Browse Source
création des schémas techniques 2D ajout de tools et utilitaire d'extraction de STEP (tubes) pour Wildowsdessins
11 changed files with 4275 additions and 1 deletions
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 172 KiB |
After Width: | Height: | Size: 196 KiB |
@ -0,0 +1,167 @@
|
||||
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(App.listDocuments().values()) > 0: |
||||
App.closeDocument(list(App.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) |
||||
print("document: " + doc.Name) |
||||
for obj in doc.Objects: |
||||
if len(obj.Parents) == 0: |
||||
#print(obj.Label) |
||||
print("Object Label : " + obj.Label) |
||||
root_objects.append(obj) |
||||
if obj.Label == doc.Name or obj.Label == doc.Name + ' (experimental)': |
||||
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 + ")") |
||||
|
||||
if 'experimental' in main_object.Label or 'expérimental' in main_object.Label: |
||||
print('Document ' + doc.Name + ' is marked as experimental and will be ignored') |
||||
close_all_docs() |
||||
return |
||||
|
||||
secondary_objects = [] |
||||
code_obj = doc.getObjectsByLabel('Code_Tube_Draft') |
||||
# |
||||
print("len(code_obj) : " + str(len(code_obj))) |
||||
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 = main_object.newObject('PartDesign::Pocket','Pocket') |
||||
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') |
||||
# |
||||
print ("back from convert") |
||||
|
||||
# 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() |
||||
Gui.runCommand('Std_Quit') |
||||
|
@ -0,0 +1,24 @@
|
||||
:: Set the path to your FreeCAD executable here |
||||
set FREECAD=C:\Program Files\FreeCAD 0.21\bin\freecad.exe |
||||
|
||||
set SCRIPT_DIR=%~dp0 |
||||
echo %SCRIPT_DIR% >>%TMP%\toto.txt |
||||
cd %script_dir% |
||||
echo %cd% >>%TMP%\toto.txt |
||||
|
||||
cd .. |
||||
echo %cd% >>%TMP%\toto.txt |
||||
:: rm -rf ./dist |
||||
|
||||
:: Check script syntax before starting freecad |
||||
:: python3 -m py_compile tools/export-all-parts.py |
||||
|
||||
:: Export all versioned files |
||||
:: mkdir -p dist/FCStd |
||||
:: git archive HEAD . | tar -x -C dist/FCStd |
||||
|
||||
:: Start freecad to run the script. We must start freecad with GUI (otherwise we can't export colors). We start it hidden in a virtual framebuffer (xvfb) so that it can run cleanly in the background. |
||||
:: xvfb-run $FREECAD tools/export-all-parts.py |
||||
:: %freecad%/freecad.exe tools/export-all-parts.py |
||||
echo %freecad% |
||||
start "" "%freecad%" tools/export-all-parts.py |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue