def saveFile(self): import FreeCADGui if self.form.Radio_Selection.isChecked(): objects = FreeCADGui.Selection.getSelection() else: objects = [ obj for obj in FreeCAD.ActiveDocument.Objects if obj.ViewObject.isVisible() ] if not objects: QtGui.QMessageBox.critical( None, translate("Web", "Nothing to upload"), translate( "The selection of the document contains no object to upload" )) return None filename = os.path.join(tempfile._get_default_tempdir(), next(tempfile._get_candidate_names())) filetype = self.form.Combo_Filetype.currentIndex() # 0 = obj + mtl, 1 = obj, 2 = dae, 3 = stl, 4 = IGES, 5 = iv (currently not working) if filetype == 0: # OBJ + MTL import importOBJ importOBJ.export(objects, filename + ".obj") return self.packFiles(filename, [filename + ".obj", filename + ".mtl"]) elif filetype == 1: # OBJ (mesh exporter) import Mesh Mesh.export(objects, filename + ".obj") return self.packFiles(filename, [filename + ".obj"]) elif filetype == 2: # DAE import importDAE importDAE.export(objects, filename + ".dae") return self.packFiles(filename, [filename + ".dae"]) elif filetype == 3: # STL import Mesh Mesh.export(objects, filename + ".stl") return self.packFiles(filename, [filename + ".stl"]) elif filetype == 4: # IGES import Part Part.export(objects, filename + ".iges") return self.packFiles(filename, [filename + ".iges"]) elif filetype == 5: # IV import FreeCADGui FreeCADGui.export(objects, filename + ".iv") # removing FreeCAD-specific nodes f = open(filename + ".iv", "rb") s = f.read() f.close() s = s.replace("SoBrepEdgeSet", "SoIndexedLineSet") s = s.replace("SoBrepFaceSet", "SoIndexedFaceSet") s = s.replace("\n", "--endl--") s = re.sub("highlightIndex .*?\]", " ", s) s = re.sub("partIndex .*?\]", " ", s) s = s.replace("--endl--", "\n") f = open(filename + ".iv", "wb") f.write(s) f.close() return self.packFiles(filename, [filename + ".iv"])
def exportVRML(doc, modelName, scale, dir): ## Export to VRML scaled 1/2.54 #VrmlFileName='.//'+doc.Label+'.wrl' ## outdir=os.path.dirname(os.path.realpath(__file__))+dir outdir = dir #FreeCAD.Console.PrintMessage('\r\n'+outdir) VrmlFileName = outdir + '/' + modelName + '.wrl' StepFileName = outdir + '/' + modelName + '.step' objs = [] objs = GetListOfObjects(FreeCAD, doc) #objs.append(FreeCAD.getDocument(doc.Name).getObject("Fusion001")) FreeCAD.ActiveDocument.addObject('Part::Feature', 'Vrml_model').Shape = objs[0].Shape FreeCAD.ActiveDocument.ActiveObject.Label = 'Vrml_model' FreeCADGui.ActiveDocument.ActiveObject.ShapeColor = FreeCADGui.getDocument( doc.Name).getObject(objs[0].Name).ShapeColor FreeCADGui.ActiveDocument.ActiveObject.LineColor = FreeCADGui.getDocument( doc.Name).getObject(objs[0].Name).LineColor FreeCADGui.ActiveDocument.ActiveObject.PointColor = FreeCADGui.getDocument( doc.Name).getObject(objs[0].Name).PointColor FreeCADGui.ActiveDocument.ActiveObject.DiffuseColor = FreeCADGui.getDocument( doc.Name).getObject(objs[0].Name).DiffuseColor FreeCAD.ActiveDocument.recompute() newObj = FreeCAD.getDocument(doc.Name).getObject('Vrml_model') #scale to export vrml start Draft.scale(newObj, delta=FreeCAD.Vector(scale, scale, scale), center=FreeCAD.Vector(0, 0, 0), legacy=True) FreeCAD.activeDocument().recompute() #we need to remove object to export only scaled model FreeCAD.getDocument(doc.Name).removeObject(objs[0].Name) __objs__ = [] __objs__.append(FreeCAD.getDocument(doc.Name).getObject("Vrml_model")) FreeCADGui.export(__objs__, VrmlFileName) FreeCAD.activeDocument().recompute() #restoring step module import ImportGui ImportGui.insert(StepFileName, doc.Name) FreeCAD.Console.PrintMessage(FreeCAD.ActiveDocument.ActiveObject.Label + " exported and scaled to Vrml\r\n") del __objs__ return 0
def exportVRML(doc,modelName,scale,dir): ## Export to VRML scaled 1/2.54 #VrmlFileName='.//'+doc.Label+'.wrl' ## outdir=os.path.dirname(os.path.realpath(__file__))+dir outdir=dir FreeCAD.Console.PrintMessage('\r\n'+outdir) VrmlFileName=outdir+'/'+modelName+'.wrl' StepFileName=outdir+'/'+modelName+'.step' objs=[] objs=GetListOfObjects(FreeCAD, doc) #objs.append(FreeCAD.getDocument(doc.Name).getObject("Fusion001")) FreeCAD.ActiveDocument.addObject('Part::Feature','Vrml_model').Shape=objs[0].Shape FreeCAD.ActiveDocument.ActiveObject.Label='Vrml_model' FreeCADGui.ActiveDocument.ActiveObject.ShapeColor=FreeCADGui.getDocument(doc.Name).getObject(objs[0].Name).ShapeColor FreeCADGui.ActiveDocument.ActiveObject.LineColor=FreeCADGui.getDocument(doc.Name).getObject(objs[0].Name).LineColor FreeCADGui.ActiveDocument.ActiveObject.PointColor=FreeCADGui.getDocument(doc.Name).getObject(objs[0].Name).PointColor FreeCADGui.ActiveDocument.ActiveObject.DiffuseColor=FreeCADGui.getDocument(doc.Name).getObject(objs[0].Name).DiffuseColor FreeCAD.ActiveDocument.recompute() newObj=FreeCAD.getDocument(doc.Name).getObject('Vrml_model') #scale to export vrml start Draft.scale(newObj,delta=FreeCAD.Vector(scale,scale,scale),center=FreeCAD.Vector(0,0,0),legacy=True) FreeCAD.activeDocument().recompute() #we need to remove object to export only scaled model FreeCAD.getDocument(doc.Name).removeObject(objs[0].Name) __objs__=[] __objs__.append(FreeCAD.getDocument(doc.Name).getObject("Vrml_model")) FreeCADGui.export(__objs__,VrmlFileName) FreeCAD.activeDocument().recompute() #restoring step module import ImportGui ImportGui.insert(StepFileName,doc.Name) FreeCAD.Console.PrintMessage(FreeCAD.ActiveDocument.ActiveObject.Label+" exported and scaled to Vrml\r\n") del __objs__ return 0
def saveFile(self): import FreeCADGui if self.form.Radio_Selection.isChecked(): objects = FreeCADGui.Selection.getSelection() else: objects = [obj for obj in FreeCAD.ActiveDocument.Objects if obj.ViewObject.isVisible()] if not objects: QtGui.QMessageBox.critical(None,translate("WebTools","Nothing to upload"),translate("The selection of the document contains no object to upload")) return None filename = os.path.join(tempfile._get_default_tempdir(),next(tempfile._get_candidate_names())) filetype = self.form.Combo_Filetype.currentIndex() # 0 = obj + mtl, 1 = obj, 2 = dae, 3 = stl, 4 = IGES, 5 = iv (currently not working) if filetype == 0: # OBJ + MTL import importOBJ importOBJ.export(objects,filename+".obj") return self.packFiles(filename,[filename+".obj",filename+".mtl"]) elif filetype == 1: # OBJ (mesh exporter) import Mesh Mesh.export(objects,filename+".obj") return self.packFiles(filename,[filename+".obj"]) elif filetype == 2: # DAE import importDAE importDAE.export(objects,filename+".dae") return self.packFiles(filename,[filename+".dae"]) elif filetype == 3: # STL import Mesh Mesh.export(objects,filename+".stl") return self.packFiles(filename,[filename+".stl"]) elif filetype == 4: # IGES import Part Part.export(objects,filename+".iges") return self.packFiles(filename,[filename+".iges"]) elif filetype == 5: # IV import FreeCADGui # remove objects with no face (unsupported by this format) nobjects = [] for o in objects: if o.isDerivedFrom("Part::Feature"): if o.Shape.Faces: nobjects.append(o) FreeCADGui.export(nobjects,filename+".iv") # removing FreeCAD-specific nodes f = open(filename+".iv","rb") s = f.read() f.close() ver = FreeCAD.Version() vinfo = "# Exported by FreeCAD v" + ver[0] + "." + ver[1] + " build" + ver[2] + "\n" vinfo += "# http://www.freecadweb.org\n" s = s.replace("#Inventor V2.1 ascii","#Inventor V2.1 ascii\n"+vinfo) s = s.replace("SoBrepEdgeSet","IndexedLineSet") s = s.replace("SoBrepFaceSet","IndexedFaceSet") s = s.replace("SoBrepPointSet","IndexedPointSet") s = s.replace("\n","--endl--") s = re.sub("--endl--[ \t]+highlightIndex.*?--endl--","--endl--",s) s = re.sub("--endl--[ \t]+partIndex.*?--endl--","--endl--",s) s = re.sub("--endl--[ \t]+selectionIndex.*?--endl--","--endl--",s) s = re.sub("SFInt32 highlightIndex, ","",s) s = re.sub("MFInt32 partIndex, ","",s) s = re.sub("MFInt32 selectionIndex ","",s) s = re.sub(", \]"," \]",s) s = s.replace("--endl--","\n") f = open(filename+".iv","wb") f.write(s) f.close() print("saved "+filename+".iv") return self.packFiles(filename,[filename+".iv"])
def export(ftype, componentName, componentModel, filename, fuse=False, scale=None): """ Exports given ComponentModel object using FreeCAD. `ftype` : one of "STEP", "VRML", "FREECAD", "X3D" `componentModel` : a ComponentModel instance `filename` : name of the file, extension is important `fuse` : fuse objects together before export (preserves color) `scale` : scales the model with this factor before exporting X3D exporter doesn't support `fuse` parameter. """ objects = componentModel.parts if len(objects) < 1: raise Exception("ComponentModel is empty!") if len(objects) == 1: # can't fuse if there is only 1 object fuse = False # export to X3D or Simple VRML, continue for other exporters (VRML, FREECAD, STEP) if ftype in ["X3D", "S_VRML"]: if fuse: print("%s exporter can't do fuse, ignoring." % ftype) from export_x3d import exportX3D, Mesh from export_vrml import exportVRML meshes = [shapeToMesh(o[0].toFreecad(), o[1], scale) for o in objects] if ftype == "X3D": exportX3D(meshes, filename) else: # S_VRML exportVRML(meshes, filename) return # init FreeCADGui try: import ImportGui except ImportError: FreeCADGui.showMainWindow() FreeCADGui.getMainWindow().hide() # prevent splash of main window import ImportGui # must be after `showMainWindow` # make sure RefineShape=False pg = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Part/Boolean") usersRSOption = pg.GetBool("RefineModel") # will be restored, we promise pg.SetBool("RefineModel", False) # create a FreeCAD document doc = FreeCAD.newDocument() # create objects fcobjects = [makeFCObject(doc, componentName+"_"+co[2], co[0], co[1]) for co in objects] if fuse: fuseobj = doc.addObject("Part::MultiFuse", componentName) fuseobj.Shapes = fcobjects doc.recompute() exportObjects = [fuseobj] else: exportObjects = fcobjects if scale: import Draft v = FreeCAD.Vector(scale, scale, scale) vc = FreeCAD.Vector(0,0,0) # legacy=False, sometimes fail if scale < 1.0 exportObjects = [Draft.scale(obj, delta=v, center=vc, legacy=True) for obj in exportObjects] doc.recompute() if ftype == "STEP": # check filename if not os.path.splitext(filename)[1] in ['.stp', '.step']: raise Exception("Filename for STEP export must end with '.stp' or '.step'.") ImportGui.export(exportObjects, filename) elif ftype == "VRML": # check filename if not os.path.splitext(filename)[1] in ['.wrl', '.vrml']: raise Exception("Filename for VRML export must end with '.wrl' or '.vrml'.") # workaround for not exporting unselected objects (v0.16) # http://www.freecadweb.org/tracker/view.php?id=2221 FreeCADGui.Selection.clearSelection() for o in exportObjects: FreeCADGui.Selection.addSelection(o) # deal with points and lines for o in exportObjects: o.ViewObject.DisplayMode = "Shaded" FreeCADGui.export(exportObjects, filename) elif ftype == "FREECAD": for obj in list(doc.Objects): if not (obj in exportObjects): doc.removeObject(obj.Name) doc.saveAs(filename) else: raise Exception("Unknown export file type!") # restore RefineShape option pg.SetBool("RefineModel", usersRSOption)
search_folders[0] = search_folders[0][1:] search_folders[-1] = search_folders[-1][:-1] last_date = os.environ.get('LAST_DATE') oda_path = os.environ.get('ODA_PATH') document_index = 0 for search_folder in search_folders: for root, dirs, files in os.walk(search_folder): for file in files: if file.endswith('.dwg'): try: file_path = root + "\\" + file mtime = os.path.getctime(file_path) last_modified_date = datetime.fromtimestamp(mtime) if last_modified_date > datetime.strptime( last_date, '%Y-%m-%d %H:%M:%S'): convertToDxf(file_path) importDXF.open(tmp_folder + "\\" + file[:-3] + "dxf") document = list( app.listDocuments().keys())[document_index] document_index += 1 app.setActiveDocument(document) app.ActiveDocument = app.getDocument(document) gui.export(app.ActiveDocument.Objects, results_folder + "\\" + file[:-3] + "pdf") except OSError: mtime = 0 dotenv.set_key(dotenv_path, "LAST_DATE", str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
FreeCAD.setActiveDocument("Unnamed") ImportGui.insert(PATH_toStepFiles + FNME_stepfile,"Unnamed") FNME_vrmlfile = FNME_stepfile[:-4] + ".wrl" # change display mode and scale down for part in FreeCAD.ActiveDocument.Objects: part.ViewObject.DisplayMode = 1 #Shaded Draft.scale(part,delta=App.Vector(0.3937,0.3937,0.3937),center=App.Vector(0,0,0),legacy=True) if FLAG_makeTransparent: # if transparency is needed # from PySide import QtGui # QtGui.QInputDialog.getText(None, "Get text", "Input:")[0] pass __objs__=[] # select all parts (again) for part in FreeCAD.ActiveDocument.Objects: __objs__.append(part) FreeCADGui.export(__objs__,(PATH_toVrmlFiles + FNME_vrmlfile)) del __objs__ FreeCAD.closeDocument("Unnamed") # add license stuff to fresh VRML file print "working on",FNME_vrmlfile try: HDLR_vrmlfile = open(PATH_toVrmlFiles + FNME_vrmlfile, 'r') # open except: print "broken_4" else: HDLR_vrmlfile.seek(0) PMBL_vrmlfile = HDLR_vrmlfile.readlines() HDLR_vrmlfile.close() CNT_cutoff = 0
## Export as a step model exp_objects = [] for obj in FreeCAD.ActiveDocument.Objects: # select all but indivudial Spheres and Sketch if (obj.Name.find("Sphere") == -1) and (obj.Name.find("Sketch") == -1): Gui.Selection.addSelection(obj) exp_objects.append(obj) else: FreeCAD.ActiveDocument.removeObject(obj.Name) App.activeDocument().addObject("Part::MultiFuse","Fusion2") App.activeDocument().Fusion2.Shapes = exp_objects App.ActiveDocument.recompute() for obj in exp_objects: FreeCAD.ActiveDocument.removeObject(obj.Name) exp_objects= [] exp_objects.append(FreeCAD.ActiveDocument.getObject("Fusion2")) ImportGui.export(exp_objects,os.path.join(directory, name + '.step')) del exp_objects # Scale to mil before export to VRML for KiCAD use Draft.scale(FreeCAD.ActiveDocument.ActiveObject, FreeCAD.Vector(MMTOMIL,MMTOMIL,MMTOMIL)) FreeCAD.ActiveDocument.removeObject("Fusion2") ### Export as a VRML model exp_objects = [] exp_objects.append(FreeCAD.ActiveDocument.getObject("Scale")) FreeCADGui.export(exp_objects,os.path.join(directory, name + '.wrl')) del exp_objects exit(1)
exp_objects = [] for obj in FreeCAD.ActiveDocument.Objects: # select all but indivudial Spheres and Sketch if (obj.Name.find("Pin") == -1) and (obj.Name.find("Sketch") == -1): Gui.Selection.addSelection(obj) exp_objects.append(obj) else: FreeCAD.ActiveDocument.removeObject(obj.Name) App.activeDocument().addObject("Part::MultiFuse","Fusion2") App.activeDocument().Fusion2.Shapes = exp_objects App.ActiveDocument.recompute() for obj in exp_objects: FreeCAD.ActiveDocument.removeObject(obj.Name) exp_objects= [] exp_objects.append(FreeCAD.ActiveDocument.getObject("Fusion2")) ImportGui.export(exp_objects,os.path.join(directory, name + '.step')) del exp_objects # Scale to mil before export to VRML for KiCAD use Draft.scale(FreeCAD.ActiveDocument.ActiveObject, FreeCAD.Vector(MMTOMIL, MMTOMIL, MMTOMIL)) FreeCAD.ActiveDocument.removeObject("Fusion2") ### Export as a VRML model exp_objects = [] exp_objects.append(FreeCAD.ActiveDocument.getObject("Scale")) FreeCADGui.export(exp_objects,os.path.join(directory, name + '.wrl')) del exp_objects exit(1)
def export(ftype, componentName, componentModel, filename, fuse=False, scale=None): """ Exports given ComponentModel object using FreeCAD. `ftype` : one of "STEP", "VRML", "FREECAD", "X3D" `componentModel` : a ComponentModel instance `filename` : name of the file, extension is important `fuse` : fuse objects together before export (preserves color) `scale` : scales the model with this factor before exporting X3D exporter doesn't support `fuse` parameter. """ objects = componentModel.parts if len(objects) < 1: raise Exception("ComponentModel is empty!") if len(objects) == 1: # can't fuse if there is only 1 object fuse = False # export to X3D or Simple VRML, continue for other exporters (VRML, FREECAD, STEP) if ftype in ["X3D", "S_VRML"]: if fuse: print("%s exporter can't do fuse, ignoring." % ftype) from export_x3d import exportX3D, Mesh from export_vrml import exportVRML meshes = [shapeToMesh(o[0].toFreecad(), o[1], scale) for o in objects] if ftype == "X3D": exportX3D(meshes, filename) else: # S_VRML exportVRML(meshes, filename) return # init FreeCADGui try: import ImportGui except ImportError: FreeCADGui.showMainWindow() FreeCADGui.getMainWindow().hide() # prevent splash of main window import ImportGui # must be after `showMainWindow` # make sure RefineShape=False pg = FreeCAD.ParamGet( "User parameter:BaseApp/Preferences/Mod/Part/Boolean") usersRSOption = pg.GetBool("RefineModel") # will be restored, we promise pg.SetBool("RefineModel", False) # create a FreeCAD document doc = FreeCAD.newDocument() # create objects fcobjects = [ makeFCObject(doc, componentName + "_" + co[2], co[0], co[1]) for co in objects ] if fuse: fuseobj = doc.addObject("Part::MultiFuse", componentName) fuseobj.Shapes = fcobjects doc.recompute() exportObjects = [fuseobj] else: exportObjects = fcobjects if scale: import Draft v = FreeCAD.Vector(scale, scale, scale) vc = FreeCAD.Vector(0, 0, 0) # legacy=False, sometimes fail if scale < 1.0 exportObjects = [ Draft.scale(obj, delta=v, center=vc, legacy=True) for obj in exportObjects ] doc.recompute() if ftype == "STEP": # check filename if not os.path.splitext(filename)[1] in ['.stp', '.step']: raise Exception( "Filename for STEP export must end with '.stp' or '.step'.") ImportGui.export(exportObjects, filename) elif ftype == "VRML": # check filename if not os.path.splitext(filename)[1] in ['.wrl', '.vrml']: raise Exception( "Filename for VRML export must end with '.wrl' or '.vrml'.") # workaround for not exporting unselected objects (v0.16) # http://www.freecadweb.org/tracker/view.php?id=2221 FreeCADGui.Selection.clearSelection() for o in exportObjects: FreeCADGui.Selection.addSelection(o) # deal with points and lines for o in exportObjects: o.ViewObject.DisplayMode = "Shaded" FreeCADGui.export(exportObjects, filename) elif ftype == "FREECAD": for obj in list(doc.Objects): if not (obj in exportObjects): doc.removeObject(obj.Name) doc.saveAs(filename) else: raise Exception("Unknown export file type!") # restore RefineShape option pg.SetBool("RefineModel", usersRSOption)
# change display mode and scale down for part in FreeCAD.ActiveDocument.Objects: part.ViewObject.DisplayMode = 1 #Shaded Draft.scale(part, delta=App.Vector(0.3937, 0.3937, 0.3937), center=App.Vector(0, 0, 0), legacy=True) if FLAG_makeTransparent: # if transparency is needed # from PySide import QtGui # QtGui.QInputDialog.getText(None, "Get text", "Input:")[0] pass __objs__ = [] # select all parts (again) for part in FreeCAD.ActiveDocument.Objects: __objs__.append(part) FreeCADGui.export(__objs__, (PATH_toVrmlFiles + FNME_vrmlfile)) del __objs__ FreeCAD.closeDocument("Unnamed") # add license stuff to fresh VRML file print "working on", FNME_vrmlfile try: HDLR_vrmlfile = open(PATH_toVrmlFiles + FNME_vrmlfile, 'r') # open except: print "broken_4" else: HDLR_vrmlfile.seek(0) PMBL_vrmlfile = HDLR_vrmlfile.readlines() HDLR_vrmlfile.close() CNT_cutoff = 0