reworked code - no longer depends on document selection but only on macro selection for exports

This commit is contained in:
Thomas-Alexandre Moreau 2025-07-08 12:43:55 +02:00
parent d1e0f260fc
commit 9cc8cd49c0
2 changed files with 50 additions and 93 deletions

View file

@ -14,7 +14,7 @@ class ObjectListItem(QWidget):
self.obj = obj self.obj = obj
self.label = QLabel(obj.Label) self.label = QLabel(obj.Label)
self.spinbox = QSpinBox() self.spinbox = QSpinBox()
self.spinbox.setRange(0, 9999) self.spinbox.setRange(1, 9999)
self.spinbox.setValue(1) self.spinbox.setValue(1)
layout = QHBoxLayout() layout = QHBoxLayout()
@ -33,34 +33,20 @@ class WindowDialog():
self.outputRacine = "" self.outputRacine = ""
self.ui_file = os.path.join(FreeCAD.getUserMacroDir(True), 'MultiExport/MultiExport.ui') self.ui_file = os.path.join(FreeCAD.getUserMacroDir(True), 'MultiExport/MultiExport.ui')
self.form = FreeCADGui.PySideUic.loadUi(self.ui_file) self.form = FreeCADGui.PySideUic.loadUi(self.ui_file)
self._connect_widgets() self.connect_widgets()
self._populate_selector_list() self.populate_selector_list()
FreeCADGui.Selection.addObserver(self._on_selection_changed) FreeCADGui.Selection.addObserver(self.on_selection_changed)
self.form.show() self.form.show()
def refresh(self):
for index in range(self.form.listWidgetSelector.count()):
item = self.form.listWidgetSelector.item(index)
widget = self.form.listWidgetSelector.itemWidget(item)
item.setSelected(False)
for obj in FreeCADGui.Selection.getSelection(): def connect_widgets(self):
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)
break
def _connect_widgets(self):
self.form.pushButtonExport.pressed.connect(self.export) self.form.pushButtonExport.pressed.connect(self.export)
self.form.pushButtonSave.pressed.connect(self.saveVarSet) self.form.pushButtonSave.pressed.connect(self.saveVarSet)
self.form.pushButtonRefresh.pressed.connect(self.refresh)
self.form.listWidgetSelector.itemClicked.connect(self._on_list_item_clicked)
def _populate_selector_list(self):
def populate_selector_list(self):
self.form.listWidgetSelector.clear() self.form.listWidgetSelector.clear()
FreeCADGui.Selection.clearSelection() FreeCADGui.Selection.clearSelection()
@ -74,19 +60,9 @@ class WindowDialog():
self.form.listWidgetSelector.setItemWidget(item, widget) self.form.listWidgetSelector.setItemWidget(item, widget)
item.setSelected(True) item.setSelected(True)
FreeCADGui.Selection.addSelection(obj)
def on_selection_changed(self, doc, objects):
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):
for index in range(self.form.listWidgetSelector.count()): for index in range(self.form.listWidgetSelector.count()):
item = self.form.listWidgetSelector.item(index) item = self.form.listWidgetSelector.item(index)
widget = self.form.listWidgetSelector.itemWidget(item) widget = self.form.listWidgetSelector.itemWidget(item)
@ -101,7 +77,7 @@ class WindowDialog():
break break
def _createFolder(self): def createFolder(self):
date = datetime.today().strftime('%Y-%m-%d') date = datetime.today().strftime('%Y-%m-%d')
time = datetime.today().strftime('%H:%M:%S') time = datetime.today().strftime('%H:%M:%S')
@ -120,7 +96,7 @@ class WindowDialog():
# -------- MODIFICATION DE LA MACRO "exportSketchEnMasse-SVG" de Gauthier Brière -------- # # -------- MODIFICATION DE LA MACRO "exportSketchEnMasse-SVG" de Gauthier Brière -------- #
def _exportSketchBasic(self, sketchList): def exportSketchBasic(self, sketchList):
for __O__ in sketchList: for __O__ in sketchList:
__obj__ = [] __obj__ = []
__obj__.append(__O__) __obj__.append(__O__)
@ -133,7 +109,7 @@ class WindowDialog():
FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().recompute()
def _exportSketchCalepinage(self, sketchList, plateLength, plateWidth, spacing): def exportSketchCalepinage(self, sketchList, plateLength, plateWidth, spacing):
copy_sketchList = sketchList[:] copy_sketchList = sketchList[:]
__obj__ = [] __obj__ = []
currentX = 0.0 currentX = 0.0
@ -197,8 +173,8 @@ class WindowDialog():
FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().recompute()
if listSize <= 0 or isSVGFull: if listSize <= 0 or isSVGFull:
fichierSVG = u"" + 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') print('Export SVG de : ' + u"" + str(os.path.basename(self.outputRacine)) + 'CALEPINAGE-(' + str(SVGNameCounter) + ')' + '.svg')
importSVG.export(__obj__, fichierSVG) importSVG.export(__obj__, fichierSVG)
for __i__ in __obj__: for __i__ in __obj__:
FreeCAD.ActiveDocument.removeObject(__i__.Label) FreeCAD.ActiveDocument.removeObject(__i__.Label)
@ -242,25 +218,14 @@ class WindowDialog():
return None return None
def exportSVG(self, isCalepinage): def exportSVG(self, isCalepinage, svgList):
plateLength = self.form.doubleSpinBoxLength.value() plateLength = self.form.doubleSpinBoxLength.value()
plateWidth = self.form.doubleSpinBoxWidth.value() plateWidth = self.form.doubleSpinBoxWidth.value()
spacing = self.form.doubleSpinBoxSpacing.value() spacing = self.form.doubleSpinBoxSpacing.value()
sketchList = [] sketchList = []
for obj in FreeCADGui.Selection.getSelection(): for _, obj, objCount in svgList:
if not obj.Label.endswith("-SVG"): for _ in range(objCount):
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 _ in range(count):
if hasattr(obj, "Dir"): if hasattr(obj, "Dir"):
vector = FreeCAD.Vector(obj.Dir.x, obj.Dir.y, obj.Dir.z) vector = FreeCAD.Vector(obj.Dir.x, obj.Dir.y, obj.Dir.z)
else: else:
@ -278,34 +243,19 @@ class WindowDialog():
FreeCAD.ActiveDocument.removeObject(sv0.Name) FreeCAD.ActiveDocument.removeObject(sv0.Name)
if isCalepinage: if isCalepinage:
self._exportSketchCalepinage(sketchList, plateLength, plateWidth, spacing) self.exportSketchCalepinage(sketchList, plateLength, plateWidth, spacing)
else: else:
self._exportSketchBasic(sketchList) self.exportSketchBasic(sketchList)
for obj in FreeCAD.ActiveDocument.Objects:
if obj.Label.endswith("-SVG") or obj.Label.endswith("-STL"):
FreeCADGui.Selection.addSelection(obj)
def exportSTL(self, singleMode): def exportSTL(self, singleMode, stlList):
objects_to_export = [] objects_to_export = []
for obj in FreeCADGui.Selection.getSelection(): for objLabel, obj, objCount in stlList:
if not obj.Label.endswith("-STL"): for i in range(objCount):
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):
clone = Draft.clone(obj) clone = Draft.clone(obj)
objects_to_export.append((clone, obj.Label, i + 1)) objects_to_export.append((clone, objLabel, i + 1))
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
@ -326,19 +276,38 @@ class WindowDialog():
FreeCAD.ActiveDocument.removeObject(obj.Name) FreeCAD.ActiveDocument.removeObject(obj.Name)
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
for obj in FreeCAD.ActiveDocument.Objects:
if obj.Label.endswith("-SVG") or obj.Label.endswith("-STL"):
FreeCADGui.Selection.addSelection(obj)
def export(self): def export(self):
isCalepinage = self.form.checkBoxCalepinage.isChecked() isCalepinage = self.form.checkBoxCalepinage.isChecked()
isCombine = self.form.checkBoxCombine.isChecked() isCombine = self.form.checkBoxCombine.isChecked()
self.outputRacine = self._createFolder() svgList = []
stlList = []
self.exportSVG(isCalepinage) for obj in FreeCAD.ActiveDocument.Objects:
self.exportSTL(isCombine) 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"): def saveVarSet(self, varSetName = "TestVarSet"):
@ -362,6 +331,9 @@ class WindowDialog():
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
# def loadVarSet(self, varSetName = "TestVarSet", count = 1):
if __name__ == '__main__': if __name__ == '__main__':
try: try:
mainWindow = WindowDialog() mainWindow = WindowDialog()

View file

@ -45,21 +45,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2" colspan="3">
<widget class="QPushButton" name="pushButtonRefresh">
<property name="text">
<string notr="true">🔄</string>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="toolTip">
<string>Refresh</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3"> <item row="1" column="0" colspan="3">
<widget class="QListWidget" name="listWidgetSelector"> <widget class="QListWidget" name="listWidgetSelector">
<property name="selectionMode"> <property name="selectionMode">