-
Notifications
You must be signed in to change notification settings - Fork 276
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix workplane cylinder center when generated using a custom direction #1593
base: master
Are you sure you want to change the base?
Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #1593 +/- ##
=======================================
Coverage 94.86% 94.86%
=======================================
Files 28 28
Lines 6226 6230 +4
Branches 1261 1262 +1
=======================================
+ Hits 5906 5910 +4
Misses 193 193
Partials 127 127 ☔ View full report in Codecov by Sentry. |
Something like the following should handle it.
if isinstance(centered, bool):
centered = (centered, centered, centered)
offset = Vector()
plane = Plane((0, 0, 0), normal=direct)
if not centered[0]:
offset += plane.toWorldCoords((radius, 0, 0))
if not centered[1]:
offset += plane.toWorldCoords((0, radius, 0))
if centered[2]:
offset += plane.toWorldCoords((0, 0, -height / 2))
s = Solid.makeCylinder(radius, height, offset, direct, angle)
# We want a cylinder for each point on the workplane
return self.eachpoint(lambda loc: s.moved(loc), True, combine, clean) |
Thanks, I prefer this than what I did but then it requires to be careful about the axis to set for centering. To center a cylinder along its height but directed along the y axis, it requires to put the third component of c1 = cq.Shape.centerOfMass(
cq.Workplane("XY").cylinder(
radius=1,
height=10,
direct=cq.Vector(0, 1, 0),
centered=(False, False, True),
).val()
)
print(c1)
c2 = cq.Shape.centerOfMass(
cq.Workplane("XY").cylinder(
radius=1,
height=10,
direct=cq.Vector(0, 1, 0),
centered=(False, True, False),
).val()
)
print(c2) Results in Vector: (1.0, 0.0, 1.0)
Vector: (0.0, 5.0, 1.0) Is it the expected behavior? |
Fixes #1591.
(0, 0, 1)
was not centered at the right position.A test has been added to check these two points. It fails before the fix and passes after the fix.
The case where
centered != (True, True, True)
with a direction different than one along the x, y, or z axes is not managed. What would we like to do in this case?