24 __title__ =
"HelicalRebar" 25 __author__ =
"Amritpal Singh" 26 __url__ =
"https://www.freecadweb.org" 28 from PySide
import QtCore, QtGui
29 from Rebarfunc
import *
30 from PySide.QtCore
import QT_TRANSLATE_NOOP
31 from PopUpImage
import showPopUpImageDialog
40 """ getpointsOfHelicalRebar(FacePRM, s_cover, b_cover, t_cover): 41 Return points of the LShape rebar in the form of array for sketch.""" 42 dx = s_cover + diameter / 2
43 dz = float(pitch) / edges
45 R = FacePRM[0][0] / 2 - s_cover
47 if direction[2]
in {-1,1}:
51 zz = FacePRM[1][2] - t_cover
52 elif direction[2] == -1:
53 zz = FacePRM[1][2] + b_cover
56 while (round(z) < abs(size - b_cover - t_cover)):
57 for i
in range(0, int(edges) + 1):
63 iAngle = i * 360 / edges
64 x = FacePRM[1][0] + R * math.cos(math.radians(iAngle))
65 y = FacePRM[1][1] + R * math.sin(math.radians(iAngle))
66 points.append(FreeCAD.Vector(x, y, zz))
70 elif direction[2] == -1:
75 def createHelicalWire(FacePRM, s_cover, b_cover, t_cover, pitch, size, direction, helix = None):
76 """ createHelicalWire(FacePRM, SideCover, BottomCover, TopCover, Pitch, Size, Direction, Helix = None): 77 It creates a helical wire.""" 80 helix = FreeCAD.ActiveDocument.addObject(
"Part::Helix",
"Helix")
82 helix.Radius = FacePRM[0][0] / 2 - s_cover
85 helix.Height = size - b_cover - t_cover
86 if round(direction.x) == 1:
87 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0] - b_cover, FacePRM[1][1], FacePRM[1][2])
88 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, -1, 0), 90)
89 elif round(direction.x) == -1:
90 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0] + t_cover, FacePRM[1][1], FacePRM[1][2])
91 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, -1, 0), -90)
92 elif round(direction.y) == 1:
93 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0], FacePRM[1][1] - b_cover, FacePRM[1][2])
94 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(1, 0, 0), 90)
95 elif round(direction.y) == -1:
96 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0], FacePRM[1][1] + t_cover, FacePRM[1][2])
97 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(-1, 0, 0), 90)
98 elif round(direction.z) == 1:
99 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0], FacePRM[1][1], FacePRM[1][2] - size + b_cover)
100 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), 0)
101 elif round(direction.z) == -1:
102 helix.Placement.Base = FreeCAD.Vector(FacePRM[1][0], FacePRM[1][1], FacePRM[1][2] + b_cover)
103 helix.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, -1), 0)
104 FreeCAD.ActiveDocument.recompute()
109 self.
form = FreeCADGui.PySideUic.loadUi(os.path.splitext(__file__)[0] +
".ui")
110 self.form.setWindowTitle(QtGui.QApplication.translate(
"Arch",
"Helical Rebar",
None))
115 if not round(normal.z)
in {1, -1}:
116 self.form.topCoverLabel.setText(
translate(
"RebarAddon",
"Left Cover"))
117 self.form.bottomCoverLabel.setText(
translate(
"RebarAddon",
"Right Cover"))
119 self.form.image.setPixmap(QtGui.QPixmap(os.path.split(os.path.abspath(__file__))[0] +
"/icons/HelicalRebar.svg"))
120 self.form.toolButton.clicked.connect(
lambda:
showPopUpImageDialog(os.path.split(os.path.abspath(__file__))[0] +
"/icons/HelicalRebarDetailed.svg"))
121 self.form.toolButton.setIcon(self.form.toolButton.style().standardIcon(QtGui.QStyle.SP_DialogHelpButton))
127 return int(QtGui.QDialogButtonBox.Ok) | int(QtGui.QDialogButtonBox.Apply) | int(QtGui.QDialogButtonBox.Cancel)
130 if button == int(QtGui.QDialogButtonBox.Apply):
136 if not round(normal.z)
in {1, -1}:
137 self.form.topCoverLabel.setText(
translate(
"RebarAddon",
"Left Cover"))
138 self.form.bottomCoverLabel.setText(
translate(
"RebarAddon",
"Right Cover"))
140 self.form.topCoverLabel.setText(
translate(
"RebarAddon",
"Top Cover"))
141 self.form.bottomCoverLabel.setText(
translate(
"RebarAddon",
"Bottom Cover"))
145 b_cover = self.form.bottomCover.text()
146 b_cover = FreeCAD.Units.Quantity(b_cover).Value
147 s_cover = self.form.sideCover.text()
148 s_cover = FreeCAD.Units.Quantity(s_cover).Value
149 t_cover = self.form.topCover.text()
150 t_cover = FreeCAD.Units.Quantity(t_cover).Value
151 pitch = self.form.pitch.text()
152 pitch = FreeCAD.Units.Quantity(pitch).Value
153 diameter = self.form.diameter.text()
154 diameter = FreeCAD.Units.Quantity(diameter).Value
160 if signal == int(QtGui.QDialogButtonBox.Apply):
163 FreeCADGui.Control.closeDialog(self)
165 def makeHelicalRebar(s_cover, b_cover, diameter, t_cover, pitch, structure = None, facename = None):
166 """ makeHelicalRebar(SideCover, BottomCover, Diameter, TopCover, Pitch, Structure, Facename): 167 Adds the Helical reinforcement bar to the selected structural object.""" 168 if not structure
and not facename:
169 selected_obj = FreeCADGui.Selection.getSelectionEx()[0]
170 structure = selected_obj.Object
171 facename = selected_obj.SubElementNames[0]
176 FreeCAD.Console.PrintError(
"Cannot identified shape or from which base object sturctural element is derived\n")
178 size = (ArchCommands.projectToVector(structure.Shape.copy(), face.normalAt(0, 0))).Length
179 normal = face.normalAt(0,0)
182 helix =
createHelicalWire(FacePRM, s_cover, b_cover, t_cover, pitch, size, normal)
183 helix.Support = [(structure, facename)]
184 rebar = Arch.makeRebar(structure, helix, diameter, 1, 0)
185 rebar.OffsetStart = 0
187 FreeCAD.ActiveDocument.recompute()
189 rebar.ViewObject.addProperty(
"App::PropertyString",
"RebarShape",
"RebarDialog", QT_TRANSLATE_NOOP(
"App::Property",
"Shape of rebar")).RebarShape =
"HelicalRebar" 190 rebar.ViewObject.setEditorMode(
"RebarShape", 2)
191 rebar.addProperty(
"App::PropertyDistance",
"SideCover",
"RebarDialog", QT_TRANSLATE_NOOP(
"App::Property",
"Front cover of rebar")).SideCover = s_cover
192 rebar.setEditorMode(
"SideCover", 2)
193 rebar.addProperty(
"App::PropertyDistance",
"Pitch",
"RebarDialog", QT_TRANSLATE_NOOP(
"App::Property",
"Left Side cover of rebar")).Pitch = pitch
194 rebar.setEditorMode(
"Pitch", 2)
195 rebar.addProperty(
"App::PropertyDistance",
"BottomCover",
"RebarDialog", QT_TRANSLATE_NOOP(
"App::Property",
"Bottom cover of rebar")).BottomCover = b_cover
196 rebar.setEditorMode(
"BottomCover", 2)
197 rebar.addProperty(
"App::PropertyDistance",
"TopCover",
"RebarDialog", QT_TRANSLATE_NOOP(
"App::Property",
"Top cover of rebar")).TopCover = t_cover
198 rebar.setEditorMode(
"TopCover", 2)
199 rebar.Label =
"HelicalRebar" 200 FreeCAD.ActiveDocument.recompute()
203 def editHelicalRebar(Rebar, s_cover, b_cover, diameter, t_cover, pitch, structure = None, facename = None):
205 if structure
and facename:
206 sketch.Support = [(structure, facename)]
208 if not sketch.Support:
209 showWarning(
"You have checked remove external geometry of base sketchs when needed.\nTo unchecked Edit->Preferences->Arch.")
212 facename = sketch.Support[0][1][0]
213 structure = sketch.Support[0][0]
218 size = (ArchCommands.projectToVector(structure.Shape.copy(), face.normalAt(0, 0))).Length
219 normal = face.normalAt(0,0)
221 helix =
createHelicalWire(FacePRM, s_cover, b_cover, t_cover, pitch, size, normal, Rebar.Base)
222 FreeCAD.ActiveDocument.recompute()
223 Rebar.Diameter = diameter
224 Rebar.SideCover = s_cover
225 Rebar.BottomCover = b_cover
226 Rebar.TopCover = t_cover
228 FreeCAD.ActiveDocument.recompute()
232 FreeCADGui.Control.closeDialog()
234 obj.form.sideCover.setText(str(vobj.Object.SideCover))
235 obj.form.bottomCover.setText(str(vobj.Object.BottomCover))
236 obj.form.diameter.setText(str(vobj.Object.Diameter))
237 obj.form.topCover.setText(str(vobj.Object.TopCover))
238 obj.form.pitch.setText(str(vobj.Object.Pitch))
239 FreeCADGui.Control.showDialog(obj)
def clicked(self, button)
def check_selected_face()
def getSelectedFace(self)
def CommandHelicalRebar()
def accept(self, signal=None)
def __init__(self, Rebar=None)
def editHelicalRebar(Rebar, s_cover, b_cover, diameter, t_cover, pitch, structure=None, facename=None)
def translate(context, text, disambig=None)
def getParametersOfFace(structure, facename, sketch=True)
def facenormalDirection(structure=None, facename=None)
def makeHelicalRebar(s_cover, b_cover, diameter, t_cover, pitch, structure=None, facename=None)
def getStandardButtons(self)
def getpointsOfHelicalRebar(FacePRM, s_cover, b_cover, t_cover, pitch, edges, diameter, size, direction)
def createHelicalWire(FacePRM, s_cover, b_cover, t_cover, pitch, size, direction, helix=None)