From 5c471bef37e1e675660035797b36be11a3af8385 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 9 Mar 2023 14:26:09 +0100 Subject: [PATCH 01/20] Draft: Added LayerManager command from BIM --- src/Mod/Draft/Resources/Draft.qrc | 2 + .../Resources/icons/Draft_LayerManager.svg | 515 ++++++++++++++++++ src/Mod/Draft/Resources/ui/dialogLayers.ui | 94 ++++ src/Mod/Draft/draftguitools/gui_layers.py | 444 +++++++++++++++ src/Mod/Draft/draftutils/init_tools.py | 3 +- 5 files changed, 1057 insertions(+), 1 deletion(-) create mode 100644 src/Mod/Draft/Resources/icons/Draft_LayerManager.svg create mode 100644 src/Mod/Draft/Resources/ui/dialogLayers.ui diff --git a/src/Mod/Draft/Resources/Draft.qrc b/src/Mod/Draft/Resources/Draft.qrc index 1df9126aaa..7907e7423e 100644 --- a/src/Mod/Draft/Resources/Draft.qrc +++ b/src/Mod/Draft/Resources/Draft.qrc @@ -49,6 +49,7 @@ icons/Draft_Join.svg icons/Draft_Label.svg icons/Draft_Layer.svg + icons/Draft_LayerManager.svg icons/Draft_Line.svg icons/Draft_LinkArray.svg icons/Draft_Lock.svg @@ -191,5 +192,6 @@ ui/dialog_AnnotationStyleEditor.ui ui/TaskPanel_SetStyle.ui ui/dialogHatch.ui + ui/dialogLayers.ui diff --git a/src/Mod/Draft/Resources/icons/Draft_LayerManager.svg b/src/Mod/Draft/Resources/icons/Draft_LayerManager.svg new file mode 100644 index 0000000000..34134c781f --- /dev/null +++ b/src/Mod/Draft/Resources/icons/Draft_LayerManager.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Draft/Resources/ui/dialogLayers.ui b/src/Mod/Draft/Resources/ui/dialogLayers.ui new file mode 100644 index 0000000000..32c1468231 --- /dev/null +++ b/src/Mod/Draft/Resources/ui/dialogLayers.ui @@ -0,0 +1,94 @@ + + + Dialog + + + + 0 + 0 + 667 + 320 + + + + Layers manager + + + + + + true + + + + + + + + + New + + + + + + + Delete + + + + + + + Select all + + + + + + + Toggle on/off + + + + + + + Isolate + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + OK + + + + + + + + + + diff --git a/src/Mod/Draft/draftguitools/gui_layers.py b/src/Mod/Draft/draftguitools/gui_layers.py index ab66fa7347..432e754c7f 100644 --- a/src/Mod/Draft/draftguitools/gui_layers.py +++ b/src/Mod/Draft/draftguitools/gui_layers.py @@ -30,7 +30,10 @@ # @{ from PySide.QtCore import QT_TRANSLATE_NOOP +import os +import FreeCAD import FreeCADGui as Gui +import Draft import Draft_rc import draftguitools.gui_base as gui_base @@ -40,6 +43,18 @@ from draftutils.translate import translate bool(Draft_rc.__name__) +def getColorIcon(color): + + "returns a QtGui.QIcon from a color 3-float tuple" + + from PySide import QtCore,QtGui + c = QtGui.QColor(int(color[0]*255),int(color[1]*255),int(color[2]*255)) + im = QtGui.QImage(48,48,QtGui.QImage.Format_ARGB32) + im.fill(c) + px = QtGui.QPixmap.fromImage(im) + return QtGui.QIcon(px) + + class Layer(gui_base.GuiCommandSimplest): """GuiCommand to create a Layer object in the document.""" @@ -66,6 +81,435 @@ class Layer(gui_base.GuiCommandSimplest): self.doc.commitTransaction() +class LayerManager: + + """GuiCommand that displays a Layers manager dialog""" + + def GetResources(self): + + return {'Pixmap' : 'Draft_LayerManager', + 'MenuText': QT_TRANSLATE_NOOP("Draft_LayerManager", "Manage layers..."), + 'ToolTip' : QT_TRANSLATE_NOOP("Draft_LayerManager", "Set/modify the different layers of this document")} + + def Activated(self): + + from PySide import QtCore, QtGui + + # store changes to be committed + self.deleteList = [] + + # create the dialog + self.dialog = Gui.PySideUic.loadUi(":/ui/dialogLayers.ui") + + # set nice icons + self.dialog.setWindowIcon(QtGui.QIcon(":/icons/Draft_Layer.svg")) + self.dialog.buttonNew.setIcon(QtGui.QIcon(":/icons/document-new.svg")) + self.dialog.buttonDelete.setIcon(QtGui.QIcon(":/icons/delete.svg")) + self.dialog.buttonSelectAll.setIcon(QtGui.QIcon(":/icons/edit-select-all.svg")) + self.dialog.buttonToggle.setIcon(QtGui.QIcon(":/icons/dagViewVisible.svg")) + self.dialog.buttonIsolate.setIcon(QtGui.QIcon(":/icons/view-refresh.svg")) + self.dialog.buttonCancel.setIcon(QtGui.QIcon(":/icons/edit_Cancel.svg")) + self.dialog.buttonOK.setIcon(QtGui.QIcon(":/icons/edit_OK.svg")) + + # restore window geometry from stored state + pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft") + w = pref.GetInt("LayersManagerWidth",640) + h = pref.GetInt("LayersManagerHeight",320) + self.dialog.resize(w,h) + + # center the dialog over FreeCAD window + mw = Gui.getMainWindow() + self.dialog.move(mw.frameGeometry().topLeft() + mw.rect().center() - self.dialog.rect().center()) + + # connect signals/slots + self.dialog.buttonNew.clicked.connect(self.addItem) + self.dialog.buttonDelete.clicked.connect(self.onDelete) + self.dialog.buttonSelectAll.clicked.connect(self.dialog.tree.selectAll) + self.dialog.buttonToggle.clicked.connect(self.onToggle) + self.dialog.buttonCancel.clicked.connect(self.dialog.reject) + self.dialog.buttonIsolate.clicked.connect(self.onIsolate) + self.dialog.buttonOK.clicked.connect(self.accept) + self.dialog.rejected.connect(self.reject) + + # set the model up + self.model = QtGui.QStandardItemModel() + self.dialog.tree.setModel(self.model) + self.dialog.tree.setUniformRowHeights(True) + self.dialog.tree.setItemDelegate(Layers_Delegate()) + self.dialog.tree.setItemsExpandable(False) + self.dialog.tree.setRootIsDecorated(False) # removes spacing in first column + self.dialog.tree.setSelectionMode(QtGui.QTreeView.ExtendedSelection) # allow to select many + + # fill the tree view + self.update() + + # rock 'n roll!!! + self.dialog.exec_() + + def accept(self): + + "when OK button is pressed" + + changed = False + + # delete layers + for name in self.deleteList: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + FreeCAD.ActiveDocument.removeObject(name) + + # apply changes + for row in range(self.model.rowCount()): + + # get or create layer + name = self.model.item(row,1).toolTip() + obj = None + if name: + obj = FreeCAD.ActiveDocument.getObject(name) + if not obj: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj = Draft.make_layer() + + # visibility + checked = True if self.model.item(row,0).checkState() == QtCore.Qt.Checked else False + if checked != obj.ViewObject.Visibility: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.Visibility = checked + + # label + label = self.model.item(row,1).text() + if label: + if obj.Label != label: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.Label = label + + # line width + width = self.model.item(row,2).data(QtCore.Qt.DisplayRole) + if width: + if obj.ViewObject.LineWidth != width: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.LineWidth = width + + # draw style + style = self.model.item(row,3).text() + if style: + if obj.ViewObject.DrawStyle != style: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.DrawStyle = style + + # line color + color = self.model.item(row,4).data(QtCore.Qt.UserRole) + if color: + if obj.ViewObject.LineColor[3:] != color: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.LineColor = color + + # shape color + color = self.model.item(row,5).data(QtCore.Qt.UserRole) + if color: + if obj.ViewObject.ShapeColor[3:] != color: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.ShapeColor = color + + # transparency + transparency = self.model.item(row,6).data(QtCore.Qt.DisplayRole) + if transparency: + if obj.ViewObject.Transparency != transparency: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.Transparency = transparency + + # line print color + color = self.model.item(row,7).data(QtCore.Qt.UserRole) + if color: + if not "LinePrintColor" in obj.ViewObject.PropertiesList: + if hasattr(obj.ViewObject.Proxy,"set_properties"): + obj.ViewObject.Proxy.set_properties(obj.ViewObject) + if "LinePrintColor" in obj.ViewObject.PropertiesList: + if obj.ViewObject.LinePrintColor[3:] != color: + if not changed: + FreeCAD.ActiveDocument.openTransaction("Layers change") + changed = True + obj.ViewObject.LinePrintColor = color + + # recompute + if changed: + FreeCAD.ActiveDocument.commitTransaction() + FreeCAD.ActiveDocument.recompute() + + # exit + self.dialog.reject() + + def reject(self): + + "when Cancel button is pressed or dialog is closed" + + # save dialog size + pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft") + pref.SetInt("LayersManagerWidth",self.dialog.width()) + pref.SetInt("LayersManagerHeight",self.dialog.height()) + + return True + + def update(self): + + "rebuild the model from document contents" + + self.model.clear() + + # set header + self.model.setHorizontalHeaderLabels([translate("Draft","On"), + translate("Draft","Name"), + translate("Draft","Line width"), + translate("Draft","Draw style"), + translate("Draft","Line color"), + translate("Draft","Face color"), + translate("Draft","Transparency"), + translate("Draft","Line print color")]) + self.dialog.tree.header().setDefaultSectionSize(72) + self.dialog.tree.setColumnWidth(0,32) # on/off column + self.dialog.tree.setColumnWidth(1,128) # name column + + # populate + objs = [obj for obj in FreeCAD.ActiveDocument.Objects if Draft.getType(obj) == "Layer"] + objs.sort(key=lambda o:o.Label) + for obj in objs: + self.addItem(obj) + + def addItem(self,obj=None): + + "adds a row to the model" + + from PySide import QtCore, QtGui + + # create row with default values + onItem = QtGui.QStandardItem() + onItem.setCheckable(True) + onItem.setCheckState(QtCore.Qt.Checked) + nameItem = QtGui.QStandardItem(translate("Draft","New Layer")) + widthItem = QtGui.QStandardItem() + widthItem.setData(self.getPref("DefaultShapeLineWidth",2,"Integer"),QtCore.Qt.DisplayRole) + styleItem = QtGui.QStandardItem("Solid") + lineColorItem = QtGui.QStandardItem() + lineColorItem.setData(self.getPref("DefaultShapeLineColor",421075455),QtCore.Qt.UserRole) + shapeColorItem = QtGui.QStandardItem() + shapeColorItem.setData(self.getPref("DefaultShapeColor",3435973887),QtCore.Qt.UserRole) + transparencyItem = QtGui.QStandardItem() + transparencyItem.setData(0,QtCore.Qt.DisplayRole) + linePrintColorItem = QtGui.QStandardItem() + linePrintColorItem.setData(self.getPref("DefaultPrintColor",0),QtCore.Qt.UserRole) + + # populate with object data + if obj: + onItem.setCheckState(QtCore.Qt.Checked if obj.ViewObject.Visibility else QtCore.Qt.Unchecked) + nameItem.setText(obj.Label) + nameItem.setToolTip(obj.Name) + widthItem.setData(obj.ViewObject.LineWidth,QtCore.Qt.DisplayRole) + styleItem.setText(obj.ViewObject.DrawStyle) + lineColorItem.setData(obj.ViewObject.LineColor[:3],QtCore.Qt.UserRole) + shapeColorItem.setData(obj.ViewObject.ShapeColor[:3],QtCore.Qt.UserRole) + transparencyItem.setData(obj.ViewObject.Transparency,QtCore.Qt.DisplayRole) + if hasattr(obj.ViewObject,"LinePrintColor"): + linePrintColorItem.setData(obj.ViewObject.LinePrintColor[:3],QtCore.Qt.UserRole) + lineColorItem.setIcon(getColorIcon(lineColorItem.data(QtCore.Qt.UserRole))) + shapeColorItem.setIcon(getColorIcon(shapeColorItem.data(QtCore.Qt.UserRole))) + linePrintColorItem.setIcon(getColorIcon(linePrintColorItem.data(QtCore.Qt.UserRole))) + + # append row + self.model.appendRow([onItem, + nameItem, + widthItem, + styleItem, + lineColorItem, + shapeColorItem, + transparencyItem, + linePrintColorItem]) + + def getPref(self,value,default,valuetype="Unsigned"): + + "retrieves a view pref value" + + p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View") + if valuetype == "Unsigned": + c = p.GetUnsigned(value,default) + r = float((c>>24)&0xFF)/255.0 + g = float((c>>16)&0xFF)/255.0 + b = float((c>>8)&0xFF)/255.0 + return (r,g,b,) + elif valuetype == "Integer": + return p.GetInt(value,default) + + def onDelete(self): + + "delete selected rows" + + rows = [] + for index in self.dialog.tree.selectedIndexes(): + if not index.row() in rows: + rows.append(index.row()) + + # append layer name to the delete list + if index.column() == 1: + name = self.model.itemFromIndex(index).toolTip() + if name: + if not name in self.deleteList: + self.deleteList.append(name) + + # delete rows starting from the lowest, to not alter row indexes while deleting + rows.sort() + rows.reverse() + for row in rows: + self.model.takeRow(row) + + def onToggle(self): + + "toggle selected layers on/off" + + from PySide import QtCore, QtGui + + state = None + for index in self.dialog.tree.selectedIndexes(): + if index.column() == 0: + # get state from first selected row + if state is None: + if self.model.itemFromIndex(index).checkState() == QtCore.Qt.Checked: + state = QtCore.Qt.Unchecked + else: + state = QtCore.Qt.Checked + self.model.itemFromIndex(index).setCheckState(state) + + def onIsolate(self): + + "isolates the selected layers (turns all the others off" + + from PySide import QtCore, QtGui + + onrows = [] + for index in self.dialog.tree.selectedIndexes(): + if not index.row() in onrows: + onrows.append(index.row()) + for row in range(self.model.rowCount()): + if not row in onrows: + self.model.item(row,0).setCheckState(QtCore.Qt.Unchecked) + + +if FreeCAD.GuiUp: + + from PySide import QtCore, QtGui + + class Layers_Delegate(QtGui.QStyledItemDelegate): + + "model delegate" + + def __init__(self, parent=None, *args): + + QtGui.QStyledItemDelegate.__init__(self, parent, *args) + # setEditorData() is triggered several times. + # But we want to show the color dialog only the first time + self.first = True + + def createEditor(self,parent,option,index): + + if index.column() == 0: # Layer on/off + editor = QtGui.QCheckBox(parent) + if index.column() == 1: # Layer name + editor = QtGui.QLineEdit(parent) + elif index.column() == 2: # Line width + editor = QtGui.QSpinBox(parent) + editor.setMaximum(99) + elif index.column() == 3: # Line style + editor = QtGui.QComboBox(parent) + editor.addItems(["Solid","Dashed","Dotted","Dashdot"]) + elif index.column() == 4: # Line color + editor = QtGui.QLineEdit(parent) + self.first = True + elif index.column() == 5: # Shape color + editor = QtGui.QLineEdit(parent) + self.first = True + elif index.column() == 6: # Transparency + editor = QtGui.QSpinBox(parent) + editor.setMaximum(100) + elif index.column() == 7: # Line print color + editor = QtGui.QLineEdit(parent) + self.first = True + return editor + + def setEditorData(self, editor, index): + + if index.column() == 0: # Layer on/off + editor.setChecked(index.data()) + elif index.column() == 1: # Layer name + editor.setText(index.data()) + elif index.column() == 2: # Line width + editor.setValue(index.data()) + elif index.column() == 3: # Line style + editor.setCurrentIndex(["Solid","Dashed","Dotted","Dashdot"].index(index.data())) + elif index.column() == 4: # Line color + editor.setText(str(index.data(QtCore.Qt.UserRole))) + if self.first: + c = index.data(QtCore.Qt.UserRole) + color = QtGui.QColorDialog.getColor(QtGui.QColor(int(c[0]*255),int(c[1]*255),int(c[2]*255))) + editor.setText(str(color.getRgbF())) + self.first = False + elif index.column() == 5: # Shape color + editor.setText(str(index.data(QtCore.Qt.UserRole))) + if self.first: + c = index.data(QtCore.Qt.UserRole) + color = QtGui.QColorDialog.getColor(QtGui.QColor(int(c[0]*255),int(c[1]*255),int(c[2]*255))) + editor.setText(str(color.getRgbF())) + self.first = False + elif index.column() == 6: # Transparency + editor.setValue(index.data()) + elif index.column() == 7: # Line print color + editor.setText(str(index.data(QtCore.Qt.UserRole))) + if self.first: + c = index.data(QtCore.Qt.UserRole) + color = QtGui.QColorDialog.getColor(QtGui.QColor(int(c[0]*255),int(c[1]*255),int(c[2]*255))) + editor.setText(str(color.getRgbF())) + self.first = False + + def setModelData(self, editor, model, index): + + if index.column() == 0: # Layer on/off + model.setData(index,editor.isChecked()) + elif index.column() == 1: # Layer name + model.setData(index,editor.text()) + elif index.column() == 2: # Line width + model.setData(index,editor.value()) + elif index.column() == 3: # Line style + model.setData(index,["Solid","Dashed","Dotted","Dashdot"][editor.currentIndex()]) + elif index.column() == 4: # Line color + model.setData(index,eval(editor.text()),QtCore.Qt.UserRole) + model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) + elif index.column() == 5: # Shape color + model.setData(index,eval(editor.text()),QtCore.Qt.UserRole) + model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) + elif index.column() == 6: # Transparency + model.setData(index,editor.value()) + elif index.column() == 7: # Line prin color + model.setData(index,eval(editor.text()),QtCore.Qt.UserRole) + model.itemFromIndex(index).setIcon(getColorIcon(eval(editor.text()))) + + + + Gui.addCommand('Draft_Layer', Layer()) +Gui.addCommand('Draft_LayerManager', LayerManager()) ## @} diff --git a/src/Mod/Draft/draftutils/init_tools.py b/src/Mod/Draft/draftutils/init_tools.py index 49b401719c..82a7114f0c 100644 --- a/src/Mod/Draft/draftutils/init_tools.py +++ b/src/Mod/Draft/draftutils/init_tools.py @@ -112,6 +112,7 @@ def get_draft_utility_commands_menu(): "Draft_ApplyStyle", "Separator", "Draft_Layer", + "Draft_LayerManager", "Draft_AddNamedGroup", "Draft_AddToGroup", "Draft_SelectGroup", @@ -130,7 +131,7 @@ def get_draft_utility_commands_menu(): def get_draft_utility_commands_toolbar(): """Return the utility commands list for the toolbar.""" - return ["Draft_Layer", + return ["Draft_LayerManager", "Draft_AddNamedGroup", "Draft_AddToGroup", "Draft_SelectGroup", From 3585ed46e3bca72c770dc958380833c6366834de Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 10 Mar 2023 12:19:27 +0100 Subject: [PATCH 02/20] Draft: Fixes grid on/off behaviour - fixes #5878 - If grid is on and auto grid on: Grid always appears - If grid is on and auto grid off: Grid off at start, on when using a tool, off afterwards - If grid is off: Grid never appears --- src/Mod/Draft/draftguitools/gui_base_original.py | 2 +- src/Mod/Draft/draftguitools/gui_grid.py | 2 +- src/Mod/Draft/draftguitools/gui_lines.py | 2 +- src/Mod/Draft/draftguitools/gui_snapper.py | 13 ++++++++----- src/Mod/Draft/draftguitools/gui_trackers.py | 5 +++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Mod/Draft/draftguitools/gui_base_original.py b/src/Mod/Draft/draftguitools/gui_base_original.py index 69430e3a5c..1b58a33d9b 100644 --- a/src/Mod/Draft/draftguitools/gui_base_original.py +++ b/src/Mod/Draft/draftguitools/gui_base_original.py @@ -148,7 +148,7 @@ class DraftTool: if utils.get_param("showPlaneTracker", False): self.planetrack = trackers.PlaneTracker() if hasattr(Gui, "Snapper"): - Gui.Snapper.setTrackers() + Gui.Snapper.setTrackers(tool=True) _msg("{}".format(16*"-")) _msg("GuiCommand: {}".format(self.featureName)) diff --git a/src/Mod/Draft/draftguitools/gui_grid.py b/src/Mod/Draft/draftguitools/gui_grid.py index 835a98cd2d..0173dd8dc2 100644 --- a/src/Mod/Draft/draftguitools/gui_grid.py +++ b/src/Mod/Draft/draftguitools/gui_grid.py @@ -66,7 +66,7 @@ class ToggleGrid(gui_base.GuiCommandSimplest): super(ToggleGrid, self).Activated() if hasattr(Gui, "Snapper"): - Gui.Snapper.setTrackers() + Gui.Snapper.setTrackers(tool=True) if Gui.Snapper.grid: if Gui.Snapper.grid.Visible: Gui.Snapper.grid.off() diff --git a/src/Mod/Draft/draftguitools/gui_lines.py b/src/Mod/Draft/draftguitools/gui_lines.py index cfe5f607bd..274ccfe3b3 100644 --- a/src/Mod/Draft/draftguitools/gui_lines.py +++ b/src/Mod/Draft/draftguitools/gui_lines.py @@ -139,7 +139,7 @@ class Line(gui_base_original.Creator): if self.oldWP: App.DraftWorkingPlane.setFromParameters(self.oldWP) if hasattr(Gui, "Snapper"): - Gui.Snapper.setGrid() + Gui.Snapper.setGrid(tool=True) Gui.Snapper.restack() self.oldWP = None diff --git a/src/Mod/Draft/draftguitools/gui_snapper.py b/src/Mod/Draft/draftguitools/gui_snapper.py index a373e9e65a..171b531c3d 100644 --- a/src/Mod/Draft/draftguitools/gui_snapper.py +++ b/src/Mod/Draft/draftguitools/gui_snapper.py @@ -1594,15 +1594,15 @@ class Snapper: self.toolbar.toggleViewAction().setVisible(False) - def setGrid(self): + def setGrid(self, tool=False): """Set the grid, if visible.""" self.setTrackers() if self.grid and (not self.forceGridOff): if self.grid.Visible: - self.grid.set() + self.grid.set(tool) - def setTrackers(self): + def setTrackers(self, tool=False): """Set the trackers.""" v = Draft.get3DView() if v and (v != self.activeview): @@ -1620,7 +1620,10 @@ class Snapper: else: if Draft.getParam("grid", True): self.grid = trackers.gridTracker() - self.grid.on() + if Draft.getParam("alwaysShowGrid", True) or tool: + self.grid.on() + else: + self.grid.off() else: self.grid = None self.tracker = trackers.snapTracker() @@ -1651,7 +1654,7 @@ class Snapper: self.activeview = v if self.grid and (not self.forceGridOff): - self.grid.set() + self.grid.set(tool) def addHoldPoint(self): diff --git a/src/Mod/Draft/draftguitools/gui_trackers.py b/src/Mod/Draft/draftguitools/gui_trackers.py index a2ebb17b17..577ae5c13b 100644 --- a/src/Mod/Draft/draftguitools/gui_trackers.py +++ b/src/Mod/Draft/draftguitools/gui_trackers.py @@ -1216,7 +1216,7 @@ class gridTracker(Tracker): self.numlines = Draft.getParam("gridSize", 100) self.update() - def set(self): + def set(self,tool=False): """Move and rotate the grid according to the current working plane.""" self.reset() Q = FreeCAD.DraftWorkingPlane.getRotation().Rotation.Q @@ -1225,7 +1225,8 @@ class gridTracker(Tracker): self.trans.translation.setValue([P.x, P.y, P.z]) self.displayHumanFigure() self.setAxesColor() - self.on() + if tool: + self.on() def getClosestNode(self, point): """Return the closest node from the given point.""" From de42289c12dc401608d97924959a6b6486a01966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20=C3=89corchard?= Date: Fri, 10 Mar 2023 13:10:00 +0100 Subject: [PATCH 03/20] Do not allow an empty identifier --- src/Base/Tools.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Base/Tools.cpp b/src/Base/Tools.cpp index 32a02708fb..f3385132c5 100644 --- a/src/Base/Tools.cpp +++ b/src/Base/Tools.cpp @@ -154,6 +154,8 @@ std::string Base::Tools::addNumber(const std::string& name, unsigned int num, in std::string Base::Tools::getIdentifier(const std::string& name) { + if (name.empty()) + return "_"; // check for first character whether it's a digit std::string CleanName = name; if (!CleanName.empty() && CleanName[0] >= 48 && CleanName[0] <= 57) From fc996571cb5debcff4643f0eae93a72e632033eb Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Mon, 13 Mar 2023 22:33:29 -0500 Subject: [PATCH 04/20] CI: Run the C++ test suite as part of the GitHub CI Refactors the tests to rename them to runPythonTests and runCPPTests. --- .../workflows/actions/runCPPTests/action.yml | 62 +++++++++++++++++++ .../{runTests => runPythonTests}/action.yml | 8 +-- .github/workflows/sub_buildUbuntu2004.yml | 15 +++-- .github/workflows/sub_buildUbuntu2204.yml | 17 +++-- 4 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/actions/runCPPTests/action.yml rename .github/workflows/actions/{runTests => runPythonTests}/action.yml (96%) diff --git a/.github/workflows/actions/runCPPTests/action.yml b/.github/workflows/actions/runCPPTests/action.yml new file mode 100644 index 0000000000..ca33f90d6b --- /dev/null +++ b/.github/workflows/actions/runCPPTests/action.yml @@ -0,0 +1,62 @@ +# *************************************************************************** +# * Copyright (c) 2023 0penBrain * +# * Copyright (c) 2023 FreeCAD Project Association * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +name: runCPPTests +description: "Run: C++ tests" + +inputs: + testCommand: + description: "Test command to be run" + required: true + testLogFile: + description: "Path for the command-line output of the tests" + required: true + reportFile: + description: "Report file" + required: true + +runs: + using: "composite" + steps: + - name: Run GTest unit tests + id: runGoogleTests + shell: bash + run: stdbuf -oL -eL ${{ inputs.testCommand }} |& tee -a ${{ inputs.testLogFile }} + - name: Parse test results + if: always() + shell: bash + run: | + result=$(sed -ne "/Global test environment tear-down/,/^$/{/^$/d;p}" ${{ inputs.testLogFile }}) + if [ $(echo $result | grep -F "[ FAILED ]") ] + then + echo "
:fire: GTest C++ unit test suite failed" >> ${{ inputs.reportFile }} + else + echo "
:heavy_check_mark: GTest C++ unit test suite succeeded" >> ${{ inputs.reportFile }} + fi + echo "" >> ${{ inputs.reportFile }} + echo "Results" >> ${{ inputs.reportFile }} + echo "" >> ${{ inputs.reportFile }} + echo '```' >> ${{ inputs.reportFile }} + echo "$result" >> ${{ inputs.reportFile }} + echo '```' >> ${{ inputs.reportFile }} + echo "
">> ${{ inputs.reportFile }} + echo "" >> ${{ inputs.reportFile }} diff --git a/.github/workflows/actions/runTests/action.yml b/.github/workflows/actions/runPythonTests/action.yml similarity index 96% rename from .github/workflows/actions/runTests/action.yml rename to .github/workflows/actions/runPythonTests/action.yml index 29e4aab55c..1396f1c117 100644 --- a/.github/workflows/actions/runTests/action.yml +++ b/.github/workflows/actions/runPythonTests/action.yml @@ -1,5 +1,5 @@ # *************************************************************************** -# * Copyright (c) 2023 0penBrain * +# * Copyright (c) 2023 0penBrain * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * @@ -19,15 +19,15 @@ # * * # *************************************************************************** -name: runTests -description: "Linux: run unit tests, generate log and report" +name: runPythonTests +description: "Linux: run Python tests, generate log and report" inputs: testDescription: description: "Test description text, will be used on report" required: true testCommand: - description: "Test command to be ran" + description: "Test command to be run" required: true logFile: description: "Path for log file" diff --git a/.github/workflows/sub_buildUbuntu2004.yml b/.github/workflows/sub_buildUbuntu2004.yml index 9e69cbc9fb..1a19ae7d5f 100644 --- a/.github/workflows/sub_buildUbuntu2004.yml +++ b/.github/workflows/sub_buildUbuntu2004.yml @@ -185,7 +185,7 @@ jobs: - name: FreeCAD CLI tests on build dir if: inputs.testOnBuildDir timeout-minutes: 10 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on build dir" testCommand: ${{ env.builddir }}bin/FreeCADCmd -t 0 @@ -194,12 +194,19 @@ jobs: - name: FreeCAD GUI tests on build dir if: inputs.testOnBuildDir timeout-minutes: 15 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on build dir" testCommand: xvfb-run ${{ env.builddir }}/bin/FreeCAD -t 0 logFile: ${{ env.logdir }}TestGUIBuild.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} + - name: C++ unit tests + timeout-minutes: 1 + uses: ./.github/workflows/actions/runCPPTests + with: + testCommand: ${{ env.builddir }}/tests/Tests_run --gtest_output=json:${{env.reportdir}}gtest_results.json + testLogFile: ${{env.reportdir}}gtest_test_log.txt + reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: CMake Install uses: ./.github/workflows/actions/linux/install with: @@ -209,7 +216,7 @@ jobs: reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD CLI tests on install timeout-minutes: 10 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on install" testCommand: FreeCADCmd -t 0 @@ -217,7 +224,7 @@ jobs: reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD GUI tests on install timeout-minutes: 15 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on install" testCommand: xvfb-run FreeCAD -t 0 diff --git a/.github/workflows/sub_buildUbuntu2204.yml b/.github/workflows/sub_buildUbuntu2204.yml index 90d37dabf6..f9699aeb4f 100644 --- a/.github/workflows/sub_buildUbuntu2204.yml +++ b/.github/workflows/sub_buildUbuntu2204.yml @@ -1,5 +1,5 @@ # *************************************************************************** -# * Copyright (c) 2023 0penBrain * +# * Copyright (c) 2023 0penBrain * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * @@ -194,7 +194,7 @@ jobs: - name: FreeCAD CLI tests on build dir if: inputs.testOnBuildDir timeout-minutes: 10 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on build dir" testCommand: ${{ env.builddir }}bin/FreeCADCmd -t 0 @@ -203,12 +203,19 @@ jobs: - name: FreeCAD GUI tests on build dir if: inputs.testOnBuildDir timeout-minutes: 15 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on build dir" testCommand: xvfb-run ${{ env.builddir }}/bin/FreeCAD -t 0 logFile: ${{ env.logdir }}TestGUIBuild.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} + - name: C++ unit tests + timeout-minutes: 1 + uses: ./.github/workflows/actions/runCPPTests + with: + testCommand: ${{ env.builddir }}/tests/Tests_run --gtest_output=json:${{env.reportdir}}gtest_results.json + testLogFile: ${{env.reportdir}}gtest_test_log.txt + reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: CMake Install uses: ./.github/workflows/actions/linux/install with: @@ -218,7 +225,7 @@ jobs: reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD CLI tests on install timeout-minutes: 10 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on install" testCommand: FreeCADCmd -t 0 @@ -226,7 +233,7 @@ jobs: reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD GUI tests on install timeout-minutes: 15 - uses: ./.github/workflows/actions/runTests + uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on install" testCommand: xvfb-run FreeCAD -t 0 From 138688d25e6c79ffb5c6712a0b66544df201464f Mon Sep 17 00:00:00 2001 From: berniev Date: Wed, 15 Mar 2023 11:31:01 +1000 Subject: [PATCH 05/20] Finish #8879 and remove the unwanted files --- tests/src/Misc/test1.cpp | 19 ------------------- tests/src/Misc/test2.cpp | 1 - 2 files changed, 20 deletions(-) delete mode 100644 tests/src/Misc/test1.cpp delete mode 100644 tests/src/Misc/test2.cpp diff --git a/tests/src/Misc/test1.cpp b/tests/src/Misc/test1.cpp deleted file mode 100644 index ec010830b1..0000000000 --- a/tests/src/Misc/test1.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "gtest/gtest.h" - -TEST(FirstSuite, FirstTest){ - EXPECT_NE(1, 1) << "are in fact equal"; -} - -TEST(FirstSuite, SecondTest){ - EXPECT_EQ(1, 2) << "not equal"; -} - -TEST(FirstSuite, ThirdTest){ - ASSERT_STREQ("A", "A") << "str not equal"; -} -TEST(FirstSuite,FifthTest){ - ASSERT_STRNE("am", "am") << "str equal"; -} -TEST(FirstSuite, FourthTest){ - ASSERT_STREQ("am", "A") << "str not equal"; -} diff --git a/tests/src/Misc/test2.cpp b/tests/src/Misc/test2.cpp deleted file mode 100644 index 6020366af2..0000000000 --- a/tests/src/Misc/test2.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "gtest/gtest.h" From 4ecf74322ce48b8fa3d0696ae9b05d1ca555cedb Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 16 Mar 2023 03:46:43 +0100 Subject: [PATCH 06/20] [FEM] better pipeline connection for CalculiX - make the connection also working for frequency and buckling analysis by directly creating/updating the pipeline where the CalculiX results are loaded --- .../Fem/Gui/ViewProviderFemPostPipeline.cpp | 1 - src/Mod/Fem/ObjectsFem.py | 7 ++- src/Mod/Fem/feminout/importCcxFrdResults.py | 28 ++++++++++-- .../femtaskpanels/task_result_mechanical.py | 11 ----- .../Fem/femtaskpanels/task_solver_ccxtools.py | 45 +++---------------- src/Mod/Fem/femtest/app/test_object.py | 2 +- 6 files changed, 37 insertions(+), 57 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp index e3d015967d..770f7a4fd4 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostPipeline.cpp @@ -133,7 +133,6 @@ void ViewProviderFemPostPipeline::onSelectionChanged(const Gui::SelectionChanges void ViewProviderFemPostPipeline::updateColorBars() { - // take all visible childs and update its shape coloring auto children = claimChildren(); for (auto& child : children) { diff --git a/src/Mod/Fem/ObjectsFem.py b/src/Mod/Fem/ObjectsFem.py index 5f3bfd94d1..91e9378d07 100644 --- a/src/Mod/Fem/ObjectsFem.py +++ b/src/Mod/Fem/ObjectsFem.py @@ -742,8 +742,13 @@ def makePostVtkResult( ): """makePostVtkResult(document, base_result, [name]): creates a FEM post processing result object (vtk based) to hold FEM results""" - obj = doc.addObject("Fem::FemPostPipeline", name) + Pipeline_Name = "Pipeline_" + name + obj = doc.addObject("Fem::FemPostPipeline", Pipeline_Name) obj.load(base_result) + if FreeCAD.GuiUp: + obj.ViewObject.SelectionStyle = "BoundBox" + # to assure the user sees something, set the default to Surface + obj.ViewObject.DisplayMode = "Surface" return obj diff --git a/src/Mod/Fem/feminout/importCcxFrdResults.py b/src/Mod/Fem/feminout/importCcxFrdResults.py index 99e4042f6f..79c36015a1 100644 --- a/src/Mod/Fem/feminout/importCcxFrdResults.py +++ b/src/Mod/Fem/feminout/importCcxFrdResults.py @@ -107,9 +107,7 @@ def importFrd( .format(result_name_prefix, eigenmode_number) ) elif number_of_increments > 1: - if result_analysis_type == "buckling": - results_name = ( "{}BucklingFactor_{}_Results" .format(result_name_prefix, step_time) @@ -119,7 +117,6 @@ def importFrd( "{}Time_{}_Results" .format(result_name_prefix, step_time) ) - else: results_name = ( "{}Results" @@ -193,6 +190,31 @@ def importFrd( # fill Stats res_obj = resulttools.fill_femresult_stats(res_obj) + # create a results pipeline if not already existing + pipeline_name = "Pipeline_" + results_name + pipeline_obj = doc.getObject(pipeline_name) + if pipeline_obj is None: + pipeline_obj = ObjectsFem.makePostVtkResult(doc, res_obj, results_name) + pipeline_visibility = True + if analysis: + analysis.addObject(pipeline_obj) + else: + if FreeCAD.GuiUp: + # store pipeline visibility because pipeline_obj.load makes the + # pipeline always visible + pipeline_visibility = pipeline_obj.ViewObject.Visibility + pipeline_obj.load(res_obj) + # update the pipeline + pipeline_obj.recomputeChildren() + pipeline_obj.recompute() + if FreeCAD.GuiUp: + pipeline_obj.ViewObject.updateColorBars() + # make results mesh invisible, will be made visible + # later in task_solver_ccxtools.py + res_obj.Mesh.ViewObject.Visibility = False + # restore pipeline visibility + pipeline_obj.ViewObject.Visibility = pipeline_visibility + else: error_message = ( "Nodes, but no results found in frd file. " diff --git a/src/Mod/Fem/femtaskpanels/task_result_mechanical.py b/src/Mod/Fem/femtaskpanels/task_result_mechanical.py index 9b92c9891e..799ec748c2 100644 --- a/src/Mod/Fem/femtaskpanels/task_result_mechanical.py +++ b/src/Mod/Fem/femtaskpanels/task_result_mechanical.py @@ -65,11 +65,6 @@ class _TaskPanel: # if Mesh and result are in active analysis # activate the result mesh object self.mesh_obj.ViewObject.show() - # hide pipeline if any - CCX_pipeline = FreeCADGui.ActiveDocument.getObject("SolverCCXResult") - if CCX_pipeline is not None: - self.pipeline_visibility = CCX_pipeline.Visibility - CCX_pipeline.hide() ui_path = FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/" self.result_widget = FreeCADGui.PySideUic.loadUi(ui_path + "ResultShow.ui") @@ -195,12 +190,6 @@ class _TaskPanel: self.result_widget.sb_displacement_factor_max.setValue(10. * scale_factor) self.result_widget.sb_displacement_factor.setValue(scale_factor) - def __del__(self): - # restore visibility - CCX_pipeline = FreeCADGui.ActiveDocument.getObject("SolverCCXResult") - if self.pipeline_visibility and CCX_pipeline is not None: - CCX_pipeline.Visibility = self.pipeline_visibility - def restore_result_dialog(self): try: rt = FreeCAD.FEM_dialog["results_type"] diff --git a/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py b/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py index 5e749aa98f..ecd7a5e7c3 100644 --- a/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py +++ b/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py @@ -249,8 +249,6 @@ class _TaskPanel: # print("calculixFinished(), exit code: {}".format(exitCode)) FreeCAD.Console.PrintLog("calculix state: {}\n".format(self.Calculix.state())) - had_errors = False - # Restore previous cwd QtCore.QDir.setCurrent(self.cwd) @@ -260,7 +258,6 @@ class _TaskPanel: self.calculixNoError() else: self.calculixError() - had_errors = True self.form.pb_run_ccx.setText("Re-run CalculiX") self.femConsoleMessage("Loading result sets...") @@ -290,47 +287,15 @@ class _TaskPanel: self.fea.load_results() except Exception: FreeCAD.Console.PrintError("loading results failed\n") - had_errors = True QApplication.restoreOverrideCursor() self.form.l_time.setText("Time: {0:4.1f}: ".format(time.time() - self.Start)) - # create a results pipeline from the just created results object - if not had_errors: - CCX_results = self.fea.analysis.Document.getObject("CCX_Results") - # safe guard - if CCX_results is None: - return - # check if there is already a pipeline - self.CCX_pipeline = self.fea.analysis.Document.getObject("SolverCCXResult") - if self.CCX_pipeline is None: - try: - self._createResults() - except Exception: - FreeCAD.Console.PrintError("Results pipeline could not be created\n") - had_errors = True - self.CCX_pipeline.load(CCX_results) - self.CCX_pipeline.recomputeChildren() - self.fea.analysis.Document.recompute() - # recompute() updated the result mesh data - # but not the shape and bar coloring - self.CCX_pipeline.ViewObject.updateColorBars() - # restore mesh object visibility - CCX_mesh = self.fea.analysis.Document.getObject("ResultMesh") - if CCX_mesh is not None: - CCX_mesh.ViewObject.Visibility = self.CCX_mesh_visibility - else: - FreeCAD.Console.PrintError("\nNo result pipeline was created.\n") - - def _createResults(self): - self.CCX_pipeline = self.fea.analysis.Document.addObject( - "Fem::FemPostPipeline", "SolverCCXResult") - self.CCX_pipeline.Label = "SolverCCXResult" - self.CCX_pipeline.ViewObject.SelectionStyle = "BoundBox" - self.fea.analysis.addObject(self.CCX_pipeline) - # to assure the user sees something, set the default to Surface - self.CCX_pipeline.ViewObject.DisplayMode = "Surface" - + # restore mesh object visibility + CCX_mesh = self.fea.analysis.Document.getObject("ResultMesh") + if CCX_mesh is not None: + CCX_mesh.ViewObject.Visibility = self.CCX_mesh_visibility + def choose_working_dir(self): wd = QtGui.QFileDialog.getExistingDirectory(None, "Choose CalculiX working directory", self.fea.working_dir) diff --git a/src/Mod/Fem/femtest/app/test_object.py b/src/Mod/Fem/femtest/app/test_object.py index 87011ac19a..a0123a499a 100644 --- a/src/Mod/Fem/femtest/app/test_object.py +++ b/src/Mod/Fem/femtest/app/test_object.py @@ -86,7 +86,7 @@ class TestObjectCreate(unittest.TestCase): # thus they should not be counted # solver children: equations --> 8 # gmsh mesh children: group, region, boundary layer --> 3 - # resule children: mesh result --> 1 + # result children: mesh result --> 1 # post pipeline children: region, scalar, cut, wrap --> 5 # analysis itself is not in analysis group --> 1 # thus: -18 From 0e108cba4fa3ccbf813a8a2dbaf840b938ad40ed Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 16 Mar 2023 05:01:55 +0100 Subject: [PATCH 07/20] [FEM] use unique result mesh name - it is a long-standing bug that the name of the result mesh object is not unique. For example for a frequency analysis you get for every result the same object "ResultMesh". When now a "ResultMesh" object is deleted because one result mode object should be deleted, all result modes loose their mesh. To fix this, use a unique name for the mesh object. --- src/Mod/Fem/feminout/importCcxFrdResults.py | 8 +++----- src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Mod/Fem/feminout/importCcxFrdResults.py b/src/Mod/Fem/feminout/importCcxFrdResults.py index 79c36015a1..7e6f9238fb 100644 --- a/src/Mod/Fem/feminout/importCcxFrdResults.py +++ b/src/Mod/Fem/feminout/importCcxFrdResults.py @@ -81,11 +81,6 @@ def importFrd( if len(m["Nodes"]) > 0: mesh = importToolsFem.make_femmesh(m) - result_mesh_object = ObjectsFem.makeMeshResult( - doc, - "ResultMesh" - ) - result_mesh_object.FemMesh = mesh res_mesh_is_compacted = False nodenumbers_for_compacted_mesh = [] @@ -124,6 +119,9 @@ def importFrd( ) res_obj = ObjectsFem.makeResultMechanical(doc, results_name) + # create result mesh + result_mesh_object = ObjectsFem.makeMeshResult(doc, results_name + "_Mesh") + result_mesh_object.FemMesh = mesh res_obj.Mesh = result_mesh_object res_obj = importToolsFem.fill_femresult_mechanical(res_obj, result_set) if analysis: diff --git a/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py b/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py index ecd7a5e7c3..6a25f7b2d0 100644 --- a/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py +++ b/src/Mod/Fem/femtaskpanels/task_solver_ccxtools.py @@ -78,7 +78,7 @@ class _TaskPanel: self.CCX_mesh_visibility = False # store visibility of possibly existing mesh object - CCX_mesh = self.fea.analysis.Document.getObject("ResultMesh") + CCX_mesh = self.fea.analysis.Document.getObject("CCX_Results_Mesh") if CCX_mesh is not None: self.CCX_mesh_visibility = CCX_mesh.ViewObject.Visibility From 5ac308e8a65c7022ef851463d8ab5e1ba4b5edbe Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 16 Mar 2023 06:23:03 +0100 Subject: [PATCH 08/20] [Lint] remove checks for line endings - there is no need to check for certain OS line endings, git handles them well apparently --- .github/workflows/sub_lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sub_lint.yml b/.github/workflows/sub_lint.yml index 83738ba26b..5ec623ec2f 100644 --- a/.github/workflows/sub_lint.yml +++ b/.github/workflows/sub_lint.yml @@ -39,7 +39,7 @@ on: type: string required: true checkLineendings: - default: true + default: false type: boolean required: false lineendingsFailSilent: From 328cd863a173507d23f7c0bd7860112528b1d7ac Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 15 Mar 2023 19:45:27 -0400 Subject: [PATCH 09/20] [TD]trap bad format spec - bad format spec can break QString::asprintf --- src/Mod/TechDraw/App/DimensionFormatter.cpp | 16 +++++++++++++++- src/Mod/TechDraw/App/DimensionFormatter.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/App/DimensionFormatter.cpp b/src/Mod/TechDraw/App/DimensionFormatter.cpp index 2caea690b5..f105f934a9 100644 --- a/src/Mod/TechDraw/App/DimensionFormatter.cpp +++ b/src/Mod/TechDraw/App/DimensionFormatter.cpp @@ -320,12 +320,26 @@ QString DimensionFormatter::formatValueToSpec(double value, QString formatSpecif formattedValue.replace(QRegularExpression(QStringLiteral("([0-9][0-9]*\\.[0-9]*[1-9])00*$")), QStringLiteral("\\1")); formattedValue.replace(QRegularExpression(QStringLiteral("([0-9][0-9]*)\\.0*$")), QStringLiteral("\\1")); } else { - formattedValue = QString::asprintf(Base::Tools::toStdString(formatSpecifier).c_str(), value); + if (isNumericFormat(formatSpecifier)) { + formattedValue = QString::asprintf(Base::Tools::toStdString(formatSpecifier).c_str(), value); + } } return formattedValue; } +bool DimensionFormatter::isNumericFormat(QString formatSpecifier) +{ + QRegularExpression rxFormat(QStringLiteral("%[+-]?[0-9]*\\.*[0-9]*[aefgwAEFGW]")); //printf double format spec + QRegularExpressionMatch rxMatch; + int pos = formatSpecifier.indexOf(rxFormat, 0, &rxMatch); + if (pos != -1) { + return true; + } + return false; +} + +//TODO: similiar code here and above QStringList DimensionFormatter::getPrefixSuffixSpec(QString fSpec) { QStringList result; diff --git a/src/Mod/TechDraw/App/DimensionFormatter.h b/src/Mod/TechDraw/App/DimensionFormatter.h index e1d26f6e75..30c8c8b792 100644 --- a/src/Mod/TechDraw/App/DimensionFormatter.h +++ b/src/Mod/TechDraw/App/DimensionFormatter.h @@ -49,6 +49,7 @@ public: std::string getDefaultFormatSpec(bool isToleranceFormat) const; bool isTooSmall(double value, QString formatSpec); QString formatValueToSpec(double value, QString formatSpecifier); + bool isNumericFormat(QString formatSpecifier); private: DrawViewDimension* m_dimension; From a9694e1878decdb354d8dd8c80ea661e1cdc7b1b Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 15 Mar 2023 23:49:46 +0100 Subject: [PATCH 10/20] TD: port to Qt6 * in QtConcurrent::run the order of 1st and 2nd argument are swapped * QtConcurrent::run asserts that the argument of the passed function pointer is not non-const * Used methods of QFontDatabase are static in Qt5 and Qt6 * QTextStream::setCodec() has been removed in Qt6 * Argument of enterEvent() has changed from QEvent to QEnterEvent * QTextCharFormat::setFamily() is deprecated --- src/Mod/TechDraw/App/DimensionFormatter.cpp | 1 + src/Mod/TechDraw/App/DrawComplexSection.cpp | 6 +++++- src/Mod/TechDraw/App/DrawComplexSection.h | 2 +- src/Mod/TechDraw/App/DrawViewDetail.cpp | 6 +++++- src/Mod/TechDraw/App/DrawViewDetail.h | 2 +- src/Mod/TechDraw/App/DrawViewPart.cpp | 8 ++++++++ src/Mod/TechDraw/App/DrawViewSection.cpp | 6 +++++- src/Mod/TechDraw/App/DrawViewSection.h | 2 +- src/Mod/TechDraw/Gui/AppTechDrawGui.cpp | 3 +-- src/Mod/TechDraw/Gui/QGSPage.cpp | 2 ++ src/Mod/TechDraw/Gui/QGVPage.cpp | 6 ++++-- src/Mod/TechDraw/Gui/QGVPage.h | 4 ++++ src/Mod/TechDraw/Gui/mrichtextedit.cpp | 7 +++++-- 13 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/Mod/TechDraw/App/DimensionFormatter.cpp b/src/Mod/TechDraw/App/DimensionFormatter.cpp index f105f934a9..0291f7ca33 100644 --- a/src/Mod/TechDraw/App/DimensionFormatter.cpp +++ b/src/Mod/TechDraw/App/DimensionFormatter.cpp @@ -22,6 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include # include #endif diff --git a/src/Mod/TechDraw/App/DrawComplexSection.cpp b/src/Mod/TechDraw/App/DrawComplexSection.cpp index db60ad0119..3dab553f1e 100644 --- a/src/Mod/TechDraw/App/DrawComplexSection.cpp +++ b/src/Mod/TechDraw/App/DrawComplexSection.cpp @@ -282,7 +282,7 @@ TopoDS_Shape DrawComplexSection::prepareShape(const TopoDS_Shape& cutShape, doub } -void DrawComplexSection::makeSectionCut(TopoDS_Shape& baseShape) +void DrawComplexSection::makeSectionCut(const TopoDS_Shape& baseShape) { // Base::Console().Message("DCS::makeSectionCut() - %s - baseShape.IsNull: %d\n", // getNameInDocument(), baseShape.IsNull()); @@ -295,7 +295,11 @@ void DrawComplexSection::makeSectionCut(TopoDS_Shape& baseShape) connectAlignWatcher = QObject::connect(&m_alignWatcher, &QFutureWatcherBase::finished, &m_alignWatcher, [this] { this->onSectionCutFinished(); }); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) m_alignFuture = QtConcurrent::run(this, &DrawComplexSection::makeAlignedPieces, baseShape); +#else + m_alignFuture = QtConcurrent::run(&DrawComplexSection::makeAlignedPieces, this, baseShape); +#endif m_alignWatcher.setFuture(m_alignFuture); waitingForAlign(true); } diff --git a/src/Mod/TechDraw/App/DrawComplexSection.h b/src/Mod/TechDraw/App/DrawComplexSection.h index d06e730c83..f5fc22624c 100644 --- a/src/Mod/TechDraw/App/DrawComplexSection.h +++ b/src/Mod/TechDraw/App/DrawComplexSection.h @@ -58,7 +58,7 @@ public: TopoDS_Compound alignSectionFaces(TopoDS_Shape faceIntersections) override; std::pair sectionLineEnds() override; - void makeSectionCut(TopoDS_Shape& baseShape) override; + void makeSectionCut(const TopoDS_Shape& baseShape) override; void waitingForAlign(bool s) { m_waitingForAlign = s; } bool waitingForAlign(void) const { return m_waitingForAlign; } diff --git a/src/Mod/TechDraw/App/DrawViewDetail.cpp b/src/Mod/TechDraw/App/DrawViewDetail.cpp index 20f42ee81e..fbcb8ba955 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.cpp +++ b/src/Mod/TechDraw/App/DrawViewDetail.cpp @@ -186,7 +186,11 @@ void DrawViewDetail::detailExec(TopoDS_Shape& shape, DrawViewPart* dvp, DrawView connectDetailWatcher = QObject::connect(&m_detailWatcher, &QFutureWatcherBase::finished, &m_detailWatcher, [this] { this->onMakeDetailFinished(); }); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) m_detailFuture = QtConcurrent::run(this, &DrawViewDetail::makeDetailShape, shape, dvp, dvs); +#else + m_detailFuture = QtConcurrent::run(&DrawViewDetail::makeDetailShape, this, shape, dvp, dvs); +#endif m_detailWatcher.setFuture(m_detailFuture); waitingForDetail(true); } @@ -194,7 +198,7 @@ void DrawViewDetail::detailExec(TopoDS_Shape& shape, DrawViewPart* dvp, DrawView //this runs in a separate thread since it can sometimes take a long time //make a common of the input shape and a cylinder (or prism depending on //the matting style) -void DrawViewDetail::makeDetailShape(TopoDS_Shape& shape, DrawViewPart* dvp, DrawViewSection* dvs) +void DrawViewDetail::makeDetailShape(const TopoDS_Shape& shape, DrawViewPart* dvp, DrawViewSection* dvs) { showProgressMessage(getNameInDocument(), "is making detail shape"); diff --git a/src/Mod/TechDraw/App/DrawViewDetail.h b/src/Mod/TechDraw/App/DrawViewDetail.h index 8873ad0af7..9fa099834b 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.h +++ b/src/Mod/TechDraw/App/DrawViewDetail.h @@ -73,7 +73,7 @@ public: void detailExec(TopoDS_Shape& s, DrawViewPart* baseView, DrawViewSection* sectionAlias); - void makeDetailShape(TopoDS_Shape& shape, + void makeDetailShape(const TopoDS_Shape& shape, DrawViewPart* dvp, DrawViewSection* dvs); void postHlrTasks(void) override; diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 92090d5944..daf79c2beb 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -390,7 +390,11 @@ TechDraw::GeometryObjectPtr DrawViewPart::buildGeometryObject(TopoDS_Shape& shap //https://github.com/KDE/clazy/blob/1.11/docs/checks/README-connect-3arg-lambda.md connectHlrWatcher = QObject::connect(&m_hlrWatcher, &QFutureWatcherBase::finished, &m_hlrWatcher, [this] { this->onHlrFinished(); }); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) m_hlrFuture = QtConcurrent::run(go.get(), &GeometryObject::projectShape, shape, viewAxis); +#else + m_hlrFuture = QtConcurrent::run(&GeometryObject::projectShape, go.get(), shape, viewAxis); +#endif m_hlrWatcher.setFuture(m_hlrFuture); waitingForHlr(true); } @@ -430,7 +434,11 @@ void DrawViewPart::onHlrFinished(void) connectFaceWatcher = QObject::connect(&m_faceWatcher, &QFutureWatcherBase::finished, &m_faceWatcher, [this] { this->onFacesFinished(); }); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) m_faceFuture = QtConcurrent::run(this, &DrawViewPart::extractFaces); +#else + m_faceFuture = QtConcurrent::run(&DrawViewPart::extractFaces, this); +#endif m_faceWatcher.setFuture(m_faceFuture); waitingForFaces(true); } diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index 27641c08ff..b8cbd47cca 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -380,7 +380,11 @@ void DrawViewSection::sectionExec(TopoDS_Shape& baseShape) connectCutWatcher = QObject::connect(&m_cutWatcher, &QFutureWatcherBase::finished, &m_cutWatcher, [this] { this->onSectionCutFinished(); }); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) m_cutFuture = QtConcurrent::run(this, &DrawViewSection::makeSectionCut, baseShape); +#else + m_cutFuture = QtConcurrent::run(&DrawViewSection::makeSectionCut, this, baseShape); +#endif m_cutWatcher.setFuture(m_cutFuture); waitingForCut(true); } @@ -390,7 +394,7 @@ void DrawViewSection::sectionExec(TopoDS_Shape& baseShape) } } -void DrawViewSection::makeSectionCut(TopoDS_Shape& baseShape) +void DrawViewSection::makeSectionCut(const TopoDS_Shape& baseShape) { // Base::Console().Message("DVS::makeSectionCut() - %s - baseShape.IsNull: %d\n", // getNameInDocument(), baseShape.IsNull()); diff --git a/src/Mod/TechDraw/App/DrawViewSection.h b/src/Mod/TechDraw/App/DrawViewSection.h index f37313108f..d709b8f661 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.h +++ b/src/Mod/TechDraw/App/DrawViewSection.h @@ -116,7 +116,7 @@ public: short mustExecute() const override; void sectionExec(TopoDS_Shape& s); - virtual void makeSectionCut(TopoDS_Shape& baseShape); + virtual void makeSectionCut(const TopoDS_Shape& baseShape); void postHlrTasks(void) override; virtual void postSectionCutTasks(); void waitingForCut(bool s) { m_waitingForCut = s; } diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp index 0248083f2a..e624d3df93 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp @@ -84,14 +84,13 @@ void loadTechDrawResource() // add fonts std::string fontDir = App::Application::getResourceDir() + "Mod/TechDraw/Resources/fonts/"; - QFontDatabase fontDB; std::vector fontsAll( {"osifont-lgpl3fe.ttf", "osifont-italic.ttf", "Y14.5-2018.ttf", "Y14.5-FreeCAD.ttf"}); for (auto& font : fontsAll) { QString fontFile = Base::Tools::fromStdString(fontDir + font); - int rc = fontDB.addApplicationFont(fontFile); + int rc = QFontDatabase::addApplicationFont(fontFile); if (rc < 0) { Base::Console().Warning( "TechDraw failed to load font file: %d from: %s\n", rc, qPrintable(fontFile)); diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index a902f1b617..323f9e2bef 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -1259,7 +1259,9 @@ void QGSPage::postProcessXml(QTemporaryFile& temporaryFile, QString fileName, QS QTextStream stream(&outFile); stream.setGenerateByteOrderMark(false); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) stream.setCodec("UTF-8"); +#endif stream << exportDoc.toByteArray(); outFile.close(); diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index fff8d2986f..91fbab93e5 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -357,7 +356,6 @@ void QGVPage::setRenderer(RendererType type) if (m_renderer == OpenGL) { #ifndef QT_NO_OPENGL - // setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); //QGLWidget is obsolete setViewport(new QOpenGLWidget); setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); #endif @@ -466,7 +464,11 @@ void QGVPage::kbPanScroll(int xMove, int yMove) } } +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) void QGVPage::enterEvent(QEvent* event) +#else +void QGVPage::enterEvent(QEnterEvent* event) +#endif { QGraphicsView::enterEvent(event); m_navStyle->handleEnterEvent(event); diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index 8dcf2a2533..780d845821 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -130,7 +130,11 @@ public Q_SLOTS: protected: void wheelEvent(QWheelEvent* event) override; void paintEvent(QPaintEvent* event) override; +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) void enterEvent(QEvent* event) override; +#else + void enterEvent(QEnterEvent* event) override; +#endif void leaveEvent(QEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; diff --git a/src/Mod/TechDraw/Gui/mrichtextedit.cpp b/src/Mod/TechDraw/Gui/mrichtextedit.cpp index 6e2cbb06d0..b52a3b4f74 100644 --- a/src/Mod/TechDraw/Gui/mrichtextedit.cpp +++ b/src/Mod/TechDraw/Gui/mrichtextedit.cpp @@ -201,8 +201,7 @@ MRichTextEdit::MRichTextEdit(QWidget *parent, QString textIn) : QWidget(parent) // font size - QFontDatabase db; - const auto sizes = db.standardSizes(); + const auto sizes = QFontDatabase::standardSizes(); for(int size: sizes) { f_fontsize->addItem(QString::number(size)); } @@ -430,7 +429,11 @@ void MRichTextEdit::textStyle(int index) { } if (index == ParagraphMonospace) { fmt = cursor.charFormat(); +#if QT_VERSION < QT_VERSION_CHECK(5,13,0) fmt.setFontFamily(QString::fromUtf8("Monospace")); +#else + fmt.setFontFamilies(QStringList() << QString::fromUtf8("Monospace")); +#endif fmt.setFontStyleHint(QFont::Monospace); fmt.setFontFixedPitch(true); } From 0c5f476ad44a98f3b966ddec38876430c4fa93b5 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 15 Mar 2023 09:26:19 -0400 Subject: [PATCH 11/20] [TD]skip center marks for view frame --- src/Mod/TechDraw/Gui/QGIView.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index c0398536f1..f8de2bcd14 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -545,21 +545,23 @@ QRectF QGIView::customChildrenBoundingRect() const int editablePathItemType = QGraphicsItem::UserType + 301; // TODO: Magic number warning int movableTextItemType = QGraphicsItem::UserType + 300; int weldingSymbolItemType = QGraphicsItem::UserType + 340; + int centerMarkItemType = QGraphicsItem::UserType + 171; QRectF result; - for (QList::iterator it = children.begin(); it != children.end(); ++it) { - if (!(*it)->isVisible()) { + for (auto& child : children) { + if (!child->isVisible()) { continue; } - if ( ((*it)->type() != dimItemType) && - ((*it)->type() != leaderItemType) && - ((*it)->type() != textLeaderItemType) && - ((*it)->type() != editablePathItemType) && - ((*it)->type() != movableTextItemType) && - ((*it)->type() != borderItemType) && - ((*it)->type() != labelItemType) && - ((*it)->type() != weldingSymbolItemType) && - ((*it)->type() != captionItemType) ) { - QRectF childRect = mapFromItem(*it, (*it)->boundingRect()).boundingRect(); + if ( (child->type() != dimItemType) && + (child->type() != leaderItemType) && + (child->type() != textLeaderItemType) && + (child->type() != editablePathItemType) && + (child->type() != movableTextItemType) && + (child->type() != borderItemType) && + (child->type() != labelItemType) && + (child->type() != weldingSymbolItemType) && + (child->type() != captionItemType) && + (child->type() != centerMarkItemType)) { + QRectF childRect = mapFromItem(child, child->boundingRect()).boundingRect(); result = result.united(childRect); //result = result.united((*it)->boundingRect()); } From e3dcb24ebee908e7cdd71488bf3307aa31480aa4 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 15 Mar 2023 10:36:51 -0400 Subject: [PATCH 12/20] [TD]prevent bleed through on Detail mat --- src/Mod/TechDraw/Gui/QGIMatting.cpp | 28 ++++++++++++++++++++++++++-- src/Mod/TechDraw/Gui/QGIMatting.h | 4 ++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIMatting.cpp b/src/Mod/TechDraw/Gui/QGIMatting.cpp index dc5c1994bd..e5a3e06d9f 100644 --- a/src/Mod/TechDraw/Gui/QGIMatting.cpp +++ b/src/Mod/TechDraw/Gui/QGIMatting.cpp @@ -41,7 +41,8 @@ using namespace TechDrawGui; QGIMatting::QGIMatting() : - m_radius(5.0) + m_radius(5.0), + m_fudge(1.01) // same as m_fudge in DrawViewDetail { setCacheMode(QGraphicsItem::NoCache); @@ -58,25 +59,48 @@ QGIMatting::QGIMatting() : m_border->setPen(m_pen); m_border->setBrush(m_brush); + m_mat = new QGraphicsPathItem(); + addToGroup(m_mat); + m_matPen.setColor(Qt::white); + m_matPen.setStyle(Qt::SolidLine); + m_matBrush.setStyle(Qt::SolidPattern); + m_matBrush.setColor(Qt::white); + m_mat->setPen(m_matPen); + m_mat->setBrush(m_matBrush); + setZValue(ZVALUE::MATTING); } void QGIMatting::draw() { prepareGeometryChange(); + double penWidth = Rez::guiX(TechDraw::LineGroup::getDefaultWidth("Graphic")); + double penWidth_2 = penWidth / 2.0; + m_pen.setWidthF(penWidth); + double matSize = m_radius * m_fudge + 2 * penWidth; // outer bound of mat + m_matPen.setWidthF(2.0 * penWidth); QPainterPath ppCut; + QPainterPath ppMat; if (getHoleStyle() == 0) { QRectF roundCutout (-m_radius, -m_radius, 2.0 * m_radius, 2.0 * m_radius); ppCut.addEllipse(roundCutout); + QRectF roundMat(-matSize, -matSize, 2.0 * matSize, 2.0 * matSize); + ppMat.addEllipse(roundMat); + ppMat.addEllipse(roundCutout.adjusted(-penWidth_2, -penWidth_2, penWidth_2, penWidth_2)); } else { double squareSize = m_radius; QRectF squareCutout (-squareSize, -squareSize, 2.0 * squareSize, 2.0 * squareSize); ppCut.addRect(squareCutout); + QRectF squareMat(-matSize, -matSize, 2.0 * matSize, 2.0 * matSize); + ppMat.addRect(squareMat); + ppMat.addRect(squareCutout.adjusted(-penWidth_2, -penWidth_2, penWidth_2, penWidth_2)); } - m_pen.setWidthF(Rez::guiX(TechDraw::LineGroup::getDefaultWidth("Graphic"))); m_border->setPen(m_pen); m_border->setPath(ppCut); m_border->setZValue(ZVALUE::MATTING); + m_mat->setPen(m_matPen); + m_mat->setPath(ppMat); + m_mat->setZValue(ZVALUE::MATTING - 1.0); } int QGIMatting::getHoleStyle() diff --git a/src/Mod/TechDraw/Gui/QGIMatting.h b/src/Mod/TechDraw/Gui/QGIMatting.h index 2fb1acb80a..5b3df6baa0 100644 --- a/src/Mod/TechDraw/Gui/QGIMatting.h +++ b/src/Mod/TechDraw/Gui/QGIMatting.h @@ -62,13 +62,17 @@ protected: double m_height; double m_width; double m_radius; + double m_fudge; int getHoleStyle(); QGraphicsPathItem* m_border; + QGraphicsPathItem* m_mat; private: QPen m_pen; QBrush m_brush; + QPen m_matPen; + QBrush m_matBrush; }; From 5247b91a63d5dc98f2a82740b28a4496b85f7601 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 15 Mar 2023 14:11:02 -0400 Subject: [PATCH 13/20] [TD]add wait for threads to Dimension test script --- .../TechDraw/TDTest/DrawViewDimensionTest.py | 78 ++++++++++--------- .../TechDraw/TDTest/TechDrawTestUtilities.py | 13 ++-- src/Mod/TechDraw/TestTechDrawApp.py | 1 - src/Mod/TechDraw/TestTechDrawGui.py | 2 + 4 files changed, 53 insertions(+), 41 deletions(-) diff --git a/src/Mod/TechDraw/TDTest/DrawViewDimensionTest.py b/src/Mod/TechDraw/TDTest/DrawViewDimensionTest.py index bba244cea4..4dab44f35b 100644 --- a/src/Mod/TechDraw/TDTest/DrawViewDimensionTest.py +++ b/src/Mod/TechDraw/TDTest/DrawViewDimensionTest.py @@ -1,68 +1,76 @@ import FreeCAD import unittest from .TechDrawTestUtilities import createPageWithSVGTemplate - +from PySide import QtCore class DrawViewDimensionTest(unittest.TestCase): def setUp(self): """Creates a page and 2 views""" - FreeCAD.newDocument("TDDim") - FreeCAD.setActiveDocument("TDDim") - FreeCAD.ActiveDocument = FreeCAD.getDocument("TDDim") + print("DVDTest.setUp()") + FreeCAD.newDocument("TDDimTest") + FreeCAD.setActiveDocument("TDDimTest") + FreeCAD.ActiveDocument = FreeCAD.getDocument("TDDimTest") + self.document = FreeCAD.ActiveDocument # make source feature - FreeCAD.ActiveDocument.addObject("Part::Box", "Box") - FreeCAD.ActiveDocument.addObject("Part::Sphere", "Sphere") + self.document.addObject("Part::Box", "Box") + self.document.addObject("Part::Sphere", "Sphere") # make a page - self.page = createPageWithSVGTemplate() + self.page = createPageWithSVGTemplate(self.document) self.page.Scale = 5.0 - # page.ViewObject.show() # unit tests run in console mode # make Views - self.view1 = FreeCAD.ActiveDocument.addObject("TechDraw::DrawViewPart", "View") - FreeCAD.ActiveDocument.View.Source = [FreeCAD.ActiveDocument.Box] + self.view = self.document.addObject("TechDraw::DrawViewPart", "View") + self.page.addView(self.view) + self.view.Source = [self.document.Box] + self.view.X = 30 + self.view.Y = 150 + + self.view1 = self.document.addObject("TechDraw::DrawViewPart", "View001") self.page.addView(self.view1) - self.view1.X = 30 + self.view1.Source = [self.document.Sphere] + self.view1.X = 220 self.view1.Y = 150 - self.view2 = FreeCAD.activeDocument().addObject( - "TechDraw::DrawViewPart", "View001" - ) - FreeCAD.activeDocument().View001.Source = [FreeCAD.activeDocument().Sphere] - self.page.addView(self.view2) - self.view2.X = 220 - self.view2.Y = 150 - FreeCAD.ActiveDocument.recompute() + + self.document.recompute() + + #wait for threads to complete before checking result + loop = QtCore.QEventLoop() + + timer = QtCore.QTimer() + timer.setSingleShot(True) + timer.timeout.connect(loop.quit) + + timer.start(5000) #5 second delay + loop.exec_() def tearDown(self): - FreeCAD.closeDocument("TDDim") + print("DVDTest.tearDown()") + FreeCAD.closeDocument("TDDimTest") def testLengthDimension(self): - """Tests if a length dimension can be added to view1""" + """Tests if a length dimension can be added to view""" # make length dimension print("making length dimension") - dimension = FreeCAD.ActiveDocument.addObject( - "TechDraw::DrawViewDimension", "Dimension" - ) - dimension.Type = "Distance" - dimension.References2D = [(self.view1, "Edge1")] - print("adding dim1 to page") + + dimension = self.document.addObject("TechDraw::DrawViewDimension", "Dimension") self.page.addView(dimension) + dimension.Type = "Distance" + dimension.References2D = [(self.view, "Edge1")] print("finished length dimension") - FreeCAD.ActiveDocument.recompute() + self.document.recompute() self.assertTrue("Up-to-date" in dimension.State) def testRadiusDimension(self): - """Tests if a radius dimension can be added to view2""" + """Tests if a radius dimension can be added to view1""" print("making radius dimension") - dimension = FreeCAD.ActiveDocument.addObject( - "TechDraw::DrawViewDimension", "Dimension001" - ) + dimension = self.document.addObject("TechDraw::DrawViewDimension", "Dimension001") + self.page.addView(dimension) dimension.Type = "Radius" dimension.MeasureType = "Projected" - dimension.References2D = [(self.view2, "Edge0")] - self.page.addView(dimension) - FreeCAD.ActiveDocument.recompute() + dimension.References2D = [(self.view1, "Edge0")] + self.document.recompute() self.assertTrue("Up-to-date" in dimension.State) diff --git a/src/Mod/TechDraw/TDTest/TechDrawTestUtilities.py b/src/Mod/TechDraw/TDTest/TechDrawTestUtilities.py index ec9ba48f26..b65a634645 100644 --- a/src/Mod/TechDraw/TDTest/TechDrawTestUtilities.py +++ b/src/Mod/TechDraw/TDTest/TechDrawTestUtilities.py @@ -2,13 +2,16 @@ import FreeCAD import os -def createPageWithSVGTemplate(): +def createPageWithSVGTemplate(doc=None): """Returns a page with an SVGTemplate added on the ActiveDocument""" path = os.path.dirname(os.path.abspath(__file__)) templateFileSpec = path + "/TestTemplate.svg" + + if not doc: + doc = FreeCAD.ActiveDocument - page = FreeCAD.ActiveDocument.addObject("TechDraw::DrawPage", "Page") - FreeCAD.ActiveDocument.addObject("TechDraw::DrawSVGTemplate", "Template") - FreeCAD.ActiveDocument.Template.Template = templateFileSpec - FreeCAD.ActiveDocument.Page.Template = FreeCAD.ActiveDocument.Template + page = doc.addObject("TechDraw::DrawPage", "Page") + doc.addObject("TechDraw::DrawSVGTemplate", "Template") + doc.Template.Template = templateFileSpec + doc.Page.Template = doc.Template return page diff --git a/src/Mod/TechDraw/TestTechDrawApp.py b/src/Mod/TechDraw/TestTechDrawApp.py index da99918af1..c547488327 100644 --- a/src/Mod/TechDraw/TestTechDrawApp.py +++ b/src/Mod/TechDraw/TestTechDrawApp.py @@ -24,7 +24,6 @@ from TDTest.DrawHatchTest import DrawHatchTest # noqa: F401 from TDTest.DrawViewAnnotationTest import DrawViewAnnotationTest # noqa: F401 from TDTest.DrawViewBalloonTest import DrawViewBalloonTest # noqa: F401 -from TDTest.DrawViewDimensionTest import DrawViewDimensionTest # noqa: F401 from TDTest.DrawViewImageTest import DrawViewImageTest # noqa: F401 from TDTest.DrawViewSymbolTest import DrawViewSymbolTest # noqa: F401 from TDTest.DrawProjectionGroupTest import DrawProjectionGroupTest # noqa: F401 diff --git a/src/Mod/TechDraw/TestTechDrawGui.py b/src/Mod/TechDraw/TestTechDrawGui.py index 46e729f91d..3c9d18d041 100644 --- a/src/Mod/TechDraw/TestTechDrawGui.py +++ b/src/Mod/TechDraw/TestTechDrawGui.py @@ -25,3 +25,5 @@ from TDTest.DrawViewSectionTest import DrawViewSectionTest # noqa: F401 from TDTest.DrawViewPartTest import DrawViewPartTest # noqa: F401 from TDTest.DrawViewDetailTest import DrawViewDetailTest # noqa: F401 +from TDTest.DrawViewDimensionTest import DrawViewDimensionTest # noqa: F401 + From 0fcfb2206ef7dceaf00b5fd5993b72667fdcbf52 Mon Sep 17 00:00:00 2001 From: LarryWoestman Date: Sun, 12 Mar 2023 16:40:39 -0700 Subject: [PATCH 14/20] Path: Updated the licensing to Creative Commons 4.0 --- src/Mod/Path/PathTests/boxtest1.fcstd | Bin 46614 -> 46372 bytes src/Mod/Path/PathTests/drill_test1.FCStd | Bin 32244 -> 31979 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Mod/Path/PathTests/boxtest1.fcstd b/src/Mod/Path/PathTests/boxtest1.fcstd index 3fabd30289fd5e815526991c6ece7400d6ea10f4..d150419beffd3796df29b63790d57fca017f9e84 100644 GIT binary patch delta 25092 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 &e{*mSHvStt9EmVB+vmdX~M zM$e*ZNfcx67pan`G}P77=ykZYaSq{>o~P6Tl&SbB@=5{UoiJK=&mQSIqA`VM3B^ki+38n1 z@Pl5Kar4IPo4&}C{|=(ba#16EVz+$OW+y<|d#-AS&F z8R*Ht&21>&!is@s69EUXs!)qY8O;#t)C|JZZ^dUx$qh@c{I?EFIQ*nB9&ZMz z%cc{w8EF&wmM{*yWZ(y-1ky5MgJJ>27%4#)fOd?SpqjuCMm0b!rIlC|$wyBXLlq1T z-m$*oI{yX_xBi`T%Y_}=MvYi((v=jV%hp2lW_^cT)RA#rj;tI9cwNVblrDn$pUpdq zfs|d_iJN9KkNrV=xjAaQ!JDNm=1xbsE<~x}Vy4a}o+m!6%)VQ3&D_uqPnr84Y4Bo- zElGx+1iBVgz#xE#8iGA{n@$FYz+6Lm!T?Fs9|D4;;n(f}3vhY|X(P5fOMKd~2e)xe z94xH6{c_GAPTkgAKK+<$m{BzRn+{*l!FA$c7Q`FV7tI#^-cJPW8Dg5#r6ft|Z2$J6 zV%H*5dD0oPawW7!MCV zx1*eM?0C4fZH8V2J?ySqidE$kQwDE|mlTcBs)sV^l7Ga~@g@0M0$Ip@HqV`f)pNWY zRmXI$33xmaq1ox3H}&hdy(Z)L;LU5JN7JD6b%7GeSOutakWL^p3qBaQIq(MyHDGlk zUwnCH-vK00TuQBU)R4r-ux#_MSPCvck`_+j4U;`|;bK)Qqin`5FW%Uw+#`*!aYKgA zkt=vVVX@C3oMq*7k1jytn%#oty5cMjTcB1dmo2W_Cz0XC_pkLFUdnNnjwv06}FTHraxM&b~!2+;uW?j?^^mUBu0eHfyX=P@3uupAx=1|3{#P~m zCogIZhhBtKEj2vtHeAgY2lCS$8g{3(ZIVtRB$`tJz&Uw!r=3Iq@UrOF-xO>)@#3=9 zXB|n!zXUaK@V-TcAqoI)9Hrl9-)=|~+Uo`uqZZ&=f9rxw&du@QsH{b0Gh2tyt@0LS z@R~=TZh8?-u5ONBH|gN);oYX-FGVKKWY_<^d2t#?#S!SsaQxgomFc^^ysB$U-s0%f8djreiiV4PYw2F~FzUj!WLmf(Y@e2;|1x03#fa=PRDQb$g zfB0YRpqk|R{K(C82loS?TT9E z1l8(vziJzUSN)WczTMKp7DnC!Gkz z;N8aySqydcS3zk)9TG5R&wPGOZj>e|y2@LaO{YAT=F#j6D0MC&h$zRgL;Sdpz(Mau z-A~{K%=EmXnes;)+B4qO2ZRN}sFNMZORoLlRnn5+ls`ydjmZX-MnjNpI< z@F*JDk&~?OCG3)U-o8dT;rL^D5;#tQ+KB0KVm(nP+tzqGh-^7zK^&3<2bNBoK1o4~ zjk-BHVnQq%-Yl^pURf&x6z$$L}f!M zKO?uN$0V=|?m1jLwWt1^40MT24NB<&us7DLF6WKaRkXKj%Eyb)ks-yFBC+2jde6Y^ z+y;IK_lcP>#OB$>e%P%BpQ_BEsX%^qz6i%9rpA@~N9=q{xQP1o4HhpG_lNa^D|Sb% ze@+C=S>I$EgFcj6%Q^z{Lx87oe5v*d+f$NATptXaGn)Ay3nvzf$fT?dKnKPa7ZnmNDvCuVi_S-*uN5M^tDP zd51xwD?d4#4rR-j{?RYDRE3`-}`j+ zpAugG#*fpl$Aw;60^pz@Z5K{=a?((Fn&_8Cg=j^gc>yl|JnqlI(8uxU z{Kb=JQ)nSBnrBN}sw?;WVtO1}vAeuNnqdx3l@T@0g3Kt9_sVg?KZd;*8w3XodPTN| z()z2Z27V-|6E?&_qGOL{Lg7MS>4>zg&Yss#1O93%->>}j zam-$Sv1u#(w-(TpcFR1g;|s77LI{hRt8ZAl(>X+-EhhQ32hACZoMXobE)xWXd&An& zZOT@9GAO>mK(80V`fe`zGc8Z#ia&rmt1$e2Td&T_o(T=ZMvLm^c4k%ii*YY2QaLav zKWIKNRq$h6@I}DHc*J}UK-8$svu@63&1L9l?Xta4V8Su#odsXwg>)l-=K#N*&{0nCYfbbv2^FA7xhZ6U^3pTa z`cn!3?YL?1H1Z3YRba=S`1&tyjms2WM_ZIk8mi{PbmU-wjoe1ui{*M3aC8f6>g8un zRo^J|#X$@&a!RK=lUy3}v+PVlfwTeT>HsYip1aOk8&Z7emu}^gV4NEiSXiI}PZek* z@Pmf~GzrMY+YSbL1H9$M_$D(~%MFC(v%@Xl9R7r7IYxXFgsX;UZhv%YuPoq8$ep1{ z1Sayafi?q2`2=ty>#f1g#X8k;e3{WO!~+D!%0`|0$eaU|^MSR&42fh4Rltj6E+XiEYDy)!(WBD7R)EVR>#Ff9CN2TIeuLsQ+bOgIkSv!V^> zg|~b34A0+w%}=f7{7MzZNZ8(2^_k=MGym5?*cW8P;SUDud%H-*%^ zO{+~tTUv~PCmx#ooE}j#cdkJfa`NV2=CRKvtQMsy>l6~?I_E#AatnFkEV%sOrwRb=BHH3O*bb>|7_5>NlC zp)7PyIv!7yd8h16?UIAEJWL0Pkg9}Uq^E$G-{9=a$4SEWEr?z`QgJ#^z8OnD$&*J{ zgyIsBK&ek{s{!6yn6RI7jGE8&mbeE57BDJH z>?%gKU&I^{C@t#D@ppP@0a6oApS5%ve+^CGWgXC{BcRk^E!YMH2mnVj+fM&eL{+LA zqa(nCS7M+j@a%AX;xRU}$=tQ*(1STI-$B9E)np~* z>@|^#pp(-=H?y8{Oot!Wcd~$9Re$J-7O6RX+jQvZU3YKmv9(6 zKQf^_ljZljq?WVC2NtU?WPBceM!!y(ORr#NFus3axeYiJMSu zGTKlQ^jg8j*JT<>rCx`5+z)1cUlFGRn7{Dx{NHaVWl~%8<}~~U0zrvS{E#Xr@Fq7t zxy0;zxHX}64y8E|^-i{5I8G<2a@C*S-gt;|ljyTIGGBePm~@-7vNv5AlsP1JeP2tN z)%W^-JEAUE97eTDWtYiw<0wg1aJMLZ)|81Wr%%#JyJ4J(QZuJrz@@DEo`;A6IA4Dq zpp7|?s>-JlaY+Z%4N0;cn(K{O-}iF-Mk&SR~6wjby{*7>rfdPMa;# z?WU&(p{p@%%xp$u;A8+V4Ftus{|}akI~Gh@x9cZ#h{$m+gx*uj`y8k){U0p3ZLq5- z`=xNsmBwIh_YCbERH!Ar4FZdl3fw>jM+@QUQ^A`aCOu|%*$A%_m{k*p1Oyo856lqx zWTE~~0$yl$;qXZE2v*IC1+vr<%+#fG9mLh4^U~!uA>u>2mN+2IqzrHM4~Sg+1(Dy_ z{|h2<{|h49zE}IAs1$CWP2`CZe-r(>HH69HcYleNi>hIAQ;c^)OLiB z4qW5_5hIk-r+eS^2(VRnE9kI7p=>o&^#um@u+kxjkmy9glY4gp#YK;uFpDBz4JCZz zWq!0NhFR2+ts$E%f7&gcXF*sf>M!ylk865(;_&N!?<*GAFn#!Lxw%%6CI5Tp@`)&S z9JIug4(;wd(_(DA`|1GQDkoCPU#H7`qhEV~IP)F$@>16A%z(k4!d~Ao2rSKQCBu5_ z@5gCY293=@KldIL2DRY5xLQH?`Lr^wAnvi#2wSbQ)J+JI++Fd;GI zoJam&8u7fEEVb151<;R=%`S`oA-#kOp5NVn=8v!G?nuQRw#rXU6bmz%qF`(#2#%3N zoB12y4~)^x!T1P+*K_>Rs3&$xksn|ZOwZOO^r{;7HW%*mOHLg2n2~+?^EWMbaN{fX zU_)wWUN*rUOGYWc3nnNPZ$Tx!%t2?+2Pn~lUz603R&)7R0ZQSH`#-bfI;{ye;yLgw zgxa9lZvHN|K^hVA%Xckwv|~C{hmizgfiS`9=3QbmXh1 zPJ(s{QkfMi+2XrltnlB++&7U)lmH6r2h=0+5@L1t_v$b?$|~McX*Il)e^PVKUGiQP z_4Rz@F(g4=2*|sm0P((|B}F^-hxW>b{W;_9o|EQ!2u8yMXWWrbTmPbeGxOfEkzT+` z1y8S7Ve9r(s5W_}{HScw3x?dcDa1whJ10{I|W+RQccSsAjkS7EtEY{}ycK+XNe`#hBXefCcyM$i8mH2{4I|NCklf6xD#w+3lK|MLgLZWvjB@h%uZy5RNy zeF+WhKTpo?(T(Y`fI=bo0QdaKX5VXrKF2u6?$k|4#r%iZZNj#eRV!euRCKrLuar7& zXhcCY@3{MI1*KmkeUeJ0mNmQ&Vzre?3uaSn$GQ?9aI~mLF74y3wCi$GLC8Cx~^J9V2!sq<_i^ zOj+NCt%|)Kw`^n<1G;C&=K_{@Jv*Xo6ZIoWUTjJIvS+x@x-DD{G`7S#@ZNp67_;Vr z900HHKA~P~lI}U1EnywEb<0;gNqsvn8z=u?Ay)wvMHjYr7Z4T!L6Gi{1`%mVQCdP2 z5KuZKUFlj|a>1PMiAm6r711^h)n&;QRkb7tmHRmZ}_EibF3dn&gMgnh3R6$rncpB_mtD>A*DKML|Tg;CuYo0GrY2rdpV}9 z4Jl7UW=6hhL(#1UcOMZ9?Z_7uMn9}nA?gvz2zG6ZTo1*oy>V!T?iwJ>pj&>#POsH) zX}oH~$%Wgw4Pl5z(RsZmAfDM!0%}yr(T$N%_${p7370Q8`Q>#4)d_BSlT)r`qs^O# zp{@{vpwfOTYvH-s_s6w^N`2r$OMkeUT&#T0=u?-&Z72_Wr!&(nw}vd4YT}<$fs{?! zM)sY&<$jev2&QU6?bj5mcG{?w_V~(ZFz=^fzMB#K?(!jL)>kPlnNn}~OG<9Z*8v9k zm&4aB50Gb`;aA?@Suxcc-*z6Wbsyih;W+Y^+wLa%LUaA{mcHqd`@93K?My!4OXORC zb%-dgatzcsqwiMK?#H<{L1px?Ff2$zaNht|RVMdK{3qDtJjpaePs8FRZ=KNkN_oC( zlNE$I;`d=k#26=6MUR2e%P8EuI%BU zfF2|(@%U%Cly1sXEMGIpIUY}Vx1Uk)TIt5TH!V7}e2=H7(=&Q{3G|emZp1I*30E%l zkSX#0UBk77I)WNvs+b3x(pMX>FgISp2e+FAgYvH|XaNYd!$_YPig<={th2WbOuPC~ zkD5!|#+-H%D3O-&go`RssEU_Y2;7r(GIXzR=XUpBl%4lEdS1UvSJ_#&p+hLm$FJE~ zp%JMEwO5U8RU_BiDGcw3h2QnDEB_+aUPqeBknvf_5mL=}PtSd+qztsW6={kw3QnWN zIVz&kbd)Lds=qG|aj`8LgRD3M!anFuYxSjktmW$(jomR9{kG`x*}lfTKTs*jC!z1^ z$ROP-DE1>J@j$qE`QGKjkK+a{FWrl$*NCrvg!&mssw()kG-C?mu1Ye?wYwTW)e`vp zwz#E^*HmnYDtHoh3C&kDrlB;ygyhD3Dxoa>#_)(c%hx=)G$54BZ$b&WWzl!3smN#U zC%-YDu7DE!;JsAeT<_kEZcY*Ia9E>87w)BS)1lUv(C7=6LX8My!%w^K>lfu)6iZ<0 zxHPD^kS`+Ng6jb@R?`Lu-!q-LTPe4RrL<`NXb?gu`-F$1QNeNDHH=E_)B3a-DBBo^b>x78(`UY6sw>94a1Hx7GQeq}4HRTaF{ zc{m#LFc!<}BwSf!8&Q&DlaK11>CzP}vF0uLDM@>ZE-D=RXp?oj@r5gx9|66(WbGuGJ^|7MlI68=x?-8W^wXRF3 zipA2lebSob<7r-#1lPJ;8aR)5_0jlR-~>~GztVRP@mBLxkO2>NaL_RQH*JmN>m;x? z^T6>Y1!j|~@unp07XwkH(1lP#eqL7)*S$Bp4ZEfC%8k7tYvv8ID))`0$(%#jJ7V}a4jD+hH+G}9okK)`7Cb!B z8e-7ZgfTE#cPX<&o;xBT#W%A7Vz%e{j5(Xd#^M>8I~@VWvy^SWb+zaRX>SgpimGAP z{K}%HGCjo|dRY<954&_^N>_bKnpOZhh^#!Ic*I=E;Cz?ZRsT6Uy}Rc#*Qg zc%N_t8M6-v&OZne^@*@@?bCV{Lv<>9Y|gBp*(U|XD^o2?e(zl(+FySQw-)iwrgHho zSL<**8BL0(Vwq zz6kf*%tmmHg1QUt25d)87Ux;OO$czlE@Rc;2kPyWN@8c%RuauedqTbPE@u`wAMa;H z=<}7+%{;?anY6!MzN!@G2jD2W2`v1|@*>!zn>drZGg>l-12cokHx~b~nshXKMaV-c z9K}{AfhuC^G=S)j; z9lZe8)k_qs(vvDBrTv_fnlF?ItA$ERQ%ltiY?H*kSPgpaIn4Re_}RDk(4EBiL*Estuk6uJpqnmtmzlz6wQ)zx zMQ4;EWE|gX$JIH_sywad;`19)xqmRz6ZhVI!C<_-d(V2oUY#Z{e(2Gq@Z!ng8LjdS zYXMA>rV22;ZX0o#+2yd(r1~=7vHtfT^}0^Ux0X6CSFbx{1i6Z{^UVA#pc-~+T@J7@L$uQFqlax-m)MMeE^U0G(HRS8ZTRVhn zC0nIHGf;Y0hqDH|theUiX8IiY6tG0lp)Fo-0pla!vS*IagRu1)+?}BsqQPKUl@*v# zsWZYHBtd9#3tM7Xb+SSekk|?2LN|IoUu{DKgTnmR)$*3dj{Thd(ncc{MxsR z8BoNl@y)s(8*ff{GCdTm+ZIO_6H`_|97G>U<%pKBCU4!>HaAN52&CiBWE1g*ik!Ea zkuOD*!BrL%>5dVNFD?NF%42yjp$DvK#kZ*U7gfe}(pN=$Yy?s34d;m*(vEw&Em|)z zDECDw(1b^T_n|6R3HjKqet^*_LYe~#-rxN;aV*Tc3c2pnojUN@^74kp439{0$a|9P z4|MR<#%LFwVOD!<15PsmiTcP8$Fg{}FR9lf)cm7`Be|>vuAsB-gtOWs5^!1VW%HTk z^SR9gwiCx=Egnhus9N+msvQnh-)L;WuY3R>wOnSHwcdt`Th#^?D~CUS^;}>rb?jih z$8p*+fYX9o1?OZz+R^z}m)~)Yca(fj68o70e$M#Yw zO7x8$mM17Ev}NkBu^L2DFzFYz_KqvD=vEOx_Y-=<@ENIkKJ0MRu(Ul+AG#4b0rd2~ zYt_Nu2D-5eOy5l1$}Eh%TT2T|><@#J?W&YVyicfUYZ=X`LK`jXU@>?!A0M0(Q?VEHk^e!T`2@~EqA)8zP$stnCLy{6D===w`)eV={>L1Cf1l}i5z48 zG-(^l`Dld81jn1k1k&YenwJ}D_hq83p2Saw-Cp_a^@{S<_v8Yfa4e-@pTqMe96~@F z!&&IiM(BzlH!ul*+&5#*)0QY(1T87zMG!D)kd~>^s%#;^d4hWZ=~K4yWBI9EB^|e=A|h68lj|YDD9Vj!Cu zdc?^;AgTly0jguFq~K%CXV_qA%0ml0vISK2{PGOvvMQRH%og z<4(q_sGHqZ?>ZZt41}2N&{Xd;VZyBn3Fbv1#mXc=xRn_$*<)=`!6eqU$Jryaw+ zm_e}lYMIq2z>g`tq&1gD<&B1dz_4=@MPN)1g#Vc53Uqvy@2*AQy?Y0gu>y0Pu2R<*LlGkW&p z(Icv+nJ1QFGYQHDR@3~5_L$f=clu8BmVd|-iUc+tz907q3r?py} z;@>YA9Zha|nG$-ZYtUCE0llE3hS5!Xv?@Bb&xUF7wHv)(VO*;k zU)}OCZ$E^Dj9=Sbf zaw=vaes}c>$Hp`(qJKW+^>*fF6cb@vEk#QWwEyi@Zg31CTjL@zd!wx~VM!~R!tIjQ zo^&Saz1~ZxQ-$mzKXQVjC_&M zu+X^3A}!zIh071<3BNCLRY$dUPg;=F<@Y^%(zEm-LxrWRO#AL5Mr+8>V>)9N>Qpn= zh0zi~Hl=s;{ui)bwvoD_T8JqJq9r z{>Lv|Vec!{Pb+il%S{$$tns)!%n4WMKh|?6FRza!&TxI$_J6nV&EeDYp=cWJ>8dF| zHpFqEx|ltdhc7XuSH&N&$hBqFR9JZ?dUjOwJ~UUYCkN9F z%rSW6p+tT_S0R*8((+A2ij+_S@G*HON>GXjVq2b354;;6}i~{18gZh6tA=0Vr|)y#oXD7BR#RlAni7KOI`!s@rq9o(;Sp(x}qPxr74F)lV_<8_i&Ub>bHqM-6$rCHYjBTKZQ5Y$4JY?qRaL6 zsL8R$9MvmbW@yQ9BlU{Vh&HITV<}inYs;j+cDX?MMC zY<%-GOstvPT_z&BA+NySpUpktWCOabJZ8DNJcoL>y-0F!*z*(Z&vgk{NDBAaJNTxQ z8)qk5DLiK7X^E^JvSTp^CaoDc{ zT^1!7pP`YSo?r{xbIN~#?EW%EfpBD;fy_mNU!U>gNAXjzborNSY{mu1-gDQ)6VtF$ zez2bzmtcO`SI#7$DDr1su(!-SgYt6*zBq+~rDbAVJz2;67ZP^X1y5w*G!wumPV6(1 zLP(Mz!lf_&axJ*%iYy4DT8V%Rtr`3DyUhRq9`Yz{Zen8p!uXDjr45AV1}a}pv6(eA zf5#Jo)4&w6&#BnJX;FpKb(_HVCOI&ZY-%FGmJ>m=f4Nm(bVHoG$%H(@gn{AIS373* z|Lb(~EORz+K3o*%|NXi&tQ5{kgQ`Kh2fkko0su@%003O1ieFoWR}$3*&gx_okAIE*%z>WsN$E;*1Nrt_=l zjx3hJ;&bWFt~Tb93t<@}V?u09%q@+%tPTG!zJGE#hT-R(gYe{$1KDAUd8DW5xtP&E zUDQo3&=>d@ea-#NU}~gZTI5dnOE>aZ;UxfT$~#}gL}_{%m46P76bu4c!9?@V+e#Oi zfP9!!KJ}TzMC9e`b}%tJ5?Eh8&RN|I(!?9~BcD5w5AkUQ}op{t!>15Tu{Bzx7Xaq#HAj=S4fdf7$)GbH5ChnokTYg3Z2S{Jl#0DW6yr+ZXA6*8Vqc z-28vKz@Pa6`N5tPQk~vLXG^O9K*l-{@TU~rwQq)Xl{Krz(_(M`p$p*!t{#BL0ieN`>)UYhRtho5K9Uy_%+2@>maW)=%oA| zhUY(VK9!L(Mk4K0Y|O3gP6xD8y#E>=mym-xQecurzX3o;DKNL9a{|afAf8lMZ4vcp z(os_uY_^D)&NTJUEb#t^0*Y!P(&|se|FuIQ45Y$riq8;GGaC$8N({t+6&9c05vZ&P zr@@wsf0F{+q@AmSA&N=Pl0#EYP6tO;UmVBz{>2M4nFdQO`5g>+1vXhib1D!u=b;3G z?xw@YN`EJX!72T3Dg6Hljgs;j`E9DwGbyM^5G4h)kPaKT5DP?_0mCl)4G&hz_@xEE zjO3ICYCb&8vk&spMLmN50YxRJDg*ZRLO{@J2JE=(yw6S{uhV71M9MFSQP2EajL?7L zBE?7qBJKX_LjN)Rdlp4@`_rw$t0@zFoqbUA>A!D4jO;&?$#e5xszE~8u(Zkx iJZ-XJGnEX)IY@7Oz&(hu@f}HNT4@_Ydn;pWyZ-?JRFXmf delta 25477 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 oXP(!|i?(^b diff --git a/src/Mod/Path/PathTests/drill_test1.FCStd b/src/Mod/Path/PathTests/drill_test1.FCStd index 382a4fa2cf46e95eae0e0dd557277a95566afb5d..7a82630b5254a238ca7a8e8c99e5476c5e1fbd4c 100644 GIT binary patch delta 20806 zcmZ7c18^Y0{sjuhwrzW3+qO5!#D3zz(&&pR}$EW6&ozqU>oq?Pnkcf6&yxl zHy13j5oZi|u@M(i4Qij#d= zOM+}u4T^u|*2Vy~t&Pr}rjcn;yVs$EY^ZBvCt{u-rpbiYdVEpafh-wqfX{c3kD28j zn00FN_d)9|ovjAZI#vkjFb!sgJ9U(t&m#JudvQwd|E!vELK%OfPi|-GG z4sOHLSw9?nS&6h8&`Wl%5q+*iJXq>}9iL=QVV8=iGq)4|-ILGP257Aj@rIikocTS! zqqo8@QW#K@c?=-t1yVib-;L+=@5wZkD7p{zM?ZEWKPTPb2=*sbv;@BIdP8zWb@R@d z8aRp-e?BY}mTabsx#fJZ;0r4W2JBoj=WN#ILiaed?@bir`@esF4fH>&((|*a^!TlL zPTU0Psh0#JB`8Sgf{C9bdV}Ku&4h4Rk-LoL(?YsKm(-qW6b*2k*P+o|yLK69h1Ty! zz=zXjU$rliecxg~*7vzk&?ERH;cE0X72Y{-j&wdnb;pIJ{uhFUORP<2Xlm(l;&O*z z{E&XRHpy}tR?s7Ifld;gT=ojO%=xva}uW z8Z9UnKlfz|TMEY1eaXCJ&ec>us-L;&Ex#oZQVDTDQj7D)mmM`n2Vg2mjlDReUolFi zPsWT(t6kT9#EbK*qEyIH+V0$)e7?vv?F@io2 zCWxeha&|Bn;~3Pyb|29x$BAN&J{Rf@iFgMOjn8xVxflC*=f8I__i=d%^$~H=`{$Nm z%I}sko~l+NCrZfoDS(nzTwB_j6!6Wy2k-^-C+8G*Gr+?F*VO>I8!yeD^B6?CYoVjKwJ=q{} zaB@F9jELZ%G}$tN#xlkg5!pEs1;k%J`-&N(2nbzMLdQBxfN{_DBKSVaj51IXTo;4c z#ktQn+MsY~=T&|7>!7AYw=0Sjvvf$!9|s%vBLY~>cTd{q#v=~Ly1a!^_=3?nlY<$F z@UD+e6cQ-6VP!K=9}S>5KYo7^dE8DL4(QOhA6W$96t7)0@l`1*riBEA%SB9+87Ihuj!`5d?F!5(BtpvMlzff)untfZa^h@gW# zDSoP0N3!kNexi*G_in)l;i;6*9M zOluX@Gk&5ud1!ZIfgpSK#h-ieQlva>*foGSo$R`*0U#^8L!1QT+v1>bW*ITx;3ewa z6HvB`1$rH{oJN1a@I7fDh7JwJi@LT}*k;Vbl-O1^7{=tV3-XIlv|E{ffg)Y#+<)fm z-~6?b?QWsi`A^%!zzf~_A_CY7!u^rK^Y&(c>8I=C4sQeqV@6Y7WS`YfCzi{hhz;I+m|FX zh3+r2u?%8Y!(GY4m!8P;ISK^W%Y<`coh1Nw-kNi;anECo6ATa%@9+{S$Rg#II^2y6YAT_%ioDVL&(ZAc9n~6sO?@?8d^O_UC9rJ8GZmQ zb{5dHCK?l)ue(f)i%I-~lxEfX8?;+pVvo{<8IxDXn^J!V?TPzdRZb(a^ z>~l012;A2Ps?D0$2bwu9Mb#r){n|hMJ8YW0#cWtEo7z#3$^JXZCi%Vl=PQbpJYPcF z6T|gEa@!*39P3N1Y4xV*B5NuaU^8}-bDAMeCa(D$Wo|u`$rB<2D$>KasT@ z^U+Sw8g#0KJt23VwHnh)JX}KBHs<6W-!H;ZudwkVt~oR-GvfOY&|21lXF|0_hgA>f4;_ zxutvsrw3gD>1*hMefvH)v*)u5iXFcm?(<0X)3(MT93S&@JL5L`WeqXEsSBqHq#zbJ zQ}E;wiSm3!3Y<5b$rRq`=ZPpefzCw7>2OpeQI}7dMCPVuao@}A74?g70h7xuAwMt)f#S%w z?0}B|6&w)NTkbXiZXW`cA7g_c)89_23edq(BfrZdK>gMJ#1hp=AF!VhWrFXU)HcUY zQLk7E9jjx|*6_(rYxXtI9pFn(>*lcqy|pqTn?8+!v{7SW%gSC7X*)LuKx_e@^fdAA z((9sCgmR$rEL-^Z zmu^Or1NI}Azqd4dvJ6?w7r+|tjb?)=J~b^?S@$HaO>|$M5z^_SAk{X zyDFRxN*ME_)3)i(A>W5w@Tt#{1B6wF`}&3Yih1?oX_MQgiCDPz7aQ0f8S_yId60iM zND-Vw7JxYNjdVy>^oPStIM*tC$*c!6BvS(yq}X3SVU(@ECvYR2nj^dBkui;DgnS0< zQ{jJ6B6l_AWPxy~q1=+(4K8|eO(Jqd57PuWUOViUB6L6d^ffW>+thT?HqzA3>_rv| zw369Z(JTf_Mi&M6_MUii49PhH6*7<49!=>K7xFb! z?R*8Tgzjf>maAJ0)fn$ai*37eFf5CIX0y=dK=6XoE2eLSjfW$b!K?F2LLpdFwr&B8zHP_O&4k9lVr3d-Dev{ zc(s^xqDf41Ip3jZ<>Pr+25Hn3egYTC+Ap#gZR|X0zdbGp?`0?L%Hdd1i8)pkB@7a+ zi3+psl*VCO48?hgFs>wsa7aDhnpzCz(|@s2FXP9hAuIO2?z>Q;PXx8+@s&n`y)NgX zz=xas=&{G@p5j|G%^G;At6s_>gZBG8^>qoV9W|s4%+fN(#`2IZzG-SoEbM@!;T6SU&?-G2UN$}7AASK$r^tx(=H&?N{FGCn`eR8>f$ zxYtnsQ&@e^x?&IF`W7cZo>?;EI0Zl>1~KZM$=5Z+@C)-&JMr$?pyhyfQ@Qh~%MSy4 zbr)G@*BnWS+^e?NEio@BQ$uJO`Ux;qNtz6fmzw$&g@(pKYU>usF%hiCbkCPreBa~K z(}L8HRv=YS9*U5C<|4G?YIThx&s!{;*~oP3)hDwSP~loNn|IB5+Q)?)4S>9L0aZK1 z#;W`UY^DbA-$jFJ1mTYotdO1Q_n&iVJb~b_b*W0#or^=uUCivfts*@=BR$Mc`a{E# zM|I=pTUQ#31TkUx_TahS!$2LOCF+CZFp$x%shlN_I?D}lsK28V7wB~9-7g<1~tnEuvv-b{8EP}<1@1idIgU2f(u3e1R=|D;j>*7Z zzV2@keI>d=zmsW^W^7yi=@nrTC>+XMv?C`jydr-pY#b4M5dJD8I?$#oRr*(2^e4b2 z>gX?805X>efrQb3gy_Sn1O0sX$HJsDCJN=FnG_~LDppWW(N&sDh0_#M;yipoX zf*!uS@ZKhGRlVZN{s*jF8_?@X8Ec1fNLb8gddScl50`)_&UYFSDn#Ev>OCKCW<2Fc zghC1Dc9Ku(;&ecnvpG7GH%S^rEK*g!wb;%i%PzgMep$ZrfrZsko2^bDvhNdkfZ?8Z zmQG~BLFr~;phH1O-+qs@LT_WTT??bnj!xqXAeM-cW)TS(*sq|D0z&P;wkW0q4T zR`G9+C`saW0S8D);*rguP2yKi?nThJhFICIb^9qDN4(UGx=Mz0T&wilYoASA9GWB- zvnp{!Gz7Pv$-#7xK#72_H|J&Vw|%#5^(@#wq9+zX_~J`v!h}>4AIaSIOuUrn9QRX` z+GJkcVBj#_pFC-x10z*v6T5Sv!xhyb>&VmYpr(Ruc&Z$Fe;zxHF__mi*OJu z>QCLnmSWP;J@?wG#QhncKr#FA(1S7+u{ri$p%v5R8o1R^^l=K|?!4Qf_5{5y|< zjxx2`{an01Qi7ZYZS=+m2`Nxj5x~h|7sV zM+gY?b*6s90pXskrY_Pc?9DLBKVcQ3IrI#tbZ zcLqA`0h1dS?(WW3OPl~)P;{))<(&8t|1+f(=^V**n+HMyD1}Rh9EMAjdCoEB#a$CT zp8pn162`$;F9f|Nf4{@Spzz0qoQse4Oli7*7a`tmJ>u1$YbC70vRB_7=!3!9OBhnB z$AtfY^EW;c%=HLY$iv&jZ#tQYA_Ks-)6szJ==dJTlEtv#!MW9M%e!f8y;{%)XJcAs zDQ1K zIpKwU8d@LzcI7PSS+eoPf`m8_eA)3!5^swHW&NbYsf0C+b}YovWP05H2O^<#JZcp{ zeLR_G0_@%0yn)4sbPM~_gJWKRExv?_66!t%Si#ldJ4MNVL@f$ZgUpjWj!~d7fy_KRJ}BwNV%o0p_xA% z;cfQAs6@W?tnqyD(iL2VuHp8Y(%)o2-kfa#HJw!DZWo)2PW|4J6OnCTFfkmV-px|T zNFF?9W>Vkc8>BL}=l9|~P`rf4EnMp1SKRB&HI(OXyDFJXp@OSwwRUk(5ox>CS(xGo zw&A~j*r5$UK{Ag?#XSu)1o4>G>|59Wyieg^zGrmZyjPkJJV1JX)UdPE+KCU39Zw^ za7QS%&y9=Rl6udQzTqyNz!XGKq$*Oj$G#}F7=CTB{*57X@BkI} zQ&zWVmee7MdokHug&&0y+sWg%Ok&g^T-M?fwzimN_Z`hPdYg+3o$1SNd`hs@GN1Hv zqS(mLk+RuAf-t9po+qt(P7M)~B&Y_92qYV0_)Hv+`uDy447mMS%B8VjjWZb%(#x61 zYLc@qA=Zoy>mx1zoZ>=kf1dvQ;*Fb?G(AhiD(ma8+8!4P9hlDqxBwA)(e($Eo@)e*5!OB>3=dP&y_3 zXUtDIox!@X)}*2p_x>V%F2o-tNO=8kxUXEQUYZ^q1T}vH0OQ>z7Y#lwG1H%2!$?uq zX}3?L&+hd3?^=gaI}ex1#jFpu_xD>iE< zyTqG&+c%H3r5@Z^#!+^ay8?e|K#NoWChSCV>;oH-==q4hDqtfnF3J(d<~pUH|M=BP ze%)nm7i>HMNJ-=?{Jn5Vp_$n1NyCLRMz#N2_Q&R^-A@}7&~-5JweU_meRX{D^>X}F zzG`kwxOFK~5YNrmhixc-ap~@k3bx=rLNh5#+>A>jNI$dZ{L0oPb;;moquB*@$@gN` za@61FjZ?<%pcH87{DSFk4y?6jkxswn#-EDeq04n>0X4QCIug^3tuR>5M?VW`jizI) zjR!yd&%OyGd{{!C^Ds9qhB!+qsANlZP0~Cn@Ta4QaiyOxyMMkb)E=stED#;Pl{xXhfE}zWvsls-% zGErA(FUGhfOQO_I1G1g)(;#zW+H!X{&8;W?P77#AL)1@$CO&)9;JD$=fw+CY$S!qq2 zK8)qEX5u3`mVggxx#XTcaiQFr5s^wgUYvm|aM3MF&(B~Tfeik{Ui(#Wg3pi&93`k_@OR8}pnqdij=M^gP~K+`iaBbwQX1qf^Z zu^I+JzX&sDSl*#N{hXvDVNs$?MF*pV9ovnb9ol#3ip7oOD6$>9a&7Dl*IEXUR(u(* zihVNkhXbI9eP|zVQ)?7aKhs@s-KY%S$%YuUmceH;0^yr@;-q^+VSP3O5Mx|%jch6e zW%vXSYn*+wNSC6kiTN%2+xr^b0IL4K#^8Q`cLJG=1COQr@CqqoR2OD74}6&(&JU{e zoL?{7D%sfibyTKF2J^ zC`c-Z@$tKL3GL5>cS5ygb)D^y4lvofAIZozdzTnurV?`a()>RfjB0r|**S=|bdjFd zKcj~B)T-MTY6{}(XKu%lhI>W2iLD8v=_#L3@rH|9H;1YUd55bC`G;d7=@)V0mG}9F zRbUURO*2P0+L#w4^(3a4fr_`F_`~GgL5)S<RmPK`iz?f@O6h@L0WnDVCsRDr%zcF4 zwW~_&`Mlwo8JfzLwz}ROX?NNxt?ocqeHHQdg==Od2Y< zZG`RWsO&#Aq9q57WtJ?@vE@hMiazwnJdAHf9I1^Tiq7wFfsGh4YO*>yiM-wnj!b3F z_Q}oSRxYR{JFS#y>#$@qL>mt?;<^e38RhLu+69@csB1%Nw`;+&hObS@ti?94Tz5G4 zw4C~p^nvCJp>E#9<+XplJy z=~2bhnNznyUM{7wjvVV#jAP4momj4i`+Nq`@z@$rcA6?xa7*jalSL3b(T_=j71`WM z>?E}^Q1&M&)mSiLaBHb!!zJ#YP_qQ=0mVh2>`|tfaWnuyZEWN{9uZu}+~xdIOfv65%nTSC}vN z-+C?AHK4s32uYJbff_h`6!#&E@O9=AH4t44aW~b25r?2;!V))A;Yo6pn`&)Ft&I%4 zJ#PZYX9(+uJe}WdM61VY79r+Jb*}-7oF^8!t|_UOaMF3Gpc3f3Mv@ob=KcJ2UQP5` zk!E?gLa}x=-v3nxv+Lx*h~4jWO9d^f>E#h8G`Zy3pzhXAm1F+~oZrIl1n>31w^?qk zqL(n&l#PFe2ly02Fi$P@*MV;9!CGS` z@9S5K8o}rEzlxF!1||L^X9k;XOl%?-0ECId(pi-8hc8&1^N=`W3h0TDA~|jp9uPjY z)~G;q%wn-=3e;*-60JS!(tDGu`$O3lEz;+ya?vsftAcqm7srqr$orBcq?In{);vB> z8L(;u{@6+{LEguGlR%{DIr*do^)#BN%;LQ9VuZF7->+#^cj+P`O3DSRcFE-zWJ+c4>%RWO?4`*}a@&-yiym`=e7ikCP?Q3(d+ z)c{b^g91?~R$dg!63mJ#plICc&nT`4{KA{^qvv7VW%$#3Ya?y&-KyMEcKec*-x7Ya zqChv^LF%O8ioh3(r=pd5c zVd%4)y16^PYDYyTj*aPm;h%R~gPf-BISQc?ZUetc8b8{M7>_^LmEq?aL!gBI;-QSWtW;(&D{Del9l-E;c z7Xu3Ew7Nvzz90TdW>lu?Kadwj1~9pw-L0AAI|Frb3b49+^6^t$g3_%bUjBR}(XecC z9l{TQKRo64Vc;iC*2in;25*liNL$V79gKi=J+Yr&QKOzLd-2ZI`JZG%b!BB?qJ~<| z>P-sX0bqvi!@cT$LX}Cazjy> zN2Oqg{Vh5ZkrHOypW!hh2@pN}P*>|#c?!>t%pzT&q%NC!nf|?#l_e z(&0)Bs;8^hI7SM|--bgk{S|RMQG5mrkzXzNze`j2&-(t`*_n77ekO&azeZD8cG2u} zEmU3(%${;Z`->qIwl4Nc6u8!nUA68w_DL>Waw3#6A9&J;L&FSqfSkKpl

63}ezx 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 delta 19652 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 Cv&TRH From ca1312c8adb0dd1fe67f49a00725025cb13f34ee Mon Sep 17 00:00:00 2001 From: Russell Johnson <47639332+Russ4262@users.noreply.github.com> Date: Thu, 16 Mar 2023 00:20:15 -0500 Subject: [PATCH 15/20] Path: Update license Addresses user-specific need in #8894 --- src/Mod/Path/PathTests/test_adaptive.fcstd | Bin 17180 -> 20661 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Mod/Path/PathTests/test_adaptive.fcstd b/src/Mod/Path/PathTests/test_adaptive.fcstd index 7af4b06f81e90c822d2dbd8c98ae2ab5a296e7cf..f12d004b0bf7535fb04cc219a83afd76024b3498 100644 GIT binary patch delta 13337 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 Vl@JjZfD2%GyO|mh2Ir|_|358KN}T`z From 20984f866cd747f5aa3bdc84d940ef4c049ab947 Mon Sep 17 00:00:00 2001 From: marioalexis Date: Wed, 15 Mar 2023 18:22:29 -0300 Subject: [PATCH 16/20] Fem: Remove unused member node --- src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp | 10 +++------- src/Mod/Fem/Gui/ViewProviderFemPostFunction.h | 2 -- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp index 5eff14d080..467f735d84 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp @@ -186,9 +186,6 @@ ViewProviderFemPostFunction::ViewProviderFemPostFunction() m_geometrySeperator = new SoSeparator(); m_geometrySeperator->ref(); - m_transform = new SoTransform(); - m_transform->ref(); - m_scale = new SoScale(); m_scale->ref(); m_scale->scaleFactor = SbVec3f(1, 1, 1); @@ -199,7 +196,6 @@ ViewProviderFemPostFunction::~ViewProviderFemPostFunction() m_geometrySeperator->unref(); m_manip->unref(); m_scale->unref(); - //transform is unref'd when it is replaced by the dragger } void ViewProviderFemPostFunction::attach(App::DocumentObject* pcObj) @@ -211,7 +207,7 @@ void ViewProviderFemPostFunction::attach(App::DocumentObject* pcObj) color->diffuseColor.setValue(0, 0, 1); color->transparency.setValue(0.5); - m_transform = new SoTransform; + SoTransform* transform = new SoTransform(); m_manip = setupManipulator(); m_manip->ref(); @@ -220,7 +216,7 @@ void ViewProviderFemPostFunction::attach(App::DocumentObject* pcObj) pcEditNode->ref(); pcEditNode->addChild(color); - pcEditNode->addChild(m_transform); + pcEditNode->addChild(transform); pcEditNode->addChild(m_geometrySeperator); m_geometrySeperator->insertChild(m_scale, 0); @@ -232,7 +228,7 @@ void ViewProviderFemPostFunction::attach(App::DocumentObject* pcObj) SoSearchAction sa; sa.setInterest(SoSearchAction::FIRST); sa.setSearchingAll(FALSE); - sa.setNode(m_transform); + sa.setNode(transform); sa.apply(pcEditNode); SoPath* path = sa.getPath(); if (path) { diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h index 8987510891..7775e4ff20 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.h @@ -140,7 +140,6 @@ protected: SoTransformManip* getManipulator() {return m_manip;} SoSeparator* getGeometryNode() {return m_geometrySeperator;} SoScale* getScaleNode() {return m_scale;} - SoTransform* getTransformNode() {return m_transform;} private: static void dragStartCallback(void * data, SoDragger * d); @@ -150,7 +149,6 @@ private: SoSeparator* m_geometrySeperator; SoTransformManip* m_manip; SoScale* m_scale; - SoTransform* m_transform; bool m_autoscale, m_isDragging, m_autoRecompute; }; From fc3e1fe70e28da68ad5d835d3812370db6f6b64f Mon Sep 17 00:00:00 2001 From: sliptonic Date: Thu, 16 Mar 2023 13:39:27 -0500 Subject: [PATCH 17/20] Path Update license to CC 4.0 --- src/Mod/Path/PathTests/boxtest.fcstd | Bin 39419 -> 39033 bytes src/Mod/Path/Tools/Shape/chamfer.fcstd | Bin 10192 -> 14190 bytes src/Mod/Path/Tools/Shape/dovetail.fcstd | Bin 12401 -> 15906 bytes src/Mod/Path/Tools/Shape/probe.fcstd | Bin 14315 -> 13050 bytes src/Mod/Path/Tools/Shape/slittingsaw.fcstd | Bin 15701 -> 14301 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Mod/Path/PathTests/boxtest.fcstd b/src/Mod/Path/PathTests/boxtest.fcstd index 185ca0bea1b0333eb74628582453b2808b11f45d..e0b39cbc5a470016d5880f81b87c1e3e6c3217e9 100644 GIT binary patch delta 29286 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 T5yt>XIRJs;q7vl4$cO(28Ir2& delta 31058 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 z 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 diff --git a/src/Mod/Path/Tools/Shape/chamfer.fcstd b/src/Mod/Path/Tools/Shape/chamfer.fcstd index 23d60b34a3091655733437f603a1e18dd18383ef..27b346c4cf86a7e5c71168d30a31f4f3f285d6ee 100644 GIT binary patch literal 14190 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 literal 10192 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 diff --git a/src/Mod/Path/Tools/Shape/dovetail.fcstd b/src/Mod/Path/Tools/Shape/dovetail.fcstd index a94300cedfdba4cff4081c274ee601032f4bdee7..7f8e8d808fa8c8c18fa808bd859002d01620e9b1 100644 GIT binary patch delta 14646 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 delta 11033 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 _J)1iM?Ws1X!p#2nM0o$5$>sSz@iQ4sJ6i390? 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 RNXpgHQe0Gm?BDRv{{X(Ls$&2E diff --git a/src/Mod/Path/Tools/Shape/slittingsaw.fcstd b/src/Mod/Path/Tools/Shape/slittingsaw.fcstd index aecf93d8748b62f18f851e3aaf372df642117259..7b8cf8b2a2fa3348d64760fba65e837a26aa5f34 100644 GIT binary patch delta 10191 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 Date: Sat, 4 Mar 2023 23:58:42 +0100 Subject: [PATCH 18/20] Delete src/Tools/ImageTools/ImageConv directory ImageConv Tools are not used in the Freecad project. --- src/Tools/ImageTools/ImageConv/CmdLine.cpp | 280 ----------------- src/Tools/ImageTools/ImageConv/CmdLine.h | 235 -------------- src/Tools/ImageTools/ImageConv/ImageConv.pro | 9 - src/Tools/ImageTools/ImageConv/cmdline.htm | 146 --------- src/Tools/ImageTools/ImageConv/imageconv.cpp | 304 ------------------- src/Tools/ImageTools/ImageConv/imageconv.h | 98 ------ src/Tools/ImageTools/ImageConv/main.cpp | 148 --------- 7 files changed, 1220 deletions(-) delete mode 100644 src/Tools/ImageTools/ImageConv/CmdLine.cpp delete mode 100644 src/Tools/ImageTools/ImageConv/CmdLine.h delete mode 100644 src/Tools/ImageTools/ImageConv/ImageConv.pro delete mode 100644 src/Tools/ImageTools/ImageConv/cmdline.htm delete mode 100644 src/Tools/ImageTools/ImageConv/imageconv.cpp delete mode 100644 src/Tools/ImageTools/ImageConv/imageconv.h delete mode 100644 src/Tools/ImageTools/ImageConv/main.cpp diff --git a/src/Tools/ImageTools/ImageConv/CmdLine.cpp b/src/Tools/ImageTools/ImageConv/CmdLine.cpp deleted file mode 100644 index 009d45e960..0000000000 --- a/src/Tools/ImageTools/ImageConv/CmdLine.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/*------------------------------------------------------ - CCmdLine - - A utility for parsing command lines. - - Copyright (C) 1999 Chris Losinger, Smaller Animals Software. - http://www.smalleranimals.com - - This software is provided 'as-is', without any express - or implied warranty. In no event will the authors be - held liable for any damages arising from the use of this software. - - Permission is granted to anyone to use this software - for any purpose, including commercial applications, and - to alter it and redistribute it freely, subject to the - following restrictions: - - 1. The origin of this software must not be misrepresented; - you must not claim that you wrote the original software. - If you use this software in a product, an acknowledgment - in the product documentation would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, - and must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. - - See SACmds.h for more info. -------------------------------------------------------*/ - -// if you're using MFC, you'll need to un-comment this line -// #include "stdafx.h" - -#include "CmdLine.h" -#ifdef Q_WS_WIN -# include "crtdbg.h" -#endif - -/*------------------------------------------------------ - int CCmdLine::SplitLine(int argc, char **argv) - - parse the command line into switches and arguments - - returns number of switches found -------------------------------------------------------*/ -int CCmdLine::SplitLine(int argc, char **argv) -{ - clear(); - - StringType curParam; // current argv[x] - - // skip the exe name (start with i = 1) - for (int i = 1; i < argc; i++) - { - // if it's a switch, start a new CCmdLine - if (IsSwitch(argv[i])) - { - curParam = argv[i]; - - StringType arg; - - // look at next input string to see if it's a switch or an argument - if (i + 1 < argc) - { - if (!IsSwitch(argv[i + 1])) - { - // it's an argument, not a switch - arg = argv[i + 1]; - - // skip to next - i++; - } - else - { - arg = ""; - } - } - - // add it - CCmdParam cmd; - - // only add non-empty args - if (arg != "") - { - cmd.m_strings.push_back(arg); - } - - // add the CCmdParam to 'this' - pair res = insert(CCmdLine::value_type(curParam, cmd)); - - } - else - { - // it's not a new switch, so it must be more stuff for the last switch - - // ...let's add it - CCmdLine::iterator theIterator; - - // get an iterator for the current param - theIterator = find(curParam); - if (theIterator!=end()) - { - (*theIterator).second.m_strings.push_back(argv[i]); - } - else - { - // ?? - } - } - } - - return size(); -} - -/*------------------------------------------------------ - - protected member function - test a parameter to see if it's a switch : - - switches are of the form : -x - where 'x' is one or more characters. - the first character of a switch must be non-numeric! - -------------------------------------------------------*/ - -bool CCmdLine::IsSwitch(const char *pParam) -{ - if (pParam==NULL) - return false; - - // switches must non-empty - // must have at least one character after the '-' - int len = strlen(pParam); - if (len <= 1) - { - return false; - } - - // switches always start with '-' - if (pParam[0]=='-') - { - // allow negative numbers as arguments. - // ie., don't count them as switches -#ifdef Q_WS_WIN - return (!isdigit(pParam[1])); -#else - return true; -#endif - } - else - { - return false; - } -} - -/*------------------------------------------------------ - bool CCmdLine::HasSwitch(const char *pSwitch) - - was the switch found on the command line ? - - ex. if the command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.HasSwitch("-a") true - cmdLine.HasSwitch("-z") false -------------------------------------------------------*/ - -bool CCmdLine::HasSwitch(const char *pSwitch) -{ - CCmdLine::iterator theIterator; - theIterator = find(pSwitch); - return (theIterator!=end()); -} - -/*------------------------------------------------------ - - StringType CCmdLine::GetSafeArgument(const char *pSwitch, int iIdx, const char *pDefault) - - fetch an argument associated with a switch . if the parameter at - index iIdx is not found, this will return the default that you - provide. - - example : - - command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.GetSafeArgument("-a", 0, "zz") p1 - cmdLine.GetSafeArgument("-a", 1, "zz") p2 - cmdLine.GetSafeArgument("-b", 0, "zz") p4 - cmdLine.GetSafeArgument("-b", 1, "zz") zz - -------------------------------------------------------*/ - -StringType CCmdLine::GetSafeArgument(const char *pSwitch, int iIdx, const char *pDefault) -{ - StringType sRet; - - if (pDefault!=NULL) - sRet = pDefault; - - try - { - sRet = GetArgument(pSwitch, iIdx); - } - catch (...) - { - } - - return sRet; -} - -/*------------------------------------------------------ - - StringType CCmdLine::GetArgument(const char *pSwitch, int iIdx) - - fetch a argument associated with a switch. throws an exception - of (int)0, if the parameter at index iIdx is not found. - - example : - - command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.GetArgument("-a", 0) p1 - cmdLine.GetArgument("-b", 1) throws (int)0, returns an empty string - -------------------------------------------------------*/ - -StringType CCmdLine::GetArgument(const char *pSwitch, int iIdx) -{ - if (HasSwitch(pSwitch)) - { - CCmdLine::iterator theIterator; - - theIterator = find(pSwitch); - if (theIterator!=end()) - { - if ((*theIterator).second.m_strings.size() > (unsigned)iIdx) - { - return (*theIterator).second.m_strings[iIdx]; - } - } - } - - throw (int)0; - - return ""; -} - -/*------------------------------------------------------ - int CCmdLine::GetArgumentCount(const char *pSwitch) - - returns the number of arguments found for a given switch. - - returns -1 if the switch was not found - -------------------------------------------------------*/ - -int CCmdLine::GetArgumentCount(const char *pSwitch) -{ - int iArgumentCount = -1; - - if (HasSwitch(pSwitch)) - { - CCmdLine::iterator theIterator; - - theIterator = find(pSwitch); - if (theIterator!=end()) - { - iArgumentCount = (*theIterator).second.m_strings.size(); - } - } - - return iArgumentCount; -} diff --git a/src/Tools/ImageTools/ImageConv/CmdLine.h b/src/Tools/ImageTools/ImageConv/CmdLine.h deleted file mode 100644 index 88a965a70b..0000000000 --- a/src/Tools/ImageTools/ImageConv/CmdLine.h +++ /dev/null @@ -1,235 +0,0 @@ -/*------------------------------------------------------ - CCmdLine - - A utility for parsing command lines. - - Copyright (C) 1999 Chris Losinger, Smaller Animals Software. - http://www.smalleranimals.com - - This software is provided 'as-is', without any express - or implied warranty. In no event will the authors be - held liable for any damages arising from the use of this software. - - Permission is granted to anyone to use this software - for any purpose, including commercial applications, and - to alter it and redistribute it freely, subject to the - following restrictions: - - 1. The origin of this software must not be misrepresented; - you must not claim that you wrote the original software. - If you use this software in a product, an acknowledgment - in the product documentation would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, - and must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. - - ------------------------- - - Example : - - Our example application uses a command line that has two - required switches and two optional switches. The app should abort - if the required switches are not present and continue with default - values if the optional switches are not present. - - Sample command line : - MyApp.exe -p1 text1 text2 -p2 "this is a big argument" -opt1 -55 -opt2 - - Switches -p1 and -p2 are required. - p1 has two arguments and p2 has one. - - Switches -opt1 and -opt2 are optional. - opt1 requires a numeric argument. - opt2 has no arguments. - - Also, assume that the app displays a 'help' screen if the '-h' switch - is present on the command line. - - #include "CmdLine.h" - - void main(int argc, char **argv) - { - // our cmd line parser object - CCmdLine cmdLine; - - // parse argc,argv - if (cmdLine.SplitLine(argc, argv) < 1) - { - // no switches were given on the command line, abort - ASSERT(0); - exit(-1); - } - - // test for the 'help' case - if (cmdLine.HasSwitch("-h")) - { - show_help(); - exit(0); - } - - // get the required arguments - StringType p1_1, p1_2, p2_1; - try - { - // if any of these fail, we'll end up in the catch() block - p1_1 = cmdLine.GetArgument("-p1", 0); - p1_2 = cmdLine.GetArgument("-p1", 1); - p2_1 = cmdLine.GetArgument("-p2", 0); - - } - catch (...) - { - // one of the required arguments was missing, abort - ASSERT(0); - exit(-1); - } - - // get the optional parameters - - // convert to an int, default to '100' - int iOpt1Val = atoi(cmdLine.GetSafeArgument("-opt1", 0, 100)); - - // since opt2 has no arguments, just test for the presence of - // the '-opt2' switch - bool bOptVal2 = cmdLine.HasSwitch("-opt2"); - - .... and so on.... - - } - - If this class is used in an MFC application, StringType is CString, else - it uses the STL 'string' type. - - If this is an MFC app, you can use the __argc and __argv macros from - you CYourWinApp::InitInstance() function in place of the standard argc - and argv variables. - -------------------------------------------------------*/ -#ifndef SACMDSH -#define SACMDSH - - -#ifdef __AFX_H__ -// if we're using MFC, use CStrings -#define StringType CString -#else -// if we're not using MFC, use STL strings -#define StringType string -#endif - -// tell the compiler to shut up -#pragma warning(disable:4786) - -//#include // you may need this -#include -#include -#include -using namespace std ; - -// handy little container for our argument vector -struct CCmdParam -{ - vector m_strings; -}; - -// this class is actually a map of strings to vectors -using _CCmdLine = map; - -// the command line parser class -class CCmdLine : public _CCmdLine -{ - -public: - /*------------------------------------------------------ - int CCmdLine::SplitLine(int argc, char **argv) - - parse the command line into switches and arguments. - - returns number of switches found - ------------------------------------------------------*/ - int SplitLine(int argc, char **argv); - - /*------------------------------------------------------ - bool CCmdLine::HasSwitch(const char *pSwitch) - - was the switch found on the command line ? - - ex. if the command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.HasSwitch("-a") true - cmdLine.HasSwitch("-z") false - ------------------------------------------------------*/ - bool HasSwitch(const char *pSwitch); - - /*------------------------------------------------------ - - StringType CCmdLine::GetSafeArgument(const char *pSwitch, int iIdx, const char *pDefault) - - fetch an argument associated with a switch . if the parameter at - index iIdx is not found, this will return the default that you - provide. - - example : - - command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.GetSafeArgument("-a", 0, "zz") p1 - cmdLine.GetSafeArgument("-a", 1, "zz") p2 - cmdLine.GetSafeArgument("-b", 0, "zz") p4 - cmdLine.GetSafeArgument("-b", 1, "zz") zz - - ------------------------------------------------------*/ - - StringType GetSafeArgument(const char *pSwitch, int iIdx, const char *pDefault); - - /*------------------------------------------------------ - - StringType CCmdLine::GetArgument(const char *pSwitch, int iIdx) - - fetch a argument associated with a switch. throws an exception - of (int)0, if the parameter at index iIdx is not found. - - example : - - command line is : app.exe -a p1 p2 p3 -b p4 -c -d p5 - - call return - ---- ------ - cmdLine.GetArgument("-a", 0) p1 - cmdLine.GetArgument("-b", 1) throws (int)0, returns an empty string - - ------------------------------------------------------*/ - StringType GetArgument(const char *pSwitch, int iIdx); - - /*------------------------------------------------------ - int CCmdLine::GetArgumentCount(const char *pSwitch) - - returns the number of arguments found for a given switch. - - returns -1 if the switch was not found - - ------------------------------------------------------*/ - int GetArgumentCount(const char *pSwitch); - -protected: - /*------------------------------------------------------ - - protected member function - test a parameter to see if it's a switch : - - switches are of the form : -x - where 'x' is one or more characters. - the first character of a switch must be non-numeric! - - ------------------------------------------------------*/ - bool IsSwitch(const char *pParam); -}; - -#endif diff --git a/src/Tools/ImageTools/ImageConv/ImageConv.pro b/src/Tools/ImageTools/ImageConv/ImageConv.pro deleted file mode 100644 index b702f57074..0000000000 --- a/src/Tools/ImageTools/ImageConv/ImageConv.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = app -CONFIG += debug console -TARGET += -DEPENDPATH += . -INCLUDEPATH += . - -# Input -HEADERS += CmdLine.h imageconv.h -SOURCES += CmdLine.cpp imageconv.cpp main.cpp diff --git a/src/Tools/ImageTools/ImageConv/cmdline.htm b/src/Tools/ImageTools/ImageConv/cmdline.htm deleted file mode 100644 index 25a8363264..0000000000 --- a/src/Tools/ImageTools/ImageConv/cmdline.htm +++ /dev/null @@ -1,146 +0,0 @@ - - -

-CCmdLine - a class for parsing command line with or without MFC -


- - -This article was contributed by Chris Losinger. - - -

Environment: All - - -

- - -CCmdLine is a simple way to parse a command line into switches and arguments. -Ex : -
-

    -MyApp.exe -sw1 arg1 arg2 -sw2 arg3 -sw3 -sw4 -
-
-When using CCmdLine, "-sw1", "-sw2", "-sw3" and "-sw4" are switches and "arg1", "arg2" and "arg3" are arguments. -

-Parsing command lines with the standard C string functions (strlen, strcpy, etc.) or even -with the CString operators is a nightmare. But, CCmdLine makes it effortless. -

-CCmdLine was written for use with console apps, but can be easily used in -any application which requires command-line parsing. -

-CCmdLine uses STL for its collection classes, so it works in MFC -and non-MFC apps. If you are using this in an MFC app, the switches -and arguments will be returned as CStrings. If you are using this in a -non-MFC app, they will be returned as STL 'string's. -

-


-Example : - -Assume the application we're writing uses a command line that has two -required switches and two optional switches. The app should abort -if the required switches are not present and continue with default -values if the optional switches are not present. -
    -Sample command line : -
    -
    -  MyApp.exe -p1 text1 text2 -p2 "this is a big argument" -opt1 -55 -opt2
    -
    -Switches -p1 and -p2 are required. -
    -p1 has two arguments and p2 has one. -
    -
    -Switches -opt1 and -opt2 are optional. -
    -opt1 requires a numeric argument. -
    -opt2 has no arguments. -
    -
    -Also, assume that the app displays a 'help' screen if the '-h' switch -is present on the command line. -
-Here's how you can use CCmdLine to handle this : -
- -

-// if this is an MFC app, uncomment this line
-// #include "stdafx.h"
-
-#include "CmdLine.h"
-
-void main(int argc, char **argv)
-{
-  // our cmd line parser object
-  CCmdLine cmdLine;
-
-  // parse the command line
-  // use __argc and __argv, in MFC apps
-  if (cmdLine.SplitLine(argc, argv) < 1)
-  {
-     // no switches were given on the command line, abort
-     ASSERT(0);
-     exit(-1);
-  }
-
-  // test for the 'help' case
-  if (cmdLine.HasSwitch("-h"))
-  {
-     show_help();
-     exit(0);
-  }
-
-  // StringType is CString when using MFC, else STL's 'string'
-  StringType p1_1, p1_2, p2_1;
-
-  // get the required arguments
-  try
-  {  
-     // if any of these GetArgument calls fail, 
-     // we'll end up in the catch() block
-
-     // get the first -p1 argument
-     p1_1 = cmdLine.GetArgument("-p1", 0);
-
-     // get the second -p1 argument
-     p1_2 = cmdLine.GetArgument("-p1", 1);
-
-     // get the first -p2 argument
-     p2_1 = cmdLine.GetArgument("-p2", 0);
-
-  }
-  catch (...)
-  {
-     // one of the required arguments was missing, abort
-     ASSERT(0);
-     exit(-1);
-  }
-
-  // get the optional parameters
-
-  // GetSafeArgument does not throw exceptions, and allows for 
-  // the use of a default value, in case the switch is not found
-  // convert to an int, default to '100'
-  int iOpt1Val =    atoi( cmdLine.GetSafeArgument( "-opt1", 0, 100 ) );
-
-  // since opt2 has no arguments, just test for the presence of
-  // the '-opt2' switch
-  bool bOptSwitch2 =   cmdLine.HasSwitch("-opt2");
-
-  .... and so on....
-
-}
-
-
- - - -

Download source - 5 Kb - - - -

Date Posted: June 16, 1999 - - \ No newline at end of file diff --git a/src/Tools/ImageTools/ImageConv/imageconv.cpp b/src/Tools/ImageTools/ImageConv/imageconv.cpp deleted file mode 100644 index 99dc7df42c..0000000000 --- a/src/Tools/ImageTools/ImageConv/imageconv.cpp +++ /dev/null @@ -1,304 +0,0 @@ -/*************************************************************************** - imageconv.cpp - description - ------------------- - begin : Die Apr 23 21:02:14 CEST 2002 - copyright : (C) 2002 by Werner Mayer - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Library General Public License as * - * published by the Free Software Foundation; either version 2 of the * - * License, or (at your option) any later version. * - * Werner Mayer 2002 * - * * - ***************************************************************************/ - -#include "imageconv.h" -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -CCmdLineParser::CCmdLineParser(int argc, char** argv) -{ - SplitLine(argc, argv); -} - -CCmdParam CCmdLineParser::GetArgumentList(const char* pSwitch) -{ - if (HasSwitch(pSwitch)) - { - CCmdLineParser::iterator theIterator; - - theIterator = find(pSwitch); - if (theIterator!=end()) - { - return (*theIterator).second; - } - } - - CCmdParam param; - return param; -} - -// ------------------------------------------------------------ - -QString CImageConvApp::m_Executable = "ImageConv"; -QString CImageConvApp::m_BmpFactory = "BmpFactoryIcons.cpp"; - -CImageConvApp::CImageConvApp(const QString& sFile) -{ - m_bUpdate = false; - m_Output = sFile; - QString filter = "*.png;*.bmp;*.xbm;*.pnm;*.jpg;*.jpeg;*.mng;*.gif"; // not "*.xpm"! - m_Dir.setNameFilters(filter.split(';')); -} - -void CImageConvApp::SetOutputFile(const QString& sFile) -{ - m_Output = sFile; -} - -void CImageConvApp::SetNameFilters(const QStringList& nameFilter) -{ - m_Dir.setNameFilters(nameFilter); -} - -bool CImageConvApp::Save(const QString& fn) -{ - int iPos = fn.indexOf("."); - - QString ext = fn.mid(iPos+1); // extension of filename - QString name = fn.mid(0,iPos); // filename without extension - - if (!m_clPixmap.isNull()) - { - if (!fn.isEmpty()) - { - return m_clPixmap.save(fn, ext.toUpper().toLatin1()); - } - } - - return false; -} - -bool CImageConvApp::Load(const QString& fn) -{ - QByteArray ext = QImageReader::imageFormat(fn); - - if (!fn.isEmpty()) - return m_clPixmap.load( fn, ext); - - return false; -} - -const QPixmap& CImageConvApp::GetPixmap() const -{ - return m_clPixmap; -} - -bool CImageConvApp::ConvertToXPM(bool bAppendToFile) -{ - QStringList list = m_Dir.entryList(); - - // print to the console - cout << "Try converting to XPM..." << endl; - if (list.count() == 0) - { - cout << "Cannot find " << (const char*)m_Dir.nameFilters().join(" ").toLatin1() << endl; - return false; - } - - for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) - { - QByteArray ext = QImageReader::imageFormat(*it); - if (ext.isEmpty()) - continue; // no image format - - if (m_Output == *it) - continue; // if the file is the output file itself - - cout << "Converting " << (const char*)(*it).toLatin1() << " ..."; - - if (Load(*it) == true) - { - QString name(*it); - name.replace(name.indexOf(".")+1, 4, "xpm"); - - bool ok; - - QFileInfo fi(*it); - if (bAppendToFile) - ok = AppendToFile(fi.baseName()); - else - ok = Save(name); - - if (ok) - cout << "Done" << endl; - else - cout << "failed" << endl; - } - else - { - cout << "failed" << endl; - } - } - - return true; -} - -void CImageConvApp::CreateBmpFactory() -{ - // empty file - // - QFileInfo fi(m_BmpFactory); - - // already exists - if (fi.exists() && fi.isFile()) - return; - - QFile fw(m_BmpFactory); - QTextStream tw (&fw); - if (!fw.open(QIODevice::Text | QIODevice::Unbuffered | QIODevice::WriteOnly)) - return; - - // write header stuff - tw << "\n"; - tw << "void RegisterIcons()\n"; - tw << "{\n"; - tw << " Gui::BitmapFactoryInst& rclBmpFactory = Gui::BitmapFactory();\n"; - tw << "}\n"; - fw.close(); -} - -bool CImageConvApp::AppendToFile(const QString& file) -{ - CreateBmpFactory(); - - QString ohead("static char"); - QString nhead("static const char"); - - // save as XPM into tmp. buffer - QByteArray str; - QBuffer buf(&str); - buf.open (QIODevice::WriteOnly); - QImageWriter iio(&buf, "XPM"); - QImage im; - im = m_clPixmap.toImage(); - iio.write(im); - buf.close(); - - // convert to string and make changes - QString txt = str; - txt.replace(ohead, nhead); - txt.replace(QString("dummy"), file); - - // open file - bool found = false; - QFile fw(m_Output); - if (fw.open(QIODevice::ReadOnly)) - { - QTextStream tr (&fw); - QString line; - do - { - line = tr.readLine(); - if ((line.indexOf(file)) != -1) // icon already registered - { - found = true; - } - } while (!tr.atEnd() && !found); - - fw.close(); - } - - // register new icon - if (!found) - { - if (!fw.open(QIODevice::Text | QIODevice::Unbuffered | QIODevice::ReadWrite | QIODevice::Append)) - return false; - - // write into file now - QTextStream tw (&fw); - tw << txt << "\n"; - fw.close(); - - if (m_bUpdate) - { - QFile bmp(m_BmpFactory); - QTextStream ts (&bmp); - if (!bmp.open(QIODevice::Text | QIODevice::Unbuffered | QIODevice::WriteOnly)) - return false; - - bmp.seek(bmp.size()-3); - ts << " rclBmpFactory.addXPM(\"" << file << "\", " << file << ");\n"; - ts << "}\n"; - bmp.close(); - } - } - - return true; -} - -void CImageConvApp::Error() -{ - cerr << "Usage: " << (const char*)m_Executable.toLatin1() << " [OPTION(S)] -i input file(s) {-o output file}" << endl; - cerr << "Try '" << (const char*)m_Executable.toLatin1() << " --help' for more information." << endl; - - exit(0); -} - -void CImageConvApp::Version() -{ - cerr << (const char*)m_Executable.toLatin1() << " 1.0.0 " << endl; - exit(0); -} - -void CImageConvApp::Usage() -{ - cerr << "Usage: " << (const char*)m_Executable.toLatin1() << " [OPTION(S)] -i input file(s) {-o output file}\n" << endl; - cerr << "Options:" << endl; - - cerr << " -i \tSpecify the input file(s).\n" - " \tSeveral filenames must be separated by a blank.\n" - " \tIf you want to select all files of a format\n" - " \tyou also can write \"*.[FORMAT]\" (e.g. *.png).\n" - " \tSpecifying several files only makes sense in\n" - " \taddition with -a or -x." << endl; - - cerr << " -o \tSpecify the output file." << endl; - - cerr << " -x, --xpm\tConvert all specified image files to XPM.\n" - " \tFor each specified image file a corresponding\n" - " \tXPM file will be created.\n" - " \tWith -i you can specify the input files." << endl; - - cerr << " -a, --append\tConvert all specified image files to XPM and\n" - " \tappend the result to the file specified with -o.\n" - " \tWith -i you can specify the input files.\n" << endl; - - - cerr << " -u, --update\tUpdate the file \"BmpFactoryIcons.cpp\"\n" - " \tThis is a special mode to add icons to the FreeCAD's\n" - " \tbitmap factory automatically.\n" - " \tThis switch is only available in addition with -a.\n" << endl; - - cerr << " -v, --version\tPrint the version and exit." << endl; - - cerr << " -h, --help\tPrint this message and exit.\n" << endl; - - cerr << "This program supports the following image formats:\n" - " BMP, GIF, JPEG, MNG, PNG, PNM, XBM and XPM\n\n" - << (const char*)m_Executable.toLatin1() << " uses Qt Version " << qVersion() << "\n" - "Qt can be downloaded at http://www.trolltech.com." << endl; - - exit(0); -} diff --git a/src/Tools/ImageTools/ImageConv/imageconv.h b/src/Tools/ImageTools/ImageConv/imageconv.h deleted file mode 100644 index d90d51183e..0000000000 --- a/src/Tools/ImageTools/ImageConv/imageconv.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - imageconv.h - description - ------------------- - begin : Die Apr 23 21:02:14 CEST 2002 - copyright : (C) 2002 by Werner Mayer - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Library General Public License as * - * published by the Free Software Foundation; either version 2 of the * - * License, or (at your option) any later version. * - * Werner Mayer 2002 * - * * - ***************************************************************************/ - -#ifndef IMAGECONV_H -#define IMAGECONV_H - -// includes -#include "CmdLine.h" -#include -#include -#include -#include - -#include -#include - -// defines -#define TString std::string -#define TVector std::vector -#define TMap std::map -#define TPair std::pair - - -// the command line parser class -class CCmdLineParser : public CCmdLine -{ -public: - CCmdLineParser (int argc, char** argv); - ~CCmdLineParser () {} - - CCmdParam GetArgumentList(const char* pSwitch); -}; - -// ------------------------------------------------------------ - -class CICException -{ -public: - CICException(const QString& text) - : msg(text) {} - CICException(const CICException& e) - { *this = e; } - ~CICException() - { } - QString what() const - { return msg; } - -private: - QString msg; -}; - -// ------------------------------------------------------------ - -class CImageConvApp -{ -public: - CImageConvApp(const QString& sFile = "Images.cpp"); - void SetOutputFile(const QString& sFile); - void SetNameFilters(const QStringList& nameFilter); - bool Save(const QString& fn); - bool Load(const QString& fn); - bool ConvertToXPM(bool bAppendToFile = false); - bool AppendToFile(const QString& file); - void SetUpdateBmpFactory(bool b) - { m_bUpdate = b; } - void CreateBmpFactory(); - - const QPixmap& GetPixmap() const; - - static void Usage(); - static void Error(); - static void Version(); - -private: - bool m_bUpdate; - static QString m_Executable; - static QString m_BmpFactory; - QPixmap m_clPixmap; // pixmap - QString m_Output; // specified output file - QDir m_Dir; // directory -}; - -#endif // IMAGECONV_H diff --git a/src/Tools/ImageTools/ImageConv/main.cpp b/src/Tools/ImageTools/ImageConv/main.cpp deleted file mode 100644 index f3a740ff26..0000000000 --- a/src/Tools/ImageTools/ImageConv/main.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Die Apr 23 21:02:14 CEST 2002 - copyright : (C) 2002 by Werner Mayer - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Library General Public License as * - * published by the Free Software Foundation; either version 2 of the * - * License, or (at your option) any later version. * - * Werner Mayer 2002 * - * * - ***************************************************************************/ - -#include -#include -#include "imageconv.h" - -using namespace std; - -int main( int argc, char **argv ) -{ - QApplication app( argc, argv ); - CImageConvApp cICApp; - CCmdLineParser cCmdP(argc, argv); - - try - { - // look for the specified switches and arguments - // - // - // show help message and exit - if (cCmdP.HasSwitch("-h") || cCmdP.HasSwitch("--help")) - { - CImageConvApp::Usage(); - } - // show version and exit - else if (cCmdP.HasSwitch("-v") || cCmdP.HasSwitch("--version")) - { - CImageConvApp::Version(); - } - - // convert all given/found image files to XPM - if (cCmdP.HasSwitch("-x") || cCmdP.HasSwitch("--xpm")) - { - // search for input files - if (cCmdP.GetArgumentCount("-i") > 0) - { - QStringList nameFilters; - CCmdParam para = cCmdP.GetArgumentList("-i"); - for (TVector::iterator it = para.m_strings.begin(); it != para.m_strings.end(); it++) - { - cout << "Search for " << it->c_str() << endl; - nameFilters.append(it->c_str()); - } - - cICApp.SetNameFilters(nameFilters); - cICApp.ConvertToXPM(false); - } - else - throw CICException("No input file specified."); - } - - // convert all given/found image files to XPM and write the result into a text file - else if (cCmdP.HasSwitch("-a") || cCmdP.HasSwitch("--append")) - { - // search for input fĂ­les - if (cCmdP.GetArgumentCount("-i") > 0) - { - cICApp.SetUpdateBmpFactory(cCmdP.HasSwitch("-a") || cCmdP.HasSwitch("--update")); - QStringList nameFilters; - CCmdParam para = cCmdP.GetArgumentList("-i"); - for (TVector::iterator it = para.m_strings.begin(); it != para.m_strings.end(); it++) - { - cout << "Search for " << it->c_str() << endl; - nameFilters.append(it->c_str()); - } - - cICApp.SetNameFilters(nameFilters); - } - else - throw CICException("No input files specified."); - - // search for output file - if (cCmdP.GetArgumentCount("-o") > 0) - { - cICApp.SetOutputFile(QString(cCmdP.GetArgument("-o", 0).c_str())); - cICApp.ConvertToXPM(true); - } - else - throw CICException("No output file specified."); - } - - // convert one image file to another image file - else if (cCmdP.HasSwitch("-i") && cCmdP.HasSwitch("-o")) - { - // input and output file specified - CCmdParam p1 = cCmdP.GetArgumentList("-i"); - CCmdParam p2 = cCmdP.GetArgumentList("-o"); - - if (p1.m_strings.size() > 1) - throw CICException("Too much input files specified."); - if (p1.m_strings.size() < 1) - throw CICException("No input file specified."); - if (p2.m_strings.size() > 1) - throw CICException("Too much output files specified."); - if (p2.m_strings.size() < 1) - throw CICException("No output file specified."); - - TString fil1(*p1.m_strings.begin()); - TString fil2(*p2.m_strings.begin()); - - if (cICApp.Load(QString(fil1.c_str())) == false) - { - cout << "Loading of " << fil1.c_str() << " failed!" << endl; - cout << "Perhaps the file does not exist or QT does not support this format." << endl; - return -1; - } - if (cICApp.Save(QString(fil2.c_str())) == false) - { - cout << "Saving of " << fil2.c_str() << " failed!" << endl; - cout << "Perhaps QT does not support this format." << endl; - } - else - { - cout << "Converted successfully!" << endl; - } - } - // no/wrong arguments - else - throw CICException("Wrong arguments."); - } - catch(const CICException& e) - { - cerr << (const char*)e.what().toLatin1() << endl; - CImageConvApp::Error(); - } - catch(...) - { - cerr << "An unknown exception has occurred!!!" << endl; - } - - return 0; -} From da38f163200eec92a7ecaabc181df5b2b8c03015 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 16 Mar 2023 15:19:18 +0100 Subject: [PATCH 19/20] Gui: set-up a logging category filter to suppress the most annoying Qt warnings --- src/Gui/Application.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 077af9fafb..b3685d4a35 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -41,6 +41,8 @@ # include #endif +#include + #include #include #include @@ -1670,6 +1672,18 @@ Gui::PreferencePackManager* Application::prefPackManager() //************************************************************************** // Init, Destruct and singleton +namespace { +void setCategoryFilterRules() +{ + QString filter; + QTextStream stream(&filter); + stream << "qt.qpa.xcb.warning=false\n"; + stream << "qt.qpa.mime.warning=false\n"; + stream.flush(); + QLoggingCategory::setFilterRules(filter); +} +} + using _qt_msg_handler_old = void (*)(QtMsgType, const QMessageLogContext &, const QString &); _qt_msg_handler_old old_qtmsg_handler = nullptr; @@ -1755,6 +1769,7 @@ void Application::initApplication() initTypes(); new Base::ScriptProducer( "FreeCADGuiInit", FreeCADGuiInit ); init_resources(); + setCategoryFilterRules(); old_qtmsg_handler = qInstallMessageHandler(messageHandler); init = true; } From c1751bde4a47c0c44b9d22cb176ae0cbcdfa53c5 Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 16 Mar 2023 06:14:37 +0100 Subject: [PATCH 20/20] [FEM] improve deletion warning - don't popup a warning if all children of an object are selected too when deleting the object --- src/Mod/Fem/Gui/ViewProviderAnalysis.cpp | 34 +++++++++++++++++-- src/Mod/Fem/Gui/ViewProviderAnalysis.h | 16 +++++---- .../Fem/Gui/ViewProviderFemPostFunction.cpp | 30 +++------------- src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 33 +++--------------- src/Mod/Fem/Gui/ViewProviderSolver.cpp | 32 +++-------------- 5 files changed, 53 insertions(+), 92 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp index 7b8a387cc5..6cf3adb674 100644 --- a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp +++ b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp @@ -31,6 +31,7 @@ # include #endif +#include #include #include #include @@ -38,6 +39,8 @@ #include #include #include +#include +#include #include #include #include @@ -251,15 +254,40 @@ void ViewProviderFemAnalysis::dropObject(App::DocumentObject *obj) bool ViewProviderFemAnalysis::onDelete(const std::vector &) { - // warn the user if the object has childs - + // warn the user if the object has unselected children auto objs = claimChildren(); + return checkSelectedChildren(objs, this->getDocument(), "analysis"); +} + +bool ViewProviderFemAnalysis::checkSelectedChildren(const std::vector objs, + Gui::Document* docGui, std::string objectName) +{ + // warn the user if the object has unselected children if (!objs.empty()) { + // check if all children are in the selection + bool found = false; + auto selectionList = Gui::Selection().getSelectionEx(docGui->getDocument()->getName()); + for (auto child : objs) { + found = false; + for (Gui::SelectionObject selection : selectionList) { + if (std::string(child->getNameInDocument()) + == std::string(selection.getFeatName())) { + found = true; + break; + } + } + if (!found) + break; + } + if (found)// all children are selected too + return true; + // generate dialog QString bodyMessage; QTextStream bodyMessageStream(&bodyMessage); bodyMessageStream << qApp->translate("Std_Delete", - "The analysis is not empty, therefore the\nfollowing referencing objects might be lost:"); + ("The " + objectName + " is not empty, therefore the\nfollowing " + "referencing objects might be lost:").c_str()); bodyMessageStream << '\n'; for (auto ObjIterator : objs) bodyMessageStream << '\n' << QString::fromUtf8(ObjIterator->Label.getValue()); diff --git a/src/Mod/Fem/Gui/ViewProviderAnalysis.h b/src/Mod/Fem/Gui/ViewProviderAnalysis.h index e993a8b2dc..4f62db2a8d 100644 --- a/src/Mod/Fem/Gui/ViewProviderAnalysis.h +++ b/src/Mod/Fem/Gui/ViewProviderAnalysis.h @@ -52,10 +52,10 @@ class FemGuiExport ViewProviderFemAnalysis : public Gui::ViewProviderDocumentObj PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderAnalysis); public: - /// constructor. + /// constructor ViewProviderFemAnalysis(); - /// destructor. + /// destructor ~ViewProviderFemAnalysis() override; void attach(App::DocumentObject*) override; @@ -63,17 +63,19 @@ public: std::vector claimChildren()const override; - // handling when object is deleted + /// handling when object is deleted bool onDelete(const std::vector&) override; - /// Asks the view provider if the given object can be deleted. + /// warning on deletion when there are children + static bool checkSelectedChildren(const std::vector objs, + Gui::Document* docGui, std::string objectName); + /// asks the view provider if the given object can be deleted bool canDelete(App::DocumentObject* obj) const override; - //virtual std::vector claimChildren3D(void)const; void setupContextMenu(QMenu*, QObject*, const char*) override; - /// A list of all possible display modes + /// list of all possible display modes std::vector getDisplayModes() const override; - // shows solid in the tree + /// shows solid in the tree bool isShow() const override { return Visibility.getValue(); } diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp index 467f735d84..a4a0e1b089 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFunction.cpp @@ -56,6 +56,7 @@ #include "ViewProviderFemPostFunction.h" #include "FemSettings.h" #include "TaskPostBoxes.h" +#include "ViewProviderAnalysis.h" #include "ui_BoxWidget.h" #include "ui_CylinderWidget.h" @@ -133,32 +134,10 @@ void ViewProviderFemPostFunctionProvider::updateSize() bool ViewProviderFemPostFunctionProvider::onDelete(const std::vector&) { - // warn the user if the object has childs - + // warn the user if the object has unselected children auto objs = claimChildren(); - if (!objs.empty()) - { - // generate dialog - QString bodyMessage; - QTextStream bodyMessageStream(&bodyMessage); - bodyMessageStream << qApp->translate("Std_Delete", - "The functions list is not empty, therefore the\nfollowing referencing objects might be lost:"); - bodyMessageStream << '\n'; - for (auto ObjIterator : objs) - bodyMessageStream << '\n' << QString::fromUtf8(ObjIterator->Label.getValue()); - bodyMessageStream << "\n\n" << QObject::tr("Are you sure you want to continue?"); - // show and evaluate the dialog - int DialogResult = QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("Std_Delete", "Object dependencies"), bodyMessage, - QMessageBox::Yes, QMessageBox::No); - if (DialogResult == QMessageBox::Yes) - return true; - else - return false; - } - else { - return true; - } + return ViewProviderFemAnalysis::checkSelectedChildren( + objs, this->getDocument(), "functions list"); } bool ViewProviderFemPostFunctionProvider::canDelete(App::DocumentObject* obj) const @@ -178,7 +157,6 @@ PROPERTY_SOURCE(FemGui::ViewProviderFemPostFunction, Gui::ViewProviderDocumentOb ViewProviderFemPostFunction::ViewProviderFemPostFunction() : m_manip(nullptr), m_autoscale(false), m_isDragging(false), m_autoRecompute(false) { - ADD_PROPERTY_TYPE(AutoScaleFactorX, (1), "AutoScale", App::Prop_Hidden, "Automatic scaling factor"); ADD_PROPERTY_TYPE(AutoScaleFactorY, (1), "AutoScale", App::Prop_Hidden, "Automatic scaling factor"); ADD_PROPERTY_TYPE(AutoScaleFactorZ, (1), "AutoScale", App::Prop_Hidden, "Automatic scaling factor"); diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index ce952cd086..65969063da 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -62,6 +62,7 @@ #include "ViewProviderFemPostObject.h" #include "TaskPostBoxes.h" +#include "ViewProviderAnalysis.h" using namespace FemGui; @@ -836,8 +837,8 @@ void ViewProviderFemPostObject::setupTaskDialog(TaskDlgPost* dlg) dlg->appendBox(new TaskPostDisplay(this)); } -void ViewProviderFemPostObject::unsetEdit(int ModNum) { - +void ViewProviderFemPostObject::unsetEdit(int ModNum) +{ if (ModNum == ViewProvider::Default) { // and update the pad //getSketchObject()->getDocument()->recompute(); @@ -903,33 +904,9 @@ void ViewProviderFemPostObject::OnChange(Base::Subject< int >& /*rCaller*/, int bool ViewProviderFemPostObject::onDelete(const std::vector&) { - // warn the user if the object has childs - + // warn the user if the object has unselected children auto objs = claimChildren(); - if (!objs.empty()) - { - // generate dialog - QString bodyMessage; - QTextStream bodyMessageStream(&bodyMessage); - bodyMessageStream << qApp->translate("Std_Delete", - "The pipeline is not empty, therefore the\nfollowing " - "referencing objects might be lost:"); - bodyMessageStream << '\n'; - for (auto ObjIterator : objs) - bodyMessageStream << '\n' << QString::fromUtf8(ObjIterator->Label.getValue()); - bodyMessageStream << "\n\n" << QObject::tr("Are you sure you want to continue?"); - // show and evaluate the dialog - int DialogResult = QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("Std_Delete", "Object dependencies"), bodyMessage, - QMessageBox::Yes, QMessageBox::No); - if (DialogResult == QMessageBox::Yes) - return true; - else - return false; - } - else { - return true; - } + return ViewProviderFemAnalysis::checkSelectedChildren(objs, this->getDocument(), "pipeline"); } bool ViewProviderFemPostObject::canDelete(App::DocumentObject* obj) const diff --git a/src/Mod/Fem/Gui/ViewProviderSolver.cpp b/src/Mod/Fem/Gui/ViewProviderSolver.cpp index 3eabd41722..d69125f49a 100644 --- a/src/Mod/Fem/Gui/ViewProviderSolver.cpp +++ b/src/Mod/Fem/Gui/ViewProviderSolver.cpp @@ -32,6 +32,7 @@ #include #include "ViewProviderSolver.h" +#include "ViewProviderAnalysis.h" using namespace FemGui; @@ -44,9 +45,7 @@ ViewProviderSolver::ViewProviderSolver() } ViewProviderSolver::~ViewProviderSolver() -{ - -} +{} std::vector ViewProviderSolver::getDisplayModes() const { @@ -55,32 +54,9 @@ std::vector ViewProviderSolver::getDisplayModes() const bool ViewProviderSolver::onDelete(const std::vector&) { - // warn the user if the object has childs - + // warn the user if the object has unselected children auto objs = claimChildren(); - if (!objs.empty()) - { - // generate dialog - QString bodyMessage; - QTextStream bodyMessageStream(&bodyMessage); - bodyMessageStream << qApp->translate("Std_Delete", - "The solver is not empty, therefore the\nfollowing referencing objects might be lost:"); - bodyMessageStream << '\n'; - for (auto ObjIterator : objs) - bodyMessageStream << '\n' << QString::fromUtf8(ObjIterator->Label.getValue()); - bodyMessageStream << "\n\n" << QObject::tr("Are you sure you want to continue?"); - // show and evaluate the dialog - int DialogResult = QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("Std_Delete", "Object dependencies"), bodyMessage, - QMessageBox::Yes, QMessageBox::No); - if (DialogResult == QMessageBox::Yes) - return true; - else - return false; - } - else { - return true; - } + return ViewProviderFemAnalysis::checkSelectedChildren(objs, this->getDocument(), "solver"); } bool ViewProviderSolver::canDelete(App::DocumentObject* obj) const