from pathlib import Path from time import perf_counter import ezdxf from ezdxf.render.forms import sphere from ezdxf.addons import MengerSponge from ezdxf.addons.pycsg import CSG DIR = Path("~/Desktop/Outbox").expanduser() doc = ezdxf.new() doc.layers.new("sponge", dxfattribs={"color": 5}) doc.layers.new("sphere", dxfattribs={"color": 6}) doc.set_modelspace_vport(6, center=(5, 0)) msp = doc.modelspace() sponge1 = MengerSponge(level=3).mesh() sphere1 = sphere(count=32, stacks=16, radius=0.5, quads=True).translate(0.25, 0.25, 1) t0 = perf_counter() subtract = CSG(sponge1, meshid=1) - CSG(sphere1, meshid=2) t1 = perf_counter() # get mesh result by id subtract.mesh(1).render_mesh(msp, dxfattribs={"layer": "sponge"}) subtract.mesh(2).render_mesh(msp, dxfattribs={"layer": "sphere"}) print(f"runtime: {t1-t0:.3f}s") doc.saveas(DIR / "csg_sphere_vs_menger_sponge.dxf")
from ezdxf.render.forms import cube, cylinder_2p DIR = Path("~/Desktop/Outbox").expanduser() cube1 = cube() cylinder1 = cylinder_2p(count=32, base_center=(0, -1, 0), top_center=(0, 1, 0), radius=0.25) doc = ezdxf.new() doc.set_modelspace_vport(6, center=(5, 0)) msp = doc.modelspace() # build solid union union = CSG(cube1) + CSG(cylinder1) # convert to mesh and render mesh to modelspace union.mesh().render_mesh(msp, dxfattribs={"color": 1}) # build solid difference difference = CSG(cube1) - CSG(cylinder1) # convert to mesh, translate mesh and render mesh to modelspace difference.mesh().translate(1.5).render(msp, dxfattribs={"color": 3}) # build solid intersection intersection = CSG(cube1) * CSG(cylinder1) # convert to mesh, translate mesh and render mesh to modelspace intersection.mesh().translate(2.75).render(msp, dxfattribs={"color": 5}) doc.saveas(DIR / "pycsg01.dxf")