154 lines
4.8 KiB
Python
154 lines
4.8 KiB
Python
from pathlib import Path
|
|
import os
|
|
|
|
import FreeCAD as App
|
|
import Import
|
|
import ImportGui
|
|
|
|
project_folder = os.getcwd()
|
|
output_folder = project_folder + '/dist/STEP'
|
|
assemblies_output_folder = project_folder + '/dist/FCStd'
|
|
|
|
def close_all_docs():
|
|
while len(FreeCAD.listDocuments().values()) > 0:
|
|
FreeCAD.closeDocument(list(FreeCAD.listDocuments().values())[0].Name)
|
|
|
|
def convert_file(file_name, output_format):
|
|
doc = App.open(project_folder + '/' + file_name)
|
|
|
|
root_objects = []
|
|
main_object = None
|
|
|
|
#print("document: " + doc.Name)
|
|
for obj in doc.Objects:
|
|
if len(obj.Parents) == 0:
|
|
#print(obj.Label)
|
|
root_objects.append(obj)
|
|
if obj.Label == doc.Name:
|
|
main_object = obj
|
|
|
|
if main_object is None and len(root_objects) == 1:
|
|
main_object = root_objects[0]
|
|
|
|
if main_object is None:
|
|
raise Exception("Can't find main object in file " + file_name + " (found " + str(len(root_objects)) + " root object(s), none named like the document " + doc.Name + ")")
|
|
|
|
secondary_objects = []
|
|
code_obj = doc.getObjectsByLabel('Code_Tube_Draft')
|
|
if len(code_obj) == 1:
|
|
code_obj = code_obj[0]
|
|
#code_obj.Label = 'Code_Tube'
|
|
#secondary_objects.append(code_obj)
|
|
|
|
# engrave code on tube
|
|
code_pocket = main_object.newObjectAt('PartDesign::Pocket','Pocket', [code_obj])
|
|
code_pocket.Profile = code_obj
|
|
code_pocket.Length = 0.2
|
|
code_pocket.recompute()
|
|
main_object.recompute()
|
|
|
|
if len(secondary_objects) > 0:
|
|
group = doc.addObject('App::Part', 'Groupe')
|
|
group.addObject(main_object)
|
|
for obj in secondary_objects:
|
|
group.addObject(obj)
|
|
main_object = group
|
|
|
|
output_path = output_folder + '/' + os.path.dirname(file_name) + '/' + Path(file_name).stem + '.' + output_format
|
|
output_dir = os.path.dirname(output_path)
|
|
if not os.path.exists(output_dir):
|
|
os.makedirs(output_dir)
|
|
|
|
if output_format.lower() == 'stpz':
|
|
import stepZ
|
|
stepZ.export([main_object], output_path)
|
|
else:
|
|
Import.export([main_object], output_path)
|
|
|
|
close_all_docs()
|
|
|
|
def convert_assembly(file_name, output_format):
|
|
print("Exporting assembly " + file_name + "...")
|
|
|
|
doc = App.open(project_folder + '/' + file_name)
|
|
|
|
root_objects = []
|
|
main_object = None
|
|
|
|
# remove all objects that are not visible, or not in the TypeId whitelist, because we don't want to export those
|
|
need_check_objects = True
|
|
while need_check_objects:
|
|
need_check_objects = False
|
|
for obj in doc.Objects:
|
|
if not obj.Visibility or obj.TypeId not in ['Part::Feature', 'Part::FeaturePython', 'PartDesign::Body', 'Part::Mirroring', 'Part::Cut', 'Part::Part2DObjectPython', 'Part::MultiFuse', 'Part::Loft', 'Part::Torus', 'Part::Cylinder', 'App::DocumentObjectGroup', 'App::Part', 'App::Link']:
|
|
#print('removing ' + obj.Name + ' ('+obj.Label+')')
|
|
doc.removeObject(obj.Name)
|
|
need_check_objects = True
|
|
break
|
|
|
|
for obj in doc.Objects:
|
|
if len(obj.Parents) == 0:
|
|
#print(obj.Label)
|
|
root_objects.append(obj)
|
|
if obj.Label == doc.Name:
|
|
main_object = obj
|
|
|
|
if main_object is None and len(root_objects) == 1:
|
|
main_object = root_objects[0]
|
|
|
|
if main_object is None:
|
|
raise Exception("Can't find main assembly in file " + file_name + " (found " + str(len(root_objects)) + " root object(s), none named like the document " + doc.Name + ")")
|
|
|
|
output_path = output_folder + '/' + os.path.dirname(file_name) + '/' + Path(file_name).stem + '.' + output_format
|
|
output_dir = os.path.dirname(output_path)
|
|
if not os.path.exists(output_dir):
|
|
os.makedirs(output_dir)
|
|
|
|
if output_format.lower() == 'stpz':
|
|
import stepZ
|
|
stepZ.export([main_object], output_path)
|
|
else:
|
|
ImportGui.export([main_object], output_path)
|
|
|
|
close_all_docs()
|
|
|
|
def export_configuration(doc, config_name, output_filename):
|
|
print('Generating assembly for configuration '+config_name+'...')
|
|
|
|
Gui.Selection.clearSelection()
|
|
Gui.Selection.addSelection('vheliotech','Model','Configurations.'+doc.getObjectsByLabel(config_name)[0].Name+'.')
|
|
Gui.runCommand('Asm4_applyConfiguration')
|
|
Gui.Selection.clearSelection()
|
|
|
|
doc.saveAs(assemblies_output_folder + '/' + output_filename + '.FCStd')
|
|
|
|
try:
|
|
folders = [
|
|
'chaudronnerie',
|
|
'tubes'
|
|
]
|
|
|
|
for folder in folders:
|
|
files = os.listdir(project_folder + '/' + folder)
|
|
for source_file in files:
|
|
if not source_file.endswith('.FCStd'): continue
|
|
source_path = folder + '/' + source_file
|
|
print(source_path)
|
|
convert_file(source_path, 'step')
|
|
|
|
convert_assembly('vheliotech.FCStd', 'step')
|
|
|
|
'''doc = App.open(project_folder + '/vheliotech.FCStd')
|
|
export_configuration(doc, 'Config_Integrale', 'vheliotech-config-integrale')
|
|
export_configuration(doc, 'Config_Solaire', 'vheliotech-config-solaire')
|
|
export_configuration(doc, 'Config_Motorisee', 'vheliotech-config-motorisee')
|
|
export_configuration(doc, 'Config_Basique', 'vheliotech-config-basique')
|
|
close_all_docs()'''
|
|
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
# exit FreeCAD
|
|
close_all_docs()
|
|
FreeCADGui.getMainWindow().close()
|
|
|