| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | from PySide import QtCore, QtGui |
| | import FreeCAD |
| | import FreeCADGui |
| | import Path |
| | from PySide.QtCore import QT_TRANSLATE_NOOP |
| | import PathScripts.PathUtils as PathUtils |
| | from Path.Main.Gui.Editor import CodeEditor |
| |
|
| | translate = FreeCAD.Qt.translate |
| |
|
| |
|
| | class GCodeHighlighter(QtGui.QSyntaxHighlighter): |
| | def __init__(self, parent=None): |
| | def convertcolor(c): |
| | return QtGui.QColor(int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF)) |
| |
|
| | super(GCodeHighlighter, self).__init__(parent) |
| | p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Editor") |
| | colors = [] |
| | c = p.GetUnsigned("Number") |
| | if c: |
| | colors.append(convertcolor(c)) |
| | else: |
| | colors.append(QtCore.Qt.red) |
| | c = p.GetUnsigned("Keyword") |
| | if c: |
| | colors.append(convertcolor(c)) |
| | else: |
| | colors.append(QtGui.QColor(0, 170, 0)) |
| | c = p.GetUnsigned("Define name") |
| | if c: |
| | colors.append(convertcolor(c)) |
| | else: |
| | colors.append(QtGui.QColor(160, 160, 164)) |
| |
|
| | self.highlightingRules = [] |
| | numberFormat = QtGui.QTextCharFormat() |
| | numberFormat.setForeground(colors[0]) |
| | self.highlightingRules.append((QtCore.QRegularExpression("[\\-0-9\\.]"), numberFormat)) |
| | keywordFormat = QtGui.QTextCharFormat() |
| | keywordFormat.setForeground(colors[1]) |
| | keywordFormat.setFontWeight(QtGui.QFont.Bold) |
| | keywordPatterns = ["\\bG[0-9]+\\b", "\\bM[0-9]+\\b"] |
| | self.highlightingRules.extend( |
| | [(QtCore.QRegularExpression(pattern), keywordFormat) for pattern in keywordPatterns] |
| | ) |
| | speedFormat = QtGui.QTextCharFormat() |
| | speedFormat.setFontWeight(QtGui.QFont.Bold) |
| | speedFormat.setForeground(colors[2]) |
| | self.highlightingRules.append((QtCore.QRegularExpression("\\bF[0-9\\.]+\\b"), speedFormat)) |
| |
|
| | def highlightBlock(self, text): |
| |
|
| | for pattern, fmt in self.highlightingRules: |
| | expression = QtCore.QRegularExpression(pattern) |
| | index = expression.match(text) |
| | while index.hasMatch(): |
| | length = index.capturedLength() |
| | self.setFormat(index.capturedStart(), length, fmt) |
| | index = expression.match(text, index.capturedStart() + length) |
| |
|
| |
|
| | class GCodeEditorDialog(QtGui.QDialog): |
| | tool = None |
| |
|
| | def __init__(self, PathObj, parent=FreeCADGui.getMainWindow()): |
| | self.PathObj = PathObj |
| | if hasattr(PathObj, "ToolController"): |
| | self.tool = PathObj.ToolController.Tool |
| | else: |
| | self.tool = None |
| |
|
| | QtGui.QDialog.__init__(self, parent) |
| | layout = QtGui.QVBoxLayout(self) |
| |
|
| | p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/CAM") |
| | c = p.GetUnsigned("DefaultHighlightPathColor", 4286382335) |
| | Q = QtGui.QColor(int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF)) |
| | highlightcolor = ( |
| | Q.red() / 255.0, |
| | Q.green() / 255.0, |
| | Q.blue() / 255.0, |
| | Q.alpha() / 255.0, |
| | ) |
| |
|
| | self.selectionobj = FreeCAD.ActiveDocument.addObject("Path::Feature", "selection") |
| | self.selectionobj.ViewObject.LineWidth = 4 |
| | self.selectionobj.ViewObject.NormalColor = highlightcolor |
| |
|
| | |
| | self.editor = CodeEditor() |
| | font = QtGui.QFont() |
| | p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Editor") |
| | font.setFamily(p.GetString("Font", "Courier")) |
| | font.setFixedPitch(True) |
| | font.setPointSize(p.GetInt("FontSize", 10)) |
| | self.editor.setFont(font) |
| | self.editor.setPlainText("G01 X55 Y4.5 F300.0") |
| | layout.addWidget(self.editor) |
| |
|
| | |
| | lab = QtGui.QLabel() |
| | lab.setText( |
| | translate( |
| | "CAM_Inspect", |
| | "<b>Note</b>: This dialog shows path commands in FreeCAD base units (mm/s)." |
| | "<br>Values will be converted to the desired unit during post processing.", |
| | ) |
| | ) |
| | lab.setWordWrap(True) |
| | layout.addWidget(lab) |
| |
|
| | |
| | self.buttons = QtGui.QDialogButtonBox( |
| | QtGui.QDialogButtonBox.Close, |
| | QtCore.Qt.Horizontal, |
| | self, |
| | ) |
| |
|
| | layout.addWidget(self.buttons) |
| | self.buttons.rejected.connect(self.reject) |
| | self.editor.selectionChanged.connect(self.highlightpath) |
| | self.finished.connect(self.cleanup) |
| |
|
| | prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/CAM") |
| | Xpos = int(prefs.GetString("inspecteditorX", "0")) |
| | Ypos = int(prefs.GetString("inspecteditorY", "0")) |
| | height = int(prefs.GetString("inspecteditorH", "500")) |
| | width = int(prefs.GetString("inspecteditorW", "600")) |
| | self.move(Xpos, Ypos) |
| | self.resize(width, height) |
| |
|
| | def cleanup(self): |
| | prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/CAM") |
| | prefs.SetString("inspecteditorX", str(self.x())) |
| | prefs.SetString("inspecteditorY", str(self.y())) |
| | prefs.SetString("inspecteditorW", str(self.width())) |
| | prefs.SetString("inspecteditorH", str(self.height())) |
| | FreeCAD.ActiveDocument.removeObject(self.selectionobj.Name) |
| |
|
| | def highlightpath(self): |
| | cursor = self.editor.textCursor() |
| | sp = cursor.selectionStart() |
| | ep = cursor.selectionEnd() |
| | cursor.setPosition(sp) |
| | startrow = cursor.blockNumber() |
| | cursor.setPosition(ep) |
| | endrow = cursor.blockNumber() |
| |
|
| | commands = PathUtils.getPathWithPlacement(self.PathObj).Commands |
| |
|
| | |
| | prevX = prevY = prevZ = None |
| | prevcommands = commands[:startrow] |
| | prevcommands.reverse() |
| | for c in prevcommands: |
| | if prevX is None: |
| | if c.Parameters.get("X") is not None: |
| | prevX = c.Parameters.get("X") |
| | if prevY is None: |
| | if c.Parameters.get("Y") is not None: |
| | prevY = c.Parameters.get("Y") |
| | if prevZ is None: |
| | if c.Parameters.get("Z") is not None: |
| | prevZ = c.Parameters.get("Z") |
| | if prevX is not None and prevY is not None and prevZ is not None: |
| | break |
| | if prevX is None: |
| | prevX = 0.0 |
| | if prevY is None: |
| | prevY = 0.0 |
| | if prevZ is None: |
| | prevZ = 0.0 |
| |
|
| | |
| | p = Path.Path() |
| | firstrapid = Path.Command("G0", {"X": prevX, "Y": prevY, "Z": prevZ}) |
| |
|
| | selectionpath = [firstrapid] + commands[startrow : endrow + 1] |
| | p.Commands = selectionpath |
| | self.selectionobj.Path = p |
| |
|
| | if self.tool is not None: |
| | self.tool.Placement.Base.x = prevX |
| | self.tool.Placement.Base.y = prevY |
| | self.tool.Placement.Base.z = prevZ |
| |
|
| |
|
| | def show(obj): |
| | "show(obj): shows the G-code data of the given Path object in a dialog" |
| |
|
| | prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/CAM") |
| | |
| | defaultMHS = 256 * 1024 |
| | mhs = prefs.GetUnsigned("inspecteditorMaxHighlighterSize", defaultMHS) |
| |
|
| | if hasattr(obj, "Path"): |
| | if obj.Path: |
| | dia = GCodeEditorDialog(obj) |
| | dia.editor.setPlainText(obj.Path.toGCode()) |
| | gcodeSize = len(dia.editor.toPlainText()) |
| | if gcodeSize <= mhs: |
| | |
| | |
| | |
| | |
| | dia.highlighter = GCodeHighlighter(dia.editor.document()) |
| | else: |
| | FreeCAD.Console.PrintMessage( |
| | translate( |
| | "Path", |
| | "GCode size too big ({} o), disabling syntax highlighter.".format( |
| | gcodeSize |
| | ), |
| | ) |
| | ) |
| | result = dia.exec_() |
| | |
| | if result: |
| | p = Path.Path(dia.editor.toPlainText()) |
| | FreeCAD.ActiveDocument.openTransaction("Edit Path") |
| | obj.Path = p |
| | FreeCAD.ActiveDocument.commitTransaction() |
| | FreeCAD.ActiveDocument.recompute() |
| |
|
| |
|
| | class CommandPathInspect: |
| | def GetResources(self): |
| | return { |
| | "Pixmap": "CAM_Inspect", |
| | "MenuText": QT_TRANSLATE_NOOP("CAM_Inspect", "Inspect Toolpath"), |
| | "Accel": "P, I", |
| | "ToolTip": QT_TRANSLATE_NOOP( |
| | "CAM_Inspect", "Inspects the contents of a toolpath object" |
| | ), |
| | } |
| |
|
| | def IsActive(self): |
| | selection = FreeCADGui.Selection.getSelection() |
| | if len(selection) == 0: |
| | return False |
| | obj = selection[0] |
| | return hasattr(obj, "Path") and len(obj.Path.Commands) > 0 |
| |
|
| | def Activated(self): |
| | |
| | selection = FreeCADGui.Selection.getSelection() |
| | if len(selection) != 1: |
| | FreeCAD.Console.PrintError( |
| | translate("CAM_Inspect", "Select exactly one path object") + "\n" |
| | ) |
| | return |
| | if not (selection[0].isDerivedFrom("Path::Feature")): |
| | FreeCAD.Console.PrintError( |
| | translate("CAM_Inspect", "Select exactly one path object") + "\n" |
| | ) |
| | return |
| |
|
| | |
| | FreeCADGui.addModule("Path.Main.Gui.Inspect") |
| | FreeCADGui.doCommand( |
| | "Path.Main.Gui.Inspect.show(FreeCAD.ActiveDocument." + selection[0].Name + ")" |
| | ) |
| |
|
| |
|
| | if FreeCAD.GuiUp: |
| | |
| | FreeCADGui.addCommand("CAM_Inspect", CommandPathInspect()) |
| |
|