#! python # (c) 2011 Adrian Przekwas LGPL from __future__ import division # allows floating point division from integers import FreeCAD, Part from FreeCAD import Base class MySpring: def __init__(self, obj): """Add the properties: Pitch, Diameter, Height, BarDiameter""" obj.addProperty( "App::PropertyLength", "Pitch", "MySpring", "Pitch of the helix", locked=True ).Pitch = 5.0 obj.addProperty( "App::PropertyLength", "Diameter", "MySpring", "Diameter of the helix", locked=True ).Diameter = 6.0 obj.addProperty( "App::PropertyLength", "Height", "MySpring", "Height of the helix", locked=True ).Height = 30.0 obj.addProperty( "App::PropertyLength", "BarDiameter", "MySpring", "Diameter of the bar", locked=True ).BarDiameter = 3.0 obj.Proxy = self def onChanged(self, fp, prop): if prop == "Pitch" or prop == "Diameter" or prop == "Height" or prop == "BarDiameter": self.execute(fp) def execute(self, fp): pitch = fp.Pitch radius = fp.Diameter / 2 height = fp.Height barradius = fp.BarDiameter / 2 myhelix = Part.makeHelix(pitch, height, radius) g = myhelix.Edges[0].Curve c = Part.Circle() c.Center = g.value(0) # start point of the helix c.Axis = (0, 1, 0) c.Radius = barradius p = c.toShape() section = Part.Wire([p]) makeSolid = True isFrenet = True myspring = Part.Wire(myhelix).makePipeShell([section], makeSolid, isFrenet) fp.Shape = myspring def makeMySpring(): doc = FreeCAD.activeDocument() if doc is None: doc = FreeCAD.newDocument() spring = doc.addObject("Part::FeaturePython", "My_Spring") spring.Label = "My Spring" MySpring(spring) spring.ViewObject.Proxy = 0 doc.recompute() if __name__ == "__main__": makeMySpring()