def test_sphere_cylinder_subtract(): a = sphere(count=8, stacks=4, radius=0.5).translate(0.5, 0.5, 0.5) b = cylinder_2p(count=16, base_center=(0, 0, 0), top_center=(1, 0, 0), radius=0.3) CSG(a) - CSG(b)
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=.5, quads=True).translate(.25, .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(msp, dxfattribs={'layer': 'sponge'}) subtract.mesh(2).render(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 sphere, cube from ezdxf.addons.pycsg import CSG DIR = Path('~/Desktop/Outbox').expanduser() NLENGTH = .05 doc = ezdxf.new() doc.layers.new('csg', dxfattribs={'color': 1}) doc.layers.new('normals', dxfattribs={'color': 6}) doc.set_modelspace_vport(6, center=(5, 0)) msp = doc.modelspace() cube1 = cube().translate(-.5, -.5, -.5) sphere1 = sphere(count=32, stacks=16, radius=.5, quads=True) union = (CSG(cube1) + CSG(sphere1)).mesh() union.render_mesh(msp, dxfattribs={'layer': 'csg', 'color': 1}) union.render_normals(msp, length=NLENGTH, relative=False, dxfattribs={'layer': 'normals'}) subtract = (CSG(cube1) - CSG(sphere1)).mesh().translate(2.5) subtract.render_mesh(msp, dxfattribs={'layer': 'csg', 'color': 3}) subtract.render_normals(msp, length=NLENGTH, relative=False, dxfattribs={'layer': 'normals'}) intersection = (CSG(cube1) * CSG(sphere1)).mesh().translate(4) intersection.render(msp, dxfattribs={'layer': 'csg', 'color': 5}) intersection.render_normals(msp, length=NLENGTH, relative=False, dxfattribs={'layer': 'normals'}) doc.saveas(DIR / 'csg_sphere.dxf')
def polyface_sphere(filename): mesh = sphere(128, 64, quads=True) with r12writer(filename) as r12: r12.add_polyface(mesh.vertices, mesh.faces, color=1) print(f'saved as "{filename}".')