mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 10:41:20 -08:00
83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
"""
|
|
STL import and edit example
|
|
|
|
name: benchy.py
|
|
by: Gumyr
|
|
date: July 9, 2023
|
|
|
|
desc:
|
|
This example imports a STL model as a Solid object and changes it.
|
|
The low-poly-benchy used in this example is by reddaugherty, see
|
|
https://www.printables.com/model/151134-low-poly-benchy.
|
|
|
|
license:
|
|
|
|
Copyright 2023 Gumyr
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
"""
|
|
|
|
# [Imports]
|
|
from build123d import *
|
|
from ocp_vscode import *
|
|
|
|
# [Parameters]
|
|
# - none
|
|
|
|
# [Code]
|
|
# Import the benchy as a Solid model
|
|
importer = Mesher()
|
|
benchy_stl = importer.read("low_poly_benchy.stl")[0]
|
|
|
|
with BuildPart() as benchy:
|
|
add(benchy_stl)
|
|
|
|
# Determine the plane that defines the top of the roof
|
|
vertices = benchy.vertices()
|
|
roof_vertices = vertices.filter_by_position(Axis.Z, 38, 42)
|
|
roof_plane_vertices = [
|
|
roof_vertices.group_by(Axis.Y, tol_digits=2)[-1].sort_by(Axis.X)[0],
|
|
roof_vertices.sort_by(Axis.Z)[0],
|
|
roof_vertices.group_by(Axis.Y, tol_digits=2)[0].sort_by(Axis.X)[0],
|
|
]
|
|
roof_plane = Plane(
|
|
Face(Wire.make_polygon([v.to_tuple() for v in roof_plane_vertices]))
|
|
)
|
|
# Remove the faceted smoke stack
|
|
split(bisect_by=roof_plane, keep=Keep.BOTTOM)
|
|
|
|
# Determine the position and size of the smoke stack
|
|
smoke_stack_vertices = vertices.group_by(Axis.Z, tol_digits=0)[-1]
|
|
smoke_stack_center = sum(
|
|
[Vector(v.X, v.Y, v.Z) for v in smoke_stack_vertices], Vector()
|
|
) * (1 / len(smoke_stack_vertices))
|
|
smoke_stack_radius = max(
|
|
[
|
|
(Vector(*v.to_tuple()) - smoke_stack_center).length
|
|
for v in smoke_stack_vertices
|
|
]
|
|
)
|
|
|
|
# Create the new smoke stack
|
|
with BuildSketch(Plane(smoke_stack_center)):
|
|
Circle(smoke_stack_radius)
|
|
Circle(smoke_stack_radius - 2 * MM, mode=Mode.SUBTRACT)
|
|
extrude(amount=-3 * MM)
|
|
with BuildSketch(Plane(smoke_stack_center)):
|
|
Circle(smoke_stack_radius - 0.5 * MM)
|
|
Circle(smoke_stack_radius - 2 * MM, mode=Mode.SUBTRACT)
|
|
extrude(amount=roof_plane_vertices[1].Z - smoke_stack_center.Z)
|
|
|
|
show(benchy)
|
|
# [End]
|