def comm_tower(height=25.0, radius=0.5): base_height = 1.2 pole_radius = 0.10 top_height = 0.1 antenna_height = 2.0 obj_base = ddd.regularpolygon(3, radius, "Comm Tower Base").extrude(base_height) obj_base = ddd.uv.map_cubic(obj_base) obj_base = obj_base.material(ddd.mats.metal_paint_red) obj_pole = ddd.regularpolygon(4, pole_radius, "Comm Tower Pole").extrude(height - base_height - top_height) obj_pole = ddd.uv.map_cubic(obj_pole) obj_pole = obj_pole.material(ddd.mats.metal_paint_red) obj_pole = ddd.align.matrix_polar(obj_pole.translate([radius - pole_radius * 2, 0, base_height]), 3) obj_top = ddd.regularpolygon(3, radius, "Comm Tower Top").extrude(top_height) obj_top = obj_top.material(ddd.mats.metal_paint_red) obj_top = ddd.uv.map_cubic(obj_top) obj_top = obj_top.translate([0, 0, height - top_height]) obj_antenna = ddd.regularpolygon(3, 0.05, "Comm Antenna Vert").extrude(antenna_height).translate([0, 0, height]) obj_antenna = ddd.uv.map_cubic(obj_antenna) obj_antenna = obj_antenna.material(ddd.mats.steel) # TODO: Combination of suitable meshes shall be done automatically combined = ddd.group([obj_base, obj_pole, obj_top]).combine() obj = ddd.group([combined, obj_antenna]) obj.name = "Communications Tower" return obj
def trunk_callback(height): section = ddd.regularpolygon(sides=5, r=r).extrude_step(ddd.regularpolygon(sides=5, r=r*0.8), height * 0.15) section = section.extrude_step(ddd.regularpolygon(sides=5, r=r*0.8).translate([random.uniform(-0.4, 0.4), random.uniform(-0.4, 0.4)]), height * 0.35) section = section.extrude_step(ddd.regularpolygon(sides=5, r=r*0.7).translate([random.uniform(-0.3, 0.3), random.uniform(-0.3, 0.3)]), height * 0.5) section = section.smooth(math.pi * 0.45) section = ddd.uv.map_cylindrical(section, split=False) section = section.material(ddd.mats.bark) return section
def childrens_playground_arc(length=3.25, width=1.0, sides=7, height=None): arc_thick = 0.08 bar_thick = 0.05 if height is None: height = length / 2 * 0.9 circleline = ddd.regularpolygon(sides * 2, name="Childrens Playground Arc Side Arc").rotate(-math.pi / 2).outline().scale([length / 2, height]) arcline = circleline.intersection(ddd.rect([-length, 0.1, length, height * 2])) arc = circleline.buffer(arc_thick / 2).intersection(ddd.rect([-length, 0, length, height * 2])) arc = arc.extrude(arc_thick, center=True).material(ddd.mats.metal_paint_red) arc = arc.rotate(ddd.ROT_FLOOR_TO_FRONT) arc = ddd.uv.map_cubic(arc) arc1 = arc.copy().translate([0, -width / 2, 0]) arc2 = arc.copy().translate([0, +width / 2, 0]) item = ddd.group([arc1, arc2]) bar = ddd.point(name="Childrens Playground Arc Bar").buffer(bar_thick / 2).extrude(width - arc_thick, center=True).rotate(ddd.ROT_FLOOR_TO_FRONT) bar = ddd.uv.map_cubic(bar) mats = [ddd.mats.metal_paint_white, ddd.mats.metal_paint_red] for idx, p in enumerate(arcline.geom.coords[1:-1]): pbar = bar.copy().translate([p[0], 0, p[1]]) pbar = pbar.material(mats[idx % 2]) item.append(pbar) item = ddd.meshops.batch_by_material(item).clean(remove_degenerate=False) return item
def traffic_sign_circle(r=0.5, thick=0.1, caps=True): sides = 16 item = ddd.regularpolygon(sides, r, name="Sign circle").material(ddd.mats.metal_paint_red) item = item.rotate(math.pi / sides).extrude(thick, cap=caps, base=caps) item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).translate([0, thick / 2, r * math.cos(math.pi / sides)]) item = ddd.uv.map_cubic(item) return item
def bar_u(height=0.8, width=0.4, r=0.15, thick=0.1): """ A U-shaped figure, like that used for handles, bycicle stands... """ vertical_height = height - r base = ddd.regularpolygon(6, r=thick * 0.5, name="U-Shape") path = ddd.point().line_to([0, vertical_height]).arc_to([r, height], [r, vertical_height], True, resolution=1) path = path.line_to([width - r, height]).arc_to([width, vertical_height], [width - r, vertical_height], True, resolution=1) path = path.line_to([width, 0]) item = base.extrude_along(path) item = item.rotate(ddd.ROT_FLOOR_TO_FRONT) #.rotate(ddd.ROT_TOP_CW) item = item.translate([-width * 0.5, 0, 0]) item = item.material(ddd.mats.steel) item = ddd.uv.map_cubic(item) return item
def cart_wheel(r=0.075, thick=0.03): """ """ sides = 10 item = ddd.regularpolygon(sides, r, name="Cart Wheel").rotate(math.pi / sides) item = item.extrude(thick).material(ddd.mats.plastic_black) item = ddd.uv.map_cylindrical(item) item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).translate([0, thick / 2, 0]) return item
def bollard(height=1.2, r=0.2, sides=6): """ A bollard. Sits centered on its base. """ bollard = ddd.regularpolygon(6, r, name="Bollard") extrude_steps = ((2.0, 0), (2.0, 0.75), (1.0, 1), (1.0, 6.75), (2.0, 7), (2.0, 7.75), (1.0, 8)) bollard = extrude_step_multi(bollard, extrude_steps, base=False, cap=True, scale_y=height / 8) bollard = bollard.material(ddd.mats.bronze) bollard = ddd.uv.map_cylindrical(bollard) return bollard
def roundedpost(height=2.00, r=0.075, sides=6, mat_post=None): """ A rounded post. """ col = ddd.regularpolygon(sides, r, name="Post").extrude(height) # , cap=False, base=False) if mat_post: col = col.material(mat_post) col = col.smooth(math.pi * 0.45) col = ddd.uv.map_cylindrical(col, scale=[0.25, 0.25], split=False) col = ddd.collision.aabox_from_aabb(col) #col.mesh.face_normals = ((1, 0, 0) for n in col.mesh.face_normals] return col
def tree_fir(height=20, r=0.2): """ (Abeto) They are large trees, reaching heights of 10–80 m (33–262 ft) tall with trunk diameters of 0.5–4 m (1 ft 8 in–13 ft 1 in) when mature. """ top_r = (height / 4) * random.uniform(0.9, 1.1) top_base_h = height / 10 section = ddd.regularpolygon(sides=5, r=r).extrude_step(ddd.regularpolygon(sides=5, r=r*0.1), height) section = ddd.uv.map_cylindrical(section) section = section.material(ddd.mats.bark) #pol = ddd.regularpolygon(sides=9, r=1) #layer = pol.extrude_step(pol.scale(0.5), -0.4, base=False, cap=False) #layer = layer.extrude_step(ddd.point(), -0.2, cap=False) #layer = layer.material(ddd.mats.treetop).twosided().translate([0, 0, 0.6]) layer = ddd.sphere(subdivisions=1).scale([1, 1, 0.5]) #layer = ddd.uv.map_spherical(layer) layer = layer.vertex_func(lambda x, y, z, i: [x, y, z + ((x*x + y*y) * 0.7)]) layer = layer.material(ddd.mats.treetop) numlayers = 8 leaves = ddd.group3(name="Fir leaves group") for i in range(numlayers): lh = top_base_h + ((height - top_base_h) / (numlayers - 1)) * i lobj = layer.copy(name="Fir leaves %d" % i) lscale = top_r * (1 / numlayers) * (numlayers - i) lobj = layer.scale([lscale, lscale, lscale]).translate([0, 0, lh]) #lobj = ddd.uv.map_cubic(lobj) leaves.append(lobj) leaves = leaves.combine() leaves = leaves.merge_vertices() #leaves = leaves.smooth(math.pi*2) leaves = ddd.uv.map_spherical(leaves, scale=[4, 8], split=False) obj = ddd.group3([section.combine(), leaves], name="Fir") #obj.show() return obj
def childrens_playground_sandbox(r=1.5, sides=5, height=0.4, thick=0.1): """ """ area = ddd.regularpolygon(sides, r, name="Playground Sand") item = area.material(ddd.mats.wood) item = item.outline().buffer(thick / 2).extrude(height) item = ddd.uv.map_cubic(item) item.name = "Playground sandbox border" area = area.triangulate().material(ddd.mats.sand).translate([0, 0, height / 3]) area = ddd.uv.map_cubic(area) item = ddd.group([area, item], name="Playground Sandbox") return item
def pipeline_start(pipeline, root): """ Generate different geometric objects. """ items = ddd.group3() # Remember to use JOIN_ROUND so resolution is applied when buffering points fig = ddd.point([0, 0]).buffer(1.0, resolution=2, join_style=ddd.JOIN_ROUND, cap_style=ddd.CAP_ROUND).triangulate() items.append(fig) fig = ddd.point([0, 0]).buffer(1.0, resolution=3, join_style=ddd.JOIN_ROUND, cap_style=ddd.CAP_ROUND).triangulate() items.append(fig) fig = ddd.point([0, 0]).buffer(1.0, resolution=4, join_style=ddd.JOIN_ROUND, cap_style=ddd.CAP_ROUND).triangulate() items.append(fig) # Extrusion with optional caps fig = ddd.disc().extrude(5) items.append(fig) fig = ddd.disc().extrude(5, base=False) items.append(fig) fig = ddd.disc().extrude(5, cap=False) items.append(fig) fig = ddd.disc().extrude(5, cap=False, base=False) items.append(fig) # Extrude line (to faces, not volume) fig1 = ddd.line([[-2, 0], [0, 0], [2, 2]]) fig = fig1.extrude(2.0).twosided() items.append(fig) # Extrusion to line (explicit) fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.line([[-4, 0], [4, 0]]) fig = fig1.extrude_step(fig2, 1.0) items.append(fig) # Extrusion to line (explicit) fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.line([[-3, 0], [3, 0]]) fig = fig1.extrude_step(fig2, 1.0) items.append(fig) # Extrusion to line (explicit, method subtract) fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.line([[-3, 0], [3, 0]]) fig = fig1.extrude_step(fig2, 1.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) # TODO: this currently fails but should be fixed items.append(fig) # Extrusion to line with vertical (explicit) for skillion roofs fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.line([[-4, 2], [4, 2]]) fig = fig1.extrude_step(fig2, 1.0) # TODO: this currently fails but should be fixed items.append(fig) # Extrusion to line (axis middle) fig1 = ddd.rect([-4, -2, 4, 2]) #.rotate(math.pi * 1.5) axis_major, axis_minor, axis_angle = ddd.geomops.oriented_axis(fig1) fig = fig1.extrude_step(axis_minor, 1.0) items.append(fig) # Extrusion to line (axis middle) fig1 = ddd.rect([-4, -2, 4, 2]) #.rotate(math.pi * 1.5) axis_major, axis_minor, axis_angle = ddd.geomops.oriented_axis(fig1) fig = fig1.extrude_step(axis_major, 1.0) items.append(fig) # Extrusion to line (buffered geometry) - currently fails (shapely does not return the reduced polygon linestring) fig1 = ddd.rect([-4, -2, 4, 2]) fig = fig1.extrude_step(fig1.buffer(-2.5), 1.0) items.append(fig) # Extrusion to line (buffered geometry) and back (fails, extrusion from point to shape) fig1 = ddd.rect([-4, -2, 4, 2]) fig = fig1.extrude_step(fig1.buffer(-2.5), 1.0) fig = fig.extrude_step(fig1, 1.0) items.append(fig) # Triangulation with hole fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.rect([-3, -1, -1, 1]) fig = fig1.subtract(fig2).triangulate() items.append(fig) # Extrusion with hole fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.rect([-3, -1, -1, 1]) fig = fig1.subtract(fig2).extrude(1.0) items.append(fig) # Extrusion with steps with hole fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.rect([-3, -1, -1, 1]) figh = fig1.subtract(fig2) fig = figh.extrude_step(figh, 1.0, base=False) fig = fig.extrude_step(figh.buffer(-0.25), 1.0) items.append(fig) # Extrusion with steps with hole 2 fig1 = ddd.rect([-4, -2, 4, 2]) fig2 = ddd.rect([-3, -1, -1, 1]) figh = fig1.subtract(fig2) fig = figh.extrude_step(figh, 1.0, base=False, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(figh.buffer(-0.25), 1.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Simple extrusion fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND).extrude(5.0) items.append(fig) # Simple extrusion fig = ddd.regularpolygon(5).extrude(5.0) items.append(fig) # Simple extrusion no caps fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig, 5.0, base=False, cap=False) items.append(fig) # Extrusion between shapes fig1 = ddd.point([0, 0]).buffer(1.0) fig2 = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig3 = ddd.point([0, 0]).buffer(1.0) fig = fig1.extrude_step(fig2, 3.0).extrude_step(fig3, 2.0) items.append(fig) # Extrusion fig = ddd.point([0, 0]).buffer(1.0) for i in range(10): fign = ddd.point([0, 0]).buffer(1.0).rotate(math.pi / 12 * i) fig = fig.extrude_step(fign, 0.5) items.append(fig) # Pointy end fig = ddd.point().buffer(2.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(ddd.point(), 5.0) items.append(fig) # Convex shapes (this fails) coords = [[10, 10], [5, 9], [3, 12], [1, 5], [-8, 0], [10, 0]] #coords.reverse() fig = ddd.polygon(coords).scale(0.25) fig = fig.extrude_step(fig.buffer(-0.5), 1) items.append(fig) # Convex shapes - subtract method (works) coords = [[10, 10], [5, 9], [3, 12], [1, 5], [-8, 0], [10, 0]] #coords.reverse() fig = ddd.polygon(coords).scale(0.25) fig = fig.extrude_step(fig.buffer(-0.5), 1, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Extrude-subtract to bigger fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig.buffer(1.0), 5.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Extrude-subtract downwards shape = ddd.disc().scale([3, 2]) fig = shape.extrude_step(shape.buffer(-0.5), -1.0, base=False, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(shape.buffer(-1.0), -0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Extrude-subtract vertical case fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig, 5.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Convex shapes with holes - subtract method fig = ddd.group3() text = Text3D.quick_text("86A").scale(2.0) for f in text.children: #f.replace(f.subtract(f.buffer(-0.2))) fe = f.extrude_step(f.buffer(-0.05), 0.2, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig.append(fe) items.append(fig) # Extrude to point fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig.centroid(), 2.0) items.append(fig) """ fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig.centroid(), 2.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) """ # Extrude to empty fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig.buffer(-2.0), 2.0) items.append(fig) fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig.buffer(-2.0), 2.0, base=False, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Extrude with division fig1 = ddd.disc().translate([1.5, 0]).union(ddd.disc()) fig = fig1.extrude_step(fig1.buffer(-0.2), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(fig1.buffer(-0.5), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Extrude multiple with empty geometry fig1 = ddd.point([0, 0]).buffer(2.0, cap_style=ddd.CAP_ROUND) fig = fig1.extrude_step(fig1.buffer(-0.5), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(fig1.buffer(-1.5), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(fig1.buffer(-2.5), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(fig1.buffer(-2.5), 0.5, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Triangulate/Extrude with colinear segments fig1 = ddd.polygon([[0, 0], [1, 0], [2, 0], [2, 1], [1, 1], [0, 1]]) #fig = fig1.triangulate() fig = fig1.extrude(1.0) items.append(fig) # All items items = ddd.align.grid(items, space=10.0) #items.append(ddd.helper.all()) items.show() root.append(items)
def trunk_callback(height): section = ddd.regularpolygon(sides=5, r=r).extrude(height) section = section.smooth(math.pi * 0.45) section = ddd.uv.map_cylindrical(section, scale=(2, 2), split=False) section = section.material(ddd.mats.bark) return section
def traffic_sign_rect_rotated(r=0.5, thick=0.1, caps=True): item = ddd.regularpolygon(4, r, name="Sign square angled").material(ddd.mats.metal_paint_white) item = item.extrude(thick, cap=caps, base=caps) item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).translate([0, thick / 2, r]) item = ddd.uv.map_cubic(item) return item
def traffic_sign_triangle_inverted(r=0.6, thick=0.1, caps=True): item = ddd.regularpolygon(3, r, name="Sign triangle inverted").material(ddd.mats.metal_paint_red) item = item.rotate(math.pi / 2 + math.pi).extrude(thick, cap=caps, base=caps) item = item.rotate(ddd.ROT_FLOOR_TO_FRONT).translate([0, thick / 2, r]) item = ddd.uv.map_cubic(item) return item
figh = fig1.subtract(fig2) fig = figh.extrude_step(figh, 1.0, base=False, method=ddd.EXTRUSION_METHOD_SUBTRACT) fig = fig.extrude_step(figh.buffer(-0.25), 1.0, method=ddd.EXTRUSION_METHOD_SUBTRACT) items.append(fig) # Simple extrusion fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND).extrude(5.0) items.append(fig) # Simple extrusion fig = ddd.regularpolygon(5).extrude(5.0) items.append(fig) # Simple extrusion no caps fig = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig = fig.extrude_step(fig, 5.0, base=False, cap=False) items.append(fig) # Extrusion between shapes fig1 = ddd.point([0, 0]).buffer(1.0) fig2 = ddd.point([0, 0]).buffer(1.0, cap_style=ddd.CAP_ROUND) fig3 = ddd.point([0, 0]).buffer(1.0) fig = fig1.extrude_step(fig2, 3.0).extrude_step(fig3, 2.0) items.append(fig) # Extrusion
def trunk_callback(height): section = ddd.regularpolygon(sides=5, r=r).extrude(height) section = ddd.uv.map_cylindrical(section) section = section.material(ddd.mats.bark) return section
functions = (sports.handball_field_lines, sports.basketball_field_lines, sports.tennis_field_lines, sports.football_field_lines) count = 3 for m in functions: items = ddd.group3() for i in range(count): area = ddd.polygon([[0, 0], [10, 0], [10, 5], [0, 5]]).scale(1 + i * 3).rotate(i * 2 * math.pi / count) lines = sports.field_lines_area(area, m).translate([0, 0, 0.05]) area = area.triangulate().material(ddd.mats.pitch) item = ddd.group2([area, lines]) items.append(item) items.show() area = ddd.regularpolygon(7, r=random.uniform(12, 20)).scale([random.uniform(0.5, 1.5), random.uniform(0.5, 1.5)]).rotate(random.uniform(0, math.pi * 2)) lines = sports.field_lines_area(area, m).translate([0, 0, 0.05]) area = area.triangulate().material(ddd.mats.pitch) item = ddd.group2([area, lines]) item.show() ''' area = ddd.polygon([[0, 0], [10, 0], [10, 5], [0, 5]]) lines = sports.tennis_field_lines(area).translate([0, 0, 0.05]) area = area.triangulate().material(ddd.mats.pitch) item = ddd.group2([area, lines]) items.append(item) item.show()
# Jose Juan Montes 2019-2020 from ddd.pack.sketchy import urban, landscape, sports from ddd.ddd import ddd import math import random import webbrowser row = ddd.group2() for i in range(3, 12 + 1): area = ddd.regularpolygon(i, 1.0, name="%d-Polygon" % i) area.extra['sides'] = i area.extra['text'] = "Sample text to test SVG metadata export (áéíóúñç)" row.append(area) row = ddd.align.grid(row, 2.5, 1) row = row.rotate(math.pi / 2) items = ddd.group2() top_row = row items.append(top_row) mat_red = ddd.material(color="#ff0000", extra={'svg:fill-opacity': 1.0}) row_r = row.material(mat_red) row_g = row.material(ddd.mats.green).translate([-0.2, -0.2]) row_b = row.material(ddd.mats.blue).translate([0.2, -0.2]) colors = ddd.group2([row_r, row_g, row_b], name="Mixed colors") items.append(colors) items = ddd.align.grid(items, 2.5, 1)
def crane_vertical(): """ Large vertical crane (such as those seen in cargo ports). Inspired by: https://commons.wikimedia.org/wiki/File:Port_crane_of_Mammoet,_Schiedam-8054.jpg """ base_width = 7 base_length = 6 # Piers pier_height = 2.0 pier_width = 1.5 pier_length = base_length + 2 pier = ddd.rect( [-pier_width / 2, -pier_length / 2, pier_width / 2, pier_length / 2], name="Crane Pier") pier = pier.extrude(pier_height).material(ddd.mats.metal_paint_red) pier = ddd.uv.map_cubic(pier) pier_l = pier.translate([-base_width * (2 / 6), 0, 0]) pier_r = pier.translate([base_width * (2 / 6), 0, 0]) piers = ddd.group3([pier_l, pier_r], name="Crane Piers") # Base base_height = 1.5 base = ddd.rect([0, 0, base_width, base_length], name="Crane Base").recenter() base = base.extrude(base_height).translate([0, 0, pier_height]) base = base.material(ddd.mats.cement) base = ddd.uv.map_cubic(base) # Base Tower column_height = 8 column_radius_base = base_width * 0.85 * 0.5 column_radius = column_radius_base * 0.5 column_shape_base = ddd.regularpolygon(4, column_radius_base) column_shape_middle = ddd.regularpolygon(12, column_radius) column = column_shape_base.extrude_step(column_shape_middle, 1, base=False) column = column.extrude_step(column_shape_middle, column_height - 1, cap=False) column = column.translate([0, 0, pier_height + base_height ]).material(ddd.mats.metal_paint_red) column = ddd.uv.map_cubic(column) column.name = "Crane column" # Platform and railing platform_radius = column_radius + 0.85 platform_base_height = pier_height + base_height + column_height - 2.0 platform_shape = ddd.point(name="Crane platform").buffer( platform_radius, cap_style=ddd.CAP_ROUND) platform = platform_shape.triangulate(twosided=True) platform = platform.material(ddd.mats.metallic_grid) platform_fence = platform_shape.outline().extrude(1.2).material( ddd.mats.fence) platform = ddd.group([platform, platform_fence], name="Crane platform") platform = ddd.uv.map_cylindrical(platform) platform = platform.translate([0, 0, platform_base_height]) # WeightBlock block_width = base_width * 0.6 block_length = base_length * 1.25 block_base_height = pier_height + base_height + column_height block_height = 2.2 block = ddd.rect([-block_width / 2, 0, block_width / 2, block_length], name="Crane Weight") block = block.extrude(block_height).translate([0, -2.5, block_base_height ]).material(ddd.mats.cement) block = ddd.uv.map_cubic(block) # Cabin cabin_width = block_width * 0.6 cabin_length = 3 cabin_height = block_height cabin_shape = ddd.rect( [-block_width * 0.5, 0, block_width * 0.5, cabin_length]) cabin_shape_top = ddd.rect( [-block_width * 0.5, 1, block_width * 0.5, cabin_length]) cabin = cabin_shape.extrude_step(cabin_shape, 1) cabin = cabin.extrude_step(cabin_shape_top, cabin_height - 1) cabin = cabin.extrude_step(cabin_shape_top.buffer(-0.4), 0.3) cabin = cabin.material(ddd.mats.metal_paint_yellow) cabin = cabin.translate([0, -2.5 - cabin_length, block_base_height]) cabin = ddd.uv.map_cubic(cabin) mainsupport_width = 2 mainsupport_skew = 2 mainsupport_height = 10 mainsupport_base_height = block_base_height + block_height mainsupport = ddd.rect([0, 0, mainsupport_width, mainsupport_width], name="Main Support").recenter() mainsupport = mainsupport.extrude_step(mainsupport.translate( [0, -mainsupport_skew]), mainsupport_height, base=False) mainsupport = mainsupport.material(ddd.mats.metal_paint_red) mainsupport = mainsupport.translate([0, 0, mainsupport_base_height]) mainsupport = ddd.uv.map_cubic(mainsupport) secsupport_width = 1.5 secsupport_skew = 11 secsupport_height = 18 secsupport_base_height = block_base_height + block_height secsupport = ddd.rect([0, 0, secsupport_width, secsupport_width], name="Sec Support").recenter() secsupport = secsupport.extrude_step(secsupport.scale( [0.8, 0.7]).translate([0, -secsupport_skew]), secsupport_height, base=False) secsupport = secsupport.material(ddd.mats.metal_paint_red) secsupport = secsupport.translate([0, -1.5, secsupport_base_height]) secsupport = ddd.uv.map_cubic(secsupport) maincable1 = cable( [-block_width * 0.4, block_length - 3, mainsupport_base_height], [ -mainsupport_width * 0.2, -mainsupport_skew, mainsupport_base_height + mainsupport_height - 0.2 ]) maincable1 = maincable1.material(ddd.mats.cable_metal) maincable2 = cable( [block_width * 0.4, block_length - 3, mainsupport_base_height], [ mainsupport_width * 0.2, -mainsupport_skew, mainsupport_base_height + mainsupport_height - 0.2 ]) maincable2 = maincable2.material(ddd.mats.cable_metal) seccable1 = cable( [0, -mainsupport_skew, mainsupport_base_height + mainsupport_height], [ 0, -1.5 - secsupport_skew, mainsupport_base_height + secsupport_height - 0.2 ]) seccable1 = seccable1.material(ddd.mats.cable_metal) # Drag cable dragcable_length = 20 dragcable_point = [ 0, -1.5 - secsupport_skew, mainsupport_base_height + secsupport_height - 0.2 ] dragcable_endpoint = [ 0, -1.5 - secsupport_skew, mainsupport_base_height + secsupport_height - 0.2 - dragcable_length ] dragcable = cable(dragcable_endpoint, dragcable_point) dragcable = dragcable.material(ddd.mats.cable_metal) # Pulley block pulley_block_width = 0.5 pulley_block_thick = 0.3 pulley_block_height = 0.8 pulley_block_profile = ddd.polygon( [[-pulley_block_width * 0.25, 0], [pulley_block_width * 0.25, 0], [pulley_block_width / 2, pulley_block_height], [-pulley_block_width / 2, pulley_block_height]], name="Pulley block") pulley_block_profile = pulley_block_profile.buffer( 0.2, resolution=3, join_style=ddd.JOIN_ROUND) pulley_block = pulley_block_profile.extrude(pulley_block_thick).translate( [0, 0, -pulley_block_thick / 2]) pulley_block = pulley_block.rotate(ddd.ROT_FLOOR_TO_FRONT).rotate( ddd.ROT_TOP_CW) pulley_block = pulley_block.material(ddd.mats.metal_paint_yellow) pulley_block = ddd.uv.map_cubic(pulley_block) pulley_block = pulley_block.translate(dragcable_endpoint) # Hook hook_radius = 0.6 hook_radius_inner = 0.35 hook = ddd.sphere(r=hook_radius, name="Hook") hook = hook.scale([0.2, 1.0, 1.0]) hole = ddd.point().buffer(hook_radius_inner, resolution=3, cap_style=ddd.CAP_ROUND).extrude(4.0).translate( [0, 0, -2]) hole = hole.rotate(ddd.ROT_FLOOR_TO_FRONT).rotate(ddd.ROT_TOP_CW) hook = hook.subtract(hole) hook = hook.material(ddd.mats.steel) #hook = ddd.uv.map_cubic(hook) hook = hook.translate(dragcable_endpoint) item = ddd.group3([ piers, base, column, platform, block, cabin, mainsupport, maincable1, maincable2, secsupport, seccable1, dragcable, pulley_block, hook ], name="Crane Vertical") return item