Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
seperated code and implement editDialog
  • Loading branch information
amrit3701 committed Jun 16, 2017
1 parent 1c2b0c2 commit 7efc536
Show file tree
Hide file tree
Showing 2 changed files with 207 additions and 116 deletions.
134 changes: 134 additions & 0 deletions Rebarfunc.py
@@ -0,0 +1,134 @@
from PySide import QtCore, QtGui
import FreeCADGui, FreeCAD

def check_selected_face():
""" check_selected_face(): This function checks whether user have selected
any face or not."""
selected_objs = FreeCADGui.Selection.getSelectionEx()
if not selected_objs:
showWarning("Select any face of the structural element.")
selected_obj = None
else:
selected_face_names = selected_objs[0].SubElementNames
if not selected_face_names:
selected_obj = None
showWarning("Select any face of the structural element.")
elif "Face" in selected_face_names[0]:
if len(selected_face_names) > 1:
showWarning("You have selected more than one face of the structural element.")
selected_obj = None
elif len(selected_face_names) == 1:
selected_obj = selected_objs[0]
else:
showWarning("Select any face of the selected the face.")
selected_obj = None
return selected_obj

def vec(edge):
""" vec(edge) or vec(line): returns a vector from an edge or a Part.line."""
# if edge is not straight, you'll get strange results!
import Part
if isinstance(edge,Part.Shape):
return edge.Vertexes[-1].Point.sub(edge.Vertexes[0].Point)
elif isinstance(edge,Part.Line):
return edge.EndPoint.sub(edge.StartPoint)
else:
return None

def getEdgesAngle(edge1, edge2):
""" getEdgesAngle(edge1, edge2): returns a angle between two edges."""
vec1 = vec(edge1)
vec2 = vec(edge2)
angle = vec1.getAngle(vec2)
import math
angle = math.degrees(angle)
return angle

def checkRectangle(edges):
""" checkRectangle(edges=[]): This function checks whether the given form rectangle
or not. It will return True when edges form rectangular shape or return False
when edges not form a rectangular."""
angles = [round(getEdgesAngle(edges[0], edges[1])), round(getEdgesAngle(edges[0], edges[2])),
round(getEdgesAngle(edges[0], edges[3]))]
if angles.count(90) == 2 and (angles.count(180) == 1 or angles.count(0) == 1):
return True
else:
return False

def getBaseStructuralObject(obj):
""" getBaseStructuralObject(obj): This function will return last base
structural object."""
if hasattr(obj, "Base"):
return obj
else:
return getBaseStructuralObject(obj.Base)


def getBaseObject(obj):
""" getBaseObject(obj): This function will return last base object."""
if hasattr(obj, "Base"):
return getBaseObject(obj.Base)
else:
return obj

def getTrueParametersOfStructure(obj):
baseObject = getBaseObject(obj)
# If selected_obj is not derived from any base object
if baseObject:
# If selected_obj is derived from SketchObject
#if selected_obj.Object.Base.isDerivedFrom("Sketcher::SketchObject"):
if baseObject.isDerivedFrom("Sketcher::SketchObject"):
edges = baseObject.Shape.Edges
if checkRectangle(edges):
for edge in edges:
# Representation vector of edge
rep_vector = edge.Vertexes[1].Point.sub(edge.Vertexes[0].Point)
rep_vector_angle = round(math.degrees(rep_vector.getAngle(FreeCAD.Vector(1,0,0))))
if rep_vector_angle in {0, 180}:
length = edge.Length
else:
width = edge.Length
else:
FreeCAD.Console.PrintError("Cannot identified from which base object sturctural element is derived\n")
return
else:
structuralBaseObject = getBaseStructuralObject(obj)
length = structuralBaseObject.Length.Value
width = structuralBaseObject.Width.Value
height = obj.Height.Value
return [length, width, height]

