File: render_meshes.py

package info (click to toggle)
ezdxf 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 104,528 kB
  • sloc: python: 182,341; makefile: 116; lisp: 20; ansic: 4
file content (108 lines) | stat: -rw-r--r-- 3,320 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Copyright (c) 2018-2022, Manfred Moitzi
# License: MIT License
import math
import pathlib
import ezdxf
from ezdxf.render import forms, MeshBuilder
from itertools import cycle

CWD = pathlib.Path("~/Desktop/Outbox").expanduser()
if not CWD.exists():
    CWD = pathlib.Path(".")

# ------------------------------------------------------------------------------
# This example shows how to create 3D forms.
#
# docs:
# forms: https://ezdxf.mozman.at/docs/render/forms.html
# MeshBuilder: https://ezdxf.mozman.at/docs/render/mesh.html
# ------------------------------------------------------------------------------


def write_mesh(filename, mesh: MeshBuilder):
    """Write MeshBuilder object as a MESH entity."""
    doc = ezdxf.new("R2000")
    # MESH can represent ngons, no tessellation is applied:
    mesh.render_mesh(doc.modelspace())
    try:
        doc.saveas(filename)
    except IOError as e:
        print(str(e))
    else:
        print(f'saving as "{filename}" MESH: done')


def write_polyface(filename, mesh: MeshBuilder):
    """Write MeshBuilder object as a POLYFACE entity a subtype of POLYLINE."""
    doc = ezdxf.new("R2000")
    # POLYFACE can only represent triangles or quads, the required
    # tessellation of the mesh is done automatically:
    mesh.render_polyface(doc.modelspace())
    try:
        doc.saveas(filename)
    except IOError as e:
        print(str(e))
    else:
        print(f'saving as "{filename}" POLYFACE: done')


def write_3dfaces(filename, mesh: MeshBuilder):
    """Write MeshBuilder object as single 3DFACE entities."""
    doc = ezdxf.new("R2000")
    # 3DFACE can only represent triangles or quads, the required
    # tessellation of the mesh is done automatically:
    mesh.render_3dfaces(doc.modelspace())
    try:
        doc.saveas(filename)
    except IOError as e:
        print(str(e))
    else:
        print(f'saving as "{filename}" 3DFACES: done')


def build_rotation_form(alpha=2 * math.pi, sides=16):
    profile = forms.spline_interpolation(
        [(0, 0.1), (1, 1), (3, 1.5), (5, 3)], subdivide=8
    )  # in xy-plane
    return forms.rotation_form(sides, profile, angle=alpha, axis=(1, 0, 0))


def create_gear(
    filename, teeth=20, outside_radius=10, top_width=2, bottom_width=3, height=2
):
    doc = ezdxf.new("R2000")
    msp = doc.modelspace()
    vertices = zip(
        forms.gear(
            count=teeth,
            top_width=top_width,
            bottom_width=bottom_width,
            height=height,
            outside_radius=outside_radius,
        ),
        cycle(
            [0, 0.1, 0, 0.1]
        ),  # bulge values: top, down flank,  bottom, up flank
    )
    msp.add_lwpolyline(
        vertices,
        format="vb",
        close=True,
    )
    doc.saveas(filename)


def main():
    cylinder = forms.cylinder(16)
    write_mesh(CWD / "cylinder_mesh.dxf", cylinder)
    write_polyface(CWD / "cylinder_polyface.dxf", cylinder)
    write_3dfaces(CWD / "cylinder_3dfaces.dxf", cylinder)
    rotation_form = build_rotation_form(sides=32)
    write_mesh(CWD / "rotated_profile_mesh.dxf", rotation_form)
    write_polyface(CWD / "rotated_profile_polyface.dxf", rotation_form)
    write_3dfaces(CWD / "rotated_profile_3dfaces.dxf", rotation_form)
    create_gear(CWD / "gear.dxf")


if __name__ == "__main__":
    main()