1# Purpose: open example files with big polyface models 2# Copyright (c) 2014-2021, Manfred Moitzi 3# License: MIT License 4import time 5import pathlib 6 7import ezdxf 8from ezdxf.render import MeshVertexMerger 9 10SRCDIR = pathlib.Path(ezdxf.EZDXF_TEST_FILES) / "CADKitSamples" 11OUTDIR = pathlib.Path('~/Desktop/Outbox').expanduser() 12 13 14def optimize_polyfaces(polyfaces): 15 count = 0 16 runtime = 0 17 vertex_diff = 0 18 print("start optimizing...") 19 for polyface in polyfaces: 20 count += 1 21 start_vertex_count = len(polyface) 22 start_time = time.time() 23 polyface.optimize() 24 end_time = time.time() 25 end_vertex_count = len(polyface) 26 runtime += end_time - start_time 27 vertex_diff += start_vertex_count - end_vertex_count 28 print(f"removed {vertex_diff} vertices in {runtime:.2f} seconds.") 29 30 31def optimize(name: str): 32 filename = SRCDIR / name 33 new_filename = OUTDIR / ('optimized_' + name) 34 print(f'opening DXF file: {filename}') 35 start_time = time.time() 36 doc = ezdxf.readfile(filename) 37 msp = doc.modelspace() 38 end_time = time.time() 39 print(f'time for reading: {end_time - start_time:.1f} seconds') 40 print(f"DXF version: {doc.dxfversion}") 41 print(f"Database contains {len(doc.entitydb)} entities.") 42 polyfaces = (polyline for polyline in msp.query('POLYLINE') if polyline.is_poly_face_mesh) 43 optimize_polyfaces(polyfaces) 44 45 print(f'saving DXF file: {new_filename}') 46 start_time = time.time() 47 doc.saveas(new_filename) 48 end_time = time.time() 49 print(f'time for saving: {end_time - start_time:.1f} seconds') 50 51 52def save_as(name): 53 filename = SRCDIR / name 54 55 print(f'opening DXF file: {filename}') 56 start_time = time.time() 57 doc = ezdxf.readfile(filename) 58 msp = doc.modelspace() 59 end_time = time.time() 60 print(f'time for reading: {end_time - start_time:.1f} seconds') 61 print(f"DXF version: {doc.dxfversion}") 62 print(f"Database contains {len(doc.entitydb)} entities.") 63 polyfaces = (polyline for polyline in msp.query('POLYLINE') if polyline.is_poly_face_mesh) 64 65 # create a new documents 66 doc1 = ezdxf.new() 67 msp1 = doc1.modelspace() 68 doc2 = ezdxf.new() 69 msp2 = doc2.modelspace() 70 for polyface in polyfaces: 71 b = MeshVertexMerger.from_polyface(polyface) 72 b.render_mesh(msp1, dxfattribs={ 73 'layer': polyface.dxf.layer, 74 'color': polyface.dxf.color, 75 }) 76 b.render_polyface(msp2, dxfattribs={ 77 'layer': polyface.dxf.layer, 78 'color': polyface.dxf.color, 79 }) 80 81 new_filename = OUTDIR / ('mesh_' + name) 82 print(f'saving as mesh DXF file: {new_filename}') 83 start_time = time.time() 84 doc1.saveas(new_filename) 85 end_time = time.time() 86 print(f'time for saving: {end_time - start_time:.1f} seconds') 87 88 new_filename = OUTDIR / ('recreated_polyface_' + name) 89 print(f'saving as polyface DXF file: {new_filename}') 90 start_time = time.time() 91 doc2.saveas(new_filename) 92 end_time = time.time() 93 print(f'time for saving: {end_time - start_time:.1f} seconds') 94 95 96if __name__ == '__main__': 97 optimize('fanuc-430-arm.dxf') 98 optimize('cnc machine.dxf') 99 save_as('fanuc-430-arm.dxf')