176 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			176 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from math import sin, cos, pi, sqrt
							 | 
						||
| 
								 | 
							
								import cadquery as cq
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# TEST_1
							 | 
						||
| 
								 | 
							
								# example from PythonOCC core_geometry_geomplate.py, use of thickness = 0 returns 2D surface.
							 | 
						||
| 
								 | 
							
								thickness = 0
							 | 
						||
| 
								 | 
							
								edge_points = [[0.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 10.0, 10.0], [0.0, 0.0, 10.0]]
							 | 
						||
| 
								 | 
							
								surface_points = [[5.0, 5.0, 5.0]]
							 | 
						||
| 
								 | 
							
								plate_0 = cq.Workplane("XY").interpPlate(edge_points, surface_points, thickness)
							 | 
						||
| 
								 | 
							
								print("plate_0.val().Volume() = ", plate_0.val().Volume())
							 | 
						||
| 
								 | 
							
								plate_0 = plate_0.translate((0, 6 * 12, 0))
							 | 
						||
| 
								 | 
							
								show_object(plate_0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# EXAMPLE 1
							 | 
						||
| 
								 | 
							
								# Plate with 5 sides and 2 bumps, one side is not co-planar with the other sides
							 | 
						||
| 
								 | 
							
								thickness = 0.1
							 | 
						||
| 
								 | 
							
								edge_points = [
							 | 
						||
| 
								 | 
							
								    [-7.0, -7.0, 0.0],
							 | 
						||
| 
								 | 
							
								    [-3.0, -10.0, 3.0],
							 | 
						||
| 
								 | 
							
								    [7.0, -7.0, 0.0],
							 | 
						||
| 
								 | 
							
								    [7.0, 7.0, 0.0],
							 | 
						||
| 
								 | 
							
								    [-7.0, 7.0, 0.0],
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								edge_wire = cq.Workplane("XY").polyline(
							 | 
						||
| 
								 | 
							
								    [(-7.0, -7.0), (7.0, -7.0), (7.0, 7.0), (-7.0, 7.0)]
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								# edge_wire = edge_wire.add(cq.Workplane("YZ").workplane().transformed(offset=cq.Vector(0, 0, -7), rotate=cq.Vector(45, 0, 0)).polyline([(-7.,0.), (3,-3), (7.,0.)]))
							 | 
						||
| 
								 | 
							
								# In CadQuery Sept-2019 it worked with rotate=cq.Vector(0, 45, 0). In CadQuery Dec-2019 rotate=cq.Vector(45, 0, 0) only closes the wire.
							 | 
						||
| 
								 | 
							
								edge_wire = edge_wire.add(
							 | 
						||
| 
								 | 
							
								    cq.Workplane("YZ")
							 | 
						||
| 
								 | 
							
								    .workplane()
							 | 
						||
| 
								 | 
							
								    .transformed(offset=cq.Vector(0, 0, -7), rotate=cq.Vector(45, 0, 0))
							 | 
						||
| 
								 | 
							
								    .spline([(-7.0, 0.0), (3, -3), (7.0, 0.0)])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								surface_points = [[-3.0, -3.0, -3.0], [3.0, 3.0, 3.0]]
							 | 
						||
| 
								 | 
							
								plate_1 = cq.Workplane("XY").interpPlate(edge_wire, surface_points, thickness)
							 | 
						||
| 
								 | 
							
								# plate_1 = cq.Workplane("XY").interpPlate(edge_points, surface_points, thickness) # list of (x,y,z) points instead of wires for edges
							 | 
						||
| 
								 | 
							
								print("plate_1.val().Volume() = ", plate_1.val().Volume())
							 | 
						||
| 
								 | 
							
								show_object(plate_1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# EXAMPLE 2
							 | 
						||
| 
								 | 
							
								# Embossed star, need to change optional parameters to obtain nice looking result.
							 | 
						||
| 
								 | 
							
								r1 = 3.0
							 | 
						||
| 
								 | 
							
								r2 = 10.0
							 | 
						||
| 
								 | 
							
								fn = 6
							 | 
						||
| 
								 | 
							
								thickness = 0.1
							 | 
						||
| 
								 | 
							
								edge_points = [
							 | 
						||
| 
								 | 
							
								    [r1 * cos(i * pi / fn), r1 * sin(i * pi / fn)]
							 | 
						||
| 
								 | 
							
								    if i % 2 == 0
							 | 
						||
| 
								 | 
							
								    else [r2 * cos(i * pi / fn), r2 * sin(i * pi / fn)]
							 | 
						||
| 
								 | 
							
								    for i in range(2 * fn + 1)
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								edge_wire = cq.Workplane("XY").polyline(edge_points)
							 | 
						||
| 
								 | 
							
								r2 = 4.5
							 | 
						||
| 
								 | 
							
								surface_points = [
							 | 
						||
| 
								 | 
							
								    [r2 * cos(i * pi / fn), r2 * sin(i * pi / fn), 1.0] for i in range(2 * fn)
							 | 
						||
| 
								 | 
							
								] + [[0.0, 0.0, -2.0]]
							 | 
						||
| 
								 | 
							
								plate_2 = cq.Workplane("XY").interpPlate(
							 | 
						||
| 
								 | 
							
								    edge_wire,
							 | 
						||
| 
								 | 
							
								    surface_points,
							 | 
						||
| 
								 | 
							
								    thickness,
							 | 
						||
| 
								 | 
							
								    combine=True,
							 | 
						||
| 
								 | 
							
								    clean=True,
							 | 
						||
| 
								 | 
							
								    degree=3,
							 | 
						||
| 
								 | 
							
								    nbPtsOnCur=15,
							 | 
						||
| 
								 | 
							
								    nbIter=2,
							 | 
						||
| 
								 | 
							
								    anisotropy=False,
							 | 
						||
| 
								 | 
							
								    tol2d=0.00001,
							 | 
						||
| 
								 | 
							
								    tol3d=0.0001,
							 | 
						||
| 
								 | 
							
								    tolAng=0.01,
							 | 
						||
| 
								 | 
							
								    tolCurv=0.1,
							 | 
						||
| 
								 | 
							
								    maxDeg=8,
							 | 
						||
| 
								 | 
							
								    maxSegments=49,
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								# plate_2 = cq.Workplane("XY").interpPlate(edge_points, surface_points, thickness, combine=True, clean=True, Degree=3, NbPtsOnCur=15, NbIter=2, Anisotropie=False, Tol2d=0.00001, Tol3d=0.0001, TolAng=0.01, TolCurv=0.1, MaxDeg=8, MaxSegments=49) # list of (x,y,z) points instead of wires for edges
							 | 
						||
| 
								 | 
							
								print("plate_2.val().Volume() = ", plate_2.val().Volume())
							 | 
						||
| 
								 | 
							
								plate_2 = plate_2.translate((0, 2 * 12, 0))
							 | 
						||
| 
								 | 
							
								show_object(plate_2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# EXAMPLE 3
							 | 
						||
| 
								 | 
							
								# Points on hexagonal pattern coordinates, use of pushpoints.
							 | 
						||
| 
								 | 
							
								r1 = 1.0
							 | 
						||
| 
								 | 
							
								N = 3
							 | 
						||
| 
								 | 
							
								ca = cos(30.0 * pi / 180.0)
							 | 
						||
| 
								 | 
							
								sa = sin(30.0 * pi / 180.0)
							 | 
						||
| 
								 | 
							
								# EVEN ROWS
							 | 
						||
| 
								 | 
							
								pts = [
							 | 
						||
| 
								 | 
							
								    (-3.0, -3.0),
							 | 
						||
| 
								 | 
							
								    (-1.267949, -3.0),
							 | 
						||
| 
								 | 
							
								    (0.464102, -3.0),
							 | 
						||
| 
								 | 
							
								    (2.196152, -3.0),
							 | 
						||
| 
								 | 
							
								    (-3.0, 0.0),
							 | 
						||
| 
								 | 
							
								    (-1.267949, 0.0),
							 | 
						||
| 
								 | 
							
								    (0.464102, 0.0),
							 | 
						||
| 
								 | 
							
								    (2.196152, 0.0),
							 | 
						||
| 
								 | 
							
								    (-2.133974, -1.5),
							 | 
						||
| 
								 | 
							
								    (-0.401923, -1.5),
							 | 
						||
| 
								 | 
							
								    (1.330127, -1.5),
							 | 
						||
| 
								 | 
							
								    (3.062178, -1.5),
							 | 
						||
| 
								 | 
							
								    (-2.133975, 1.5),
							 | 
						||
| 
								 | 
							
								    (-0.401924, 1.5),
							 | 
						||
| 
								 | 
							
								    (1.330127, 1.5),
							 | 
						||
| 
								 | 
							
								    (3.062178, 1.5),
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								# Spike surface
							 | 
						||
| 
								 | 
							
								thickness = 0.1
							 | 
						||
| 
								 | 
							
								fn = 6
							 | 
						||
| 
								 | 
							
								edge_points = [
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        r1 * cos(i * 2 * pi / fn + 30 * pi / 180),
							 | 
						||
| 
								 | 
							
								        r1 * sin(i * 2 * pi / fn + 30 * pi / 180),
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								    for i in range(fn + 1)
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								surface_points = [
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        r1 / 4 * cos(i * 2 * pi / fn + 30 * pi / 180),
							 | 
						||
| 
								 | 
							
								        r1 / 4 * sin(i * 2 * pi / fn + 30 * pi / 180),
							 | 
						||
| 
								 | 
							
								        0.75,
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								    for i in range(fn + 1)
							 | 
						||
| 
								 | 
							
								] + [[0, 0, 2]]
							 | 
						||
| 
								 | 
							
								edge_wire = cq.Workplane("XY").polyline(edge_points)
							 | 
						||
| 
								 | 
							
								plate_3 = (
							 | 
						||
| 
								 | 
							
								    cq.Workplane("XY")
							 | 
						||
| 
								 | 
							
								    .pushPoints(pts)
							 | 
						||
| 
								 | 
							
								    .interpPlate(
							 | 
						||
| 
								 | 
							
								        edge_wire,
							 | 
						||
| 
								 | 
							
								        surface_points,
							 | 
						||
| 
								 | 
							
								        thickness,
							 | 
						||
| 
								 | 
							
								        combine=False,
							 | 
						||
| 
								 | 
							
								        clean=False,
							 | 
						||
| 
								 | 
							
								        degree=2,
							 | 
						||
| 
								 | 
							
								        nbPtsOnCur=20,
							 | 
						||
| 
								 | 
							
								        nbIter=2,
							 | 
						||
| 
								 | 
							
								        anisotropy=False,
							 | 
						||
| 
								 | 
							
								        tol2d=0.00001,
							 | 
						||
| 
								 | 
							
								        tol3d=0.0001,
							 | 
						||
| 
								 | 
							
								        tolAng=0.01,
							 | 
						||
| 
								 | 
							
								        tolCurv=0.1,
							 | 
						||
| 
								 | 
							
								        maxDeg=8,
							 | 
						||
| 
								 | 
							
								        maxSegments=9,
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								print("plate_3.val().Volume() = ", plate_3.val().Volume())
							 | 
						||
| 
								 | 
							
								plate_3 = plate_3.translate((0, 4 * 11, 0))
							 | 
						||
| 
								 | 
							
								show_object(plate_3)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# EXAMPLE 4
							 | 
						||
| 
								 | 
							
								# Gyroïd, all edges are splines on different workplanes.
							 | 
						||
| 
								 | 
							
								thickness = 0.1
							 | 
						||
| 
								 | 
							
								edge_points = [
							 | 
						||
| 
								 | 
							
								    [[3.54, 3.54], [1.77, 0.0], [3.54, -3.54]],
							 | 
						||
| 
								 | 
							
								    [[-3.54, -3.54], [0.0, -1.77], [3.54, -3.54]],
							 | 
						||
| 
								 | 
							
								    [[-3.54, -3.54], [0.0, -1.77], [3.54, -3.54]],
							 | 
						||
| 
								 | 
							
								    [[-3.54, -3.54], [-1.77, 0.0], [-3.54, 3.54]],
							 | 
						||
| 
								 | 
							
								    [[3.54, 3.54], [0.0, 1.77], [-3.54, 3.54]],
							 | 
						||
| 
								 | 
							
								    [[3.54, 3.54], [0.0, 1.77], [-3.54, 3.54]],
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								plane_list = ["XZ", "XY", "YZ", "XZ", "YZ", "XY"]
							 | 
						||
| 
								 | 
							
								offset_list = [-3.54, 3.54, 3.54, 3.54, -3.54, -3.54]
							 | 
						||
| 
								 | 
							
								edge_wire = (
							 | 
						||
| 
								 | 
							
								    cq.Workplane(plane_list[0]).workplane(offset=-offset_list[0]).spline(edge_points[0])
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								for i in range(len(edge_points) - 1):
							 | 
						||
| 
								 | 
							
								    edge_wire = edge_wire.add(
							 | 
						||
| 
								 | 
							
								        cq.Workplane(plane_list[i + 1])
							 | 
						||
| 
								 | 
							
								        .workplane(offset=-offset_list[i + 1])
							 | 
						||
| 
								 | 
							
								        .spline(edge_points[i + 1])
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								surface_points = [[0, 0, 0]]
							 | 
						||
| 
								 | 
							
								plate_4 = cq.Workplane("XY").interpPlate(edge_wire, surface_points, thickness)
							 | 
						||
| 
								 | 
							
								print("plate_4.val().Volume() = ", plate_4.val().Volume())
							 | 
						||
| 
								 | 
							
								plate_4 = plate_4.translate((0, 5 * 12, 0))
							 | 
						||
| 
								 | 
							
								show_object(plate_4)
							 |