Skip to content

Instantly share code, notes, and snippets.

@dzid26
Last active June 20, 2025 13:02
Show Gist options
  • Save dzid26/e0ff365de43cabe658df9d93b92d1954 to your computer and use it in GitHub Desktop.
Save dzid26/e0ff365de43cabe658df9d93b92d1954 to your computer and use it in GitHub Desktop.
remove trailing space
# Copyright 2016, Jon Nordby <[email protected]>. Licensed LGPLv2+ & MIT
# [email protected]: ChatGPT + Deepseek R1
"""
exportProject:
Exports all files in document which have names like "mypart [dxf]" or "otherpart[stl,step]"
to individual files in an export directory. Default prefix: 'export/$project-'.
Prints clean results to console only when exports occur.
"""
import os
import re
import FreeCAD
from PySide import QtGui
# Regex to extract part names and types
partTypeRegex = re.compile(r'^(.*)\[([,\w]+)\].*$')
# Export functions
def exportMesh(objs, p): import Mesh; Mesh.export(objs, p)
def exportDxf(objs, p): import importDXF; importDXF.export(objs, p)
def exportStep(objs, p):
for o in objs: o.Shape.exportStep(p)
supportedTypes = {
'stl': exportMesh,
'obj': exportMesh,
'step': exportStep,
'dxf': exportDxf,
}
def extractTypes(label):
match = re.search(partTypeRegex, label)
return (match.group(1), match.group(2).split(',')) if match else (label, [])
def exportDocument(doc, exportdir):
exported = []
os.makedirs(exportdir, exist_ok=True)
docname = os.path.splitext(os.path.basename(doc.FileName))[0] if doc.FileName else "Untitled"
for obj in doc.Objects:
partname, types = extractTypes(obj.Label)
for t in types:
if t in supportedTypes:
filename = f"{docname}-{partname.strip()}.{t}"
filepath = os.path.join(exportdir, filename)
supportedTypes[t]([obj], filepath)
exported.append(filename)
return exported
def macromain():
doc = FreeCAD.ActiveDocument
if not doc:
return
try:
# Handle unsaved documents
if not doc.FileName:
path = QtGui.QFileDialog.getSaveFileName(
None, "Save document before export",
"Untitled.FCStd",
"FreeCAD documents (*.FCStd)")[0]
if not path:
return
doc.saveAs(path)
if FreeCAD.GuiUp:
FreeCAD.Gui.updateGui()
doc.save()
if FreeCAD.GuiUp:
FreeCAD.Gui.SendMsgToActiveView("Save")
FreeCAD.Gui.updateGui()
doc.recompute()
exportdir = os.path.join(os.path.dirname(doc.FileName), 'export/')
exported_files = exportDocument(doc, exportdir)
if exported_files:
# Clean console output without timestamps
print("\n ============ Exported files ============")
print(exportdir.replace('\\', '/'))
for f in exported_files:
print("- ", f)
print("="*40 + "\n")
except Exception as e:
print("\n! Export error:", str(e), "\n")
if __name__ == '__main__' and FreeCAD.GuiUp:
macromain()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment