286 lines
10 KiB
Python
286 lines
10 KiB
Python
|
|
import ArchComponent
|
||
|
|
import FreeCAD
|
||
|
|
|
||
|
|
if FreeCAD.GuiUp:
|
||
|
|
import FreeCADGui
|
||
|
|
from PySide import QtCore
|
||
|
|
from PySide.QtCore import QT_TRANSLATE_NOOP
|
||
|
|
else:
|
||
|
|
# \cond
|
||
|
|
def translate(ctxt, txt):
|
||
|
|
return txt
|
||
|
|
|
||
|
|
|
||
|
|
def QT_TRANSLATE_NOOP(ctxt, txt):
|
||
|
|
return txt
|
||
|
|
# \endcond
|
||
|
|
|
||
|
|
try:
|
||
|
|
_fromUtf8 = QtCore.QString.fromUtf8
|
||
|
|
except AttributeError:
|
||
|
|
def _fromUtf8(s):
|
||
|
|
return s
|
||
|
|
|
||
|
|
|
||
|
|
def makeFencePost(diameter=48, length=3000, placement=None, name="Post"):
|
||
|
|
"makePipe([baseobj,diamerter,length,placement,name]): creates an pipe object from the given base object"
|
||
|
|
|
||
|
|
if not FreeCAD.ActiveDocument:
|
||
|
|
FreeCAD.Console.PrintError("No active document. Aborting\n")
|
||
|
|
return
|
||
|
|
|
||
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name)
|
||
|
|
obj.Label = name
|
||
|
|
_FencePost(obj)
|
||
|
|
|
||
|
|
if FreeCAD.GuiUp:
|
||
|
|
_ViewProviderFencePost(obj.ViewObject)
|
||
|
|
|
||
|
|
obj.Length = length
|
||
|
|
obj.Diameter = diameter
|
||
|
|
|
||
|
|
if placement:
|
||
|
|
obj.Placement = placement
|
||
|
|
return obj
|
||
|
|
|
||
|
|
|
||
|
|
def makeFenceReinforcePost(diameter=48, length=3000, placement=None, name="Post"):
|
||
|
|
"makePipe([baseobj,diamerter,length,placement,name]): creates an pipe object from the given base object"
|
||
|
|
|
||
|
|
if not FreeCAD.ActiveDocument:
|
||
|
|
FreeCAD.Console.PrintError("No active document. Aborting\n")
|
||
|
|
return
|
||
|
|
|
||
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name)
|
||
|
|
obj.Label = name
|
||
|
|
_FenceReinforcePostPost(obj)
|
||
|
|
|
||
|
|
if FreeCAD.GuiUp:
|
||
|
|
_ViewProviderFencePost(obj.ViewObject)
|
||
|
|
|
||
|
|
obj.Length = length
|
||
|
|
obj.Diameter = diameter
|
||
|
|
|
||
|
|
if placement:
|
||
|
|
obj.Placement = placement
|
||
|
|
return obj
|
||
|
|
|
||
|
|
|
||
|
|
class _FencePost(ArchComponent.Component):
|
||
|
|
def __init__(self, obj):
|
||
|
|
ArchComponent.Component.__init__(self, obj)
|
||
|
|
self.setProperties(obj)
|
||
|
|
obj.IfcType = "Pipe Segment"
|
||
|
|
self.Type = "FencePost"
|
||
|
|
|
||
|
|
def setProperties(self, obj):
|
||
|
|
|
||
|
|
pl = obj.PropertiesList
|
||
|
|
if not "Diameter" in pl:
|
||
|
|
obj.addProperty("App::PropertyLength", "Diameter", "Pipe",
|
||
|
|
QT_TRANSLATE_NOOP("App::Property", "The diameter of this pipe, if not based on a profile")
|
||
|
|
).Diameter = 48
|
||
|
|
if not "Thickness" in pl:
|
||
|
|
obj.addProperty("App::PropertyLength", "Thickness", "Pipe",
|
||
|
|
QT_TRANSLATE_NOOP("App::Property", "The Thickness of this pipe, if not based on a profile")
|
||
|
|
).Thickness = 4
|
||
|
|
if not "Length" in pl:
|
||
|
|
obj.addProperty("App::PropertyLength", "Length", "Pipe",
|
||
|
|
QT_TRANSLATE_NOOP("App::Property", "The length of this pipe, if not based on an edge")
|
||
|
|
).Length = 3000
|
||
|
|
|
||
|
|
def onDocumentRestored(self, obj):
|
||
|
|
|
||
|
|
ArchComponent.Component.onDocumentRestored(self, obj)
|
||
|
|
self.setProperties(obj)
|
||
|
|
|
||
|
|
def execute(self, obj):
|
||
|
|
import Part
|
||
|
|
pl = obj.Placement
|
||
|
|
|
||
|
|
if obj.CloneOf:
|
||
|
|
obj.Shape = obj.CloneOf.Shape
|
||
|
|
else:
|
||
|
|
w = self.getProfile(obj)
|
||
|
|
try:
|
||
|
|
# sh = w.makePipeShell([p], True, False, 2)
|
||
|
|
sh = w.revolve(FreeCAD.Vector(0.0, 0.0, 0.0), FreeCAD.Vector(0.0, 0.0, 1.0), 360)
|
||
|
|
sh = Part.Solid(sh)
|
||
|
|
except:
|
||
|
|
FreeCAD.Console.PrintError("Unable to build the pipe \n")
|
||
|
|
else:
|
||
|
|
obj.Shape = sh
|
||
|
|
obj.Placement = pl
|
||
|
|
|
||
|
|
return
|
||
|
|
|
||
|
|
# ------------------------- Prueba para apoyos de refuerzo:
|
||
|
|
import math
|
||
|
|
L = math.pi / 2 * (obj.Diameter.Value - 2 * obj.Thickness.Value)
|
||
|
|
|
||
|
|
v1 = FreeCAD.Vector(L / 2, 0, obj.Thickness.Value)
|
||
|
|
vc1 = FreeCAD.Vector(L / 2 + obj.Thickness.Value, 0, 0)
|
||
|
|
v2 = FreeCAD.Vector(L / 2, 0, -obj.Thickness.Value)
|
||
|
|
|
||
|
|
v11 = FreeCAD.Vector(-L / 2, 0, obj.Thickness.Value)
|
||
|
|
vc11 = FreeCAD.Vector(-(L / 2 + obj.Thickness.Value), 0, 0)
|
||
|
|
v21 = FreeCAD.Vector(-L / 2, 0, -obj.Thickness.Value)
|
||
|
|
|
||
|
|
arc1 = Part.Arc(v1, vc1, v2).toShape()
|
||
|
|
arc11 = Part.Arc(v11, vc11, v21).toShape()
|
||
|
|
line1 = Part.LineSegment(v11, v1).toShape()
|
||
|
|
line2 = Part.LineSegment(v21, v2).toShape()
|
||
|
|
w = Part.Wire([arc1, line2, arc11, line1])
|
||
|
|
face = Part.Face(w)
|
||
|
|
pro = face.extrude(FreeCAD.Vector(0, 40, 0))
|
||
|
|
|
||
|
|
#Part.Circle(Center, Normal, Radius)
|
||
|
|
cir1 = Part.Face(Part.Wire(Part.Circle(FreeCAD.Vector(0, -200, 0), FreeCAD.Vector(0, 1, 0), obj.Diameter.Value / 2).toShape()))
|
||
|
|
ext = cir1.extrude(FreeCAD.Vector(0, 170, 0))
|
||
|
|
cir2 = Part.Circle(FreeCAD.Vector(0, -30, 0), FreeCAD.Vector(0, 1, 0), obj.Diameter.Value/2).toShape()
|
||
|
|
loft = Part.makeLoft([cir2, w], True)
|
||
|
|
ext = ext.fuse([loft, pro])
|
||
|
|
Part.show(ext)
|
||
|
|
|
||
|
|
|
||
|
|
def getProfile(self, obj):
|
||
|
|
import Part
|
||
|
|
sin45 = 0.707106781
|
||
|
|
radio = obj.Diameter.Value / 2
|
||
|
|
taph = 20
|
||
|
|
tapw = radio + 2
|
||
|
|
chamfer = 5
|
||
|
|
chamfer2 = chamfer * sin45
|
||
|
|
|
||
|
|
edge1 = Part.makeLine(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(radio, 0, 0))
|
||
|
|
edge2 = Part.makeLine(FreeCAD.Vector(radio, 0, 0), FreeCAD.Vector(radio, 0, obj.Length.Value - taph))
|
||
|
|
edge3 = Part.makeLine(FreeCAD.Vector(radio, 0, obj.Length.Value - taph),
|
||
|
|
FreeCAD.Vector(tapw, 0, obj.Length.Value - taph))
|
||
|
|
edge4 = Part.makeLine(FreeCAD.Vector(tapw, 0, obj.Length.Value - taph),
|
||
|
|
FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer))
|
||
|
|
if True:
|
||
|
|
edge5 = Part.makeLine(FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer),
|
||
|
|
FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value))
|
||
|
|
else:
|
||
|
|
edge5 = Part.Arc(FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer),
|
||
|
|
FreeCAD.Vector(tapw - chamfer2, 0, obj.Length.Value - chamfer2),
|
||
|
|
FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value)
|
||
|
|
).toShape()
|
||
|
|
edge6 = Part.makeLine(FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value),
|
||
|
|
FreeCAD.Vector(0, 0, obj.Length.Value))
|
||
|
|
w = Part.Wire([edge1, edge2, edge3, edge4, edge5, edge6])
|
||
|
|
|
||
|
|
return w
|
||
|
|
|
||
|
|
|
||
|
|
class _FenceReinforcePost(ArchComponent.Component):
|
||
|
|
def __init__(self, obj):
|
||
|
|
ArchComponent.Component.__init__(self, obj)
|
||
|
|
self.setProperties(obj)
|
||
|
|
obj.IfcType = "Pipe Segment"
|
||
|
|
self.Type = "FencePost"
|
||
|
|
|
||
|
|
def setProperties(self, obj):
|
||
|
|
|
||
|
|
pl = obj.PropertiesList
|
||
|
|
if not "Diameter" in pl:
|
||
|
|
obj.addProperty("App::PropertyLength", "Diameter", "Pipe",
|
||
|
|
QT_TRANSLATE_NOOP("App::Property", "The diameter of this pipe, if not based on a profile")
|
||
|
|
).Diameter = 48
|
||
|
|
if not "Length" in pl:
|
||
|
|
obj.addProperty("App::PropertyLength", "Length", "Pipe",
|
||
|
|
QT_TRANSLATE_NOOP("App::Property", "The length of this pipe, if not based on an edge")
|
||
|
|
).Length = 3000
|
||
|
|
self.Type = "Pipe"
|
||
|
|
|
||
|
|
def onDocumentRestored(self, obj):
|
||
|
|
|
||
|
|
ArchComponent.Component.onDocumentRestored(self, obj)
|
||
|
|
self.setProperties(obj)
|
||
|
|
|
||
|
|
def execute(self, obj):
|
||
|
|
|
||
|
|
pl = obj.Placement
|
||
|
|
w = self.getWire(obj)
|
||
|
|
|
||
|
|
try:
|
||
|
|
# sh = w.makePipeShell([p], True, False, 2)
|
||
|
|
sh = w.revolve(FreeCAD.Vector(0.0, 0.0, 0.0), FreeCAD.Vector(0.0, 0.0, 1.0), 360)
|
||
|
|
except:
|
||
|
|
FreeCAD.Console.PrintError(translate("Arch", "Unable to build the pipe") + "\n")
|
||
|
|
else:
|
||
|
|
obj.Shape = sh
|
||
|
|
obj.Placement = pl
|
||
|
|
|
||
|
|
def getWire(self, obj):
|
||
|
|
|
||
|
|
import Part
|
||
|
|
sin45 = 0.707106781
|
||
|
|
radio = obj.Diameter.Value / 2
|
||
|
|
taph = 20
|
||
|
|
tapw = radio + 2
|
||
|
|
chamfer = 5
|
||
|
|
chamfer2 = chamfer * sin45
|
||
|
|
|
||
|
|
edge1 = Part.makeLine(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(radio, 0, 0))
|
||
|
|
edge2 = Part.makeLine(FreeCAD.Vector(radio, 0, 0), FreeCAD.Vector(radio, 0, obj.Length.Value - taph))
|
||
|
|
edge3 = Part.makeLine(FreeCAD.Vector(radio, 0, obj.Length.Value - taph),
|
||
|
|
FreeCAD.Vector(tapw, 0, obj.Length.Value - taph))
|
||
|
|
edge4 = Part.makeLine(FreeCAD.Vector(tapw, 0, obj.Length.Value - taph),
|
||
|
|
FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer))
|
||
|
|
|
||
|
|
if True:
|
||
|
|
edge5 = Part.makeLine(FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer),
|
||
|
|
FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value))
|
||
|
|
else:
|
||
|
|
edge5 = Part.Arc(FreeCAD.Vector(tapw, 0, obj.Length.Value - chamfer),
|
||
|
|
FreeCAD.Vector(tapw - chamfer2, 0, obj.Length.Value - chamfer2),
|
||
|
|
FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value)
|
||
|
|
).toShape()
|
||
|
|
edge6 = Part.makeLine(FreeCAD.Vector(tapw - chamfer, 0, obj.Length.Value),
|
||
|
|
FreeCAD.Vector(0, 0, obj.Length.Value))
|
||
|
|
w = Part.Wire([edge1, edge2, edge3, edge4, edge5, edge6])
|
||
|
|
|
||
|
|
return w
|
||
|
|
|
||
|
|
|
||
|
|
class _ViewProviderFencePost(ArchComponent.ViewProviderComponent):
|
||
|
|
"A View Provider for the Pipe object"
|
||
|
|
|
||
|
|
def __init__(self, vobj):
|
||
|
|
ArchComponent.ViewProviderComponent.__init__(self, vobj)
|
||
|
|
|
||
|
|
def getIcon(self):
|
||
|
|
return ":/icons/Arch_Pipe_Tree.svg"
|
||
|
|
|
||
|
|
|
||
|
|
class _CommandFencePost:
|
||
|
|
"the Arch Pipe command definition"
|
||
|
|
|
||
|
|
def GetResources(self):
|
||
|
|
|
||
|
|
return {'Pixmap': 'Arch_Pipe',
|
||
|
|
'MenuText': QT_TRANSLATE_NOOP("Arch_Pipe", "Pipe"),
|
||
|
|
'Accel': "P, I",
|
||
|
|
'ToolTip': QT_TRANSLATE_NOOP("Arch_Pipe", "Creates a pipe object from a given Wire or Line")}
|
||
|
|
|
||
|
|
def IsActive(self):
|
||
|
|
|
||
|
|
return not FreeCAD.ActiveDocument is None
|
||
|
|
|
||
|
|
def Activated(self):
|
||
|
|
if True:
|
||
|
|
makeFencePost()
|
||
|
|
else:
|
||
|
|
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Pipe"))
|
||
|
|
FreeCADGui.addModule("Arch")
|
||
|
|
FreeCADGui.doCommand("obj = Arch.makePipe()")
|
||
|
|
FreeCADGui.addModule("Draft")
|
||
|
|
FreeCADGui.doCommand("Draft.autogroup(obj)")
|
||
|
|
FreeCAD.ActiveDocument.commitTransaction()
|
||
|
|
FreeCAD.ActiveDocument.recompute()
|
||
|
|
|
||
|
|
|
||
|
|
if FreeCAD.GuiUp:
|
||
|
|
FreeCADGui.addCommand('FencePost', _CommandFencePost())
|