First, Sample is U-Shape rebar.
Code: Select all
import ArchCommands,ArchComponent,FreeCAD
from FreeCAD import Vector
import Draft
import DraftGeomUtils
class _Rebar(ArchComponent.Component):
def __init__(self,obj):
ArchComponent.Component.__init__(self,obj)
obj.addProperty("App::PropertyDistance","diameter","Rebar","The diameter of this rebar")
obj.Role = ['Rebar']
self.Type = "Rebar"
def getProfile(self,obj,noplacement=True):
return []
def getExtrusionVector(self,obj,noplacement=True):
return FreeCAD.Vector()
def execute(self,obj):
if self.clone(obj):
return
class _Rebar_U_shape(_Rebar):
def __init__(self,obj):
_Rebar.__init__(self,obj)
obj.addProperty("App::PropertyDistance","A","Rebar","The A length of this rebar")
obj.addProperty("App::PropertyDistance","B","Rebar","The B length of this rebar")
def execute(self,obj):
if self.clone(obj):
return
pl = obj.Placement
dia = obj.diameter
A = obj.A
B = obj.B
R = 5*dia /2.
import Part
points = []
points.append(Vector(0,0,A))
points.append(Vector(0,0,0))
points.append(Vector(B,0,0))
points.append(Vector(B,0,A))
lines = []
for i in range(1, len(points)):
lines.append(Part.Line(points[i],points[i-1]))
spath = Part.Shape(lines)
wpath = Part.Wire(spath.Edges)
wire = Part.Wire(wpath)
wire = DraftGeomUtils.filletWire(wire,R)
bpoint = points[0]
bvec = points[1].sub(points[0]).normalize()
circle = Part.makeCircle(dia/2,bpoint,bvec)
circle = Part.Wire(circle)
bar = wire.makePipeShell([circle],True,False,2)
shapes = []
shapes.append(bar)
obj.Shape = bar
class _ViewProviderRebar(ArchComponent.ViewProviderComponent):
def __init__(self,vobj):
ArchComponent.ViewProviderComponent.__init__(self,vobj)
vobj.ShapeColor = (0.67,0.00,0.00)
def getIcon(self):
import Arch_rc
return ":/icons/Arch_Rebar_Tree.svg"
def makeRebar2(dia=12 , A=300 , B=1000 , placement = (0,0,0) ):
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Reinforcing Bar")
_Rebar_U_shape(obj)
obj.diameter = dia
obj.A = A
obj.B = B
obj.Placement.Base = Vector(placement)
if FreeCAD.GuiUp:
_ViewProviderRebar(obj.ViewObject)
return obj
if __name__=="__main__":
rebar1 = makeRebar2()
rebar2 = makeRebar2(placement = (0, 500, 0))
rebar3 = makeRebar2(dia= 25 , placement = (0, 1000, 0))
rebar4 = makeRebar2(dia= 32 , A = 500 , B = 1200, placement = (0, 1500, 0))
FreeCAD.ActiveDocument.recompute()
Msg("\nDone!!\n\n")