191 lines
6.4 KiB
Plaintext
Executable file
191 lines
6.4 KiB
Plaintext
Executable file
import importSVG
|
|
import FreeCAD
|
|
import FreeCADGui
|
|
import Draft
|
|
import os
|
|
import Mesh
|
|
|
|
|
|
|
|
class WindowDialog():
|
|
def __init__(self):
|
|
self.ui_file = os.path.join(FreeCAD.getUserMacroDir(True), 'MultiExport/MultiExport.ui')
|
|
self.form = FreeCADGui.PySideUic.loadUi(self.ui_file)
|
|
self._connect_widgets()
|
|
self.form.show()
|
|
|
|
def _connect_widgets(self):
|
|
self.form.pushButtonSVG.pressed.connect(lambda: self.exportSVG(False))
|
|
self.form.pushButtonCalepinage.pressed.connect(lambda: self.exportSVG(True))
|
|
self.form.pushButtonSTLSingle.pressed.connect(lambda: self.exportSTL(True))
|
|
self.form.pushButtonSTLMulti.pressed.connect(lambda: self.exportSTL(False))
|
|
|
|
# -------- MODIFICATION DE LA MACRO "exportSketchEnMasse-SVG" de Gauthier Brière -------- #
|
|
|
|
def _exportSketchBasic(self, sketchList):
|
|
outputRacine = App.activeDocument().getFileName().rpartition('.')[0]
|
|
for __O__ in sketchList:
|
|
__obj__ = []
|
|
__obj__.append(__O__)
|
|
|
|
print('Export SVG de : ' + __obj__[0].Label)
|
|
|
|
oldPlace = __obj__[0].Placement
|
|
__obj__[0].Placement=App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(1,0,0),0), App.Vector(0,0,0))
|
|
fichierSVG = u"" + outputRacine + '--' + __obj__[0].Label + '.svg'
|
|
importSVG.export(__obj__, fichierSVG)
|
|
__obj__[0].Placement = oldPlace
|
|
App.ActiveDocument.removeObject(__O__.Label)
|
|
|
|
App.activeDocument().recompute()
|
|
|
|
def _exportSketchCalepinage(self, sketchList, plateLength, plateWidth, spacing, laserSize):
|
|
outputRacine = App.activeDocument().getFileName().rpartition('.')[0]
|
|
copy_sketchList = sketchList[:]
|
|
__obj__ = []
|
|
currentX = 0.0
|
|
currentY = 0.0
|
|
isSVGFull = False
|
|
YBlockCounter = 0
|
|
SVGNameCounter = 1
|
|
maxY = 0.0
|
|
index = 0
|
|
listSize = len(copy_sketchList)
|
|
errorCount = 0
|
|
|
|
while listSize > 0:
|
|
while index < listSize:
|
|
__O__ = copy_sketchList[index]
|
|
boundingBox = __O__.Shape.BoundBox
|
|
if (boundingBox.XLength > plateLength) or (boundingBox.YLength > plateWidth):
|
|
copy_sketchList.pop(index)
|
|
listSize = len(copy_sketchList)
|
|
errorCount += 1
|
|
App.ActiveDocument.removeObject(__O__.Label)
|
|
App.activeDocument().recompute()
|
|
continue
|
|
if boundingBox.XLength + currentX > plateLength:
|
|
if boundingBox.YLength + currentY > plateWidth:
|
|
YBlockCounter += 1
|
|
if YBlockCounter >= listSize:
|
|
isSVGFull = True
|
|
break
|
|
index += 1
|
|
continue
|
|
if boundingBox.YLength + currentY > plateWidth:
|
|
YBlockCounter += 1
|
|
if YBlockCounter >= listSize:
|
|
isSVGFull = True
|
|
break
|
|
index += 1
|
|
continue
|
|
__obj__.insert(0, __O__)
|
|
maxY = boundingBox.YLength if boundingBox.YLength > maxY else maxY
|
|
__obj__[0].Placement=App.Placement(App.Vector(0,0,0), App.Rotation(App.Vector(1,0,0),0), App.Vector(0,0,0))
|
|
|
|
if currentX == 0.0:
|
|
__obj__[0].Placement.Base = FreeCAD.Vector(-boundingBox.XMin + currentX, -boundingBox.YMin + currentY, 0.0)
|
|
currentX += boundingBox.XLength
|
|
else:
|
|
__obj__[0].Placement.Base = FreeCAD.Vector(-boundingBox.XMin + currentX + spacing, -boundingBox.YMin + currentY, 0.0)
|
|
currentX += boundingBox.XLength + spacing
|
|
|
|
copy_sketchList.pop(index)
|
|
listSize = len(copy_sketchList)
|
|
App.activeDocument().recompute()
|
|
index = 0
|
|
YBlockCounter = 0
|
|
|
|
currentX = 0.0
|
|
currentY += maxY + spacing
|
|
maxY = 0.0
|
|
index = 0
|
|
listSize = len(copy_sketchList)
|
|
App.activeDocument().recompute()
|
|
|
|
if listSize <= 0 or isSVGFull:
|
|
fichierSVG = u"" + outputRacine + '--CALEPINAGE-' + str(SVGNameCounter) + '.svg'
|
|
print('Export SVG de : ' + u"" + str(os.path.basename(outputRacine)) + '--CALEPINAGE-' + str(SVGNameCounter) + '.svg')
|
|
importSVG.export(__obj__, fichierSVG)
|
|
for __i__ in __obj__:
|
|
App.ActiveDocument.removeObject(__i__.Label)
|
|
|
|
App.activeDocument().recompute()
|
|
__obj__.clear()
|
|
maxY = 0.0
|
|
index = 0
|
|
currentX = 0.0
|
|
currentY = 0.0
|
|
isSVGFull = False
|
|
SVGNameCounter += 1
|
|
YBlockCounter = 0
|
|
listSize = len(copy_sketchList)
|
|
|
|
if errorCount == 1:
|
|
print(f"ERREUR : {errorCount} sketch ne rentre pas sur le plateau")
|
|
elif errorCount > 1:
|
|
print(f"ERREUR : {errorCount} sketchs ne rentrent pas sur le plateau")
|
|
|
|
# -------- END -------- #
|
|
|
|
def exportSVG(self, isCalepinage):
|
|
plateLength = self.form.doubleSpinBoxLength.value()
|
|
plateWidth = self.form.doubleSpinBoxWidth.value()
|
|
spacing = self.form.doubleSpinBoxSpacing.value()
|
|
laserSize = self.form.doubleSpinBoxLaserSize.value()
|
|
sketchList = []
|
|
for selectedObject in FreeCADGui.Selection.getSelectionEx():
|
|
if hasattr(selectedObject.Object, 'Dir'):
|
|
sv0 = Draft.make_shape2dview(selectedObject.Object, FreeCAD.Vector(selectedObject.Object.Dir))
|
|
elif hasattr(selectedObject.Object, 'Objects'):
|
|
for child in selectedObject.Object.Objects:
|
|
if hasattr(child, 'Dir'):
|
|
sv0 = Draft.make_shape2dview(selectedObject.Object, FreeCAD.Vector(child.Dir))
|
|
break
|
|
|
|
FreeCAD.ActiveDocument.recompute()
|
|
sk = Draft.make_sketch(sv0, autoconstraints=True)
|
|
sk.ViewObject.LineColor = (1.0, 0.0, 0.0)
|
|
FreeCAD.ActiveDocument.recompute()
|
|
sketchList.append(sk)
|
|
if hasattr(sv0, 'Name'):
|
|
App.ActiveDocument.removeObject(sv0.Name)
|
|
|
|
if isCalepinage:
|
|
self._exportSketchCalepinage(sketchList, plateLength, plateWidth, spacing, laserSize)
|
|
else:
|
|
self._exportSketchBasic(sketchList)
|
|
|
|
def exportSTL(self, singleMode):
|
|
outputRacine = App.activeDocument().getFileName().rpartition('.')[0]
|
|
__obj__ = []
|
|
for selectedObject in FreeCADGui.Selection.getSelectionEx():
|
|
__obj__.append(selectedObject.Object)
|
|
if not singleMode:
|
|
filename = u"" + outputRacine + '--' + __obj__[0].Label + '.stl'
|
|
if hasattr(Mesh, "exportOptions"):
|
|
options = Mesh.exportOptions(outputRacine)
|
|
Mesh.export(__obj__, filename, options)
|
|
else:
|
|
Mesh.export(__obj__, filename)
|
|
print(f'Export STL de : {__obj__[0].Label}.stl')
|
|
__obj__.clear()
|
|
if singleMode:
|
|
filename = u"" + outputRacine + '--' + __obj__[0].Label + '.stl' if len(__obj__) == 1 else u"" + outputRacine + '.stl'
|
|
if hasattr(Mesh, "exportOptions"):
|
|
options = Mesh.exportOptions(outputRacine)
|
|
Mesh.export(__obj__, filename, options)
|
|
else:
|
|
Mesh.export(__obj__, filename)
|
|
if len(__obj__) == 1:
|
|
print(f'Export STL de : {__obj__[0].Label}.stl')
|
|
else:
|
|
print(f'Export STL de {os.path.basename(outputRacine)}.stl')
|
|
del __obj__
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
d = WindowDialog()
|
|
except Exception as e:
|
|
print(e) |