| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import FreeCAD, FreeCADGui |
| | import Part, Sketcher |
| |
|
| |
|
| | class ShaftFeature: |
| | "Creates and updates the feature of the shaft" |
| |
|
| | App = FreeCAD |
| | Gui = FreeCADGui |
| |
|
| | def __init__(self, doc): |
| | "Create new feature" |
| | self.Doc = doc |
| |
|
| | |
| | self.sketch = self.Doc.addObject("Sketcher::SketchObject", "SketchShaft") |
| | self.sketch.Placement = self.App.Placement( |
| | self.App.Vector(0, 0, 0), self.App.Rotation(0, 0, 0, 1) |
| | ) |
| |
|
| | self.feature = 0 |
| | self.segments = 0 |
| | self.totalLength = 0 |
| | self.lastRadius = 0 |
| |
|
| | def addSegment(self, length, diameter, innerdiameter): |
| | "Add a segment at the end of the shaft" |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | constrRadius = 4 + self.segments * 6 |
| | constrLength = 7 + self.segments * 6 |
| | constrInnerRadius = 1 + self.segments * 6 |
| | |
| | |
| | segRadius = 1 + self.segments * 2 |
| | segLength = 2 + self.segments * 2 |
| | prevSegLength = 0 + self.segments * 2 |
| | prevSegEnd = 3 + (self.segments - 1) * 2 |
| | segEnd = prevSegEnd + 2 |
| |
|
| | radius = diameter / 2 |
| | innerradius = innerdiameter / 2 |
| | oldLength = self.totalLength |
| | self.totalLength += length |
| | self.segments += 1 |
| |
|
| | if oldLength == 0: |
| | |
| | |
| | self.sketch.addGeometry( |
| | Part.LineSegment(self.App.Vector(0, 0, 0), self.App.Vector(self.totalLength, 0, 0)) |
| | ) |
| | self.sketch.addConstraint( |
| | Sketcher.Constraint("DistanceX", 0, self.totalLength) |
| | ) |
| | self.sketch.addConstraint( |
| | Sketcher.Constraint("DistanceY", -1, 1, 0, 1, innerradius) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("PointOnObject", 0, 1, -2)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Horizontal", 0)) |
| | |
| | self.sketch.addGeometry( |
| | Part.LineSegment(self.App.Vector(0, innerradius, 0), self.App.Vector(0, radius, 0)) |
| | ) |
| | self.sketch.addConstraint( |
| | Sketcher.Constraint("DistanceY", -1, 1, 1, 2, radius) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("Coincident", 0, 1, 1, 1)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Vertical", 1)) |
| | self.sketch.addGeometry( |
| | Part.LineSegment(self.App.Vector(0, radius, 0), self.App.Vector(length, radius, 0)) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("DistanceX", 2, length)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Coincident", 2, 1, 1, 2)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Horizontal", 2)) |
| | else: |
| | |
| | self.sketch.delGeometry(prevSegEnd) |
| | |
| | |
| | self.sketch.setDatum(0, self.totalLength) |
| | |
| | self.sketch.addGeometry( |
| | Part.LineSegment( |
| | self.App.Vector(oldLength, self.lastRadius, 0), |
| | self.App.Vector(oldLength, radius, 0), |
| | ) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("DistanceY", -1, 1, segRadius, 2, radius)) |
| | self.sketch.addConstraint( |
| | Sketcher.Constraint("Coincident", segRadius, 1, prevSegLength, 2) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("Vertical", segRadius)) |
| | self.sketch.addGeometry( |
| | Part.LineSegment( |
| | self.App.Vector(oldLength, radius, 0), |
| | self.App.Vector(oldLength + length, radius, 0), |
| | ) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("DistanceX", segLength, length)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Coincident", segLength, 1, segRadius, 2)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Horizontal", segLength)) |
| |
|
| | |
| | self.sketch.addGeometry( |
| | Part.LineSegment( |
| | self.App.Vector(oldLength + length, radius, 0), |
| | self.App.Vector(oldLength + length, innerradius, 0), |
| | ) |
| | ) |
| | self.sketch.addConstraint(Sketcher.Constraint("Coincident", 0, 2, segEnd, 2)) |
| | self.sketch.addConstraint(Sketcher.Constraint("Coincident", segEnd, 1, segLength, 2)) |
| | self.lastRadius = radius |
| |
|
| | if oldLength == 0: |
| | |
| | self.feature = self.Doc.addObject("PartDesign::Revolution", "RevolutionShaft") |
| | self.feature.Profile = self.sketch |
| | self.feature.ReferenceAxis = (self.sketch, ["H_Axis"]) |
| | self.feature.Angle = 360.0 |
| | self.Doc.recompute() |
| | self.Gui.hide("SketchShaft") |
| | else: |
| | self.Doc.recompute() |
| | |
| | self.Gui.SendMsgToActiveView("ViewFit") |
| |
|
| | def updateSegment(self, segment, oldLength, length, diameter, innerdiameter): |
| | constrRadius = 4 + segment * 6 |
| | constrLength = 7 + segment * 6 |
| | constrInnerRadius = 1 |
| | |
| | self.totalLength = self.totalLength - oldLength + length |
| | |
| | self.sketch.setDatum(0, self.totalLength) |
| | |
| | self.sketch.setDatum(constrLength, length) |
| | |
| | self.sketch.setDatum(constrRadius, diameter / 2) |
| | |
| | self.sketch.setDatum(constrInnerRadius, innerdiameter / 2) |
| | |
| | self.Doc.recompute() |
| | self.Gui.SendMsgToActiveView("ViewFit") |
| |
|