def getParametersOfFace(obj, selected_face):
StructurePRM = getTrueParametersOfStructure(obj)
normal = selected_face.normalAt(0,0)
normal = selected_face.Placement.Rotation.inverted().multVec(normal)
center_of_mass = selected_face.CenterOfMass
center_of_mass = center_of_mass.sub(getBaseStructuralObject(obj).Placement.Base)
# Set length and width of user selected face of structural element
flag = True
for i in range(len(normal)):
if round(normal[i]) == 0:
if flag and i == 0:
x = center_of_mass[i]
facelength = StructurePRM[0]
flag = False
elif flag and i == 1:
x = center_of_mass[i]
facelength = StructurePRM[1]
flag = False
if i == 1:
y = center_of_mass[i]
facewidth = StructurePRM[1]
elif i == 2:
y = center_of_mass[i]
facewidth = StructurePRM[2]
return [(facelength, facewidth), (x, y)]

def showWarning(message):
""" showWarning(message): This function is used to produce warning
message for the user."""
msg = QtGui.QMessageBox()
msg.setIcon(QtGui.QMessageBox.Warning)
msg.setText(message)
msg.setStandardButtons(QtGui.QMessageBox.Ok)
msg.exec_()
189 changes: 73 additions & 116 deletions StraightRebar.py
@@ -1,14 +1,16 @@
from PySide import QtCore, QtGui
import FreeCAD, FreeCADGui, os
from Rebarfunc import *
import FreeCAD, FreeCADGui, os, sys
import math

class _StraightRebarTaskPanel:
def __init__(self):
def __init__(self, Rebar = None):
self.form = FreeCADGui.PySideUic.loadUi(os.path.splitext(__file__)[0]+".ui")
self.form.amount_radio.clicked.connect(self.amount_radio_clicked)
self.form.spacing_radio.clicked.connect(self.spacing_radio_clicked)
QtCore.QObject.connect(self.form.submit, QtCore.SIGNAL("clicked()"), self.accept)
self.form.image.setPixmap(QtGui.QPixmap(os.path.split(os.path.abspath(__file__))[0]+"/icons/FrontFaceStraightRebar.svg"))
self.Rebar = Rebar

def getStandardButtons(self):
return int(QtGui.QDialogButtonBox.Close)
Expand All @@ -24,13 +26,22 @@ def accept(self):
diameter = FreeCAD.Units.Quantity(diameter).Value
amount_check = self.form.amount_radio.isChecked()
spacing_check = self.form.spacing_radio.isChecked()
if amount_check == True:
amount = self.form.amount.value()
makeStraightRebar(f_cover, b_cover, s_cover, diameter, True, amount)
elif spacing_check == True:
spacing = self.form.spacing.text()
spacing = FreeCAD.Units.Quantity(spacing).Value
makeStraightRebar(f_cover, b_cover, s_cover, diameter, False, spacing)
if not self.Rebar:
if amount_check == True:
amount = self.form.amount.value()
makeStraightRebar(f_cover, b_cover, s_cover, diameter, True, amount)
elif spacing_check == True:
spacing = self.form.spacing.text()
spacing = FreeCAD.Units.Quantity(spacing).Value
makeStraightRebar(f_cover, b_cover, s_cover, diameter, False, spacing)
else:
if amount_check == True:
amount = self.form.amount.value()
editStraightRebar(self.Rebar, f_cover, b_cover, s_cover, diameter, True, amount)
elif spacing_check == True:
spacing = self.form.spacing.text()
spacing = FreeCAD.Units.Quantity(spacing).Value
editStraightRebar(self.Rebar, f_cover, b_cover, s_cover, diameter, False, spacing)
FreeCAD.Console.PrintMessage("Done!\n")
FreeCADGui.Control.closeDialog(self)

