53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
|
|
from cqparts.constraint import Mate, Coincident
|
|
|
|
from .base import Fastener
|
|
from ..screws import Screw
|
|
from ..utils import VectorEvaluator, Selector, Applicator
|
|
|
|
|
|
class ScrewFastener(Fastener):
|
|
"""
|
|
Screw fastener assembly.
|
|
|
|
Example usage can be found here: :ref:`cqparts_fasteners.built-in.screw`
|
|
"""
|
|
Evaluator = VectorEvaluator
|
|
|
|
class Selector(Selector):
|
|
ratio = 0.8
|
|
def get_components(self):
|
|
end_effect = self.evaluator.eval[-1]
|
|
end_point = end_effect.start_point + (end_effect.end_point - end_effect.start_point) * self.ratio
|
|
|
|
return {'screw': Screw(
|
|
head=('countersunk', {
|
|
'diameter': 9.5,
|
|
'height': 3.5,
|
|
}),
|
|
neck_length=abs(self.evaluator.eval[-1].start_point - self.evaluator.eval[0].start_point),
|
|
# only the length after the neck is threaded
|
|
length=abs(end_point - self.evaluator.eval[0].start_point),
|
|
#length=abs(self.evaluator.eval[-1].end_point - self.evaluator.eval[0].start_point),
|
|
)}
|
|
|
|
def get_constraints(self):
|
|
# bind fastener relative to its anchor; the part holding it in.
|
|
anchor_part = self.evaluator.eval[-1].part # last effected part
|
|
|
|
return [Coincident(
|
|
self.components['screw'].mate_origin,
|
|
Mate(anchor_part, self.evaluator.eval[0].start_coordsys - anchor_part.world_coords)
|
|
)]
|
|
|
|
class Applicator(Applicator):
|
|
|
|
def apply_alterations(self):
|
|
screw = self.selector.components['screw']
|
|
cutter = screw.make_cutter() # cutter in local coords
|
|
|
|
for effect in self.evaluator.eval:
|
|
relative_coordsys = screw.world_coords - effect.part.world_coords
|
|
local_cutter = relative_coordsys + cutter
|
|
effect.part.local_obj = effect.part.local_obj.cut(local_cutter)
|