diff options
-rw-r--r-- | Connections/Shear/Finplate/drawing_2D.py | 160 | ||||
-rw-r--r-- | Connections/Shear/Finplate/finPlateMain.py | 56 | ||||
-rw-r--r-- | Connections/Shear/Finplate/osdag_gui.py | 1284 | ||||
-rw-r--r-- | finfront.svg | 2 | ||||
-rw-r--r-- | saveINPUT.txt | 18 |
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 |