107 lines
4.0 KiB
Python
107 lines
4.0 KiB
Python
"""Adds the ability to open files from disk to the CadQuery FreeCAD module"""
|
|
# (c) 2014-2016 Jeremy Wright Apache 2.0 License
|
|
import os
|
|
import sys
|
|
import FreeCAD, FreeCADGui
|
|
from PySide import QtGui
|
|
import module_locator
|
|
import Settings
|
|
|
|
#Distinguish python built-in open function from the one declared here
|
|
if open.__module__ == '__builtin__':
|
|
pythonopen = open
|
|
|
|
|
|
def AutoExecute():
|
|
"""We should be able to pass the CQGui.Commands.CadQueryExecuteScript function directly to the file_reloaded
|
|
connect function, but that causes a segfault in FreeCAD. This function is a work-around for that. This
|
|
function is passed to file_reloaded signal and in turn calls the CadQueryExecuteScript.Activated function."""
|
|
try:
|
|
import CadQuery.Gui.Command
|
|
CadQuery.Gui.Command.CadQueryExecuteScript().Activated()
|
|
except:
|
|
import CQGui.Command
|
|
CQGui.Command.CadQueryExecuteScript().Activated()
|
|
|
|
def open(filename):
|
|
#All of the CQGui.* calls in the Python console break after opening if we don't do this
|
|
FreeCADGui.doCommand("import FreeCADGui as CQGui")
|
|
|
|
# Make sure that we enforce a specific version (2.7) of the Python interpreter
|
|
ver = hex(sys.hexversion)
|
|
interpreter = "python%s.%s" % (ver[2], ver[4]) # => 'python2.7'
|
|
|
|
# If the user doesn't have Python 2.7, warn them
|
|
if interpreter != 'python2.7':
|
|
msg = QtGui.QApplication.translate(
|
|
"cqCodeWidget",
|
|
"Please install Python 2.7",
|
|
None)
|
|
FreeCAD.Console.PrintError(msg + "\r\n")
|
|
|
|
# The extra version numbers won't work on Windows
|
|
if sys.platform.startswith('win'):
|
|
interpreter = 'python'
|
|
|
|
# Set up so that we can import from our embedded packages
|
|
module_base_path = module_locator.module_path()
|
|
libs_dir_path = os.path.join(module_base_path, 'Libs')
|
|
|
|
from pyqode.core.modes import FileWatcherMode
|
|
from pyqode.core.modes import RightMarginMode
|
|
from pyqode.python.widgets import PyCodeEdit
|
|
|
|
# Make sure we get the right libs under the FreeCAD installation
|
|
fc_base_path = os.path.dirname(os.path.dirname(module_base_path))
|
|
fc_lib_path = os.path.join(fc_base_path, 'lib')
|
|
|
|
#Getting the main window will allow us to find the children we need to work with
|
|
mw = FreeCADGui.getMainWindow()
|
|
|
|
# Grab just the file name from the path/file that's being executed
|
|
docname = os.path.basename(filename)
|
|
|
|
# Set up the text area for our CQ code
|
|
server_path = os.path.join(module_base_path, 'cq_server.py')
|
|
|
|
# Windows needs some extra help with paths
|
|
if sys.platform.startswith('win'):
|
|
codePane = PyCodeEdit(server_script=server_path, interpreter=interpreter
|
|
, args=['-s', fc_lib_path, libs_dir_path])
|
|
else:
|
|
codePane = PyCodeEdit(server_script=server_path, interpreter=interpreter
|
|
, args=['-s', libs_dir_path])
|
|
|
|
# Allow easy use of an external editor
|
|
if Settings.use_external_editor:
|
|
codePane.modes.append(FileWatcherMode())
|
|
codePane.modes.get(FileWatcherMode).file_reloaded.connect(AutoExecute)
|
|
codePane.modes.get(FileWatcherMode).auto_reload = True
|
|
|
|
# Set the margin to be at 119 characters instead of 79
|
|
codePane.modes.get(RightMarginMode).position = Settings.max_line_length
|
|
|
|
# Set the font size of the Python editor
|
|
codePane.font_size = Settings.font_size
|
|
|
|
codePane.setObjectName("cqCodePane_" + os.path.splitext(os.path.basename(filename))[0])
|
|
|
|
mdi = mw.findChild(QtGui.QMdiArea)
|
|
# add a widget to the mdi area
|
|
sub = mdi.addSubWindow(codePane)
|
|
sub.setWindowTitle(docname)
|
|
sub.setWindowIcon(QtGui.QIcon(':/icons/applications-python.svg'))
|
|
sub.show()
|
|
mw.update()
|
|
|
|
#Pull the text of the CQ script file into our code pane
|
|
codePane.file.open(filename)
|
|
|
|
msg = QtGui.QApplication.translate(
|
|
"cqCodeWidget",
|
|
"Opened ",
|
|
None)
|
|
FreeCAD.Console.PrintMessage(msg + filename + "\r\n")
|
|
|
|
return
|