diff --git a/MultiExport.FCMacro b/MultiExport.FCMacro index 3d1387c..baa959b 100755 --- a/MultiExport.FCMacro +++ b/MultiExport.FCMacro @@ -14,7 +14,7 @@ class ObjectListItem(QWidget): self.obj = obj self.label = QLabel(obj.Label) self.spinbox = QSpinBox() - self.spinbox.setRange(0, 9999) + self.spinbox.setRange(1, 9999) self.spinbox.setValue(1) layout = QHBoxLayout() @@ -33,20 +33,20 @@ class WindowDialog(): self.outputRacine = "" self.ui_file = os.path.join(FreeCAD.getUserMacroDir(True), 'MultiExport/MultiExport.ui') self.form = FreeCADGui.PySideUic.loadUi(self.ui_file) - self._connect_widgets() - self._populate_selector_list() + self.connect_widgets() + self.populate_selector_list() - # Connect the selection change signal to keep the list in sync - FreeCADGui.Selection.addObserver(self._on_selection_changed) + FreeCADGui.Selection.addObserver(self.on_selection_changed) self.form.show() - def _connect_widgets(self): + def connect_widgets(self): self.form.pushButtonExport.pressed.connect(self.export) - self.form.listWidgetSelector.itemClicked.connect(self._on_list_item_clicked) + self.form.pushButtonSave.pressed.connect(self.saveVarSet) - def _populate_selector_list(self): + + def populate_selector_list(self): self.form.listWidgetSelector.clear() FreeCADGui.Selection.clearSelection() @@ -59,38 +59,25 @@ class WindowDialog(): self.form.listWidgetSelector.addItem(item) self.form.listWidgetSelector.setItemWidget(item, widget) - # Sync selection: add the object to the selection and select the item in the list item.setSelected(True) - FreeCADGui.Selection.addSelection(obj) - - def _on_list_item_clicked(self, item): - widget = self.form.listWidgetSelector.itemWidget(item) - obj = widget.obj - if obj in FreeCADGui.Selection.getSelection(): - FreeCADGui.Selection.removeSelection(obj) - else: - FreeCADGui.Selection.addSelection(obj) - - def _on_selection_changed(self, doc, objects): - # Clear current selection in the list + def on_selection_changed(self, doc, objects): for index in range(self.form.listWidgetSelector.count()): item = self.form.listWidgetSelector.item(index) widget = self.form.listWidgetSelector.itemWidget(item) - item.setSelected(False) # Deselect in the list + item.setSelected(False) - # Sync the list selection with FreeCAD's current selection for obj in FreeCADGui.Selection.getSelection(): for index in range(self.form.listWidgetSelector.count()): item = self.form.listWidgetSelector.item(index) widget = self.form.listWidgetSelector.itemWidget(item) if widget.obj == obj: - item.setSelected(True) # Select the corresponding item in the list + item.setSelected(True) break - def _createFolder(self): + def createFolder(self): date = datetime.today().strftime('%Y-%m-%d') time = datetime.today().strftime('%H:%M:%S') @@ -109,7 +96,7 @@ class WindowDialog(): # -------- MODIFICATION DE LA MACRO "exportSketchEnMasse-SVG" de Gauthier Brière -------- # - def _exportSketchBasic(self, sketchList): + def exportSketchBasic(self, sketchList): for __O__ in sketchList: __obj__ = [] __obj__.append(__O__) @@ -122,7 +109,7 @@ class WindowDialog(): FreeCAD.activeDocument().recompute() - def _exportSketchCalepinage(self, sketchList, plateLength, plateWidth, spacing): + def exportSketchCalepinage(self, sketchList, plateLength, plateWidth, spacing): copy_sketchList = sketchList[:] __obj__ = [] currentX = 0.0 @@ -186,8 +173,8 @@ class WindowDialog(): FreeCAD.activeDocument().recompute() if listSize <= 0 or isSVGFull: - fichierSVG = u"" + self.outputRacine + 'CALEPINAGE-' + str(SVGNameCounter) + '-' + '.svg' - print('Export SVG de : ' + u"" + str(os.path.basename(self.outputRacine)) + 'CALEPINAGE-' + str(SVGNameCounter) + '-' + '.svg') + fichierSVG = u"" + self.outputRacine + 'CALEPINAGE-(' + str(SVGNameCounter) + ')' + '.svg' + print('Export SVG de : ' + u"" + str(os.path.basename(self.outputRacine)) + 'CALEPINAGE-(' + str(SVGNameCounter) + ')' + '.svg') importSVG.export(__obj__, fichierSVG) for __i__ in __obj__: FreeCAD.ActiveDocument.removeObject(__i__.Label) @@ -224,64 +211,26 @@ class WindowDialog(): largestFace = face if largestFace: - # Get normal at center of face (parametric center) u, v = largestFace.Surface.parameter(largestFace.CenterOfMass) normal = largestFace.normalAt(u, v) return normal.normalize() return None - # def searchDir(self, obj, xres, yres, zres): - # x, y, z = xres, yres, zres - - # if hasattr(obj, "Dir"): - # if obj.Dir.x != 0.0: - # x = obj.Dir.x - # if obj.Dir.y != 0.0: - # y = obj.Dir.y - # if obj.Dir.z != 0.0: - # z = obj.Dir.z - - # if not hasattr(obj, "Objects"): - # return FreeCAD.Vector(x, y, z) - # else: - # res = FreeCAD.Vector(x, y, z) - # for i in obj.Objects: - # res = self.searchDir(i, x, y, z) - # return res - - # elif hasattr(obj, "Objects"): - # res = FreeCAD.Vector(x, y, z) - # for i in obj.Objects: - # res = self.searchDir(i, x, y, z) - # return res - - def exportSVG(self, isCalepinage): + + def exportSVG(self, isCalepinage, svgList): plateLength = self.form.doubleSpinBoxLength.value() plateWidth = self.form.doubleSpinBoxWidth.value() spacing = self.form.doubleSpinBoxSpacing.value() sketchList = [] - for obj in FreeCADGui.Selection.getSelection(): - if not obj.Label.endswith("-SVG"): - continue - - count = 1 # default if not using spinboxes (or fetch from list if desired) - # Optional: match count from list - for index in range(self.form.listWidgetSelector.count()): - item = self.form.listWidgetSelector.item(index) - widget = self.form.listWidgetSelector.itemWidget(item) - if widget.obj == obj: - count = widget.get_value() - break - - for _ in range(count): + for _, obj, objCount in svgList: + for _ in range(objCount): if hasattr(obj, "Dir"): vector = FreeCAD.Vector(obj.Dir.x, obj.Dir.y, obj.Dir.z) else: vector = self.getLargestFaceDir(obj) - # vector = self.searchDir(obj, 0, 0, 0) sv0 = Draft.make_shape2dview(obj, vector) FreeCAD.ActiveDocument.recompute() @@ -294,32 +243,19 @@ class WindowDialog(): FreeCAD.ActiveDocument.removeObject(sv0.Name) if isCalepinage: - self._exportSketchCalepinage(sketchList, plateLength, plateWidth, spacing) + self.exportSketchCalepinage(sketchList, plateLength, plateWidth, spacing) else: - self._exportSketchBasic(sketchList) - - self._populate_selector_list() + self.exportSketchBasic(sketchList) - def exportSTL(self, singleMode): + def exportSTL(self, singleMode, stlList): objects_to_export = [] - for obj in FreeCADGui.Selection.getSelection(): - if not obj.Label.endswith("-STL"): - continue - - count = 1 - for index in range(self.form.listWidgetSelector.count()): - item = self.form.listWidgetSelector.item(index) - widget = self.form.listWidgetSelector.itemWidget(item) - if widget.obj == obj: - count = widget.get_value() - break - - for i in range(count): + for objLabel, obj, objCount in stlList: + for i in range(objCount): clone = Draft.clone(obj) - objects_to_export.append((clone, obj.Label, i + 1)) + objects_to_export.append((clone, objLabel, i + 1)) FreeCAD.ActiveDocument.recompute() @@ -340,17 +276,62 @@ class WindowDialog(): FreeCAD.ActiveDocument.removeObject(obj.Name) FreeCAD.ActiveDocument.recompute() - self._populate_selector_list() def export(self): isCalepinage = self.form.checkBoxCalepinage.isChecked() isCombine = self.form.checkBoxCombine.isChecked() - self.outputRacine = self._createFolder() + svgList = [] + stlList = [] - self.exportSVG(isCalepinage) - self.exportSTL(isCombine) + for obj in FreeCAD.ActiveDocument.Objects: + count = 1 + + for index in range(self.form.listWidgetSelector.count()): + item = self.form.listWidgetSelector.item(index) + widget = self.form.listWidgetSelector.itemWidget(item) + + if not item.isSelected(): + continue + + if widget.obj == obj: + count = widget.get_value() + if obj.Label.endswith("-SVG"): + svgList.append((obj.Label, obj, count)) + elif obj.Label.endswith("-STL"): + stlList.append((obj.Label, obj, count)) + break + + if not svgList == [] or not stlList == []: + self.outputRacine = self.createFolder() + + self.exportSVG(isCalepinage, svgList) + self.exportSTL(isCombine, stlList) + + + def saveVarSet(self, varSetName = "TestVarSet"): + varSet = FreeCAD.ActiveDocument.addObject("App::VarSet", varSetName) + + for obj in FreeCADGui.Selection.getSelection(): + count = 1 + for index in range(self.form.listWidgetSelector.count()): + item = self.form.listWidgetSelector.item(index) + widget = self.form.listWidgetSelector.itemWidget(item) + if widget.obj == obj: + count = widget.get_value() + break + + varSet.addProperty("App::PropertyStringList", obj.Name) + if obj.Label.endswith("-SVG"): + setattr(varSet, obj.Name, ("SVG", str(count))) + else: + setattr(varSet, obj.Name, ("STL", str(count))) + + FreeCAD.ActiveDocument.recompute() + + + # def loadVarSet(self, varSetName = "TestVarSet", count = 1): if __name__ == '__main__': diff --git a/MultiExport/MultiExport.ui b/MultiExport/MultiExport.ui index 7cd9bef..f76e2b3 100644 --- a/MultiExport/MultiExport.ui +++ b/MultiExport/MultiExport.ui @@ -17,7 +17,7 @@ Multi Export - + @@ -187,6 +187,13 @@ + + + + Save + + +