| | |
| | |
| |
|
| | """ |
| | An example for a high-level custom feature object to form a full-parametric parallelepiped. |
| | """ |
| |
|
| | __author__ = "Werner Mayer <wmayer@users.sourceforge.net>" |
| |
|
| | import FreeCAD, Part, math |
| | from FreeCAD import Base |
| |
|
| |
|
| | class Parallelepiped: |
| | def __init__(self, obj): |
| | """Add the properties: Length, Edges, Radius, Height""" |
| | obj.addProperty("App::PropertyVector", "A", "Parallelepiped", "Vector", locked=True).A = ( |
| | Base.Vector(1, 0, 0) |
| | ) |
| | obj.addProperty("App::PropertyVector", "B", "Parallelepiped", "Vector", locked=True).B = ( |
| | Base.Vector(0, 1, 0) |
| | ) |
| | obj.addProperty("App::PropertyVector", "C", "Parallelepiped", "Vector", locked=True).C = ( |
| | Base.Vector(0, 0, 1) |
| | ) |
| | obj.Proxy = self |
| |
|
| | def onChanged(self, fp, prop): |
| | if prop == "A" or prop == "B" or prop == "C": |
| | self.execute(fp) |
| |
|
| | def execute(self, fp): |
| | a = fp.A |
| | b = fp.B |
| | c = fp.C |
| |
|
| | m = Base.Matrix() |
| | m.A11 = a.x |
| | m.A12 = a.y |
| | m.A13 = a.z |
| | m.A21 = b.x |
| | m.A22 = b.y |
| | m.A23 = b.z |
| | m.A31 = c.x |
| | m.A32 = c.y |
| | m.A33 = c.z |
| | box = Part.makeBox(1, 1, 1) |
| | fp.Shape = box.transformGeometry(m) |
| |
|
| |
|
| | class BoxCylinder: |
| | def __init__(self, obj): |
| | obj.addProperty( |
| | "App::PropertyFloat", "Length", "BoxCylinder", "Length", locked=True |
| | ).Length = 10.0 |
| | obj.addProperty( |
| | "App::PropertyFloat", "Width", "BoxCylinder", "Width", locked=True |
| | ).Width = 10.0 |
| | obj.addProperty( |
| | "App::PropertyLink", "Source", "BoxCylinder", "Source", locked=True |
| | ).Source = None |
| | obj.Proxy = self |
| |
|
| | def onChanged(self, fp, prop): |
| | if prop == "Length" or prop == "Width": |
| | self.execute(fp) |
| |
|
| | def execute(self, fp): |
| | FreeCAD.Console.PrintMessage(str(fp.Source) + "\n") |
| | if fp.Source is None: |
| | return |
| | r = fp.Source.Radius |
| | l = fp.Length |
| | w = fp.Width |
| | h = 2 * r + 10 |
| | fp.Shape = Part.makeBox(l, w, h) |
| |
|
| |
|
| | def makeParallelepiped(): |
| | doc = FreeCAD.activeDocument() |
| | if doc is None: |
| | doc = FreeCAD.newDocument() |
| | obj = doc.addObject("Part::FeaturePython", "Parallelepiped") |
| | obj.Label = "Parallelepiped" |
| | Parallelepiped(obj) |
| | obj.ViewObject.Proxy = 0 |
| |
|
| |
|
| | def makeBoxCylinder(): |
| | doc = FreeCAD.activeDocument() |
| | if doc is None: |
| | doc = FreeCAD.newDocument() |
| | cyl = doc.addObject("Part::Cylinder", "Cylinder") |
| | cyl.Radius = 16.0 |
| | cyl.Height = 800.0 |
| | obj = doc.addObject("Part::FeaturePython", "Box") |
| | BoxCylinder(obj) |
| | obj.Source = cyl |
| | obj.Length = 800.0 |
| | obj.Width = 600.0 |
| | obj.ViewObject.Proxy = 0 |
| | doc.recompute() |
| |
|