Expand All @@ -47,125 +58,71 @@ def makeStraightRebar(f_cover, b_cover, s_cover, diameter, amount_spacing_check,
"""makeStraightRebar(f_cover, b_cover, s_cover, diameter, amount_spacing_check, amount_spacing_value):
Adds the straight reinforcement bar to the selected structural object"""
selected_obj = FreeCADGui.Selection.getSelectionEx()[0]
selected_face = selected_obj.SubObjects[0]
normal = selected_face.normalAt(0,0)
normal = selected_face.Placement.Rotation.inverted().multVec(normal)
center_of_mass = selected_face.CenterOfMass
# If selected_obj is not derived from any base object
if selected_obj.Object.Base == None:
length = selected_obj.Object.Length.Value
width = selected_obj.Object.Width.Value
# If selected_obj is derived from SketchObject
elif selected_obj.Object.Base.isDerivedFrom("Sketcher::SketchObject"):
edges = selected_obj.Object.Shape.Edges
if checkRectangle(edges):
for edge in edges:
# Representation vector of edge
rep_vector = edge.Vertexes[1].Point.sub(edge.Vertexes[0].Point)
rep_vector_angle = round(math.degrees(rep_vector.getAngle(FreeCAD.Vector(1,0,0))))
if rep_vector_angle in {0, 180}:
length = edge.Length
else:
width = edge.Length
else:
FreeCAD.Console.PrintError("Cannot identified from which base object sturctural element is derived\n")
return
height = selected_obj.Object.Height.Value
# Set length and width of user selected face of structural element
flag = True
for i in range(len(normal)):
if round(normal[i]) == 0:
if flag and i == 0:
x = center_of_mass[i]
facelength = length
flag = False
elif flag and i == 1:
x = center_of_mass[i]
facelength = width
flag = False
if i == 1:
y = center_of_mass[i]
facewidth = width
elif i == 2:
y = center_of_mass[i]
facewidth = height
FacePRM = getParametersOfFace(selected_obj.Object, selected_obj.SubObjects[0])
# Calculate the start and end points for staight line (x1, y2) and (x2, y2)
x1 = FacePRM[1][0] - FacePRM[0][0]/2 + s_cover
y1 = FacePRM[1][1] - FacePRM[0][1]/2 + b_cover
x2 = FacePRM[1][0] - FacePRM[0][0]/2 + FacePRM[0][0] - s_cover
y2 = FacePRM[1][1] - FacePRM[0][1]/2 + b_cover
import Part, Arch
sketch = FreeCAD.activeDocument().addObject('Sketcher::SketchObject','Sketch')
sketch.MapMode = "FlatFace"
# Calculate the start and end points for staight line (x1, y2) and (x2, y2)
x1 = x - facelength/2 + s_cover
y1 = y - facewidth/2 + b_cover
x2 = x - facelength/2 + facelength - s_cover
y2 = y - facewidth/2 + b_cover
sketch.Support = [(selected_obj.Object, selected_obj.SubElementNames[0])]
import Part, Arch
sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(x1, y1, 0), FreeCAD.Vector(x2, y2, 0)), False)
if amount_spacing_check == True:
structure = Arch.makeRebar(selected_obj.Object, sketch, diameter, amount_spacing_value, f_cover)
rebar = Arch.makeRebar(selected_obj.Object, sketch, diameter, amount_spacing_value, f_cover)
FreeCAD.ActiveDocument.recompute()
else:
structure = Arch.makeRebar(selected_obj.Object, sketch, diameter, int((width-diameter)/amount_spacing_value), f_cover)
FreeCADGui.ActiveDocument.getObject(structure.Label).RebarShape = "StraightRebar"
FreeCAD.ActiveDocument.recompute()

def check_selected_face():
selected_objs = FreeCADGui.Selection.getSelectionEx()
if not selected_objs:
showWarning("Select any face of the structural element.")
selected_obj = None
rebar = Arch.makeRebar(selected_obj.Object, sketch, diameter, int((width-diameter)/amount_spacing_value), f_cover)
rebar.ViewObject.Proxy.setpropertyRebarShape(rebar.ViewObject, "StraightRebar")
rebar.ViewObject.FrontCover = f_cover
rebar.ViewObject.SideCover = s_cover
rebar.ViewObject.BottomCover = b_cover
if amount_spacing_check:
rebar.ViewObject.AmountCheck = True
else:
selected_face_names = selected_objs[0].SubElementNames
if not selected_face_names:
selected_obj = None
showWarning("Select any face of the structural element.")
elif "Face" in selected_face_names[0]:
if len(selected_face_names) > 1:
showWarning("You have selected more than one face of the structural element.")
selected_obj = None
elif len(selected_face_names) == 1:
selected_obj = selected_objs[0]
else:
showWarning("Select any face of the selected the face.")
selected_obj = None
return selected_obj
rebar.ViewObject.AmountCheck = False
FreeCAD.ActiveDocument.recompute()

