freecad-cam/Mod/PartDesign/Scripts/Spring.py
2026-02-01 01:59:24 +01:00

53 lines
1.8 KiB
Python

#! 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 = 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()