Skip to content
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

cskHole generates incorrect results for shallow holes #1653

Open
TheLostLambda opened this issue Aug 29, 2024 · 1 comment
Open

cskHole generates incorrect results for shallow holes #1653

TheLostLambda opened this issue Aug 29, 2024 · 1 comment

Comments

@TheLostLambda
Copy link

cadquery/cadquery/cq.py

Lines 2930 to 2988 in 3cd327a

def cskHole(
self: T,
diameter: float,
cskDiameter: float,
cskAngle: float,
depth: Optional[float] = None,
clean: bool = True,
) -> T:
"""
Makes a countersunk hole for each item on the stack.
:param diameter: the diameter of the hole
:type diameter: float > 0
:param cskDiameter: the diameter of the countersink, must be greater than hole diameter
:param cskAngle: angle of the countersink, in degrees ( 82 is common )
:type cskAngle: float > 0
:param depth: the depth of the hole
:type depth: float > 0 or None to drill thru the entire part.
:param clean: call :meth:`clean` afterwards to have a clean shape
The surface of the hole is at the current workplane.
One hole is created for each item on the stack. A very common use case is to use a
construction rectangle to define the centers of a set of holes, like so::
s = (
Workplane()
.box(2, 4, 0.5)
.faces(">Z")
.workplane()
.rect(1.5, 3.5, forConstruction=True)
.vertices()
.cskHole(0.125, 0.25, 82, depth=None)
)
This sample creates a plate with a set of holes at the corners.
**Plugin Note**: this is one example of the power of plugins. CounterSunk holes are quite
time consuming to create, but are quite easily defined by users.
see :meth:`cboreHole` to make counterbores instead of countersinks
"""
if depth is None:
depth = self.largestDimension()
boreDir = Vector(0, 0, -1)
center = Vector()
# first make the hole
hole = Solid.makeCylinder(
diameter / 2.0, depth, center, boreDir
) # local coords!
r = cskDiameter / 2.0
h = r / math.tan(math.radians(cskAngle / 2.0))
csk = Solid.makeCone(r, 0.0, h, center, boreDir)
res = hole.fuse(csk)
return self.cutEach(lambda loc: res.moved(loc), True, clean)

If the cone generated by the angle and diameter is taller than the depth of the hole, it still cuts through and forms a conical cutout where I think it should be truncated.

I'll add more details soon, and am also happy to submit a PR myself unless someone beats me to it!

@jmwright
Copy link
Member

jmwright commented Sep 5, 2024

@TheLostLambda Could you post a screenshot for more context?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants