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')