From 55b61191042660bc34524e19be24ca6a4496179a Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 9 Jul 2023 14:33:06 -0400 Subject: [PATCH] Added import_stl example --- examples/benchy.py | 75 +++++++++++++++++++++++++++++++++++ examples/low_poly_benchy.stl | Bin 0 -> 49284 bytes 2 files changed, 75 insertions(+) create mode 100644 examples/benchy.py create mode 100644 examples/low_poly_benchy.stl diff --git a/examples/benchy.py b/examples/benchy.py new file mode 100644 index 0000000..7a1c06a --- /dev/null +++ b/examples/benchy.py @@ -0,0 +1,75 @@ +""" +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. + +""" +from build123d import * +from ocp_vscode import * + +with BuildPart() as benchy: + # Import the benchy as a Solid model and add it + add(import_stl("low_poly_benchy.stl", for_reference=False)) + + # 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.make_from_wires( + 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) diff --git a/examples/low_poly_benchy.stl b/examples/low_poly_benchy.stl new file mode 100644 index 0000000000000000000000000000000000000000..c048f1e30f39d08277cb14ea6c1a2f6a165ad31a GIT binary patch literal 49284 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