#! python # -*- coding: utf-8 -*- # (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").Pitch=5.0 obj.addProperty("App::PropertyLength","Diameter","MySpring","Diameter of the helix").Diameter=6.0 obj.addProperty("App::PropertyLength","Height","MySpring","Height of the helix").Height=30.0 obj.addProperty("App::PropertyLength","BarDiameter","MySpring","Diameter of the bar").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=1 #change to 1 to make a solid isFrenet=1 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()