def vec(edge):
""" vec(edge) or vec(line): returns a vector from an edge or a Part.line."""
# if edge is not straight, you'll get strange results!
import Part
if isinstance(edge,Part.Shape):
return edge.Vertexes[-1].Point.sub(edge.Vertexes[0].Point)
elif isinstance(edge,Part.Line):
return edge.EndPoint.sub(edge.StartPoint)
def editStraightRebar(Rebar, f_cover, b_cover, s_cover, diameter, amount_spacing_check, amount_spacing_value):
sketch = Rebar.Base
facename = sketch.Support[0][1][0]
structure = sketch.Support[0][0]
face = structure.Shape.Faces[int(facename[-1])-1]
FacePRM = getParametersOfFace(structure, face)
# Calculate the start and end points for staight line (x1, y2) and (x2, y2)
x1 = FacePRM[1][0] - FacePRM[0][0]/2 + s_cover
y1 = FacePRM[1][1] - FacePRM[0][1]/2 + b_cover
x2 = FacePRM[1][0] - FacePRM[0][0]/2 + FacePRM[0][0] - s_cover
y2 = FacePRM[1][1] - FacePRM[0][1]/2 + b_cover
FreeCAD.Console.PrintMessage(str(x1)+" "+str(y1)+" "+str(x2)+" "+str(y2)+"Done!\n")
sketch.movePoint(0,1,FreeCAD.Vector(x1,y1,0),0)
sketch.movePoint(0,2,FreeCAD.Vector(x2,y2,0),0)
if amount_spacing_check == True:
Rebar.Amount = amount_spacing_value
else:
return None

def EdgesAngle(edge1, edge2):
""" EdgesAngle(edge1, edge2): returns a angle between two edges."""
vec1 = vec(edge1)
vec2 = vec(edge2)
angle = vec1.getAngle(vec2)
import math
angle = math.degrees(angle)
return angle

def checkRectangle(edges):
""" checkRectangle(edges=[]): This function checks whether the given form rectangle
or not. It will return True when edges form rectangular shape or return False
when edges not form a rectangular."""
angles = [round(EdgesAngle(edges[0], edges[1])), round(EdgesAngle(edges[0], edges[2])),
round(EdgesAngle(edges[0], edges[3]))]
if angles.count(90) == 2 and (angles.count(180) == 1 or angles.count(0) == 1):
return True
Rebar.Amount = int((width-diameter)/amount_spacing_value)
Rebar.ViewObject.FrontCover = f_cover
Rebar.ViewObject.SideCover = s_cover
Rebar.ViewObject.BottomCover = b_cover
if amount_spacing_check:
Rebar.ViewObject.AmountCheck = True
else:
return False
Rebar.ViewObject.AmountCheck = False
FreeCAD.ActiveDocument.recompute()

def showWarning(message):
msg = QtGui.QMessageBox()
msg.setIcon(QtGui.QMessageBox.Warning)
msg.setText(message)
msg.setStandardButtons(QtGui.QMessageBox.Ok)
msg.exec_()
def editDialog(vobj):
FreeCADGui.Control.closeDialog()
obj = _StraightRebarTaskPanel(vobj.Object)
obj.form.frontCover.setText(str(vobj.FrontCover))
obj.form.sideCover.setText(str(vobj.SideCover))
obj.form.bottomCover.setText(str(vobj.BottomCover))
obj.form.diameter.setText(str(vobj.Object.Diameter))
obj.form.amount.setValue(vobj.Object.Amount)
FreeCADGui.Control.showDialog(obj)

if FreeCAD.GuiUp:
selected_obj = check_selected_face()
#selected_obj = check_selected_face()
selected_obj = FreeCADGui.Selection.getSelectionEx()[0]
if selected_obj:
FreeCADGui.Control.showDialog(_StraightRebarTaskPanel())

0 comments on commit 7efc536

Please sign in to comment.