summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Connections/Shear/Finplate/drawing_2D.py160
-rw-r--r--Connections/Shear/Finplate/finPlateMain.py56
-rw-r--r--Connections/Shear/Finplate/osdag_gui.py1284
-rw-r--r--finfront.svg2
-rw-r--r--saveINPUT.txt18
5 files changed, 1510 insertions, 10 deletions
diff --git a/Connections/Shear/Finplate/drawing_2D.py b/Connections/Shear/Finplate/drawing_2D.py
new file mode 100644
index 0000000..0b1ee80
--- /dev/null
+++ b/Connections/Shear/Finplate/drawing_2D.py
@@ -0,0 +1,160 @@
+'''
+Created on 24-Aug-2015
+
+@author: deepa
+'''
+import svgwrite
+from svgwrite import mm
+from PyQt4.QtCore import QString
+import numpy as np
+
+class Fin2DCreatorFront(object):
+
+ def __init__(self, inputObj,ouputObj,dictBeamdata,dictColumndata):
+
+ beam_T = float(dictBeamdata[QString("T")])
+ D = int (dictBeamdata[QString("D")])
+ col_B = int(dictColumndata[QString("B")])
+ col_tw = float(dictColumndata[QString("tw")])
+ col_R1 = float(dictColumndata[QString("R1")])
+ plate_ht= ouputObj['Plate']['height']
+ plate_width = ouputObj['Plate']['width']
+ weld_len = ouputObj['Plate']['height']
+ weld_thick = ouputObj['Weld']['thickness']
+ self.bolt_dia = inputObj["Bolt"]["Diameter (mm)"]
+ self.pitch = ouputObj['Bolt']["pitch"]
+ self.gauge = ouputObj['Bolt']["gauge"]
+ self.end_dist = ouputObj['Bolt']["enddist"]
+ self.edge_dist = ouputObj['Bolt']["edge"]
+ self.no_of_rows = ouputObj['Bolt']["numofrow"]
+ self.no_of_col = ouputObj['Bolt']["numofcol"]
+ self.col_L = 1000
+ self.beam_L = 500
+
+
+ self.A2 =(col_B,(self.col_L-D)/2)
+ self.B = (col_B,0)
+ self.A = (0,0)
+ self.D = (0,self.col_L)
+ self.C = (col_B,self.col_L)
+ self.B2 = (col_B,(D + self.col_L)/2)
+
+ ptEx = (col_B-col_tw)/2
+ ptEy = 0.0
+ self.E = (ptEx,ptEy)
+ ptHx = (col_B-col_tw)/2
+ ptHy = self.col_L
+ self.H = (ptHx,ptHy)
+ ptFx = (col_B + col_tw)/2
+ ptFy = 0
+ self.F = (ptFx,ptFy)
+ ptGx = (col_B + col_tw)/2
+ ptGy = self.col_L
+ self.G = (ptGx,ptGy)
+
+ #Draw rectangle for finPlate PRSU
+ ptPx = (col_B + col_tw)/2
+ ptPy = ((self.col_L - D)/2) + (beam_T + col_R1 + 3)
+ self.P = (ptPx,ptPy)
+ self.ptP = np.array([ptPx,ptPy])
+
+ self.plate_ht = plate_ht
+ self.plate_width = plate_width
+ self.weld_thick = weld_thick
+ self.weld_len = weld_len
+ # Draw Rectangle for weld
+ ptCx1 = ((col_B + col_tw)/2 + 20)
+ ptCy1 = ((self.col_L - D)/2) + (beam_T + col_R1 + 3)
+ self.C1 =(ptCx1,ptCy1)
+
+ ptAx1 = ptCx1
+ ptAy1 = ((self.col_L - D)/2)
+ self.A1 = (ptAx1,ptAy1)
+
+ ptAx3 = ptCx1 + self.beam_L
+ ptAy3 = ptAy1
+ self.A3 = (ptAx3,ptAy3)
+
+ ptBx3 = ptAx3
+ ptBy3 = ((self.col_L + D)/2 )
+ self.B3 = (ptBx3,ptBy3)
+
+ ptBx1 = ptCx1
+ ptBy1 = ptBy3
+ self.B1 = (ptBx1,ptBy1)
+
+ ptC2x= ptCx1
+ ptC2y = ptCy1 + plate_ht
+ self.C2 = (ptC2x,ptC2y)
+
+ ptAx5 = ptAx1
+ ptAy5 = ptAy1 + beam_T
+ self.A5 = ptAx5,ptAy5
+
+ ptAx4 = ptAx3
+ ptAy4 = ptAy3 + beam_T
+ self.A4 = (ptAx4,ptAy4)
+
+ ptBx4 = ptBx3
+ ptBy4 = ptBy3 - beam_T
+ self.B4 = (ptBx4,ptBy4)
+
+ ptBx5 = ((col_B + col_tw)/2) + 20
+ ptBy5 = ptBy3 - beam_T
+ self.B5 = (ptBx5,ptBy5)
+
+ ptP1x = ((col_B + col_tw)/2 + self.edge_dist)
+ ptP1y = ((self.col_L - D)/2 +(col_tw + col_R1 + 3)+ self.end_dist)
+ self.P1 = (ptP1x,ptP1y)
+
+ ptP2x = ptP1x
+ ptP2y = ptP1y + self.pitch
+ self.P2 = (ptP1x,ptP1y)
+
+ ptP3x = ptP1x
+ ptP3y = ptP2y + self.pitch
+ self.P3 = (ptP1x,ptP1y)
+ # points for diamension
+
+
+ def saveToSvg(self):
+ dwg = svgwrite.Drawing('finfront.svg', profile='tiny')
+ dwg.add(dwg.polyline(points=[(self.A2),(self.B),(self.A),(self.D),(self.C) ,(self.B2)], stroke='blue', fill='none', stroke_width=2.5))
+ dwg.add(dwg.line((self.E),(self.H)).stroke('blue',width = 2.5,linecap = 'square'))
+ dwg.add(dwg.line((self.F),(self.G)).stroke('blue',width = 2.5,linecap = 'square'))
+ dwg.add(dwg.rect(insert=(self.P), size=(self.plate_width, self.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5))
+ dwg.add(dwg.rect(insert=(self.P), size=(self.weld_thick, self.plate_ht),fill = 'none', stroke='blue', stroke_width=2.0))
+ #C1,A1,A3,B3,B1,C2
+ dwg.add(dwg.polyline(points=[(self.C1),(self.A1),(self.A3),(self.B3),(self.B1),(self.C2)],stroke = 'blue',fill= 'none',stroke_width =2.5))
+ #C1,C2
+ dwg.add(dwg.line((self.C1),(self.C2)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5])))
+ #A2,B2
+ dwg.add(dwg.line((self.A2),(self.B2)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5])))
+ dwg.add(dwg.line((self.A5),(self.A4)).stroke('blue',width = 2.5,linecap = 'square'))
+ dwg.add(dwg.line((self.B5),(self.B4)).stroke('blue',width = 2.5,linecap = 'square'))
+ nr = self.no_of_rows
+ nc = self.no_of_col
+ bolt_r = self.bolt_dia/2
+ for i in range(1,(nr+1)):
+ for j in range (1,(nc+1)):
+ pt = self.ptP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) + \
+ (i-1) * self.pitch * np.array([0,1]) + (j-1) * self.gauge * np.array([1,0])
+ dwg.add(dwg.circle(center=(pt), r = bolt_r, stroke='blue',fill ='black',stroke_width=1.5))
+ ptA = pt - (bolt_r + 4) * np.array([0,1])
+ ptB = pt + (bolt_r + 4) * np.array([0,1])
+ #dwg.add(dwg.line((ptA),(ptB)).stroke('blue',width = 2.0,linecap = 'square'))
+ ptC = pt - (bolt_r + 4) * np.array([1,0])
+ PtD = pt + (bolt_r + 4) * np.array([1,0])
+ dwg.add(dwg.line((ptC),(PtD)).stroke('blue',width = 2.0,linecap = 'square'))
+ ptE = self.ptP + self.edge_dist * np.array([1,0]) +(j-1) * self.gauge * np.array([1,0])
+ ptF = ptE + self.plate_ht * np.array([0,1])
+ dwg.add(dwg.line((ptE),(ptF)).stroke('blue',width = 1.5,linecap = 'square').dasharray(dasharray = ([20, 5, 1, 5])))
+
+ dwg.save()
+ print"Saved"
+
+
+
+
+
+ \ No newline at end of file
diff --git a/Connections/Shear/Finplate/finPlateMain.py b/Connections/Shear/Finplate/finPlateMain.py
index cfb06a6..063fc73 100644
--- a/Connections/Shear/Finplate/finPlateMain.py
+++ b/Connections/Shear/Finplate/finPlateMain.py
@@ -33,6 +33,8 @@ from OCC.STEPControl import STEPControl_Writer, STEPControl_AsIs
from OCC.Interface import Interface_Static_SetCVal
from OCC.IFSelect import IFSelect_RetDone
from OCC.StlAPI import StlAPI_Writer
+from drawing_2D import Fin2DCreatorFront
+import svgwrite
# Developed by deepa
class MainController(QtGui.QMainWindow):
@@ -1124,6 +1126,9 @@ class MainController(QtGui.QMainWindow):
if self.fuse_model == None:
self.fuse_model = self.create2Dcad(self.connectivity)
self.display2DModel( self.fuse_model,"Front")
+
+ #self.mkAndSaveSvg(self.connectivity)
+ self.call2D_Drawing()
else:
self.display.EraseAll()
self.ui.mytabWidget.setCurrentIndex(0)
@@ -1131,7 +1136,21 @@ class MainController(QtGui.QMainWindow):
self.connectivity = self.create3DColFlangeBeamWeb()
if self.fuse_model == None:
self.fuse_model = self.create2Dcad(self.connectivity)
- self.display2DModel( self.fuse_model,"Left")
+ self.display2DModel( self.fuse_model,"Left")
+
+ def mkAndSaveSvg(self, connectivity):
+ conXZ = ColWebBeamWebXZ(connectivity)
+ conXZDwg = conXZ.mkOSDAGDrawing2D('test.svg')
+ conXZDwg.saveSvg()
+
+ def call2D_Drawing(self):
+ uiObj = self.getuser_inputs()
+ resultObj = finConn(uiObj)
+ dictbeamdata = self.fetchBeamPara()
+ dictcoldata = self.fetchColumnPara()
+ fin2DFront = Fin2DCreatorFront(uiObj,resultObj,dictbeamdata,dictcoldata)
+ fin2DFront.saveToSvg()
+
def call_Topview(self):
@@ -1245,8 +1264,43 @@ def launchFinPlateController(osdagMainWindow):
window.closed.connect(osdagMainWindow.show)
#sys.exit(app.exec_())
+
+class ColWebBeamWebXZ():
+
+ def __init__(self, connectivity):
+ self.A = (0, 0)
+ self.B = (0, 80)
+ self.C = (20, 80)
+ self.D = (20, 0)
+ self.E = (7, 80)
+ self.F = (13, 80)
+ self.G = (13, 0)
+ self.H = (7, 0)
+
+ def mkOSDAGDrawing2D(self, fileName):
+
+ dwg = OSDAGDrawing2D(fileName)
+ dwg.line()
+ dwg.add(dwg.line(self.A, self.B,stroke='blue', stroke_width =2.0, stroke_linecap='square'))
+ dwg.add(dwg.line(self.B, self.C, stroke='blue', stroke_width =2.0, stroke_linecap='square'))
+ dwg.add(dwg.line(self.C, self.D, stroke='blue', stroke_width =2.0, stroke_linecap='square'))
+ #dwg.add(dwg.line(self.D, self.E, stroke=svgwrite.rgb(0, 0, 255, '%')))
+ dwg.add(dwg.line(self.D, self.A, stroke='blue', stroke_width =2.0, stroke_linecap='square'))
+ dwg.add(dwg.line(self.E, self.H, stroke='red', stroke_width =1.2,stroke_linecap ='butt' ))
+ dwg.add(dwg.line(self.F, self.G, stroke='red', stroke_width =2.0, stroke_linecap='square'))
+ #dwg.add(dwg.text('Test', insert=(0, 0.2), fill='red'))
+ return dwg
+
+
+class OSDAGDrawing2D(svgwrite.Drawing):
+ def __init__(self, fileName):
+ svgwrite.Drawing.__init__(self, fileName, profile = 'tiny')
+ def saveSvg(self):
+ #dwg.add(dwg.line((0, 0), (10, 0), stroke=svgwrite.rgb(10, 10, 16, '%')))
+ #dwg.add(dwg.text('Test', insert=(0, 0.2), fill='red'))
+ self.save()
if __name__ == '__main__':
#launchFinPlateController(None)
diff --git a/Connections/Shear/Finplate/osdag_gui.py b/Connections/Shear/Finplate/osdag_gui.py
new file mode 100644
index 0000000..9017dbb
--- /dev/null
+++ b/Connections/Shear/Finplate/osdag_gui.py
@@ -0,0 +1,1284 @@
+'''
+Created on 05-Aug-2015
+
+@author: deepa
+'''
+'''
+Created on 07-May-2015
+comment
+
+@author: deepa
+'''
+from PyQt4.QtCore import QString, pyqtSignal
+from OCC.TopoDS import topods, TopoDS_Shape
+from OCC.gp import gp_Pnt
+from nutBoltPlacement import NutBoltArray
+from OCC import VERSION, BRepTools, OSD
+from ui_finPlate import Ui_MainWindow
+from model import *
+from finPlateCalc import finConn
+import yaml
+import pickle
+from OCC.BRepAlgoAPI import BRepAlgoAPI_Fuse
+from OCC._Quantity import Quantity_NOC_RED,Quantity_NOC_BLUE1,Quantity_NOC_SADDLEBROWN
+from ISection import ISection
+from OCC.Graphic3d import Graphic3d_NOT_2D_ALUMINUM
+from weld import Weld
+from plate import Plate
+from bolt import Bolt
+from nut import Nut
+import os.path
+from utilities import osdagDisplayShape
+from OCC.Display.pyqt4Display import qtViewer3d
+from colWebBeamWebConnectivity import ColWebBeamWeb
+from colFlangeBeamWebConnectivity import ColFlangeBeamWeb
+from OCC import IGESControl
+from filletweld import FilletWeld
+from OCC.STEPControl import STEPControl_Writer, STEPControl_AsIs
+from OCC.Interface import Interface_Static_SetCVal
+from OCC.IFSelect import IFSelect_RetDone
+from OCC.StlAPI import StlAPI_Writer
+# Developed by deepa
+
+class MainController(QtGui.QMainWindow):
+
+ closed = pyqtSignal()
+
+
+
+
+
+
+
+ def __init__(self):
+ QtGui.QMainWindow.__init__(self)
+ self.ui = Ui_MainWindow()
+ self.ui.setupUi(self)
+
+ self.ui.combo_Beam.addItems(get_beamcombolist())
+ self.ui.comboColSec.addItems(get_columncombolist())
+
+ self.ui.inputDock.setFixedSize(310,710)
+
+ self.gradeType ={'Please Select Type':'',
+ 'HSFG': [8.8,10.8],
+ 'Black Bolt':[3.6,4.6,4.8,5.6,5.8,6.8,9.8,12.9]}
+ self.ui.comboType.addItems(self.gradeType.keys())
+ self.ui.comboType.currentIndexChanged[str].connect(self.combotype_currentindexchanged)
+ self.ui.comboType.setCurrentIndex(0)
+
+
+ self.ui.comboConnLoc.currentIndexChanged[str].connect(self.setimage_connection)
+ self.retrieve_prevstate()
+ self.ui.btnInput.clicked.connect(lambda: self.dockbtn_clicked(self.ui.inputDock))
+ self.ui.btnOutput.clicked.connect(lambda: self.dockbtn_clicked(self.ui.outputDock))
+
+ self.ui.btn_front.clicked.connect(self.call_Frontview)
+ self.ui.btn_top.clicked.connect(self.call_Topview)
+ self.ui.btn_side.clicked.connect(self.call_Sideview)
+
+ self.ui.btn3D.clicked.connect(lambda:self.call_3DModel(True))
+ self.ui.chkBxBeam.clicked.connect(self.call_3DBeam)
+ self.ui.chkBxCol.clicked.connect(self.call_3DColumn)
+ self.ui.chkBxFinplate.clicked.connect(self.call_3DFinplate)
+
+ validator = QtGui.QIntValidator()
+ self.ui.txtFu.setValidator(validator)
+ self.ui.txtFy.setValidator(validator)
+
+ dbl_validator = QtGui.QDoubleValidator()
+ self.ui.txtPlateLen.setValidator(dbl_validator)
+ self.ui.txtPlateLen.setMaxLength(7)
+ self.ui.txtPlateWidth.setValidator(dbl_validator)
+ self.ui.txtPlateWidth.setMaxLength(7)
+ self.ui.txtShear.setValidator(dbl_validator)
+ self.ui.txtShear.setMaxLength(7)
+
+ minfuVal = 290
+ maxfuVal = 590
+ self.ui.txtFu.editingFinished.connect(lambda: self.check_range(self.ui.txtFu,self.ui.lbl_fu, minfuVal, maxfuVal))
+
+ minfyVal = 165
+ maxfyVal = 450
+ self.ui.txtFy.editingFinished.connect(lambda: self.check_range(self.ui.txtFy,self.ui.lbl_fy, minfyVal, maxfyVal))
+
+ ##### MenuBar #####
+ self.ui.actionQuit_fin_plate_design.setShortcut('Ctrl+Q')
+ self.ui.actionQuit_fin_plate_design.setStatusTip('Exit application')
+ self.ui.actionQuit_fin_plate_design.triggered.connect(QtGui.qApp.quit)
+
+ self.ui.actionCreate_design_report.triggered.connect(self.save_design)
+ self.ui.actionSave_log_messages.triggered.connect(self.save_log)
+ self.ui.actionEnlarge_font_size.triggered.connect(self.showFontDialogue)
+ self.ui.actionZoom_in.triggered.connect(self.callZoomin)
+ self.ui.actionZoom_out.triggered.connect(self.callZoomout)
+ self.ui.actionSave_3D_model_as.triggered.connect(self.save3DcadImages)
+ self.ui.actionSave_current_2D_image_as.triggered.connect(self.save2DcadImages)
+ self.ui.actionView_2D_on_ZX.triggered.connect(self.call_Frontview)
+ self.ui.actionView_2D_on_XY.triggered.connect(self.call_Topview)
+ self.ui.actionView_2D_on_YZ.triggered.connect(self.call_Sideview)
+ self.ui.actionPan.triggered.connect(self.call_Pannig)
+
+ # self.ui.combo_Beam.addItems(get_beamcombolist())
+ # self.ui.comboColSec.addItems(get_columncombolist())
+ self.ui.combo_Beam.currentIndexChanged[str].connect(self.fillPlateThickCombo)
+ self.ui.comboColSec.currentIndexChanged[str].connect(self.populateWeldThickCombo)
+ self.ui.comboConnLoc.currentIndexChanged[str].connect(self.populateWeldThickCombo)
+ self.ui.comboPlateThick_2.currentIndexChanged[str].connect(self.populateWeldThickCombo)
+
+
+ self.ui.menuView.addAction(self.ui.inputDock.toggleViewAction())
+ self.ui.menuView.addAction(self.ui.outputDock.toggleViewAction())
+ self.ui.btn_CreateDesign.clicked.connect(self.save_design)#Saves the create design report
+ self.ui.btn_SaveMessages.clicked.connect(self.save_log)
+
+
+ # Saving and Restoring the finPlate window state.
+ #self.retrieve_prevstate()
+
+ self.ui.btnZmIn.clicked.connect(self.callZoomin)
+ self.ui.btnZmOut.clicked.connect(self.callZoomout)
+ self.ui.btnRotatCw.clicked.connect(self.callRotation)
+ self.ui.btn_Reset.clicked.connect(self.resetbtn_clicked)
+
+ self.ui.btn_Design.clicked.connect(self.design_btnclicked)
+
+ # Initialising the qtviewer
+ self.display,_ = self.init_display(backend_str="pyqt4")
+
+ self.ui.btnSvgSave.clicked.connect(self.save3DcadImages)
+ #self.ui.btnSvgSave.clicked.connect(lambda:self.saveTopng(self.display))
+
+ self.connectivity = None
+ self.fuse_model = None
+ self.disableViewButtons()
+
+ def showFontDialogue(self):
+
+ font, ok = QtGui.QFontDialog.getFont()
+ if ok:
+ self.ui.inputDock.setFont(font)
+ self.ui.outputDock.setFont(font)
+ self.ui.textEdit.setFont(font)
+
+ def callZoomin(self):
+ self.display.ZoomFactor(2)
+
+ def callZoomout(self):
+ self.display.ZoomFactor(0.5)
+
+ def callRotation(self):
+ self.display.Rotation(15,0)
+ def call_Pannig(self):
+ self.display.Pan(50,0)
+
+
+ def save2DcadImages(self):
+ files_types = "PNG (*.png);;JPG (*.jpg);;GIF (*.gif)"
+ fileName = QtGui.QFileDialog.getSaveFileName(self, 'Export', "/home/deepa/Cadfiles/untitled.png", files_types )
+ fName = str(fileName)
+ file_extension = fName.split(".")[-1]
+
+ if file_extension == 'png' or file_extension == 'jpg' or file_extension == 'gif':
+ self.display.ExportToImage(fName)
+ QtGui.QMessageBox.about(self,'Information',"File saved")
+
+
+ def disableViewButtons(self):
+ '''
+ Disables the all buttons in toolbar
+ '''
+ self.ui.btn_front.setEnabled(False)
+ self.ui.btn_top.setEnabled(False)
+ self.ui.btn_side.setEnabled(False)
+
+ self.ui.btn3D.setEnabled(False)
+ self.ui.chkBxBeam.setEnabled(False)
+ self.ui.chkBxCol.setEnabled(False)
+ self.ui.chkBxFinplate.setEnabled(False)
+
+ def enableViewButtons(self):
+ '''
+ Enables the all buttons in toolbar
+ '''
+ self.ui.btn_front.setEnabled(True)
+ self.ui.btn_top.setEnabled(True)
+ self.ui.btn_side.setEnabled(True)
+
+ self.ui.btn3D.setEnabled(True)
+ self.ui.chkBxBeam.setEnabled(True)
+ self.ui.chkBxCol.setEnabled(True)
+ self.ui.chkBxFinplate.setEnabled(True)
+
+ def fillPlateThickCombo(self):
+ '''Populates the plate thickness on the basis of beam web thickness and plate thickness check
+ '''
+ dictbeamdata = self.fetchBeamPara()
+ beam_tw = float(dictbeamdata[QString("tw")])
+ plateThickness = [6,8,10,12,14,16,18,20]
+ newlist = ['Select plate thickness']
+ for ele in plateThickness[1:]:
+ item = int(ele)
+ if item >= beam_tw:
+ newlist.append(str(item))
+ self.ui.comboPlateThick_2.clear()
+ for i in newlist[:]:
+ self.ui.comboPlateThick_2.addItem(str(i))
+ self.ui.comboPlateThick_2.setCurrentIndex(1)
+
+ def populateWeldThickCombo(self):
+ '''
+ Returns the weld thickness on the basis column flange and plate thickness check
+ '''
+ newlist = ["Select weld thickness"]
+ weldlist = [3,4,5,6,8,10,12,16]
+ dictcoldata = self.fetchColumnPara()
+ column_tf = float(dictcoldata[QString("T")])
+ column_tw = float(dictcoldata[QString("tw")])
+ plate_thick = float(self.ui.comboPlateThick_2.currentText())
+
+ if self.ui.comboConnLoc.currentText() == "Column flange-Beam web":
+
+ thickerPart = column_tf > plate_thick and column_tf or plate_thick
+
+ else:
+ thickerPart = column_tw > plate_thick and column_tw or plate_thick
+
+ if thickerPart in range(0,11):
+ weld_index = weldlist.index(3)
+ newlist.extend(weldlist[weld_index:])
+ elif thickerPart in range (11,21):
+ weld_index = weldlist.index(5)
+ newlist.extend(weldlist[weld_index:])
+ elif thickerPart in range(21,33):
+ weld_index = weldlist.index(6)
+ newlist.extend(weldlist[weld_index: ])
+ else:
+ weld_index = weldlist.index(8)
+ newlist.extend(weldlist[weld_index: ])
+
+ self.ui.comboWldSize.clear()
+ for element in newlist[:]:
+ self.ui.comboWldSize.addItem(str(element))
+
+
+ def retrieve_prevstate(self):
+ uiObj = self.get_prevstate()
+ if(uiObj != None):
+
+ self.ui.combo_Beam.setCurrentIndex(self.ui.combo_Beam.findText(uiObj['Member']['BeamSection']))
+ self.ui.comboColSec.setCurrentIndex(self.ui.comboColSec.findText(uiObj['Member']['ColumSection']))
+
+ self.ui.txtFu.setText(str(uiObj['Member']['fu (MPa)']))
+ self.ui.txtFy.setText(str(uiObj['Member']['fy (MPa)']))
+
+ self.ui.comboConnLoc.setCurrentIndex(self.ui.comboConnLoc.findText(str(uiObj['Member']['Connectivity'])))
+
+ self.ui.txtShear.setText(str(uiObj['Load']['ShearForce (kN)']))
+
+ self.ui.comboDaimeter.setCurrentIndex(self.ui.comboDaimeter.findText(str(uiObj['Bolt']['Diameter (mm)'])))
+ comboTypeIndex = self.ui.comboType.findText(str(uiObj['Bolt']['Type']))
+ self.ui.comboType.setCurrentIndex(comboTypeIndex)
+ self.combotype_currentindexchanged(str(uiObj['Bolt']['Type']))
+
+ prevValue = str(uiObj['Bolt']['Grade'])
+
+ comboGradeIndex = self.ui.comboGrade.findText(prevValue)
+
+ self.ui.comboGrade.setCurrentIndex(comboGradeIndex)
+
+
+ selection = str(uiObj['Plate']['Thickness (mm)'])
+ selectionIndex = self.ui.comboPlateThick_2.findText(selection)
+ self.ui.comboPlateThick_2.setCurrentIndex(selectionIndex)
+ self.ui.txtPlateLen.setText(str(uiObj['Plate']['Height (mm)']))
+ self.ui.txtPlateWidth.setText(str(uiObj['Plate']['Width (mm)']))
+
+ self.ui.comboWldSize.setCurrentIndex(self.ui.comboWldSize.findText(str(uiObj['Weld']['Size (mm)'])))
+
+ def setimage_connection(self):
+ '''
+ Setting image to connctivity.
+ '''
+ self.ui.lbl_connectivity.show()
+ loc = self.ui.comboConnLoc.currentText()
+ if loc == "Column flange-Beam web":
+
+ pixmap = QtGui.QPixmap(":/newPrefix/images/beam2.jpg")
+ pixmap.scaledToHeight(50)
+ pixmap.scaledToWidth(60)
+ self.ui.lbl_connectivity.setPixmap(pixmap)
+ #self.ui.lbl_connectivity.show()
+ elif(loc == "Column web-Beam web"):
+ picmap = QtGui.QPixmap(":/newPrefix/images/beam.jpg")
+ picmap.scaledToHeight(50)
+ picmap.scaledToWidth(60)
+ self.ui.lbl_connectivity.setPixmap(picmap)
+ else:
+ self.ui.lbl_connectivity.hide()
+
+
+ def getuser_inputs(self):
+ '''(nothing) -> Dictionary
+
+ Returns the dictionary object with the user input fields for designing fin plate connection
+
+ '''
+ uiObj = {}
+ uiObj["Bolt"] = {}
+ uiObj["Bolt"]["Diameter (mm)"] = self.ui.comboDaimeter.currentText().toInt()[0]
+ uiObj["Bolt"]["Grade"] = float(self.ui.comboGrade.currentText())
+ uiObj["Bolt"]["Type"] = str(self.ui.comboType.currentText())
+
+
+ uiObj["Weld"] = {}
+ uiObj["Weld"]['Size (mm)'] = self.ui.comboWldSize.currentText().toInt()[0]
+
+ uiObj['Member'] = {}
+ uiObj['Member']['BeamSection'] = str(self.ui.combo_Beam.currentText())
+ uiObj['Member']['ColumSection'] = str(self.ui.comboColSec.currentText())
+ uiObj['Member']['Connectivity'] = str(self.ui.comboConnLoc.currentText())
+ uiObj['Member']['fu (MPa)'] = self.ui.txtFu.text().toInt()[0]
+ uiObj['Member']['fy (MPa)'] = self.ui.txtFy.text().toInt()[0]
+
+ uiObj['Plate'] = {}
+ uiObj['Plate']['Thickness (mm)'] = self.ui.comboPlateThick_2.currentText().toInt()[0]
+ uiObj['Plate']['Height (mm)'] = self.ui.txtPlateLen.text().toInt()[0] # changes the label length to height
+ uiObj['Plate']['Width (mm)'] = self.ui.txtPlateWidth.text().toInt()[0]
+
+ uiObj['Load'] = {}
+ uiObj['Load']['ShearForce (kN)'] = self.ui.txtShear.text().toInt()[0]
+
+
+ return uiObj
+
+ def save_inputs(self,uiObj):
+
+ '''(Dictionary)--> None
+
+ '''
+ inputFile = QtCore.QFile('saveINPUT.txt')
+ if not inputFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtGui.QMessageBox.warning(self, "Application",
+ "Cannot write file %s:\n%s." % (inputFile, file.errorString()))
+ #yaml.dump(uiObj, inputFile,allow_unicode=True, default_flow_style = False)
+ pickle.dump(uiObj, inputFile)
+
+
+ def get_prevstate(self):
+ '''
+ '''
+ fileName = 'saveINPUT.txt'
+
+ if os.path.isfile(fileName):
+ fileObject = open(fileName,'r')
+ uiObj = pickle.load(fileObject)
+ return uiObj
+ else:
+ return None
+
+
+ def outputdict(self):
+
+ ''' Returns the output of design in dictionary object.
+ '''
+ outObj = {}
+ outObj['Plate'] ={}
+ #outObj['Plate']["Thickness(mm)"] = float(self.ui.txtPlateThick.text())
+ outObj['Plate']["External Moment (kN-m)"] = float(self.ui.txtExtMomnt.text())
+ outObj['Plate']["Moment Capacity (kN-m)"] = float(self.ui.txtMomntCapacity.text())
+
+ outObj['Weld'] ={}
+ #outObj['Weld']["Weld Thickness(mm)"] = float(self.ui.txtWeldThick.text())
+ outObj['Weld']["Resultant Shear (kN/mm)"] = float(self.ui.txtResltShr.text())
+ outObj['Weld']["Weld Strength (kN/mm)"] = float(self.ui.txtWeldStrng.text())
+
+ outObj['Bolt'] = {}
+ outObj['Bolt']["Shear Capacity (kN)"] = float(self.ui.txtShrCapacity.text())
+ outObj['Bolt']["Bearing Capacity (kN)"] = float(self.ui.txtbearCapacity.text())
+ outObj['Bolt']["Capacity Of Bolt (kN)"] = float(self.ui.txtBoltCapacity.text())
+ outObj['Bolt']["No Of Bolts"] = float(self.ui.txtNoBolts.text())
+ outObj['Bolt']["No.Of Row"] = int(self.ui.txt_row.text())
+ outObj['Bolt']["No.Of Column"] = int(self.ui.txt_col.text())
+ outObj['Bolt']["Pitch Distance (mm)"] = float(self.ui.txtPitch.text())
+ outObj['Bolt']["Guage Distance (mm)"] = float(self.ui.txtGuage.text())
+ outObj['Bolt']["End Distance (mm)"]= float(self.ui.txtEndDist.text())
+ outObj['Bolt']["Edge Distance (mm)"]= float(self.ui.txtEdgeDist.text())
+
+ return outObj
+
+
+ def save_design(self):
+ self.outdict = self.outputdict()
+ self.inputdict = self.getuser_inputs()
+ self.save_yaml(self.outdict,self.inputdict)
+
+ #self.save(self.outdict,self.inputdict)
+
+ def save_log(self):
+
+ fileName,pat =QtGui.QFileDialog.getSaveFileNameAndFilter(self,"Save File As","/home/deepa/SaveMessages","Text files (*.txt)")
+ return self.save_file(fileName+".txt")
+
+ def save_file(self, fileName):
+ '''(file open for writing)-> boolean
+ '''
+ fname = QtCore.QFile(fileName)
+
+ if not fname.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtGui.QMessageBox.warning(self, "Application",
+ "Cannot write file %s:\n%s." % (fileName, fname.errorString()))
+ return False
+
+ outf = QtCore.QTextStream(fname)
+ QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ outf << self.ui.textEdit.toPlainText()
+ QtGui.QApplication.restoreOverrideCursor()
+
+ #self.setCurrentFile(fileName);
+
+ #QtGui.QMessageBox.about(self,'Information',"File saved")
+
+
+
+ def save_yaml(self,outObj,uiObj):
+ '''(dictiionary,dictionary) -> NoneType
+ Saving input and output to file in following format.
+ Bolt:
+ diameter: 6
+ grade: 8.800000190734863
+ type: HSFG
+ Load:
+ shearForce: 100
+
+ '''
+ newDict = {"INPUT": uiObj, "OUTPUT": outObj}
+ fileName = QtGui.QFileDialog.getSaveFileName(self,"Save File As","/home/deepa/SaveDesign","Text File (*.txt)")
+ f = open(fileName,'w')
+ yaml.dump(newDict,f,allow_unicode=True, default_flow_style=False)
+
+ #return self.save_file(fileName+".txt")
+ #QtGui.QMessageBox.about(self,'Information',"File saved")
+
+
+ def resetbtn_clicked(self):
+ '''(NoneType) -> NoneType
+
+ Resets all fields in input as well as output window
+
+ '''
+ # user Inputs
+ self.ui.combo_Beam.setCurrentIndex((0))
+ self.ui.comboColSec.setCurrentIndex((0))
+ self.ui.comboConnLoc.setCurrentIndex((0))
+ self.ui.txtFu.clear()
+ self.ui.txtFy.clear()
+
+ self.ui.txtShear.clear()
+
+ self.ui.comboDaimeter.setCurrentIndex(0)
+ self.ui.comboType.setCurrentIndex((0))
+ self.ui.comboGrade.setCurrentIndex((0))
+
+ self.ui.comboPlateThick_2.setCurrentIndex((0))
+ self.ui.txtPlateLen.clear()
+ self.ui.txtPlateWidth.clear()
+
+ self.ui.comboWldSize.setCurrentIndex((0))
+
+ #----Output
+ self.ui.txtShrCapacity.clear()
+ self.ui.txtbearCapacity.clear()
+ self.ui.txtBoltCapacity.clear()
+ self.ui.txtNoBolts.clear()
+ self.ui.txtboltgrpcapacity.clear()
+ self.ui.txt_row.clear()
+ self.ui.txt_col.clear()
+ self.ui.txtPitch.clear()
+ self.ui.txtGuage.clear()
+ self.ui.txtEndDist.clear()
+ self.ui.txtEdgeDist.clear()
+
+ #self.ui.txtPlateThick.clear()
+ self.ui.txtplate_ht.clear()
+ self.ui.txtplate_width.clear()
+ self.ui.txtExtMomnt.clear()
+ self.ui.txtMomntCapacity.clear()
+
+ #self.ui.txtWeldThick.clear()
+ self.ui.txtResltShr.clear()
+ self.ui.txtWeldStrng.clear()
+ self.ui.textEdit.clear()
+
+ #------ Erase Display
+ self.display.EraseAll()
+
+ def dockbtn_clicked(self,widget):
+
+ '''(QWidget) -> NoneType
+
+ This method dock and undock widget(QdockWidget)
+ '''
+
+ flag = widget.isHidden()
+ if(flag):
+
+ widget.show()
+ else:
+ widget.hide()
+
+ def combotype_currentindexchanged(self,index):
+
+ '''(Number) -> NoneType
+ '''
+ items = self.gradeType[str(index)]
+
+ self.ui.comboGrade.clear()
+ strItems = []
+ for val in items:
+ strItems.append(str(val))
+
+ self.ui.comboGrade.addItems(strItems)
+
+
+ def check_range(self, widget,lblwidget, minVal, maxVal):
+
+ '''(QlineEdit,QLable,Number,Number)---> NoneType
+ Validating F_u(ultimate Strength) and F_y (Yeild Strength) textfields
+ '''
+ textStr = widget.text()
+ val = int(textStr)
+ if( val < minVal or val > maxVal):
+ QtGui.QMessageBox.about(self,'Error','Please Enter a value between %s-%s' %(minVal, maxVal))
+ widget.clear()
+ widget.setFocus()
+ palette = QtGui.QPalette()
+ palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.red)
+ lblwidget.setPalette(palette)
+ else:
+ palette = QtGui.QPalette()
+ lblwidget.setPalette(palette)
+
+ def display_output(self, outputObj):
+ '''(dictionary) --> NoneType
+ Setting design result values to the respective textboxes in the output window
+ '''
+ for k in outputObj.keys():
+ for key in outputObj[k].keys():
+ if (outputObj[k][key] == ""):
+ resultObj = outputObj
+ else:
+ resultObj = outputObj
+
+ # resultObj['Bolt']
+ shear_capacity = resultObj['Bolt']['shearcapacity']
+ self.ui.txtShrCapacity.setText(str(shear_capacity))
+
+ bearing_capacity = resultObj['Bolt']['bearingcapacity']
+ self.ui.txtbearCapacity.setText(str(bearing_capacity))
+
+ bolt_capacity = resultObj['Bolt']['boltcapacity']
+ self.ui.txtBoltCapacity.setText(str(bolt_capacity))
+
+ no_ofbolts = resultObj['Bolt']['numofbolts']
+ self.ui.txtNoBolts.setText(str(no_ofbolts))
+ #newly added field
+ boltGrp_capacity = resultObj['Bolt']['boltgrpcapacity']
+ self.ui.txtboltgrpcapacity.setText(str(boltGrp_capacity))
+
+ no_ofrows = resultObj['Bolt']['numofrow']
+ self.ui.txt_row.setText(str(no_ofrows))
+
+ no_ofcol = resultObj['Bolt']['numofcol']
+ self.ui.txt_col.setText(str(no_ofcol))
+
+ pitch_dist = resultObj['Bolt']['pitch']
+ self.ui.txtPitch.setText(str(pitch_dist))
+
+ gauge_dist = resultObj['Bolt']['gauge']
+ self.ui.txtGuage.setText(str(gauge_dist))
+
+ end_dist = resultObj['Bolt']['enddist']
+ self.ui.txtEndDist.setText(str(end_dist))
+
+ edge_dist = resultObj['Bolt']['edge']
+ self.ui.txtEdgeDist.setText(str(edge_dist))
+
+ resultant_shear = resultObj['Weld']['resultantshear']
+ self.ui.txtResltShr.setText(str(resultant_shear))
+
+ weld_strength = resultObj['Weld']['weldstrength']
+ self.ui.txtWeldStrng.setText(str(weld_strength))
+
+
+ # Newly included fields
+ plate_ht = resultObj['Plate']['height']
+ self.ui.txtplate_ht.setText(str(plate_ht))
+
+ plate_width = resultObj['Plate']['width']
+ self.ui.txtplate_width.setText(str(plate_width))
+
+ moment_demand = resultObj['Plate']['externalmoment']
+ self.ui.txtExtMomnt.setText(str(moment_demand))
+
+ moment_capacity = resultObj['Plate']['momentcapacity']
+ self.ui.txtMomntCapacity.setText(str(moment_capacity))
+
+
+ def displaylog_totextedit(self):
+ '''
+ This method displaying Design messages(log messages)to textedit widget.
+ '''
+
+ afile = QtCore.QFile('./Connections/Shear/Finplate/fin.log')
+
+ if not afile.open(QtCore.QIODevice.ReadOnly):#ReadOnly
+ QtGui.QMessageBox.information(None, 'info', afile.errorString())
+
+ stream = QtCore.QTextStream(afile)
+ self.ui.textEdit.clear()
+ self.ui.textEdit.setHtml(stream.readAll())
+ vscrollBar = self.ui.textEdit.verticalScrollBar();
+ vscrollBar.setValue(vscrollBar.maximum());
+ afile.close()
+
+
+ def get_backend(self):
+ """
+ loads a backend
+ backends are loaded in order of preference
+ since python comes with Tk included, but that PySide or PyQt4
+ is much preferred
+ """
+ try:
+ from PySide import QtCore, QtGui
+ return 'pyside'
+ except:
+ pass
+ try:
+ from PyQt4 import QtCore, QtGui
+ return 'pyqt4'
+ except:
+ pass
+ # Check wxPython
+ try:
+ import wx
+ return 'wx'
+ except:
+ raise ImportError("No compliant GUI library found. You must have either PySide, PyQt4 or wxPython installed.")
+ sys.exit(1)
+
+ # QtViewer
+ def init_display(self,backend_str=None, size=(1024, 768)):
+
+ global display,start_display, app, _, USED_BACKEND
+
+ if not backend_str:
+ USED_BACKEND = self.get_backend()
+ elif backend_str in [ 'pyside', 'pyqt4']:
+ USED_BACKEND = backend_str
+ else:
+ raise ValueError("You should pass either 'qt' or 'tkinter' to the init_display function.")
+ sys.exit(1)
+
+ # Qt based simple GUI
+ if USED_BACKEND in ['pyqt4', 'pyside']:
+ if USED_BACKEND == 'pyqt4':
+ from PyQt4 import QtCore, QtGui, QtOpenGL
+ from OCC.Display.pyqt4Display import qtViewer3d
+ elif USED_BACKEND == 'pyside':
+ from PySide import QtCore, QtGui, QtOpenGL
+ from OCC.Display.pysideDisplay import qtViewer3d
+
+ self.ui.modelTab = qtViewer3d(self)
+ #self.ui.model2dTab = qtViewer3d(self)
+
+ self.setWindowTitle("Osdag-%s 3d viewer ('%s' backend)" % (VERSION, USED_BACKEND))
+ self.ui.mytabWidget.resize(size[0], size[1])
+ self.ui.mytabWidget.addTab(self.ui.modelTab,"")
+ #self.ui.mytabWidget.addTab(self.ui.model2dTab,"")
+
+ self.ui.modelTab.InitDriver()
+ display = self.ui.modelTab._display
+ #display_2d = self.ui.model2dTab._display
+
+
+ # background gradient
+ display.set_bg_gradient_color(23,1,32,23,1,32)
+ #display_2d.set_bg_gradient_color(255,255,255,255,255,255)
+ # display black trihedron
+ display.display_trihedron()
+ display.View.SetProj(1, 1, 1)
+ def centerOnScreen(self):
+ '''Centers the window on the screen.'''
+ resolution = QtGui.QDesktopWidget().screenGeometry()
+ self.move((resolution.width() / 2) - (self.frameSize().width() / 2),
+ (resolution.height() / 2) - (self.frameSize().height() / 2))
+ def start_display():
+
+ self.ui.modelTab.raise_()
+ #self.ui.model2dTab.raise_() # make the application float to the top
+
+ return display, start_display
+
+ def display3Dmodel(self, component):
+ self.display.EraseAll()
+ self.display.SetModeShaded()
+ display.DisableAntiAliasing()
+ self.display.set_bg_gradient_color(23,1,32,23,1,32)
+ self.display.View_Front()
+ self.display.View_Iso()
+ self.display.FitAll()
+ if component == "Column":
+ osdagDisplayShape(self.display, self.connectivity.columnModel, update=True)
+ elif component == "Beam":
+ osdagDisplayShape(self.display, self.connectivity.get_beamModel(), material = Graphic3d_NOT_2D_ALUMINUM, update=True)
+ #osdagDisplayShape(self.display, self.connectivity.beamModel, material = Graphic3d_NOT_2D_ALUMINUM, update=True)
+ elif component == "Finplate" :
+ osdagDisplayShape(self.display, self.connectivity.weldModelLeft, color = 'red', update = True)
+ osdagDisplayShape(self.display, self.connectivity.weldModelRight, color = 'red', update = True)
+ osdagDisplayShape(self.display,self.connectivity.plateModel,color = 'blue', update = True)
+ nutboltlist = self.connectivity.nutBoltArray.getModels()
+ for nutbolt in nutboltlist:
+ osdagDisplayShape(self.display,nutbolt,color = Quantity_NOC_SADDLEBROWN,update = True)
+ #self.display.DisplayShape(self.connectivity.nutBoltArray.getModels(), color = Quantity_NOC_SADDLEBROWN, update=True)
+ elif component == "Model":
+ osdagDisplayShape(self.display, self.connectivity.columnModel, update=True)
+ osdagDisplayShape(self.display, self.connectivity.beamModel, material = Graphic3d_NOT_2D_ALUMINUM, update=True)
+ osdagDisplayShape(self.display, self.connectivity.weldModelLeft, color = 'red', update = True)
+ osdagDisplayShape(self.display, self.connectivity.weldModelRight, color = 'red', update = True)
+ osdagDisplayShape(self.display,self.connectivity.plateModel,color = 'blue', update = True)
+ nutboltlist = self.connectivity.nutBoltArray.getModels()
+ for nutbolt in nutboltlist:
+ osdagDisplayShape(self.display,nutbolt,color = Quantity_NOC_SADDLEBROWN,update = True)
+ #self.display.DisplayShape(self.connectivity.nutBoltArray.getModels(), color = Quantity_NOC_SADDLEBROWN, update=True)
+
+ def fetchBeamPara(self):
+ beam_sec = self.ui.combo_Beam.currentText()
+ dictbeamdata = get_beamdata(beam_sec)
+ return dictbeamdata
+
+ def fetchColumnPara(self):
+ column_sec = self.ui.comboColSec.currentText()
+ dictcoldata = get_columndata(column_sec)
+ return dictcoldata
+
+ def create3DColWebBeamWeb(self):
+ '''
+ creating 3d cad model with column web beam web
+ '''
+ uiObj = self.getuser_inputs()
+ resultObj = finConn(uiObj)
+
+ dictbeamdata = self.fetchBeamPara()
+ ##### BEAM PARAMETERS #####
+ beam_D = int(dictbeamdata[QString("D")])
+ beam_B = int(dictbeamdata[QString("B")])
+ beam_tw = float(dictbeamdata[QString("tw")])
+ beam_T = float(dictbeamdata[QString("T")])
+ beam_alpha = float(dictbeamdata[QString("FlangeSlope")])
+ beam_R1 = float(dictbeamdata[QString("R1")])
+ beam_R2 = float(dictbeamdata[QString("R2")])
+ beam_length = 500.0 # This parameter as per view of 3D cad model
+
+ #beam = ISection(B = 140, T = 16,D = 400,t = 8.9, R1 = 14, R2 = 7, alpha = 98,length = 500)
+ beam = ISection(B = beam_B, T = beam_T,D = beam_D,t = beam_tw,
+ R1 = beam_R1, R2 = beam_R2, alpha = beam_alpha,
+ length = beam_length)
+
+ ##### COLUMN PARAMETERS ######
+ dictcoldata = self.fetchColumnPara()
+
+ column_D = int(dictcoldata[QString("D")])
+ column_B = int(dictcoldata[QString("B")])
+ column_tw = float(dictcoldata[QString("tw")])
+ column_T = float(dictcoldata[QString("T")])
+ column_alpha = float(dictcoldata[QString("FlangeSlope")])
+ column_R1 = float(dictcoldata[QString("R1")])
+ column_R2 = float(dictcoldata[QString("R2")])
+
+ #column = ISection(B = 83, T = 14.1, D = 250, t = 11, R1 = 12, R2 = 3.2, alpha = 98, length = 1000)
+ column = ISection(B = column_B, T = column_T, D = column_D,
+ t = column_tw, R1 = column_R1, R2 = column_R2, alpha = column_alpha, length = 1000)
+ #### WELD,PLATE,BOLT AND NUT PARAMETERS #####
+
+ fillet_length = resultObj['Plate']['height']
+ fillet_thickness = resultObj['Weld']['thickness']
+ plate_width = resultObj['Plate']['width']
+ plate_thick = uiObj['Plate']['Thickness (mm)']
+ bolt_dia = uiObj["Bolt"]["Diameter (mm)"]
+ bolt_r = bolt_dia/2
+ bolt_R = bolt_r + 7
+ nut_R = bolt_R
+ bolt_T = 10.0 # minimum bolt thickness As per Indian Standard
+ bolt_Ht = 50.0 # minimum bolt length as per Indian Standard IS 3750(1985)
+ nut_T = 12.0 # minimum nut thickness As per Indian Standard
+ nut_Ht = 12.2 #
+
+ #plate = Plate(L= 300,W =100, T = 10)
+ plate = Plate(L= fillet_length,W =plate_width, T = plate_thick)
+
+ #Fweld1 = FilletWeld(L= 300,b = 6, h = 6)
+ Fweld1 = FilletWeld(L= fillet_length,b = fillet_thickness, h = fillet_thickness)
+
+ #bolt = Bolt(R = bolt_R,T = bolt_T, H = 38.0, r = 4.0 )
+ bolt = Bolt(R = bolt_R,T = bolt_T, H = bolt_Ht, r = bolt_r )
+
+ #nut =Nut(R = bolt_R, T = 10.0, H = 11, innerR1 = 4.0, outerR2 = 8.3)
+ nut = Nut(R = bolt_R, T = nut_T, H = nut_Ht, innerR1 = bolt_r)
+
+ gap = beam_tw + plate_thick+ nut_T
+
+ nutBoltArray = NutBoltArray(resultObj,nut,bolt,gap)
+
+ colwebconn = ColWebBeamWeb(column,beam,Fweld1,plate,nutBoltArray)
+ colwebconn.create_3dmodel()
+
+ return colwebconn
+
+ def create3DColFlangeBeamWeb(self):
+ '''
+ Creating 3d cad model with column flange beam web connection
+
+ '''
+ uiObj = self.getuser_inputs()
+ resultObj = finConn(uiObj)
+
+ dictbeamdata = self.fetchBeamPara()
+ fillet_length = resultObj['Plate']['height']
+ fillet_thickness = resultObj['Weld']['thickness']
+ plate_width = resultObj['Plate']['width']
+ plate_thick = uiObj['Plate']['Thickness (mm)']
+ ##### BEAM PARAMETERS #####
+ beam_D = int(dictbeamdata[QString("D")])
+ beam_B = int(dictbeamdata[QString("B")])
+ beam_tw = float(dictbeamdata[QString("tw")])
+ beam_T = float(dictbeamdata[QString("T")])
+ beam_alpha = float(dictbeamdata[QString("FlangeSlope")])
+ beam_R1 = float(dictbeamdata[QString("R1")])
+ beam_R2 = float(dictbeamdata[QString("R2")])
+ beam_length = 500.0 # This parameter as per view of 3D cad model
+
+ #beam = ISection(B = 140, T = 16,D = 400,t = 8.9, R1 = 14, R2 = 7, alpha = 98,length = 500)
+ beam = ISection(B = beam_B, T = beam_T,D = beam_D,t = beam_tw,
+ R1 = beam_R1, R2 = beam_R2, alpha = beam_alpha,
+ length = beam_length)
+
+ ##### COLUMN PARAMETERS ######
+ dictcoldata = self.fetchColumnPara()
+
+ column_D = int(dictcoldata[QString("D")])
+ column_B = int(dictcoldata[QString("B")])
+ column_tw = float(dictcoldata[QString("tw")])
+ column_T = float(dictcoldata[QString("T")])
+ column_alpha = float(dictcoldata[QString("FlangeSlope")])
+ column_R1 = float(dictcoldata[QString("R1")])
+ column_R2 = float(dictcoldata[QString("R2")])
+
+ #column = ISection(B = 83, T = 14.1, D = 250, t = 11, R1 = 12, R2 = 3.2, alpha = 98, length = 1000)
+ column = ISection(B = column_B, T = column_T, D = column_D,
+ t = column_tw, R1 = column_R1, R2 = column_R2, alpha = column_alpha, length = 1000)
+
+ #### WELD,PLATE,BOLT AND NUT PARAMETERS #####
+
+ fillet_length = resultObj['Plate']['height']
+ fillet_thickness = resultObj['Weld']['thickness']
+ plate_width = resultObj['Plate']['width']
+ plate_thick = uiObj['Plate']['Thickness (mm)']
+ bolt_dia = uiObj["Bolt"]["Diameter (mm)"]
+ bolt_r = bolt_dia/2
+ bolt_R = bolt_r + 7
+ nut_R = bolt_R
+ bolt_T = 10.0 # minimum bolt thickness As per Indian Standard
+ bolt_Ht = 50.0 # minimum bolt length as per Indian Standard
+ nut_T = 12.0 # minimum nut thickness As per Indian Standard
+ nut_Ht = 12.2 #
+
+ #plate = Plate(L= 300,W =100, T = 10)
+ plate = Plate(L= fillet_length,W =plate_width, T = plate_thick)
+
+ #Fweld1 = FilletWeld(L= 300,b = 6, h = 6)
+ Fweld1 = FilletWeld(L= fillet_length,b = fillet_thickness, h = fillet_thickness)
+
+ #bolt = Bolt(R = bolt_R,T = bolt_T, H = 38.0, r = 4.0 )
+ bolt = Bolt(R = bolt_R,T = bolt_T, H = bolt_Ht, r = bolt_r )
+
+ #nut =Nut(R = bolt_R, T = 10.0, H = 11, innerR1 = 4.0, outerR2 = 8.3)
+ nut = Nut(R = bolt_R, T = nut_T, H = nut_Ht, innerR1 = bolt_r)
+
+ gap = beam_tw + plate_thick+ nut_T
+
+ nutBoltArray = NutBoltArray(resultObj,nut,bolt,gap)
+
+ colflangeconn = ColFlangeBeamWeb(column,beam,Fweld1,plate,nutBoltArray)
+ colflangeconn.create_3dmodel()
+ return colflangeconn
+
+
+ def call_3DModel(self,flag):
+ self.ui.btnSvgSave.setEnabled(True)
+ if self.ui.btn3D.isEnabled():
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+ self.ui.mytabWidget.setCurrentIndex(0)
+
+ if flag == True:
+ if self.ui.comboConnLoc.currentText()== "Column web-Beam web":
+ #self.create3DColWebBeamWeb()
+ self.connectivity = self.create3DColWebBeamWeb()
+ self.fuse_model = None
+ else:
+ self.ui.mytabWidget.setCurrentIndex(0)
+ self.connectivity = self.create3DColFlangeBeamWeb()
+ self.fuse_model = None
+
+ self.display3Dmodel("Model")
+ # beamOrigin = self.connectivity.beam.secOrigin + self.connectivity.beam.t/2 * (-self.connectivity.beam.uDir)
+ # gpBeamOrigin = getGpPt(beamOrigin)
+ # my_sphere2 = BRepPrimAPI_MakeSphere(gpBeamOrigin,1).Shape()
+ # self.display.DisplayShape(my_sphere2,color = 'red',update = True)
+ # beamOrigin = self.connectivity.beam.secOrigin
+ # gpBeamOrigin = getGpPt(beamOrigin)
+ # my_sphere2 = BRepPrimAPI_MakeSphere(gpBeamOrigin,1).Shape()
+ # self.display.DisplayShape(my_sphere2,color = 'blue',update = True)
+ # plateOrigin = (self.connectivity.plate.secOrigin + self.connectivity.plate.T/2.0 *(self.connectivity.plate.uDir)+ self.connectivity.weldLeft.L/2.0 * (self.connectivity.plate.vDir) + self.connectivity.plate.T * (-self.connectivity.weldLeft.uDir))
+ # gpPntplateOrigin= getGpPt(plateOrigin)
+ # my_sphere = BRepPrimAPI_MakeSphere(gpPntplateOrigin,2).Shape()
+ # self.display.DisplayShape(my_sphere,update=True)
+
+ else:
+ self.display.EraseAll()
+ self.display.DisplayMessage(gp_Pnt(1000,0,400),"Sorry, can not create 3D model",height = 23.0)
+
+ def call_3DBeam(self):
+ '''
+ Creating and displaying 3D Beam
+ '''
+ if self.ui.chkBxBeam.isChecked():
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+ self.ui.mytabWidget.setCurrentIndex(0)
+
+ self.display3Dmodel("Beam")
+
+ def call_3DColumn(self):
+ '''
+ '''
+ if self.ui.chkBxCol.isChecked():
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+ self.ui.mytabWidget.setCurrentIndex(0)
+ self.display3Dmodel( "Column")
+
+ def call_3DFinplate(self):
+ '''Displaying FinPlate in 3D
+ '''
+ if self.ui.chkBxFinplate.isChecked():
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.mytabWidget.setCurrentIndex(0)
+
+ self.display3Dmodel( "Finplate")
+
+
+ def design_btnclicked(self):
+ '''
+ '''
+ self.ui.outputDock.setFixedSize(310,710)
+ self.enableViewButtons()
+
+ #self.set_designlogger()
+ # Getting User Inputs.
+ uiObj = self.getuser_inputs()
+
+ # FinPlate Design Calculations.
+ resultObj = finConn(uiObj)
+
+ # Displaying Design Calculations To Output Window
+ self.display_output(resultObj)
+
+ # Displaying Messages related to FinPlate Design.
+ self.displaylog_totextedit()
+
+ # Displaying 3D Cad model
+ status = resultObj['Bolt']['status']
+ self.call_3DModel(status)
+
+
+ def create2Dcad(self,connectivity):
+ ''' Returns the fuse model of finplate
+ '''
+ cadlist = self.connectivity.get_models()
+ final_model = cadlist[0]
+ for model in cadlist[1:]:
+ final_model = BRepAlgoAPI_Fuse(model,final_model).Shape()
+ return final_model
+
+ # Export to IGS,STEP,STL,BREP
+ def save3DcadImages(self):
+ if self.connectivity == None:
+ self.connectivity = self.create3DColWebBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ shape = self.fuse_model
+
+ files_types = "IGS (*.igs);;STEP (*.stp);;STL (*.stl);;BREP(*.brep)"
+ fileName = QtGui.QFileDialog.getSaveFileName(self, 'Export', "/home/deepa/Cadfiles/untitled.igs", files_types )
+
+ fName = str(fileName)
+ file_extension = fName.split(".")[-1]
+
+ if file_extension == 'igs':
+ IGESControl.IGESControl_Controller().Init()
+ iges_writer = IGESControl.IGESControl_Writer()
+ iges_writer.AddShape(shape)
+ iges_writer.Write(fName)
+
+ elif file_extension == 'brep':
+
+ BRepTools.breptools.Write(shape, fName)
+
+ elif file_extension == 'stp':
+ # initialize the STEP exporter
+ step_writer = STEPControl_Writer()
+ Interface_Static_SetCVal("write.step.schema", "AP203")
+
+ # transfer shapes and write file
+ step_writer.Transfer(shape, STEPControl_AsIs)
+ status = step_writer.Write(fName)
+
+ assert(status == IFSelect_RetDone)
+
+ else:
+ stl_writer = StlAPI_Writer()
+ stl_writer.SetASCIIMode(True)
+ stl_writer.Write(shape,fName)
+
+ QtGui.QMessageBox.about(self,'Information',"File saved")
+
+
+ def display2DModelOriginal(self, final_model, viewName):
+
+ self.display,_ = self.init_display()
+ self.display.EraseAll()
+ #self.display.SetModeWireFrame()
+
+ self.display.DisplayShape(final_model, update = True)
+ self.display.SetModeHLR()
+
+ if (viewName == "Front"):
+ self.display.View_Front()
+ elif (viewName == "Top"):
+ self.display.View_Top()
+ elif (viewName == "Right"):
+ self.display.View_Right()
+ else:
+ pass
+
+ def display2DModel(self, final_model, viewName):
+
+ #display, start_display, _, _ = self.simpleGUI()
+ #self.display2d,_,_ = self.init_display(backend_str="pyqt4")
+ self.display.EraseAll()
+
+ self.display.set_bg_gradient_color(255, 255, 255, 255, 255, 255)
+
+ self.display.SetModeHLR()
+ #self.display.SetModeShaded()
+ # Get Context
+ ais_context = self.display.GetContext().GetObject()
+
+ # Get Prs3d_drawer from previous context
+ drawer_handle = ais_context.DefaultDrawer()
+ drawer = drawer_handle.GetObject()
+ drawer.EnableDrawHiddenLine()
+
+ hla = drawer.HiddenLineAspect().GetObject()
+ hla.SetWidth(2)
+ hla.SetColor(Quantity_NOC_RED)
+
+ # increase line width in the current viewer
+ # This is only viewed in the HLR mode (hit 'e' key for instance)
+
+ line_aspect = drawer.SeenLineAspect().GetObject()
+ line_aspect.SetWidth(2.8)
+ line_aspect.SetColor(Quantity_NOC_BLUE1)
+
+ self.display.DisplayShape(final_model, update = False)
+
+ if (viewName == "Front"):
+ self.display.View_Front()
+ elif (viewName == "Top"):
+ self.display.View_Top()
+ elif (viewName == "Right"):
+ self.display.View_Right()
+ elif (viewName == "Left"):
+ self.display.View_Left()
+ else:
+ pass
+
+ #start_display()
+
+ def call_Frontview(self):
+
+ '''Displays front view of 2Dmodel
+ '''
+ self.ui.btnSvgSave.setEnabled(False)
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+ if self.ui.comboConnLoc.currentText()== "Column web-Beam web":
+ self.display.EraseAll()
+ self.ui.mytabWidget.setCurrentIndex(1)
+ if self.connectivity == None:
+ self.connectivity = self.create3DColWebBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Front")
+ else:
+ self.display.EraseAll()
+ self.ui.mytabWidget.setCurrentIndex(0)
+ if self.connectivity == None:
+ self.connectivity = self.create3DColFlangeBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Left")
+
+ def call_Topview(self):
+
+ '''Displays Top view of 2Dmodel
+ '''
+ self.ui.btnSvgSave.setEnabled(False)
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+
+ if self.ui.comboConnLoc.currentText()== "Column web-Beam web":
+ self.display.EraseAll()
+ self.ui.mytabWidget.setCurrentIndex(1)
+
+ if self.connectivity == None:
+ self.connectivity = self.create3DColWebBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Top")
+ else:
+ self.display.EraseAll()
+ self.ui.mytabWidget.setCurrentIndex(0)
+
+ if self.connectivity == None:
+ self.connectivity = self.create3DColFlangeBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Top")
+
+
+ def call_Sideview(self):
+
+ '''Displays Side view of the 2Dmodel'
+ '''
+ self.ui.btnSvgSave.setEnabled(False)
+ self.ui.chkBxBeam.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxCol.setChecked(QtCore.Qt.Unchecked)
+ self.ui.chkBxFinplate.setChecked(QtCore.Qt.Unchecked)
+
+ if self.ui.comboConnLoc.currentText()== "Column web-Beam web":
+ self.ui.mytabWidget.setCurrentIndex(1)
+
+ if self.connectivity == None:
+ self.connectivity = self.create3DColWebBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Right")
+ else:
+ self.ui.mytabWidget.setCurrentIndex(0)
+
+ if self.connectivity == None:
+ self.connectivity = self.create3DColFlangeBeamWeb()
+ if self.fuse_model == None:
+ self.fuse_model = self.create2Dcad(self.connectivity)
+ self.display2DModel( self.fuse_model,"Front")
+
+ def closeEvent(self, event):
+ '''
+ Closing finPlate window.
+ '''
+ uiInput = self.getuser_inputs()
+ self.save_inputs(uiInput)
+ reply = QtGui.QMessageBox.question(self, 'Message',
+ "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
+
+ if reply == QtGui.QMessageBox.Yes:
+ self.closed.emit()
+ event.accept()
+ else:
+ event.ignore()
+
+
+def set_osdaglogger():
+
+ logger = logging.getLogger("osdag")
+ logger.setLevel(logging.DEBUG)
+
+ # create the logging file handler
+ fh = logging.FileHandler("./Connections/Shear/Finplate/fin.log", mode="a")
+
+ #,datefmt='%a, %d %b %Y %H:%M:%S'
+ #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+
+ formatter = logging.Formatter('''
+ <div class="LOG %(levelname)s">
+ <span class="DATE">%(asctime)s</span>
+ <span class="LEVEL">%(levelname)s</span>
+ <span class="MSG">%(message)s</span>
+ </div>''')
+ formatter.datefmt = '%a, %d %b %Y %H:%M:%S'
+ fh.setFormatter(formatter)
+
+ # add handler to logger object
+ logger.addHandler(fh)
+
+def launchFinPlateController(osdagMainWindow):
+ set_osdaglogger()
+ rawLogger = logging.getLogger("raw")
+ rawLogger.setLevel(logging.INFO)
+ fh = logging.FileHandler("./Connections/Shear/Finplate/fin.log", mode="w")
+ formatter = logging.Formatter('''%(message)s''')
+ fh.setFormatter(formatter)
+ rawLogger.addHandler(fh)
+ rawLogger.info('''<link rel="stylesheet" type="text/css" href="./Connections/Shear/Finplate/log.css"/>''')
+
+ #app = QtGui.QApplication(sys.argv)
+ window = MainController()
+ osdagMainWindow.hide()
+
+ window.show()
+ window.closed.connect(osdagMainWindow.show)
+
+ #sys.exit(app.exec_())
+
+
+
+if __name__ == '__main__':
+ #launchFinPlateController(None)
+
+ # linking css to log file to display colour logs.
+ set_osdaglogger()
+ rawLogger = logging.getLogger("raw")
+ rawLogger.setLevel(logging.INFO)
+ fh = logging.FileHandler("fin.log", mode="w")
+ formatter = logging.Formatter('''%(message)s''')
+ fh.setFormatter(formatter)
+ rawLogger.addHandler(fh)
+ rawLogger.info('''<link rel="stylesheet" type="text/css" href="log.css"/>''')
+
+ app = QtGui.QApplication(sys.argv)
+ window = MainController()
+ window.show()
+ sys.exit(app.exec_())
+
+
+
+
+
diff --git a/finfront.svg b/finfront.svg
new file mode 100644
index 0000000..641a228
--- /dev/null
+++ b/finfront.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<svg baseProfile="tiny" height="100%" version="1.2" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><polyline fill="none" points="200,300 200,0 0,0 0,1000 200,1000 200,700" stroke="blue" stroke-width="2.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="95.5" x2="95.5" y1="0.0" y2="1000" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="104.5" y1="0" y2="1000" /><rect fill="none" height="320.0" stroke="blue" stroke-width="2.5" width="120.0" x="104.5" y="337.0" /><rect fill="none" height="320.0" stroke="blue" stroke-width="2.0" width="7" x="104.5" y="337.0" /><polyline fill="none" points="124.5,337.0 124.5,300 624.5,300 624.5,700 124.5,700 124.5,657.0" stroke="blue" stroke-width="2.5" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="124.5" y1="337.0" y2="657.0" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="200" x2="200" y1="300" y2="700" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="624.5" y1="316.0" y2="316.0" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="624.5" y1="684.0" y2="684.0" /><circle cx="144.5" cy="377.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="132.5" x2="156.5" y1="377.0" y2="377.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="144.5" x2="144.5" y1="337.0" y2="657.0" /><circle cx="184.5" cy="377.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="172.5" x2="196.5" y1="377.0" y2="377.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="184.5" x2="184.5" y1="337.0" y2="657.0" /><circle cx="144.5" cy="437.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="132.5" x2="156.5" y1="437.0" y2="437.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="144.5" x2="144.5" y1="337.0" y2="657.0" /><circle cx="184.5" cy="437.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="172.5" x2="196.5" y1="437.0" y2="437.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="184.5" x2="184.5" y1="337.0" y2="657.0" /><circle cx="144.5" cy="497.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="132.5" x2="156.5" y1="497.0" y2="497.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="144.5" x2="144.5" y1="337.0" y2="657.0" /><circle cx="184.5" cy="497.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="172.5" x2="196.5" y1="497.0" y2="497.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="184.5" x2="184.5" y1="337.0" y2="657.0" /><circle cx="144.5" cy="557.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="132.5" x2="156.5" y1="557.0" y2="557.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="144.5" x2="144.5" y1="337.0" y2="657.0" /><circle cx="184.5" cy="557.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="172.5" x2="196.5" y1="557.0" y2="557.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="184.5" x2="184.5" y1="337.0" y2="657.0" /><circle cx="144.5" cy="617.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="132.5" x2="156.5" y1="617.0" y2="617.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="144.5" x2="144.5" y1="337.0" y2="657.0" /><circle cx="184.5" cy="617.0" fill="black" r="8" stroke="blue" stroke-width="1.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.0" x1="172.5" x2="196.5" y1="617.0" y2="617.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="184.5" x2="184.5" y1="337.0" y2="657.0" /></svg> \ No newline at end of file
diff --git a/saveINPUT.txt b/saveINPUT.txt
index f40487c..7a2f8a1 100644
--- a/saveINPUT.txt
+++ b/saveINPUT.txt
@@ -4,7 +4,7 @@ p1
(dp2
S'ColumSection'
p3
-S'ISSC 150*'
+S'ISSC 200'
p4
sS'fu (MPa)'
p5
@@ -25,36 +25,36 @@ p11
(dp12
S'Width (mm)'
p13
-I100
+I0
sS'Height (mm)'
p14
-I300
+I0
sS'Thickness (mm)'
p15
-I10
+I16
ssS'Load'
p16
(dp17
S'ShearForce (kN)'
p18
-I140
+I240
ssS'Weld'
p19
(dp20
S'Size (mm)'
p21
-I6
+I8
ssS'Bolt'
p22
(dp23
S'Grade'
p24
-F8.8
+F4.8
sS'Diameter (mm)'
p25
-I20
+I16
sS'Type'
p26
-S'HSFG'
+S'Black Bolt'
p27
ss. \ No newline at end of file