From 2612ef3f3a7eb263b304006079e5208c71dcdbf0 Mon Sep 17 00:00:00 2001 From: deepa-chaudhari Date: Wed, 9 Dec 2015 19:56:36 +0530 Subject: svg-2d drawings --- .txt | 2 - Connections/Shear/Finplate/ModelUtils.py | 9 +- Connections/Shear/Finplate/ResourceFiles/icons.qrc | 8 +- .../Shear/Finplate/ResourceFiles/images/colF1.png | Bin 0 -> 6008 bytes .../Shear/Finplate/ResourceFiles/images/colFF.png | Bin 0 -> 4127 bytes .../ResourceFiles/images/colFF_converted.png | Bin 0 -> 3319 bytes .../Finplate/ResourceFiles/images/colFlange.svg | 191 +++ .../Shear/Finplate/ResourceFiles/images/colW1.png | Bin 0 -> 5476 bytes .../Shear/Finplate/ResourceFiles/images/colww.png | Bin 0 -> 6156 bytes Connections/Shear/Finplate/bolt.py | 47 +- Connections/Shear/Finplate/drawing_2D.py | 1524 ++++++++++++++------ Connections/Shear/Finplate/filletweld.py | 1 - Connections/Shear/Finplate/fin.log | 897 +----------- Connections/Shear/Finplate/fin2DCreatorTop.py | 8 + Connections/Shear/Finplate/finPlate.ui | 10 +- Connections/Shear/Finplate/finPlateCalc.py | 42 +- Connections/Shear/Finplate/finPlateMain.py | 222 +-- Connections/Shear/Finplate/finSide.svg | 2 + Connections/Shear/Finplate/finTop.svg | 2 + Connections/Shear/Finplate/finfront.svg | 2 + Connections/Shear/Finplate/icons_rc.py | 1158 ++++++++++++++- Connections/Shear/Finplate/nut.py | 121 +- Connections/Shear/Finplate/nutBoltPlacement.py | 52 +- Connections/Shear/Finplate/osdag_gui.py | 1284 ----------------- Connections/Shear/Finplate/plate.py | 31 + Connections/Shear/Finplate/saveINPUT.txt | 42 +- Connections/Shear/Finplate/ui_finPlate.py | 27 +- fin.log | 65 + finfront.svg | 2 - osdagMainPage.py | 4 - saveINPUT.txt | 8 +- test.svg | 2 - utilities/__init__.py | 2 +- 33 files changed, 2855 insertions(+), 2910 deletions(-) delete mode 100644 .txt create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colF1.png create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colFF.png create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.png create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colFlange.svg create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colW1.png create mode 100644 Connections/Shear/Finplate/ResourceFiles/images/colww.png create mode 100644 Connections/Shear/Finplate/fin2DCreatorTop.py create mode 100644 Connections/Shear/Finplate/finSide.svg create mode 100644 Connections/Shear/Finplate/finTop.svg create mode 100644 Connections/Shear/Finplate/finfront.svg delete mode 100644 Connections/Shear/Finplate/osdag_gui.py delete mode 100644 finfront.svg delete mode 100644 test.svg diff --git a/.txt b/.txt deleted file mode 100644 index 127df6f..0000000 --- a/.txt +++ /dev/null @@ -1,2 +0,0 @@ -Thu, 25 Jun 2015 15:17:05 INFO : Overall finplate connection design is safe -Thu, 25 Jun 2015 15:17:05 DEBUG :=========End Of design=========== \ No newline at end of file diff --git a/Connections/Shear/Finplate/ModelUtils.py b/Connections/Shear/Finplate/ModelUtils.py index ae4e175..f2ec597 100644 --- a/Connections/Shear/Finplate/ModelUtils.py +++ b/Connections/Shear/Finplate/ModelUtils.py @@ -3,10 +3,8 @@ Created on 29-Nov-2014 @author: deepa ''' -from OCC.Display.SimpleGui import init_display -from OCC.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeSphere,\ - BRepPrimAPI_MakePrism -from OCC.gp import gp_Pnt, gp_Dir, gp_Pln, gp_Vec +from OCC.BRepPrimAPI import BRepPrimAPI_MakePrism,BRepPrimAPI_MakeSphere +from OCC.gp import gp_Pnt, gp_Dir, gp_Vec from OCC.BRepBuilderAPI import BRepBuilderAPI_MakeFace from OCC.BRepBuilderAPI import (BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeVertex, @@ -15,7 +13,6 @@ from OCC.BRepFill import BRepFill_Filling from OCC.GeomAbs import GeomAbs_C0 from OCC.GeomAPI import GeomAPI_PointsToBSpline from OCC.TColgp import TColgp_Array1OfPnt -from OCC._Quantity import Quantity_NOC_BLACK def make_edge(*args): @@ -89,6 +86,6 @@ def makeEdgesFromPoints(points): return edges def makePrismFromFace(aFace, eDir): + return BRepPrimAPI_MakePrism(aFace, gp_Vec(gp_Pnt(0., 0., 0.),gp_Pnt(eDir[0], eDir[1], eDir[2]))).Shape() - #return BRepPrimAPI_MakePrism(aFace, gpDir, False).Shape() diff --git a/Connections/Shear/Finplate/ResourceFiles/icons.qrc b/Connections/Shear/Finplate/ResourceFiles/icons.qrc index a1f386d..ee48e9a 100644 --- a/Connections/Shear/Finplate/ResourceFiles/icons.qrc +++ b/Connections/Shear/Finplate/ResourceFiles/icons.qrc @@ -1,5 +1,11 @@ + images/colF2.png + images/colW3.png + images/colW1.png + images/colFlange.svg + images/colww.png + images/colFF.png images/download1.png images/beam2.jpg images/favicon.png @@ -16,7 +22,5 @@ images/X-Y.png images/Z-X.png images/Z-Y.png - images/colF2.png - images/colW3.png diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colF1.png b/Connections/Shear/Finplate/ResourceFiles/images/colF1.png new file mode 100644 index 0000000..abe93c5 Binary files /dev/null and b/Connections/Shear/Finplate/ResourceFiles/images/colF1.png differ diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colFF.png b/Connections/Shear/Finplate/ResourceFiles/images/colFF.png new file mode 100644 index 0000000..06c10e7 Binary files /dev/null and b/Connections/Shear/Finplate/ResourceFiles/images/colFF.png differ diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.png b/Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.png new file mode 100644 index 0000000..0e31e85 Binary files /dev/null and b/Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.png differ diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colFlange.svg b/Connections/Shear/Finplate/ResourceFiles/images/colFlange.svg new file mode 100644 index 0000000..ed301a2 --- /dev/null +++ b/Connections/Shear/Finplate/ResourceFiles/images/colFlange.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colW1.png b/Connections/Shear/Finplate/ResourceFiles/images/colW1.png new file mode 100644 index 0000000..0c4f9ca Binary files /dev/null and b/Connections/Shear/Finplate/ResourceFiles/images/colW1.png differ diff --git a/Connections/Shear/Finplate/ResourceFiles/images/colww.png b/Connections/Shear/Finplate/ResourceFiles/images/colww.png new file mode 100644 index 0000000..fff104d Binary files /dev/null and b/Connections/Shear/Finplate/ResourceFiles/images/colww.png differ diff --git a/Connections/Shear/Finplate/bolt.py b/Connections/Shear/Finplate/bolt.py index c404d34..c1abc6e 100644 --- a/Connections/Shear/Finplate/bolt.py +++ b/Connections/Shear/Finplate/bolt.py @@ -4,19 +4,38 @@ Created on 29-Nov-2014 @author: deepa ''' import numpy -from ModelUtils import * +from ModelUtils import getGpPt,getGpDir,makeEdgesFromPoints,makeWireFromEdges,makePrismFromFace,makeFaceFromWire import math from OCC.BRepPrimAPI import BRepPrimAPI_MakeCylinder -from OCC.BRepAlgo import BRepAlgo_BooleanOperations -from OCC.gp import gp_Pnt, gp_Dir, gp_Pln, gp_Ax2 +from OCC.gp import gp_Ax2 from OCC.BRepAlgoAPI import BRepAlgoAPI_Fuse -from OCC.BRepFilletAPI import BRepFilletAPI_MakeFillet -from OCC.TopAbs import TopAbs_EDGE -from OCC.TopoDS import topods -from OCC.TopExp import TopExp_Explorer class Bolt(object): - # + ''' + + a3 X-------------------+ a2 + X X|X + X X | X + X X | X + X X | X + X X | X + X X | X + X X 60 | X +a4 X XXXXXXXXXXXXXXXXX a1 + X X + X X + XX X + X X + X X + X X + X X + X-------------------X + a6 + a5 + + + ''' + def __init__(self,R,T,H,r): self.R = R self.H = H @@ -33,7 +52,6 @@ class Bolt(object): self.a5 = None self.a6 = None self.points = [] - #self.computeParams() def place(self, origin, uDir, shaftDir): self.origin = origin @@ -65,19 +83,10 @@ class Bolt(object): aFace = makeFaceFromWire(wire) extrudeDir = -self.T * self.shaftDir # extrudeDir is a numpy array boltHead = makePrismFromFace(aFace, extrudeDir) - mkFillet = BRepFilletAPI_MakeFillet(boltHead) - anEdgeExplorer = TopExp_Explorer(boltHead, TopAbs_EDGE) - while anEdgeExplorer.More(): - aEdge = topods.Edge(anEdgeExplorer.Current()) - mkFillet.Add(self.T / 17. , aEdge) - anEdgeExplorer.Next() - - boltHead = mkFillet.Shape() cylOrigin = self.origin - boltCylinder = BRepPrimAPI_MakeCylinder(gp_Ax2(getGpPt(cylOrigin), getGpDir(self.shaftDir)), self.r, self.H).Shape() + whole_Bolt = BRepAlgoAPI_Fuse(boltHead,boltCylinder).Shape() - mkFillet = BRepFilletAPI_MakeFillet(whole_Bolt) return whole_Bolt diff --git a/Connections/Shear/Finplate/drawing_2D.py b/Connections/Shear/Finplate/drawing_2D.py index 83fb8a7..342456c 100644 --- a/Connections/Shear/Finplate/drawing_2D.py +++ b/Connections/Shear/Finplate/drawing_2D.py @@ -4,28 +4,45 @@ Created on 24-Aug-2015 @author: deepa ''' import svgwrite -from svgwrite import mm from PyQt4.QtCore import QString import numpy as np from numpy import math -class Fin2DCreatorFront(object): + +class FinCommonData(object): def __init__(self, inputObj,ouputObj,dictBeamdata,dictColumndata): + ''' + Provide all the data related to Finplate connection + + :param inputObj: + :type inputObj:dictionary(Input parameter dictionary) + :param outputObj: + :type ouputObj :dictionary (output parameter dictionary) + :param dictBeamdata : + :type dictBeamdata: dictionary (Beam sectional properties) + :param dictColumndata : + :type dictBeamdata: dictionary (Column sectional properties dictionary) + + ''' self.beam_T = float(dictBeamdata[QString("T")]) self.col_T = float(dictColumndata[QString("T")]) self.D_beam = int (dictBeamdata[QString("D")]) self.D_col = int (dictColumndata[QString("D")]) self.col_B = int(dictColumndata[QString("B")]) + self.beam_B = int(dictBeamdata[QString("B")]) self.col_tw = float(dictColumndata[QString("tw")]) + self.beam_tw = float(dictBeamdata[QString("tw")]) self.col_Designation = dictColumndata[QString("Designation")] self.beam_Designation = dictBeamdata[QString("Designation")] - beam_R1 = float(dictBeamdata[QString("R1")]) - self.R1 = beam_R1 - plate_ht= ouputObj['Plate']['height'] - plate_width = ouputObj['Plate']['width'] - weld_len = ouputObj['Plate']['height'] - weld_thick = ouputObj['Weld']['thickness'] + self.beam_R1 = float(dictBeamdata[QString("R1")]) + self.col_R1 = float(dictColumndata[QString("R1")]) + self.plate_ht= ouputObj['Plate']['height'] + self.plate_thick = inputObj['Plate']["Thickness (mm)"] + + self.plate_width = ouputObj['Plate']['width'] + self.weld_len = ouputObj['Plate']['height'] + self.weld_thick = ouputObj['Weld']['thickness'] self.bolt_dia = inputObj["Bolt"]["Diameter (mm)"] self.connectivity = inputObj['Member']['Connectivity'] self.pitch = ouputObj['Bolt']["pitch"] @@ -34,224 +51,467 @@ class Fin2DCreatorFront(object): self.edge_dist = ouputObj['Bolt']["edge"] self.no_of_rows = ouputObj['Bolt']["numofrow"] self.no_of_col = ouputObj['Bolt']["numofcol"] - self.plate_thick = inputObj['Plate']["Thickness (mm)"] - self.col_L = 1000 - self.beam_L = 500 - print inputObj + self.col_L = 800 + self.beam_L = 350 + self.gap = 20 # Clear distance between Column and Beam as per subramanyam's book ,range 15-20 mm + + def addSMarker(self, dwg): + ''' + Draws start arrow to given line --------> + + :param dwg : + :type dwg : svgwrite (obj) ( Container for all svg elements) + ''' + smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") + smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) + dwg.defs.add(smarker) + return smarker + + + def addEMarker(self, dwg): + ''' + This routine returns end arrow <--------- + + :param dwg : + :type dwg : svgwrite ( Container for all svg elements) + + ''' + emarker = dwg.marker(insert=(8,0), size=(10,10), orient="auto") + emarker.add(dwg.polyline([(2.5,0), (0,3), (8,0), (0,-3)], fill='black')) + dwg.defs.add(emarker) + return emarker + + + def drawFaintLine(self,ptOne,ptTwo,dwg): + ''' + Draw faint line to show dimensions. + + :param dwg : + :type dwg : svgwrite (obj) + :param: ptOne : + :type NumPy Array + :param ptTwo : + :type NumPy Array + + ''' + dwg.add(dwg.line(ptOne,ptTwo).stroke('#D8D8D8',width = 2.5,linecap = 'square',opacity = 0.7)) + + + def draw_dimension_outerArrow(self, dwg, pt1, pt2, text, params): + ''' + :param dwg : + :type dwg : svgwrite (obj) + :param: pt1 : + :type NumPy Array + :param pt2 : + :type NumPy Array + :param text : + :type text : String + :param params["offset"] : + :type params["offset"] : offset of the dimension line + :param params["textoffset"]: + :type params["textoffset"]: float (offset of text from dimension line) + :param params["lineori"]: + :type params ["lineori"]: String (right/left) + :param params["endlinedim"]: + :type params'["endlindim"] : float (dimension line at the end of the outer arrow) + ''' + smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") + smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) + emarker = dwg.marker(insert=(8,0), size=(10,10), orient="auto") + emarker.add(dwg.polyline([(2.5,0), (0,3), (8,0), (0,-3)], fill='black')) + + dwg.defs.add(emarker) + dwg.defs.add(smarker) + + lineVec = pt2 - pt1 # [a, b] + normalVec = np.array([-lineVec[1], lineVec[0]]) # [-b, a] + normalUnitVec = self.normalize(normalVec) + if(params["lineori"] == "left"): + normalUnitVec = -normalUnitVec + + # Q1 = pt1 + params["offset"] * normalUnitVec + # Q2 = pt2 + params["offset"] * normalUnitVec + Q1 = pt1 + params["offset"] * normalUnitVec + Q2 = pt2 + params["offset"] * normalUnitVec + line = dwg.add(dwg.line(Q1, Q2).stroke('black', width = 2.5, linecap = 'square')) + line['marker-start'] = smarker.get_funciri() + line['marker-end'] = emarker.get_funciri() + + Q12mid = 0.5 * (Q1 + Q2) + txtPt = Q12mid + params["textoffset"] * normalUnitVec + dwg.add(dwg.text(text, insert=(txtPt), fill='black',font_family = "sans-serif",font_size = 28)) + + L1 = Q1 + params["endlinedim"] * normalUnitVec + L2 = Q1 + params["endlinedim"]* (-normalUnitVec) + dwg.add(dwg.line(L1,L2).stroke('black',width = 2.5,linecap = 'square',opacity = 1.0)) + L3 = Q2 + params["endlinedim"] * normalUnitVec + L4 = Q2 + params["endlinedim"]* (-normalUnitVec) + dwg.add(dwg.line(L3,L4).stroke('black',width = 2.5,linecap = 'square',opacity = 1.0)) + + def normalize(self, vec): + a = vec[0] + b = vec[1] + mag = math.sqrt(a * a + b * b) + return vec / mag + + + def draw_dimension_innerArrow(self, dwg, ptA, ptB, text, params): + ''' + :param dwg : + :type dwg : svgwrite (obj) + :param: ptA : + :type NumPy Array + :param ptB : + :type NumPy Array + :param text : + :type text : String + :param params["textoffset"]: + :type params["textoffset"]: float (offset of text from dimension line) + :param params["endlinedim"]: + :type params'["endlindim"] : float (dimension line at the end of the outer arrow) + :param params["arrowlen"]: + :type params["arrowlen"]: float (Size of the arrow) + ''' + + smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") + smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) + emarker = dwg.marker(insert=(8,0), size=(10,10), orient="auto") + emarker.add(dwg.polyline([(2.5,0), (0,3), (8,0), (0,-3)], fill='black')) + + dwg.defs.add(emarker) + dwg.defs.add(smarker) + + u = ptB - ptA # [a, b] + uUnit = self.normalize(u) + + vUnit = np.array([-uUnit[1], uUnit[0]]) # [-b, a] + + A1 = ptA + params["endlinedim"] * vUnit + A2 = ptA - params["endlinedim"]* (-vUnit) + dwg.add(dwg.line(A1,A2).stroke('black',width = 2.5,linecap = 'square')) + B1 = ptB + params["endlinedim"] * vUnit + B2 = ptB - params["endlinedim"]* (-vUnit) + dwg.add(dwg.line(B1,B2).stroke('black',width = 2.5,linecap = 'square')) + A3 = ptA - params["arrowlen"]* uUnit + B3 = ptB + params["arrowlen"]* uUnit + + line = dwg.add(dwg.line(A3, ptA).stroke('black', width = 2.5, linecap = 'square')) + line['marker-end'] = emarker.get_funciri() + line = dwg.add(dwg.line(B3, ptB).stroke('black', width = 2.5, linecap = 'square')) + line['marker-end'] = emarker.get_funciri() + txtPt = B3 + params["textoffset"] * uUnit + dwg.add(dwg.text(text, insert=(txtPt), fill='black',font_family = "sans-serif",font_size = 28)) + def drawArrow(self,line,s_arrow,e_arrow): + line['marker-start'] = s_arrow.get_funciri() + line['marker-end'] = e_arrow.get_funciri() + + def drawStartArrow(self,line,s_arrow): + line['marker-start'] = s_arrow.get_funciri() - self.A2 =(self.col_B,(self.col_L-self.D_beam)/2) - self.B = (self.col_B,0) + def drawEndArrow(self,line,e_arrow): + line['marker-end'] = e_arrow.get_funciri() + + + def drawOrientedArrow(self, dwg, pt, theta, orientation, offset, textUp,textDown): + ''' + Drawing an arrow on given direction + + :param dwg : + :type dwg : svgwrite (obj) + :param: ptA : + :type NumPy Array + :param theta: + :type theta : Int + :param orientation : + :type orientation : String + :param offset : + :type offset : float + :param textUp : + :type textUp : String + :param textDown : + :type textup : String + + ''' + #Right Up. + theta = math.radians(theta) + charWidth = 18 + xVec = np.array([1, 0]) + yVec = np.array([0, 1]) + + p1 = pt + lengthA = offset / math.sin(theta) + + arrowVec = None + if(orientation == "NE"): + arrowVec = np.array([-math.cos(theta), math.sin(theta)]) + elif(orientation == "NW"): + arrowVec = np.array([math.cos(theta), math.sin(theta)]) + elif(orientation == "SE"): + arrowVec = np.array([-math.cos(theta), -math.sin(theta)]) + elif(orientation == "SW"): + arrowVec = np.array([math.cos(theta), -math.sin(theta)]) + + p2 = p1 - lengthA * arrowVec + + text = textDown if len(textDown) > len(textUp) else textUp + lengthB = len(text) * charWidth + + labelVec = None + if(orientation == "NE"): + labelVec = -xVec + elif(orientation == "NW"): + labelVec = xVec + elif(orientation == "SE"): + labelVec = -xVec + elif(orientation == "SW"): + labelVec = xVec + + + p3 = p2 + lengthB * (-labelVec) + + txtOffset = 18 + offsetVec = - yVec + + txtPtUp = None + if(orientation == "NE"): + txtPtUp = p2 + 0.1 * lengthB * (-labelVec) + txtOffset * offsetVec + txtPtDwn = p2 - 0.1 * lengthB * (labelVec) - txtOffset * offsetVec + elif(orientation == "NW"): + txtPtUp = p3 + 0.1 * lengthB * labelVec + txtOffset * offsetVec + txtPtDwn = p3 - 0.1 * lengthB * labelVec - txtOffset * offsetVec + elif(orientation == "SE"): + txtPtUp = p2 + 0.1 * lengthB * (-labelVec) + txtOffset * offsetVec + txtPtDwn = p2 - 0.1 * lengthB * (labelVec) - txtOffset * offsetVec + elif(orientation == "SW"): + txtPtUp = p3 + 0.1 * lengthB * labelVec + txtOffset * offsetVec + txtPtDwn = p3 - 0.1 * lengthB * labelVec - txtOffset * offsetVec + + line = dwg.add(dwg.polyline(points=[p1, p2, p3], fill= 'none', stroke='black', stroke_width = 2.5)) + smarker = self.addSMarker(dwg) + line['marker-start'] = smarker.get_funciri() + + dwg.add(dwg.text(textUp, insert=(txtPtUp), fill='black',font_family = "sans-serif",font_size = 28)) + dwg.add(dwg.text(textDown, insert=(txtPtDwn), fill='black',font_family = "sans-serif",font_size = 28)) + + def saveToSvg(self): + ''' It returns the svg drawing depending upon connectivity + CFBW = Column Flange Beam Web + CWBW = Column Web Beam Web + BWBW = Beam Web Beam Web + ''' + fin2DFront = Fin2DCreatorFront(self) + fin2DTop = Fin2DCreatorTop(self) + fin2DSide = Fin2DCreatorSide(self) + + if self.connectivity == 'Column flange-Beam web': + fin2DFront.callCFBWfront() + fin2DSide.callCFBWSide() + fin2DTop.callCFBWTop() + + + elif self.connectivity == 'Column web-Beam web': + fin2DFront.callCWBWfront() + fin2DSide.callCWBWSide() + fin2DTop.callCWBWTop() + + else: + self.callBWBWSide() + +class Fin2DCreatorFront(object): + + def __init__(self,finCommonObj): + + self.dataObj = finCommonObj + + self.A2 =(self.dataObj.col_B,(self.dataObj.col_L-self.dataObj.D_beam)/2) + self.B = (self.dataObj.col_B,0) self.A = (0,0) - self.D = (0,self.col_L) - self.C = (self.col_B,self.col_L) - self.B2 = (self.col_B,(self.D_beam + self.col_L)/2) + self.D = (0,self.dataObj.col_L) + self.C = (self.dataObj.col_B,self.dataObj.col_L) + self.B2 = (self.dataObj.col_B,(self.dataObj.D_beam + self.dataObj.col_L)/2) - ptEx = (self.col_B-self.col_tw)/2 + ptEx = (self.dataObj.col_B-self.dataObj.col_tw)/2 ptEy = 0.0 self.E = (ptEx,ptEy) - ptHx = (self.col_B-self.col_tw)/2 - ptHy = self.col_L + ptHx = (self.dataObj.col_B-self.dataObj.col_tw)/2 + ptHy = self.dataObj.col_L self.H = (ptHx,ptHy) - ptFx = (self.col_B + self.col_tw)/2 + ptFx = (self.dataObj.col_B + self.dataObj.col_tw)/2 ptFy = 0 self.F = (ptFx,ptFy) - ptGx = (self.col_B + self.col_tw)/2 - ptGy = self.col_L - self.G = (ptGx,ptGy) + ptGx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + ptGy = self.dataObj.col_L + self.G = np.array([ptGx,ptGy]) #Draw rectangle for finPlate PRSU - ptPx = (self.col_B + self.col_tw)/2 - ptPy = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) + ptPx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + ptPy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) self.P = (ptPx,ptPy) self.ptP = np.array([ptPx,ptPy]) - self.U = self.ptP + plate_ht* np.array([0,1]) + self.U = self.ptP + (self.dataObj.plate_ht) * np.array([0,1]) - ptRx = (self.col_B + self.col_tw)/2 + plate_width - ptRy = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) + ptRx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.plate_width + ptRy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) self.R = (ptRx,ptRy) ptSx = ptRx - ptSy = ptPy + plate_ht + ptSy = ptPy + self.dataObj.plate_ht self.S = (ptSx,ptSy) - self.plate_ht = plate_ht - self.plate_width = plate_width - self.weld_thick = weld_thick - self.weld_len = weld_len - # Draw Rectangle for weld - - ptC1x = ((self.col_B + self.col_tw)/2 + 20) - ptC1y = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) - self.C1 =(ptC1x,ptC1y) + ptC1x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap) + ptC1y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.C1 =np.array([ptC1x,ptC1y]) - ptA1x = ((self.col_B + self.col_tw)/2 + 20) - ptA1y = ((self.col_L - self.D_beam)/2) - self.A1 = (ptA1x,ptA1y) + ptA1x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap) + ptA1y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + self.A1 = np.array([ptA1x,ptA1y]) - ptA3x = ((self.col_B + self.col_tw)/2 + 20) + self.beam_L - ptA3y = ((self.col_L - self.D_beam)/2) + ptA3x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap) + self.dataObj.beam_L + ptA3y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) self.A3 = (ptA3x,ptA3y) - ptB3x = ((self.col_B + self.col_tw)/2 + 20) + self.beam_L - ptB3y = ((self.col_L + self.D_beam)/2 ) + ptB3x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap) + self.dataObj.beam_L + ptB3y = ((self.dataObj.col_L + self.dataObj.D_beam)/2 ) self.B3 = (ptB3x,ptB3y) - ptB1x = ((self.col_B + self.col_tw)/2 + 20) - ptB1y = ((self.col_L + self.D_beam)/2 ) - self.B1 = (ptB1x,ptB1y) + ptB1x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap) + ptB1y = ((self.dataObj.col_L + self.dataObj.D_beam)/2 ) + self.B1 = np.array([ptB1x,ptB1y]) + self.ptB1 = np.array([ptB1x,ptB1y]) - ptC2x= ((self.col_B + self.col_tw)/2 + 20) - ptC2y = ptC1y + plate_ht + ptC2x= ((self.dataObj.col_B + self.dataObj.col_tw)/2 + 20) + ptC2y = ptC1y + self.dataObj.plate_ht self.C2 = (ptC2x,ptC2y) - ptA5x = ((self.col_B + self.col_tw)/2 + 20) - ptA5y = ((self.col_L - self.D_beam)/2) + self.beam_T + ptA5x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + 20) + ptA5y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + self.dataObj.beam_T self.A5 = ptA5x,ptA5y - ptA4x = ((self.col_B + self.col_tw)/2 + 20) + self.beam_L - ptA4y = ((self.col_L - self.D_beam)/2) + self.beam_T + ptA4x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + 20) + self.dataObj.beam_L + ptA4y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + self.dataObj.beam_T self.A4 = (ptA4x,ptA4y) - ptB4x = ((self.col_B + self.col_tw)/2 + 20) + self.beam_L - ptB4y = ((self.col_L + self.D_beam)/2 ) - self.beam_T + ptB4x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + 20) + self.dataObj.beam_L + ptB4y = ((self.dataObj.col_L + self.dataObj.D_beam)/2 ) - self.dataObj.beam_T self.B4 = (ptB4x,ptB4y) - ptBx5 = ((self.col_B + self.col_tw)/2) + 20 - ptBy5 = ((self.col_L + self.D_beam)/2 ) - self.beam_T + ptBx5 = ((self.dataObj.col_B + self.dataObj.col_tw)/2) + 20 + ptBy5 = ((self.dataObj.col_L + self.dataObj.D_beam)/2 ) - self.dataObj.beam_T self.B5 = (ptBx5,ptBy5) - ptP1x = ((self.col_B + self.col_tw)/2 + self.edge_dist) - ptP1y = ((self.col_L - self.D_beam)/2 +(self.col_tw + self.R1 + 3)+ self.end_dist) + ptP1x = ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist) + ptP1y = ((self.dataObj.col_L - self.dataObj.D_beam)/2 +(self.dataObj.col_tw + self.dataObj.beam_R1 + 3)+ self.dataObj.end_dist) self.P1 = (ptP1x,ptP1y) #### Column flange points for column flange beam web connectivity ##### - fromPlate_pt = self.D_col + 20 # 20 mm clear distance between colume and beam + fromPlate_pt = self.dataObj.D_col + self.dataObj.gap # 20 mm clear distance between colume and beam ptFAx = 0 ptFAy = 0 self.FA = (ptFAx,ptFAy) - ptFEx = self.col_T + ptFEx = self.dataObj.col_T ptFEy = 0.0 self.FE =(ptFEx,ptFEy) - ptFFx = self.D_col - self.col_T + ptFFx = self.dataObj.D_col - self.dataObj.col_T ptFFy = 0.0 self.FF =(ptFFx,ptFFy) - ptFBx = self.D_col + ptFBx = self.dataObj.D_col ptFBy = 0.0 self.FB =(ptFBx,ptFBy) - ptFCx = self.D_col - ptFCy = self.col_L - self.FC = (ptFBx,ptFCy) + ptFCx = self.dataObj.D_col + ptFCy = self.dataObj.col_L + self.FC = np.array([ptFBx,ptFCy]) - ptFGx = self.D_col - self.col_T - ptFGy = self.col_L + ptFGx = self.dataObj.D_col - self.dataObj.col_T + ptFGy = self.dataObj.col_L self.FG =(ptFGx,ptFGy) - ptFHx = self.col_T - ptFHy = self.col_L + ptFHx = self.dataObj.col_T + ptFHy = self.dataObj.col_L self.FH =(ptFHx,ptFHy) ptFDx = 0.0 - ptFDy = self.col_L + ptFDy = self.dataObj.col_L self.FD =(ptFDx,ptFDy) - ptFPx = self.D_col - ptFPy = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) + ptFPx = self.dataObj.D_col + ptFPy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) self.FP = (ptFPx,ptFPy) self.ptFP = np.array([ptFPx,ptFPy]) - ptFUx = self.D_col - ptFUy = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) + self.plate_ht + ptFUx = self.dataObj.D_col + ptFUy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht self.FU = (ptFUx,ptFUy) - ptFC1x = ptFPx + 20 - ptFC1y = ptFPy - self.FC1 = (ptFC1x,ptFC1y) #FC1 ptFC1x = fromPlate_pt - ptFC1y = ((self.col_L - self.D_beam)/2) + (self.beam_T + beam_R1 + 3) - self.FC1 = (ptFC1x, ptFC1y) + ptFC1y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.FC1 = np.array([ptFC1x, ptFC1y]) #FC2 ptFC2x = fromPlate_pt - ptFC2y = ((self.col_L - self.D_beam)/2) +( self.beam_T + beam_R1 + 3) + self.plate_ht + ptFC2y = ((self.dataObj.col_L - self.dataObj.D_beam)/2) +( self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht self.FC2 = (ptFC2x, ptFC2y) #FA1 ptFA1x = fromPlate_pt - ptFA1y = (self.col_L - self.D_beam)/2 - self.FA1 = ptFA1x, ptFA1y + ptFA1y = (self.dataObj.col_L - self.dataObj.D_beam)/2 + self.FA1 = np.array([ptFA1x, ptFA1y]) #FA4 ptFA4x = fromPlate_pt - ptFA4y = (self.col_L - self.D_beam)/2 + self.beam_T + ptFA4y = (self.dataObj.col_L - self.dataObj.D_beam)/2 + self.dataObj.beam_T self.FA4 = ptFA4x, ptFA4y #FA2 - ptFA2x = ptFC1x + self.beam_L + ptFA2x = ptFC1x + self.dataObj.beam_L ptFA2y = ptFA1y - self.FA2 = ptFA2x, ptFA2y + self.FA2 = np.array([ptFA2x, ptFA2y]) #FA3 - ptFA3x = fromPlate_pt + self.beam_L - ptFA3y = (((self.col_L - self.D_beam)/2 ) + self.beam_T) + ptFA3x = fromPlate_pt + self.dataObj.beam_L + ptFA3y = (((self.dataObj.col_L - self.dataObj.D_beam)/2 ) + self.dataObj.beam_T) self.FA3 = ptFA3x, ptFA3y #FB3 - ptFB3x = fromPlate_pt + self.beam_L - ptFB3y = ((self.col_L - self.D_beam)/2 + self.D_beam) - self.beam_T + ptFB3x = fromPlate_pt + self.dataObj.beam_L + ptFB3y = ((self.dataObj.col_L - self.dataObj.D_beam)/2 + self.dataObj.D_beam) - self.dataObj.beam_T self.FB3 = (ptFB3x, ptFB3y) #FB2 - ptFB2x = fromPlate_pt + self.beam_L - ptFB2y = (self.col_L -self.D_beam)/2 + self.D_beam + ptFB2x = fromPlate_pt + self.dataObj.beam_L + ptFB2y = (self.dataObj.col_L -self.dataObj.D_beam)/2 + self.dataObj.D_beam self.FB2 = ptFB2x, ptFB2y #FB1 - ptFB1x = self.D_col + 20 - ptFB1y = (self.col_L - self.D_beam)/2 + self.D_beam - self.FB1 = ptFB1x, ptFB1y + ptFB1x = self.dataObj.D_col + self.dataObj.gap + ptFB1y = (self.dataObj.col_L - self.dataObj.D_beam)/2 + self.dataObj.D_beam + self.FB1 = np.array([ptFB1x, ptFB1y]) + #FB4 ptFB4x = fromPlate_pt - ptFB4y = ((self.col_L - self.D_beam)/2 + self.D_beam) - self.beam_T + ptFB4y = ((self.dataObj.col_L - self.dataObj.D_beam)/2 + self.dataObj.D_beam) - self.dataObj.beam_T self.FB4 = ptFB4x, ptFB4y - # points for diamension - - def callBWBWfront(self): pass - def saveToSvg(self): - ''' It returns the svg drawing depending upon connectivity - CFBW = Column Flange Beam Web - CWBW = Column Web Beam Web - BWBW = Beam Web Beam Web - ''' - if self.connectivity == 'Column flange-Beam web': - self.callCFBWfront() - - elif self.connectivity == 'Column web-Beam web': - self.callCWBWfront() - - else: - self.callBWBWfront() - def callCFBWfront(self): dwg = svgwrite.Drawing('finfront.svg', profile='full') @@ -267,25 +527,32 @@ class Fin2DCreatorFront(object): dwg.add(dwg.line((self.FC1),(self.FC2)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5]))) dwg.add(dwg.line((self.FA4),(self.FA3)).stroke('blue',width = 2.5,linecap = 'square')) dwg.add(dwg.line((self.FB4),(self.FB3)).stroke('blue',width = 2.5,linecap = 'square')) - dwg.add(dwg.rect(insert=(self.FP), size=(self.plate_width, self.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) - dwg.add(dwg.rect(insert=(self.FP), size=(self.plate_width, self.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) - dwg.add(dwg.rect(insert=(self.FP), size=(self.weld_thick, self.plate_ht),fill = 'none', stroke='blue', stroke_width=2.0)) - nr = self.no_of_rows - nc = self.no_of_col - bolt_r = self.bolt_dia/2 + + # Weld hatching to represent WELD. + pattern = dwg.defs.add(dwg.pattern(id ="diagonalHatch",size=(4, 4), patternUnits="userSpaceOnUse",patternTransform="rotate(45 2 2)")) + pattern.add(dwg.path(d = "M -1,2 l 6,0", stroke='#000000',stroke_width = 0.7)) + dwg.add(dwg.rect(insert=(self.FP), size=(self.dataObj.weld_thick, self.dataObj.plate_ht),fill= "url(#diagonalHatch)", stroke='white', stroke_width=2.0)) + + dwg.add(dwg.rect(insert=(self.FP), size=(self.dataObj.plate_width, self.dataObj.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) + dwg.add(dwg.rect(insert=(self.FP), size=(self.dataObj.plate_width, self.dataObj.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) + + + nr = self.dataObj.no_of_rows + nc = self.dataObj.no_of_col + bolt_r = self.dataObj.bolt_dia/2 ptList = [] for i in range(1,(nr+1)): colList = [] for j in range (1,(nc+1)): - pt = self.ptFP + 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]) + pt = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) + \ + (i-1) * self.dataObj.pitch * np.array([0,1]) + (j-1) * self.dataObj.gauge * np.array([1,0]) dwg.add(dwg.circle(center=(pt), r = bolt_r, stroke='blue',fill = 'none',stroke_width=1.5)) 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('red',width = 2.0,linecap = 'square')) - ptE = self.ptFP + self.edge_dist * np.array([1,0]) +(j-1) * self.gauge * np.array([1,0]) - ptF = ptE + self.plate_ht * np.array([0,1]) + ptE = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) +(j-1) * self.dataObj.gauge * np.array([1,0]) + ptF = ptE + self.dataObj.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]))) colList.append(pt) ptList.append(colList) @@ -294,107 +561,159 @@ class Fin2DCreatorFront(object): for row in ptList: if len(row) > 0: pitchPts.append(row[0]) - params = {"offset": self.D_col + self.edge_dist + 50, "textoffset": 105, "lineori": "right", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]), str(len(pitchPts)-1)+ u' \u0040'+ str(self.pitch) + "mm c/c", params) + params = {"offset": self.dataObj.D_col + self.dataObj.edge_dist + 50, "textoffset": 235, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]), str(len(pitchPts)-1)+ u' \u0040'+ str(int(self.dataObj.pitch)) + " mm c/c", params) + + # Distance between Beam Flange and Plate + + params = {"offset": self.dataObj.D_col + self.dataObj.gap + 50, "textoffset": 125, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, self.FA1, self.FC1, str(int(self.dataObj.beam_T + self.dataObj.beam_R1 + 3)) + " mm", params) + # Draw Faint Line To Represent Distance Between Beam Flange and Plate. + ptOne = self.FA1 + ptBx = -30 + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + ptTwo = (ptBx,ptBy) + self.dataObj.drawFaintLine(ptOne, ptTwo, dwg) # End Distance from the starting point of plate Information - edgPtx = (self.D_col) + self.edge_dist - edgPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + edgPtx = (self.dataObj.D_col) + self.dataObj.edge_dist + edgPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) edgPt = (edgPtx,edgPty) - params = {"offset": self.D_col + self.edge_dist + 50, "textoffset": 75, "lineori": "left", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array([edgPtx,edgPty]), str(self.end_dist) + "mm", params) + params = {"offset": self.dataObj.D_col + self.dataObj.edge_dist + 50, "textoffset": 125, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array([edgPtx,edgPty]), str(int(self.dataObj.end_dist)) + " mm", params) # End Distance from plate end point. edgPt1x = edgPtx - edgPt1y = edgPty + self.plate_ht + edgPt1y = edgPty + self.dataObj.plate_ht edgPt1 = (edgPt1x,edgPt1y) - params = {"offset": self.D_col + self.edge_dist + 50, "textoffset": 75, "lineori": "right", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), np.array([edgPt1x,edgPt1y]), str(self.end_dist) + "mm", params) + params = {"offset": self.dataObj.D_col + self.dataObj.edge_dist + 50, "textoffset": 125, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), np.array([edgPt1x,edgPt1y]), str(int(self.dataObj.end_dist)) + " mm", params) # Edge Distance information - pt1A = self.ptFP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) + \ - (self.no_of_col)* self.gauge * np.array([1,0]) - pt1B = self.ptFP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) + \ - (self.no_of_col)* self.gauge * np.array([1,0]) + self.edge_dist * np.array([0,1]) - offset = self.end_dist + self.beam_T + self.R1 +3 - params = {"offset": self.D_col + self.edge_dist + 50, "textoffset": 75, "lineori": "left", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, pt1A, pt1B, str(self.edge_dist) + "mm", params) - - # Draws faint line to show dimensions + pt1A = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + \ + (self.dataObj.no_of_col-1)* self.dataObj.gauge * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) + pt1B = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + \ + (self.dataObj.no_of_col-1)* self.dataObj.gauge * np.array([1,0]) + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) + offset = self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 +3 + params = {"offset": self.dataObj.D_col + self.dataObj.edge_dist , "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, pt1A, pt1B, str(int(self.dataObj.edge_dist)) + " mm" , params) + + # Faint line for Edge distance dimension + ptB1 = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + \ + (self.dataObj.no_of_col-1)* self.dataObj.gauge * np.array([1,0]) + self.dataObj.edge_dist * np.array([1,0]) + ptB2 = ptB1 + ((self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 +3) + 115)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptB1,ptB2,dwg) + + # Gauge Distance + + if self.dataObj.no_of_col > 1: + A = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array([0,1]) + B = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + \ + (self.dataObj.no_of_col-1)* self.dataObj.gauge * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) + offset = (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + 130 + params = {"offset": offset, "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, A, B, str(int(self.dataObj.gauge)) + " mm" , params) + FA = self.FP + self.dataObj.edge_dist * np.array([1,0]) + FB = self.FP + self.dataObj.edge_dist * np.array([1,0]) + ((self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + 70) * np.array([0,-1]) + self.dataObj.drawFaintLine(FA, FB, dwg) + + # Gap Distance + gapPt = self.dataObj.col_L - ((self.dataObj.col_L - self.dataObj.D_beam)/2 + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3)) + ptG1 = self.ptFP + (gapPt + 30) * np.array([0,1]) + ptG2 = self.FC1 + (gapPt + 30) * np.array([0,1]) + offset = self.dataObj.col_L # 60% of the column length + params = {"offset": offset, "textoffset": 20, "lineori": "left", "endlinedim":10,"arrowlen":50} + self.dataObj.draw_dimension_innerArrow(dwg, ptG1, ptG2, str(self.dataObj.gap) + " mm", params) + + # Draw Faint line for Gap Distance + ptC1 = self.FC + ptC2 = ptC1 + 40 * np.array([0,1]) + self.dataObj.drawFaintLine(ptC1,ptC2,dwg) + + ptD1 = self.FB1 + ptD2 = ptD1 + 240 * np.array([0,1]) + self.dataObj.drawFaintLine(ptD1,ptD2,dwg) + + ###### Draws faint line to show dimensions ######### + # Faint lines for gauge and edge distances + ptA1 = self.ptFP + self.dataObj.edge_dist * np.array([1,0]) + \ + (self.dataObj.no_of_col-1)* self.dataObj.gauge * np.array([1,0]) + ptA2 = ptA1 + ((self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 +3) + 115)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptA1, ptA2, dwg) + ptA = self.FP ptBx = -30 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) ptB = (ptBx,ptBy) - self.drawFaintLine(ptA, ptB, dwg) + self.dataObj.drawFaintLine(ptA, ptB, dwg) - pt1 = np.array(pitchPts[0]) + pt1 = np.array(pitchPts[0]) - 20 * np.array([1,0]) ptBx = -30 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.end_dist + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.end_dist pt2 = (ptBx,ptBy) - self.drawFaintLine(pt1, pt2, dwg) + self.dataObj.drawFaintLine(pt1, pt2, dwg) ptOne = np.array(pitchPts[len( pitchPts)-1]) ptBx = -30 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + (self.plate_ht -self.end_dist) + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + (self.dataObj.plate_ht -self.dataObj.end_dist) ptTwo = (ptBx,ptBy) - self.drawFaintLine(ptOne, ptTwo, dwg) + self.dataObj.drawFaintLine(ptOne, ptTwo, dwg) ptOne = self.FU ptBx = -30 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.plate_ht + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht ptTwo = (ptBx,ptBy) - self.drawFaintLine(ptOne, ptTwo, dwg) + self.dataObj.drawFaintLine(ptOne, ptTwo, dwg) + # Beam Information - beam_ptx = self.D_col + 20 + (self.beam_L* 3/4) - beam_py = ((self.col_L - self.D_beam)/2) + self.D_beam - beam_pt = np.array([beam_ptx,beam_py]) - theta = 45 - offset = (self.D_beam * 3)/8 - textUp = "Beam " + self.beam_Designation + beam_pt = self.FA2 + self.dataObj.D_beam/2 * np.array([0,1]) + theta = 1 + offset = 0.0 + textUp = "Beam " + self.dataObj.beam_Designation textDown = "" - self.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) # Column Designation - ptx = self.D_col /2 + ptx = self.dataObj.D_col /2 pty = 0 pt = np.array([ptx,pty]) theta = 30 - offset = self.col_L /10 - textUp = "Column " + self.col_Designation + offset = self.dataObj.col_L /10 + textUp = "Column " + self.dataObj.col_Designation textDown = "" - self.drawOrientedArrow(dwg, pt, theta, "NW", offset, textUp,textDown) + self.dataObj.drawOrientedArrow(dwg, pt, theta, "NW", offset, textUp,textDown) # Weld Information - weldPtx = (self.D_col) - weldPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + weldPtx = (self.dataObj.D_col) + weldPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) weldPt = np.array([weldPtx,weldPty]) theta = 45 - offset = self.col_B - textUp = " z " + str(self.weld_thick) + " mm" + offset = self.dataObj.col_B + textUp = " z " + str(int(self.dataObj.weld_thick)) + " mm" textDown = u"\u25C1" - self.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) # Bolt Information - bltPtx = self.FP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) +(self.no_of_col-1) * self.gauge * np.array([1,0]) + bltPtx = self.FP + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) +(self.dataObj.no_of_col-1) * self.dataObj.gauge * np.array([1,0]) theta = 45 - offset = (self.D_beam * 3)/8 - textUp = str(self.no_of_rows) + " nos " + str(self.bolt_dia) + u'\u00d8' + " holes" + offset = (self.dataObj.D_beam * 3)/8 + textUp = str(self.dataObj.no_of_rows) + " nos " + str(int(self.dataObj.bolt_dia)) + u'\u00d8' + " holes" textDown = "for M20 bolts (grade 8.8)" - self.drawOrientedArrow(dwg, bltPtx, theta, "NE", offset, textUp,textDown) + self.dataObj.drawOrientedArrow(dwg, bltPtx, theta, "NE", offset, textUp,textDown) # Plate Information - pltPtx = self.D_col + self.plate_width /2 - pltPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.plate_ht + pltPtx = self.dataObj.D_col + self.dataObj.plate_width /2 + pltPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht pltPt = np.array([pltPtx,pltPty]) theta = 45 - offset = (self.D_beam)/2 - textUp = "PLT. " + str(self.plate_ht) +"X" + str(self.plate_width) +"X" + str(self.plate_thick) + offset = (self.dataObj.D_beam)/2 + textUp = "PLT. " + str(int(self.dataObj.plate_ht)) +"X" + str(int(self.dataObj.plate_width)) +"X" + str(int(self.dataObj.plate_thick)) textDown = "" - self.drawOrientedArrow(dwg, pltPt, theta, "SE", offset, textUp, textDown) + self.dataObj.drawOrientedArrow(dwg, pltPt, theta, "SE", offset, textUp, textDown) dwg.save() - print"Saved CFBWfront" + print"########### Column Flange Beam Web Saved ############" @@ -410,8 +729,14 @@ class Fin2DCreatorFront(object): 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)) + + # Diagonal Hatching to represent WELD + pattern = dwg.defs.add(dwg.pattern(id ="diagonalHatch",size=(4, 4), patternUnits="userSpaceOnUse",patternTransform="rotate(45 2 2)")) + pattern.add(dwg.path(d = "M -1,2 l 6,0", stroke='#000000',stroke_width = 0.7)) + dwg.add(dwg.rect(insert=(self.P), size=(self.dataObj.weld_thick, self.dataObj.plate_ht),fill= "url(#diagonalHatch)", stroke='white', stroke_width=2.0)) + + dwg.add(dwg.rect(insert=(self.P), size=(self.dataObj.plate_width, self.dataObj.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) + #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 @@ -420,22 +745,22 @@ class Fin2DCreatorFront(object): 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 + nr = self.dataObj.no_of_rows + nc = self.dataObj.no_of_col + bolt_r = self.dataObj.bolt_dia/2 ptList = [] for i in range(1,(nr+1)): colList = [] 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]) + pt = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) + \ + (i-1) * self.dataObj.pitch * np.array([0,1]) + (j-1) * self.dataObj.gauge * np.array([1,0]) dwg.add(dwg.circle(center=(pt), r = bolt_r, stroke='blue',fill = 'none',stroke_width=1.5)) 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('red',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]) + ptE = self.ptP + self.dataObj.edge_dist * np.array([1,0]) +(j-1) * self.dataObj.gauge * np.array([1,0]) + ptF = ptE + self.dataObj.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]))) colList.append(pt) ptList.append(colList) @@ -444,334 +769,667 @@ class Fin2DCreatorFront(object): for row in ptList: if len(row) > 0: pitchPts.append(row[0]) - -# for i in range (len( pitchPts)-1): -# params = {"offset": self.col_B + 10, "textoffset": 35, "lineori": "right", "endlinedim":10} -# self.draw_dimension_outerArrow(dwg, np.array(pitchPts[i]), np.array(pitchPts[i + 1]), str(self.pitch) + "mm", params) - params = {"offset": self.col_B + 30, "textoffset": 105, "lineori": "right", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]), str(len(pitchPts)-1)+ u' \u0040'+ str(self.pitch) + "mm c/c", params) + txtOffset = (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist + 80 + params = {"offset": (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist + 80, "textoffset": txtOffset, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]), str(len(pitchPts)-1)+ u' \u0040'+ str(int(self.dataObj. pitch)) + " mm c/c", params) # End Distance from the starting point of plate Information - edgPtx = (self.col_B + self.col_tw)/2 + self.edge_dist - edgPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + edgPtx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist + edgPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) edgPt = (edgPtx,edgPty) - params = {"offset": self.col_B + 30, "textoffset": 75, "lineori": "left", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array([edgPtx,edgPty]), str(self.end_dist) + "mm", params) + params = {"offset": (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist + 80, "textoffset": 120, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array([edgPtx,edgPty]), str(int(self.dataObj.end_dist)) + " mm", params) + + # Distance between Beam Flange and Plate + offset = (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap + 50 + params = {"offset":(self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap + 80, "textoffset": 125, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, self.A1, self.C1, str(int(self.dataObj.beam_T + self.dataObj.beam_R1 + 3)) + " mm", params) - # Draw Faint line for dimenssions + # Draw Faint line for dimensions ptOne = self.P - ptTwox = -45 - ptTwoy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + ptTwox = -60 + ptTwoy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) ptTwo = (ptTwox,ptTwoy) - self.drawFaintLine(ptOne, ptTwo, dwg) + self.dataObj.drawFaintLine(ptOne, ptTwo, dwg) pt1 = np.array(pitchPts[0]) - ptTwox = -45 - ptTwoy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.end_dist + ptTwox = -60 + ptTwoy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.end_dist pt2 = (ptTwox,ptTwoy) - self.drawFaintLine(pt1, pt2, dwg) + self.dataObj.drawFaintLine(pt1, pt2, dwg) ptA = np.array(pitchPts[len( pitchPts)-1]) - ptBx = -45 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + (self.plate_ht -self.end_dist) + ptBx = -60 + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + (self.dataObj.plate_ht -self.dataObj.end_dist) ptB = (ptBx,ptBy) - self.drawFaintLine(ptA, ptB, dwg) + self.dataObj.drawFaintLine(ptA, ptB, dwg) ptOne = self.U - ptBx = -45 - ptBy = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.plate_ht + ptBx = -60 + ptBy = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht ptTwo = (ptBx,ptBy) - self.drawFaintLine(ptOne, ptTwo, dwg) + self.dataObj.drawFaintLine(ptOne, ptTwo, dwg) # End Distance from plate end point. edgPt1x = edgPtx - edgPt1y = edgPty + self.plate_ht + edgPt1y = edgPty + self.dataObj.plate_ht edgPt1 = (edgPt1x,edgPt1y) - params = {"offset": self.col_B + 30, "textoffset": 75, "lineori": "right", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), np.array([edgPt1x,edgPt1y]), str(self.end_dist) + "mm", params) - + params = {"offset": (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.edge_dist + 80, "textoffset": 120, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), np.array([edgPt1x,edgPt1y]), str(int(self.dataObj.end_dist)) + " mm" , params) + + # Gap Distance + # Draw Faint Lines to representation of Gap distance # + dist1 = self.dataObj.col_L - ((self.dataObj.col_L - self.dataObj.D_beam)/2 + self.dataObj.D_beam) + ptA = self.B1 + ptB = self.B1 + (dist1 + 100)* np.array([0,1]) + self.dataObj.drawFaintLine(ptA,ptB,dwg) + ptC = self.G + ptD = ptC + (100)*np.array([0,1]) + self.dataObj.drawFaintLine(ptC,ptD,dwg) + ptG1 = self.B1 + (dist1 + 50)* np.array([0,1]) + ptG2 = self.B1 + self.dataObj.gap * np.array([-1,0]) + (dist1 + 50)* np.array([0,1]) + offset = 1 + params = {"offset": offset, "textoffset": 120, "lineori": "right", "endlinedim":10,"arrowlen":50} + self.dataObj.draw_dimension_innerArrow(dwg, ptG1, ptG2, str(self.dataObj.gap) + " mm", params) + # Gauge Distance Information gaugePts = ptList[0] for i in range (len( gaugePts)-1): - offset_dist = self.D_beam + 300 + offset_dist = -(self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 100) params = {"offset": offset_dist, "textoffset": 35, "lineori": "right", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array(gaugePts[i]), np.array(gaugePts[i + 1]), str(int(self.gauge)) + "mm", params) + ptP = np.array(gaugePts[i]) + ptQ = np.array(gaugePts[i + 1]) + self.dataObj.draw_dimension_outerArrow(dwg, ptP, ptQ, str(int(self.dataObj.gauge)) + " mm", params) if len(ptList[(len(ptList)-1)]) > 1: - ptA = self.ptP + self.edge_dist * np.array([1,0]) + self.plate_ht * np.array([0,1]) - ptB = ptA + (self.D_beam + 80)* np.array([0,1]) - self.drawFaintLine(ptA, ptB, dwg) + ptA = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + ptB = ptA + (self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 50)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptA, ptB, dwg) - ptC = self.ptP + self.edge_dist * np.array([1,0]) + self.plate_ht * np.array([0,1]) +self.gauge * np.array([1,0]) - ptD = ptC + (self.D_beam + 80)* np.array([0,1]) - self.drawFaintLine(ptC, ptD, dwg) - - # End Distance Information - boltPt = self.ptFP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) + \ - (self.no_of_col-1) * self.gauge * np.array([1,0]) - endPtx = (self.col_B + self.col_tw)/2 + self.plate_width - engPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.end_dist - params = {"offset": 1, "textoffset": 50, "lineori": "left", "endlinedim":10} - self.draw_dimension_outerArrow(dwg, np.array([endPtx,engPty]),boltPt, str(int(self.edge_dist)) + "mm", params) + ptC = self.ptP + self.dataObj.edge_dist * np.array([1,0]) +self.dataObj.gauge * np.array([1,0]) + ptD = ptC + (self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 50)* np.array([0,-1]) + #self.dataObj.drawFaintLine(ptC, ptD, dwg) + + # Edge Distance Information + ptA = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + (self.dataObj.no_of_col-1) * self.dataObj.gauge * np.array([1,0]) + ptB = ptA + self.dataObj.edge_dist * np.array([1,0]) + offsetDist = -(self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 120) + params = {"offset": offsetDist, "textoffset": 35, "lineori": "right", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg,ptA,ptB, str(int(self.dataObj.edge_dist)) + " mm", params) + # Draw Faint line for Edge distance + ptC = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + (self.dataObj.no_of_col-1) * self.dataObj.gauge * np.array([1,0]) + ptD = ptC + (self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 100)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptC, ptD, dwg) + ptE = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + (self.dataObj.no_of_col-1) * self.dataObj.gauge * np.array([1,0]) + self.dataObj.edge_dist * np.array([1,0]) + ptF = ptE + (self.dataObj.end_dist + self.dataObj.beam_T + self.dataObj.beam_R1 + 3 + dist1 + 100)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptE, ptF, dwg) # Plate Width Information - pltPtx = (self.col_B + self.col_tw)/2 + self.plate_width /2 - pltPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + self.plate_ht + pltPtx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.plate_width /2 + pltPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) + self.dataObj.plate_ht pltPt = np.array([pltPtx,pltPty]) theta = 45 - offset = (self.D_beam)/2 - textUp = "PLT. " + str(int(self.plate_ht)) +"X" + str(int(self.plate_width)) +"X" + str(int(self.plate_thick)) + offset = (self.dataObj.D_beam)/2 + textUp = "PLT. " + str(int(self.dataObj.plate_ht)) +"X" + str(int(self.dataObj.plate_width)) +"X" + str(int(self.dataObj.plate_thick)) textDown = "" - self.drawOrientedArrow(dwg, pltPt, theta, "SE", offset, textUp, textDown) + self.dataObj.drawOrientedArrow(dwg, pltPt, theta, "SE", offset, textUp, textDown) dwg.defs.add(emarker) dwg.defs.add(smarker) -# params["lineori"] = "left" -# params["offset"] = self.col_B + 80 -# params["textoffset"] = 60 -# self.draw_dimension_outerArrow(dwg, np.array(self.S), np.array(self.R), str(self.plate_ht) + "mm", params) - - params = {"offset": 20, "textoffset": 10, "lineori": "right", "endlinedim":10,"arrowlen":50} - ptA = (np.array(self.B1) + np.array(self.B3)) * 0.5 - ptB = (np.array(self.B5) + np.array(self.B4)) * 0.5 - #self.draw_dimension_innerArrow(dwg, ptA, ptB, str(self.beam_T), params) - # Column Designation - ptx = self.col_B /2 + ptx = self.dataObj.col_B /2 pty = 0 pt = np.array([ptx,pty]) theta = 30 - offset = self.col_L /10 - textUp = "Column " + self.col_Designation + offset = self.dataObj.col_L /10 + textUp = "Column " + self.dataObj.col_Designation textDown = "" - self.drawOrientedArrow(dwg, pt, theta, "NW", offset, textUp,textDown) + self.dataObj.drawOrientedArrow(dwg, pt, theta, "NW", offset, textUp,textDown) # Bolt Information - bltPtx = self.ptP + self.edge_dist * np.array([1,0]) + self.end_dist * np.array ([0,1]) +(self.no_of_col-1) * self.gauge * np.array([1,0]) + bltPtx = self.ptP + self.dataObj.edge_dist * np.array([1,0]) + self.dataObj.end_dist * np.array ([0,1]) +(self.dataObj.no_of_col-1) * self.dataObj.gauge * np.array([1,0]) theta = 45 - offset = (self.D_beam * 3)/8 - textUp = str(self.no_of_rows) + " nos " + str(self.bolt_dia) + u'\u00d8' + " holes" + offset = (self.dataObj.D_beam * 3)/8 + textUp = str(self.dataObj.no_of_rows) + " nos " + str(self.dataObj.bolt_dia) + u'\u00d8' + " holes" textDown = "for M20 bolts (grade 8.8)" - self.drawOrientedArrow(dwg, bltPtx, theta, "NE", offset, textUp,textDown) + self.dataObj.drawOrientedArrow(dwg, bltPtx, theta, "NE", offset, textUp,textDown) + # Beam Information - beam_ptx = self.col_B + 20 + (self.beam_L/2) - beam_py = ((self.col_L - self.D_beam)/2) + self.D_beam - beam_pt = np.array([beam_ptx,beam_py]) - theta = 45 - offset = (self.D_beam * 3)/8 - textUp = "Beam " + self.beam_Designation + beam_pt = self.ptB1 + (self.dataObj.beam_L) * np.array([1,0])+ self.dataObj.D_beam/2 * np.array([0,-1]) + theta = 1 + offset = 0.0 + textUp = "Beam " + self.dataObj.beam_Designation textDown = "" - self.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) # Weld Information - weldPtx = (self.col_B + self.col_tw)/2 - weldPty = ((self.col_L - self.D_beam)/2) + (self.beam_T + self.R1 + 3) + weldPtx = (self.dataObj.col_B + self.dataObj.col_tw)/2 + weldPty = ((self.dataObj.col_L - self.dataObj.D_beam)/2) + (self.dataObj.beam_T + self.dataObj.beam_R1 + 3) weldPt = np.array([weldPtx,weldPty]) theta = 45 - offset = self.col_B - textUp = " z " + str(self.weld_thick) + " mm" + offset = self.dataObj.col_B + textUp = " z " + str(self.dataObj.weld_thick) + " mm" textDown = "" - self.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) - + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) dwg.save() - print"Saved" + print"########### Column Web Beam Web Saved ############" + +class Fin2DCreatorTop(object): - #,dimelinePt1,dimelinePt2,orient,s_arrow,e_arrow - def draw_dimension_outerArrow(self, dwg, pt1, pt2, text, params): + def __init__(self,finCommonObj): + + self.dataObj = finCommonObj + self.A = np.array([0,0]) + self.B = np.array([0,0]) + (self.dataObj.col_B)* np.array([1,0]) + self.C = self.B + (self.dataObj.col_T)* np.array([0,1]) + self.D = self.A + (self.dataObj.col_B + self.dataObj.col_tw)/2 * np.array([1,0]) + (self.dataObj.col_T) * np.array([0,1]) + self.E = self.A + (self.dataObj.col_B + self.dataObj.col_tw)/2 * np.array([1,0]) + (self.dataObj.D_col - self.dataObj.col_T)* np.array([0,1]) + self.F = self.B + (self.dataObj.D_col - self.dataObj.col_T)* np.array([0,1]) + self.G = self.B + (self.dataObj.D_col)* np.array([0,1]) + self.H = self.A + (self.dataObj.D_col)* np.array([0,1]) + self.I = self.A + (self.dataObj.D_col - self.dataObj.col_T)* np.array([0,1]) + self.J = self.E - (self.dataObj.col_tw) * np.array([1,0]) + self.K = self.D - (self.dataObj.col_tw) * np.array([1,0]) + self.L = self.A + (self.dataObj.col_T)* np.array([0,1]) + self.A1 = self.A + ((self.dataObj.col_B + self.dataObj.col_tw)/2 + self.dataObj.gap)* np.array([1,0]) + (self.dataObj.col_T + self.dataObj.beam_R1) * np.array([0,1]) + self.A4 = self.A1 + self.dataObj.beam_B * np.array([0,1]) + self.A7 = self.A1 + (self.dataObj.beam_B - self.dataObj.beam_tw) /2 * np.array([0,1]) + self.A5 = self.A7 - 20 * np.array([1,0]) + self.A8 = self.A7 + (self.dataObj.beam_L) * np.array([1,0]) + self.P1 = self.A1 + (self.dataObj.beam_B + self.dataObj.beam_tw) /2 * np.array([0,1]) + self.A6 = self.P1 + (self.dataObj.beam_L) * np.array([1,0]) + self.P = self.P1 - 20 * np.array([1,0]) + self.P2 = self.P + (self.dataObj.plate_width) * np.array([1,0]) + self.P4 = self.P1 + (self.dataObj.plate_thick)* np.array([0,1]) + self.P3 = self.P2 + (self.dataObj.plate_thick)* np.array([0,1]) + + # Weld Triangle + + self.ptP = self.P + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + self.O = self.P + self.dataObj.weld_thick * np.array([1,0]) + self.ptO = self.O + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + self.R = self.P + self.dataObj.weld_thick * np.array([0,-1]) + self.ptR = self.R + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + + self.X = self.P + (self.dataObj.plate_thick)* np.array([0,1]) + self.ptX = self.X + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + self.Y = self.X + (self.dataObj.weld_thick) * np.array([0,1]) + self.ptY = self.Y + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + self.Z = self.X + (self.dataObj.weld_thick) * np.array([1,0]) + self.ptZ = self.Z + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + + + #### CFBW connectivity points + self.FA = np.array([0,0]) + self.FB = self.FA + self.dataObj.col_T * np.array([1,0]) + self.FC = self.FB + (self.dataObj.col_B - self.dataObj.col_tw)/2 * np.array([0,1]) + self.FD = self.FC + (self.dataObj.D_col - 2*(self.dataObj.col_T))* np.array([1,0]) + self.FE = self.A + (self.dataObj.D_col - self.dataObj.col_T) * np.array([1,0]) + self.FF = self.FA + self.dataObj.D_col * np.array([1,0]) + self.FG = self.FF + self.dataObj.col_B * np.array([0,1]) + self.FH = self.FG + self.dataObj.col_T * np.array([-1,0]) + self.FI = self.FD + self.dataObj.col_tw * np.array([0,1]) + self.FJ = self.FC + self.dataObj.col_tw * np.array([0,1]) + self.FK = self.FB + self.dataObj.col_B * np.array([0,1]) + self.FL = self.FK + self.dataObj.col_T * np.array([-1,0]) + self.FA7 = self.FD + (self.dataObj.col_T + self.dataObj.gap) * np.array([1,0]) + self.FP1 = self.FA7 + self.dataObj.beam_tw * np.array([0,1]) + self.FP = self.FP1 + self.dataObj.gap * np.array([-1,0]) + self.FA1 = self.FA7 + (self.dataObj.beam_B - self.dataObj.beam_tw)/2 *np.array([0,-1]) + self.FA2 = self.FA1 + self.dataObj.beam_L * np.array([1,0]) + self.FA3 = self.FA2 + self.dataObj.beam_B * np.array([0,1]) + self.FA4 = self.FA1 + self.dataObj.beam_B * np.array([0,1]) + self.FX = self.FP + self.dataObj.plate_thick * np.array([0,1]) + self.FP2 = self.FP + self.dataObj.plate_width * np.array([1,0]) + self.FP3 = self.FP2 + self.dataObj.plate_thick * np.array([0,1]) + self.FP4 = self.FX + self.dataObj.gap * np.array([1,0]) + self.FA8 = self.FA7 + self.dataObj.beam_L * np.array([1,0]) + self.FA6 = self.FP1 + self.dataObj.beam_L * np.array([1,0]) + self.FP5 = self.FA7 + self.dataObj.gap * np.array([-1,0]) + # Weld Triangle + + self.ptFP = self.FP + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + self.FQ = self.FP + self.dataObj.weld_thick * np.array([1,0]) + self.ptFQ = self.FQ + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + self.FR = self.FP + self.dataObj.weld_thick * np.array([0,-1]) + self.ptFR = self.FR + 2.5 * np.array([1,0]) + 2.5 * np.array([0,-1]) + + self.FX = self.FP + (self.dataObj.plate_thick)* np.array([0,1]) + self.ptFX = self.FX + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + self.FY = self.FX + (self.dataObj.weld_thick) * np.array([0,1]) + self.ptFY = self.FY + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + self.FZ = self.FX + (self.dataObj.weld_thick) * np.array([1,0]) + self.ptFZ = self.FZ + 2.5 * np.array([1,0]) + 2.5 * np.array([0,1]) + + def callCFBWTop(self): ''' - :param dwg - :type - :param: pt1 - :type NumPy Array - :param pt2 - :type NumPy Array - :param text - :type - - params["offset"] : offset of the dimension line - params["textoffset"]: offset of text from dimension line - params["lineori"]: "right"/"left" - params["endlinedim"]:dimension line at the end of the outer arrow. ''' - #defParams = {"offset": 10, "textoffset": 10, "lineori": "right"}defParams = {} + dwg = svgwrite.Drawing('finTop.svg', profile = 'full') + + dwg.add(dwg.polyline(points=[(self.FA),(self.FB),(self.FC),(self.FD),(self.FE),(self.FF),(self.FG),(self.FH),(self.FI),(self.FJ),(self.FK),(self.FL),(self.FA)], stroke='blue', fill='none', stroke_width=2.5)) + dwg.add(dwg.rect(insert=(self.FA1), size=(self.dataObj.beam_L, self.dataObj.beam_B),fill = 'none', stroke='blue', stroke_width=2.5)) + dwg.add(dwg.line((self.FP),(self.FP1)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.line((self.FX),(self.FP4)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.polyline(points=[(self.FP1),(self.FP2),(self.FP3),(self.FP4)], stroke='red', fill='none', stroke_width=2.5).dasharray(dasharray = ([5,5]))) + dwg.add(dwg.line((self.FA7),(self.FA8)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5]))) + dwg.add(dwg.line((self.FP1),(self.FA6)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5]))) + dwg.add(dwg.polyline([(self.ptFP), (self.ptFQ), (self.ptFR), (self.ptFP)], fill='black',stroke_width=2.5,stroke='black')) + dwg.add(dwg.polyline([(self.ptFX), (self.ptFY), (self.ptFZ), (self.ptFX)], fill='black',stroke_width=2.5,stroke='black')) + + nc = self.dataObj.no_of_col + bolt_r = self.dataObj.bolt_dia/2 + ptList = [] + if nc >= 1: + for col in range (nc): + pt = self.FP5 + self.dataObj.edge_dist * np.array([1,0]) + (col) * self.dataObj.gauge * np.array([1,0]) + pt1 = pt - bolt_r * np.array([1,0]) + rect_width = self.dataObj.bolt_dia + rect_ht = self.dataObj.beam_tw + self.dataObj.plate_thick + dwg.add(dwg.rect(insert=(pt1), size=(rect_width, rect_ht),fill = 'black', stroke='black', stroke_width=2.5)) + B1 = pt + 10 * np.array([0,-1]) + B2 = pt + (rect_ht + 10) * np.array([0,1]) + dwg.add(dwg.line((B1),(B2)).stroke('black',width = 2.5,linecap = 'square')) + ptList.append(pt) + dimOffset = self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 150 + # Draw Faint line between edge and gauge distance + ptA = B1 + (dimOffset ) * np.array([0,-1]) + self.dataObj.drawFaintLine(B1,ptA,dwg) + + if len(ptList) > 1: + params = {"offset": dimOffset, "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg,np.array(ptList[0]),np.array(ptList[1]), str(int(self.dataObj.gauge)) + " mm", params) + + # Draw Faint line to represent edge distance + ptB = self.FP5 + self.dataObj.edge_dist * np.array([1,0]) + (col) * self.dataObj.gauge * np.array([1,0]) + self.dataObj.edge_dist * np.array([1,0]) + ptC = ptB + (self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 90) * np.array([0,-1]) + self.dataObj.drawFaintLine(ptB,ptC,dwg) + ptx = self.FP5 + self.dataObj.edge_dist * np.array([1,0]) + (col) * self.dataObj.gauge * np.array([1,0]) + ptY = ptx + self.dataObj.edge_dist * np.array([1,0]) + offset = self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 100 + params = {"offset": offset, "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg,ptx,ptY, str(int(self.dataObj.edge_dist)) + " mm", params) - smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") - smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) - emarker = dwg.marker(insert=(8,0), size=(10,10), orient="auto") - emarker.add(dwg.polyline([(2.5,0), (0,3), (8,0), (0,-3)], fill='black')) - - dwg.defs.add(emarker) - dwg.defs.add(smarker) - - lineVec = pt2 - pt1 # [a, b] - normalVec = np.array([-lineVec[1], lineVec[0]]) # [-b, a] - normalUnitVec = self.normalize(normalVec) - if(params["lineori"] == "left"): - normalUnitVec = -normalUnitVec - - # Q1 = pt1 + params["offset"] * normalUnitVec - # Q2 = pt2 + params["offset"] * normalUnitVec - Q1 = pt1 + params["offset"] * normalUnitVec - Q2 = pt2 + params["offset"] * normalUnitVec - line = dwg.add(dwg.line(Q1, Q2).stroke('black', width = 2.5, linecap = 'square')) - line['marker-start'] = smarker.get_funciri() - line['marker-end'] = emarker.get_funciri() - - Q12mid = 0.5 * (Q1 + Q2) - txtPt = Q12mid + params["textoffset"] * normalUnitVec - dwg.add(dwg.text(text, insert=(txtPt), fill='black',)) - - L1 = Q1 + params["endlinedim"] * normalUnitVec - L2 = Q1 + params["endlinedim"]* (-normalUnitVec) - dwg.add(dwg.line(L1,L2).stroke('black',width = 2.5,linecap = 'square')) - L3 = Q2 + params["endlinedim"] * normalUnitVec - L4 = Q2 + params["endlinedim"]* (-normalUnitVec) - dwg.add(dwg.line(L3,L4).stroke('black',width = 2.5,linecap = 'square')) + # Beam Information + beam_pt = self.FA6 + theta = 1 + offset = 0 + textUp = "Beam " + self.dataObj.beam_Designation + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) - def normalize(self, vec): - a = vec[0] - b = vec[1] - mag = math.sqrt(a * a + b * b) - return vec / mag - - def draw_dimension_innerArrow(self, dwg, ptA, ptB, text, params): + # Column Information + col_pt = self.FL + theta = 45 + offset = (self.dataObj.D_beam * 3)/8 + textUp = "Beam " + self.dataObj.col_Designation + textDown = "" + self.dataObj.drawOrientedArrow(dwg, col_pt, theta, "SE", offset, textUp, textDown) - smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") - smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) - emarker = dwg.marker(insert=(8,0), size=(10,10), orient="auto") - emarker.add(dwg.polyline([(2.5,0), (0,3), (8,0), (0,-3)], fill='black')) - - dwg.defs.add(emarker) - dwg.defs.add(smarker) + # Plate Information + plt_pt = self.FP3 + theta = 45 + offset = self.dataObj.beam_B /2 + 50 + textUp = "PLT. " + str(int(self.dataObj.plate_ht))+'x'+ str(int(self.dataObj.plate_width))+ 'x' + str(int(self.dataObj.plate_thick)) + textDown = "" + self.dataObj.drawOrientedArrow(dwg, plt_pt, theta, "SE", offset, textUp, textDown) - u = ptB - ptA # [a, b] - uUnit = self.normalize(u) + # Weld Information + weldPt = self.FP + theta = 40 + offset = self.dataObj.weld_thick + self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = " z " + str(int(self.dataObj.weld_thick)) + " mm" + textDown = u"\u25C1" + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) + + # Gap Informatoin + ptG1 = self.FG + 50 * np.array([0,1]) + ptG2 = ptG1 + 20 * np.array([1,0]) + offset = 1 + params = {"offset": offset, "textoffset": 10, "lineori": "right", "endlinedim":10,"arrowlen":50} + self.dataObj.draw_dimension_innerArrow(dwg, ptG1, ptG2, str(self.dataObj.gap) + " mm", params) + # Draw Faint Lines to representation of Gap distance # + ptA = self.FG + ptB = ptG1 + self.dataObj.drawFaintLine(ptA,ptB,dwg) + ptC = self.FA4 + ptD = ptG2 + self.dataObj.drawFaintLine(ptC,ptD,dwg) + + dwg.save() + print"$$$$$$$$$ Saved Column Flange Beam Web Top $$$$$$$$$$$$" + + def callCWBWTop(self): + ''' + ''' + dwg = svgwrite.Drawing('finTop.svg', profile='full') + + dwg.add(dwg.polyline(points=[(self.A),(self.B),(self.C),(self.D),(self.E),(self.F),(self.G),(self.H),(self.I),(self.J),(self.K),(self.L),(self.A)], stroke='blue', fill='none', stroke_width=2.5)) + dwg.add(dwg.rect(insert=(self.A1), size=(self.dataObj.beam_L, self.dataObj.beam_B),fill = 'none', stroke='blue', stroke_width=2.5)) + dwg.add(dwg.line((self.A7),(self.A8)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5]))) + dwg.add(dwg.line((self.P1),(self.A6)).stroke('red',width = 2.5,linecap = 'square').dasharray(dasharray = ([5,5]))) + dwg.add(dwg.line((self.P),(self.P1)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.line((self.X),(self.P4)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.polyline(points=[(self.P1),(self.P2),(self.P3),(self.P4)], stroke='red', fill='none', stroke_width=2.5).dasharray(dasharray = ([5,5]))) + dwg.add(dwg.polyline([(self.ptP), (self.ptO), (self.ptR), (self.ptP)], fill='black',stroke_width=2.5,stroke='black')) + dwg.add(dwg.polyline([(self.ptX), (self.ptY), (self.ptZ), (self.ptX)], fill='black',stroke_width=2.5,stroke='black')) + + nc = self.dataObj.no_of_col + bolt_r = self.dataObj.bolt_dia/2 + ptList = [] + if nc >= 1: + for col in range (nc): + pt = self.A5 + self.dataObj.edge_dist * np.array([1,0]) + (col) * self.dataObj.gauge * np.array([1,0]) + print self.dataObj.gauge + pt1 = pt - bolt_r * np.array([1,0]) + rect_width = self.dataObj.bolt_dia + rect_ht = self.dataObj.beam_tw + self.dataObj.plate_thick + dwg.add(dwg.rect(insert=(pt1), size=(rect_width, rect_ht),fill = 'black', stroke='black', stroke_width=2.5)) + B1 = pt + 10 * np.array([0,-1]) + B2 = pt + (rect_ht + 10) * np.array([0,1]) + dwg.add(dwg.line((B1),(B2)).stroke('black',width = 2.5,linecap = 'square')) + ptList.append(pt) + if len(ptList) > 1: + dimOffset = self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 50 + params = {"offset": dimOffset, "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg,np.array(ptList[0]),np.array(ptList[1]), str(int(self.dataObj.gauge)) + "mm", params) + + # Draw Faint line to represent edge distance + ptB = self.A5 + self.dataObj.edge_dist * np.array([1,0]) + (nc -1) * self.dataObj.gauge * np.array([1,0]) + self.dataObj.edge_dist * np.array([1,0]) + ptC = ptB + (self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 150) * np.array([0,-1]) + self.dataObj.drawFaintLine(ptB,ptC,dwg) + ptL = self.A5 + self.dataObj.edge_dist * np.array([1,0]) + (nc-1) * self.dataObj.gauge * np.array([1,0]) + ptM = ptL + (self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 150) * np.array([0,-1]) + self.dataObj.drawFaintLine(ptL,ptM,dwg) + + # Edge Distance + ptx = self.A5 + self.dataObj.edge_dist * np.array([1,0]) + (nc-1) * self.dataObj.gauge * np.array([1,0]) + ptY = ptx + self.dataObj.edge_dist * np.array([1,0]) + offset = self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 150 + params = {"offset": offset, "textoffset": 20, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg,ptx,ptY, str(int(self.dataObj.edge_dist)) + " mm", params) + + # Draws Faint line to represent Gauge Distance + ptK = self.A5 + self.dataObj.edge_dist * np.array([1,0]) + ptM = ptK + (self.dataObj.beam_B/2 + self.dataObj.col_T + self.dataObj.col_R1 + 50)* np.array([0,-1]) + self.dataObj.drawFaintLine(ptK,ptM,dwg) - vUnit = np.array([-uUnit[1], uUnit[0]]) # [-b, a] + # Beam Information + beam_pt = self.A6 + theta = 1 + offset = 0 + textUp = "Beam " + self.dataObj.beam_Designation + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "NE", offset, textUp, textDown) - A1 = ptA + params["endlinedim"] * vUnit - A2 = ptA - params["endlinedim"]* (-vUnit) - dwg.add(dwg.line(A1,A2).stroke('black',width = 2.5,linecap = 'square')) - B1 = ptB + params["endlinedim"] * vUnit - B2 = ptB - params["endlinedim"]* (-vUnit) - dwg.add(dwg.line(B1,B2).stroke('black',width = 2.5,linecap = 'square')) - A3 = ptA - params["arrowlen"]* uUnit - B3 = ptB + params["arrowlen"]* uUnit + # column Information + col_pt = self.H + theta = 45 + offset = self.dataObj.beam_B /2 + 100 + textUp = "Column " + self.dataObj.col_Designation + textDown = " " + self.dataObj.drawOrientedArrow(dwg, col_pt, theta, "SE", offset, textUp, textDown) - line = dwg.add(dwg.line(A3, ptA).stroke('black', width = 2.5, linecap = 'square')) - line['marker-end'] = emarker.get_funciri() - line = dwg.add(dwg.line(B3, ptB).stroke('black', width = 2.5, linecap = 'square')) + # Plate Information + plt_pt = self.P3 + theta = 45 + offset = self.dataObj.beam_B /2 + 50 + textUp = "PLT. " + str(int(self.dataObj.plate_ht))+'x'+ str(int(self.dataObj.plate_width))+ 'x' + str(int(self.dataObj.plate_thick)) + textDown = "" + self.dataObj.drawOrientedArrow(dwg, plt_pt, theta, "SE", offset, textUp, textDown) - line['marker-end'] = emarker.get_funciri() - txtPt = A3 + params["textoffset"] * vUnit - dwg.add(dwg.text(text, insert=(txtPt), fill='black',)) + # Weld Information + weldPt = self.P + theta = 40 + offset = self.dataObj.weld_thick + self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = " z " + str(int(self.dataObj.weld_thick)) + " mm" + textDown = u"\u25C1" + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NW", offset, textUp, textDown) + + # Gap Informatoin + ptG1 = self.E + 50 * np.array([0,1]) + ptG2 = ptG1 + self.dataObj.gap * np.array([1,0]) + offset = 100 + params = {"offset": offset, "textoffset": 10, "lineori": "right", "endlinedim":10,"arrowlen":50} + self.dataObj.draw_dimension_innerArrow(dwg, ptG1, ptG2, str(self.dataObj.gap) + " mm", params) + # Draw Faint Lines to representation of Gap distance # + ptA = self.E + ptB = ptA + (85) * np.array([0,1]) + self.dataObj.drawFaintLine(ptA,ptB,dwg) + ptC = self.A4 + ptD = ptC + (100) * np.array([0,1]) + self.dataObj.drawFaintLine(ptC,ptD,dwg) - pass - - def drawArrow(self,line,s_arrow,e_arrow): - line['marker-start'] = s_arrow.get_funciri() - line['marker-end'] = e_arrow.get_funciri() + dwg.save() + print"$$$$$$$$$ Saved Column Web Beam Web Top $$$$$$$$$$$" - def drawStartArrow(self,line,s_arrow): - line['marker-start'] = s_arrow.get_funciri() - def drawEndArrow(self,line,e_arrow): - line['marker-end'] = e_arrow.get_funciri() - - - def drawOrientedArrow(self, dwg, pt, theta, orientation, offset, textUp,textDown): + +class Fin2DCreatorSide(object): + def __init__(self,finCommonObj): + + self.dataObj = finCommonObj + + # CWBW connectivity points + self.A = np.array([0,0]) + self.B = self.A + self.dataObj.col_T * np.array([1,0]) + self.C = self.A + (self.dataObj.D_col - self.dataObj.col_T) * np.array([1,0]) + self.D = self.A + self.dataObj.D_col * np.array([1,0]) + self.H = self.C + self.dataObj.col_L * np.array([0,1]) + self.G = self.B + self.dataObj.col_L * np.array([0,1]) + self.A1 = (self.dataObj.col_T + self.dataObj.col_R1) * np.array((1,0)) + ((self.dataObj.col_L - self.dataObj.D_beam)/2) * np.array([0,1]) + self.A2 = self.A1 + self.dataObj.beam_B * np.array([1,0]) + self.A3 = self.A2 + self.dataObj.beam_T * np.array([0,1]) + self.A12 = self.A1 + self.dataObj.beam_T * np.array([0,1]) + self.A11 = self.A12 + (self.dataObj.beam_B - self.dataObj.beam_tw)/2 * np.array([1,0]) + self.A4 = self.A11 + self.dataObj.beam_tw * np.array([1,0]) + self.A5 = self.A4 + (self.dataObj.D_beam - (2* self.dataObj.beam_T)) * np.array([0,1]) + self.A6 = self.A2 + (self.dataObj.D_beam - self.dataObj.beam_T) * np.array([0,1]) + self.A7 = self.A2 + self.dataObj.D_beam * np.array([0,1]) + self.A8 = self.A1 + self.dataObj.D_beam * np.array([0,1]) + self.A9 = self.A1 + (self.dataObj.D_beam - self.dataObj.beam_T) * np.array([0,1]) + self.A10 = self.A11 + (self.dataObj.D_beam - (2* self.dataObj.beam_T)) * np.array([0,1]) + self.P = self.A11 + (self.dataObj.beam_R1 + 3) * np.array([0,1]) + self.Q = self.P + self.dataObj.plate_thick * np.array([-1,0]) + self.X = self.Q + self.dataObj.weld_thick * np.array([-1,0]) + self.R = self.P + self.dataObj.plate_ht * np.array([0,1]) + + #### CFBW connectivity + self.FA = np.array([0,0]) + self.FB = self.FA + self.dataObj.col_B * np.array([1,0]) + self.ptMid = self.FA + ((self.dataObj.col_B/2) + (self.dataObj.col_tw/2))* np.array([1,0]) + self.ptMid1 = self.ptMid + ((self.dataObj.col_L - self.dataObj.D_beam)/2) * np.array([0,1]) + self.FC = self.FB + self.dataObj.col_L * np.array([0,1]) + self.FD = self.FA + self.dataObj.col_L * np.array([0,1]) + self.FA1 = self.ptMid1 + (self.dataObj.beam_tw/2)* np.array([-1,0])+ self.dataObj.beam_B/2 * np.array([-1,0]) + self.FA2 = self.FA1 + self.dataObj.beam_B * np.array([1,0]) + self.FA3 = self.FA2 + self.dataObj.beam_T * np.array([0,1]) + self.FA12 = self.FA1 + self.dataObj.beam_T * np.array([0,1]) + self.FA11 = self.FA12 + (self.dataObj.beam_B - self.dataObj.beam_tw)/2 * np.array([1,0]) + self.FA4 = self.FA11 + self.dataObj.beam_tw * np.array([1,0]) + self.FA5 = self.FA4 + (self.dataObj.D_beam - (2* self.dataObj.beam_T)) * np.array([0,1]) + self.FA6 = self.FA2 + (self.dataObj.D_beam - self.dataObj.beam_T) * np.array([0,1]) + self.FA7 = self.FA2 + self.dataObj.D_beam * np.array([0,1]) + self.FA8 = self.FA1 + self.dataObj.D_beam * np.array([0,1]) + self.FA9 = self.FA1 + (self.dataObj.D_beam - self.dataObj.beam_T) * np.array([0,1]) + self.FA10 = self.FA11 + (self.dataObj.D_beam - (2* self.dataObj.beam_T)) * np.array([0,1]) + self.FP = self.FA11 + (self.dataObj.beam_R1 + 3) * np.array([0,1]) + self.FQ = self.FP + self.dataObj.plate_thick * np.array([-1,0]) + self.FX = self.FQ + self.dataObj.weld_thick * np.array([-1,0]) + self.FR = self.FP + self.dataObj.plate_ht * np.array([0,1]) + self.FY = self.FX + self.dataObj.plate_ht * np.array([0,1]) + + def callCWBWSide(self): ''' - Drawing an arrow on given direction ''' - #Right Up. - theta = math.radians(theta) - charWidth = 10 - xVec = np.array([1, 0]) - yVec = np.array([0, 1]) + dwg = svgwrite.Drawing('finSide.svg', profile='full') + dwg.add(dwg.rect(insert=(self.A), size=(self.dataObj.D_col, self.dataObj.col_L),fill = 'none', stroke='blue', stroke_width=2.5)) + dwg.add(dwg.line((self.C),(self.H)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.line((self.B),(self.G)).stroke('blue',width = 2.5,linecap = 'square')) + dwg.add(dwg.polyline(points=[(self.A1),(self.A2),(self.A3),(self.A4),(self.A5),(self.A6),(self.A7),(self.A8),(self.A9),(self.A10),(self.A11),(self.A12),(self.A1)], stroke='blue', fill='none', stroke_width=2.5)) + + # Diagonal Hatching for WELD + pattern = dwg.defs.add(dwg.pattern(id ="diagonalHatch",size=(6, 6), patternUnits="userSpaceOnUse",patternTransform="rotate(45 2 2)")) + pattern.add(dwg.path(d = "M -1,2 l 6,0", stroke='#000000',stroke_width = 0.7)) + dwg.add(dwg.rect(insert=(self.X), size=(self.dataObj.weld_thick, self.dataObj.plate_ht),fill = "url(#diagonalHatch)", stroke='white', stroke_width=2.5)) + + dwg.add(dwg.rect(insert=(self.Q), size=(self.dataObj.plate_thick, self.dataObj.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5)) + + nr = self.dataObj.no_of_rows + pitchPts = [] + for row in range(nr): + pt = self.P + self.dataObj.end_dist * np.array([0,1]) + (row) *self.dataObj.pitch * np.array([0,1]) + ptOne = pt + 20 * np.array([1,0]) + ptTwo = pt + 30 * np.array([-1,0]) + dwg.add(dwg.circle(center=(pt), r = 1.5, stroke='red',fill = 'none',stroke_width=1.5)) + dwg.add(dwg.line((ptOne),(ptTwo)).stroke('red',width = 1.5,linecap = 'square').dasharray(dasharray = ([10, 5, 1, 5]))) + bltPt1 = pt + self.dataObj.bolt_dia/2 * np.array([0,-1]) + self.dataObj.plate_thick * np.array([-1,0]) + bltPt2 = pt + self.dataObj.bolt_dia/2 * np.array([0,-1]) + self.dataObj.beam_tw * np.array([1,0]) + bltPt3 = pt + self.dataObj.bolt_dia/2 * np.array([0,1]) + self.dataObj.plate_thick * np.array([-1,0]) + bltPt4 = pt + self.dataObj.bolt_dia/2 * np.array([0,1]) + self.dataObj.beam_tw * np.array([1,0]) + dwg.add(dwg.line((bltPt1),(bltPt2)).stroke('black',width = 1.5,linecap = 'square')) + dwg.add(dwg.line((bltPt3),(bltPt4)).stroke('black',width = 1.5,linecap = 'square')) + pitchPts.append(pt) + + # End and Pitch Distance Information + params = {"offset": self.dataObj.D_col / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]),str(len(pitchPts)-1)+u' \u0040'+ str(int(self.dataObj.pitch)) + " mm c/c", params) + params = {"offset": self.dataObj.D_col / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, self.P, np.array(pitchPts[0]), str(int(self.dataObj.end_dist)) + " mm ", params) + params = {"offset": self.dataObj.D_col / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), self.R, str(int(self.dataObj.end_dist)) + " mm", params) + + # Draw Faint Line + pt2 = self.P + ((self.dataObj.D_col /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(self.P,pt2,dwg) + pt1 = np.array(pitchPts[0]) + ((self.dataObj.D_col /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(np.array(pitchPts[0]),pt1,dwg) + ptA = self.R + ((self.dataObj.D_col /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(self.R,ptA,dwg) + ptB = np.array(pitchPts[len( pitchPts)-1]) + ((self.dataObj.D_col /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(np.array(pitchPts[len( pitchPts)-1]),ptB,dwg) - p1 = pt - lengthA = offset / math.sin(theta) + # Beam Information + beam_pt = self.A2 + theta = 45 + offset = self.dataObj.col_T + self.dataObj.col_R1 + 10 + textUp = "Beam " + self.dataObj.beam_Designation + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "NE", offset, textUp, textDown) - arrowVec = None - if(orientation == "NE"): - arrowVec = np.array([-math.cos(theta), math.sin(theta)]) - elif(orientation == "NW"): - arrowVec = np.array([math.cos(theta), math.sin(theta)]) - elif(orientation == "SE"): - arrowVec = np.array([-math.cos(theta), -math.sin(theta)]) - elif(orientation == "SW"): - arrowVec = np.array([math.cos(theta), -math.sin(theta)]) - - p2 = p1 - lengthA * arrowVec + # column Information + col_pt = self.H + theta = 45 + offset = 70 + textUp = "Column " + self.dataObj.col_Designation + textDown = " " + self.dataObj.drawOrientedArrow(dwg, col_pt, theta, "SE", offset, textUp, textDown) - text = textDown if len(textDown) > len(textUp) else textUp - lengthB = len(text) * charWidth + # Plate Information + beam_pt = self.R + self.dataObj.plate_thick/2 * np.array([-1,0]) + theta = 45 + offset = self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = "PLT. " + str(int(self.dataObj.plate_ht))+'x'+ str(int(self.dataObj.plate_width))+ 'x' + str(int(self.dataObj.plate_thick)) + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) - labelVec = None - if(orientation == "NE"): - labelVec = -xVec - elif(orientation == "NW"): - labelVec = xVec - elif(orientation == "SE"): - labelVec = -xVec - elif(orientation == "SW"): - labelVec = xVec - + # Weld Information + weldPt = self.X + self.dataObj.weld_thick/2 * np.array([1,0]) + theta = 45 + offset = self.dataObj.weld_thick + self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = " z " + str(int(self.dataObj.weld_thick)) + " mm" + textDown = u"\u25C1" + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NE", offset, textUp, textDown) - p3 = p2 + lengthB * (-labelVec) + dwg.save() + print "********* Column Web Beam Web Side Saved ***********" + + def callCFBWSide(self): + ''' + ''' + dwg = svgwrite.Drawing('finSide.svg', profile='full') + dwg.add(dwg.rect(insert=(self.FA), size=(self.dataObj.col_B, self.dataObj.col_L),fill = 'none', stroke='blue', stroke_width=2.5)) + dwg.add(dwg.polyline(points=[(self.FA1),(self.FA2),(self.FA3),(self.FA4),(self.FA5),(self.FA6),(self.FA7),(self.FA8),(self.FA9),(self.FA10),(self.FA11),(self.FA12),(self.FA1)], stroke='blue', fill='none', stroke_width=2.5)) -# if case == "weld": -# pt = lengthB /2 (-labelVec) - - txtOffset = 15 - offsetVec = - yVec + # Diagonal Hatching for WELD + pattern = dwg.defs.add(dwg.pattern(id ="diagonalHatch",size=(6, 6), patternUnits="userSpaceOnUse",patternTransform="rotate(45 2 2)")) + pattern.add(dwg.path(d = "M -1,2 l 6,0", stroke='#000000',stroke_width = 0.7)) + dwg.add(dwg.rect(insert=(self.FX), size=(self.dataObj.weld_thick, self.dataObj.plate_ht),fill = "url(#diagonalHatch)", stroke='white', stroke_width=2.5)) + + dwg.add(dwg.rect(insert=(self.FQ), size=(self.dataObj.plate_thick, self.dataObj.plate_ht),fill = 'none', stroke='blue', stroke_width=2.5))#dwg.add(dwg.line((self.ptMid),(self.ptMid1)).stroke('green',width = 2.5,linecap = 'square')) - txtPtUp = None - if(orientation == "NE"): - txtPtUp = p2 + 0.1 * lengthB * (-labelVec) + txtOffset * offsetVec - txtPtDwn = p2 -0.1 * lengthB * (labelVec) - txtOffset * offsetVec - elif(orientation == "NW"): - txtPtUp = p3 + 0.1 * lengthB * labelVec + txtOffset * offsetVec - txtPtDwn = p3 - 0.1 * lengthB * labelVec - txtOffset * offsetVec - elif(orientation == "SE"): - txtPtUp = p2 + 0.1 * lengthB * (-labelVec) + txtOffset * offsetVec - txtPtDwn = p2 - 0.1 * lengthB * (labelVec) - txtOffset * offsetVec - elif(orientation == "SW"): - txtPtUp = p3 + 0.1 * lengthB * labelVec + txtOffset * offsetVec - txtPtDwn = p3 - 0.1 * lengthB * labelVec - txtOffset * offsetVec + nr = self.dataObj.no_of_rows + pitchPts = [] + for row in range(nr): + pt = self.FP + self.dataObj.end_dist * np.array([0,1]) + (row) *self.dataObj.pitch * np.array([0,1]) + ptOne = pt + 20 * np.array([1,0]) + ptTwo = pt + 30 * np.array([-1,0]) + dwg.add(dwg.line((ptOne),(ptTwo)).stroke('red',width = 1.5,linecap = 'square').dasharray(dasharray = ([10, 5, 1, 5]))) + bltPt1 = pt + self.dataObj.bolt_dia/2 * np.array([0,-1]) + self.dataObj.plate_thick * np.array([-1,0]) + bltPt2 = pt + self.dataObj.bolt_dia/2 * np.array([0,-1]) + self.dataObj.beam_tw * np.array([1,0]) + bltPt3 = pt + self.dataObj.bolt_dia/2 * np.array([0,1]) + self.dataObj.plate_thick * np.array([-1,0]) + bltPt4 = pt + self.dataObj.bolt_dia/2 * np.array([0,1]) + self.dataObj.beam_tw * np.array([1,0]) + dwg.add(dwg.line((bltPt1),(bltPt2)).stroke('black',width = 1.5,linecap = 'square')) + dwg.add(dwg.line((bltPt3),(bltPt4)).stroke('black',width = 1.5,linecap = 'square')) + pitchPts.append(pt) + + params = {"offset": self.dataObj.col_B / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[0]), np.array(pitchPts[len( pitchPts)-1]),str(len(pitchPts)-1)+u' \u0040'+ str(int(self.dataObj.pitch)) + "mm c/c", params) + params = {"offset": self.dataObj.col_B / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, self.FP, np.array(pitchPts[0]), str(int(self.dataObj.end_dist)) + " mm ", params) + params = {"offset": self.dataObj.col_B / 2 + 30, "textoffset": 15, "lineori": "left", "endlinedim":10} + self.dataObj.draw_dimension_outerArrow(dwg, np.array(pitchPts[len( pitchPts)-1]), self.FR, str(int(self.dataObj.end_dist)) + " mm", params) + + # Draw Faint Line + pt2 = self.FP + ((self.dataObj.col_B /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(self.FP,pt2,dwg) + pt1 = np.array(pitchPts[0]) + ((self.dataObj.col_B /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(np.array(pitchPts[0]),pt1,dwg) + ptA = self.FR + ((self.dataObj.col_B /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(self.FR,ptA,dwg) + ptB = np.array(pitchPts[len( pitchPts)-1]) + ((self.dataObj.col_B /2) + 15) * np.array([1,0]) + self.dataObj.drawFaintLine(np.array(pitchPts[len( pitchPts)-1]),ptB,dwg) - #line = dwg.add(dwg.line(p1, p2, p3).stroke('black', width = 2.5, linecap = 'square')) - line = dwg.add(dwg.polyline(points=[p1, p2, p3], fill= 'none', stroke='black', stroke_width = 2.5)) - smarker = self.addSMarker(dwg) - line['marker-start'] = smarker.get_funciri() + # Beam Information + beam_pt = self.FA2 + theta = 45 + offset = self.dataObj.col_T + self.dataObj.col_R1 + 10 + textUp = "Beam " + self.dataObj.beam_Designation + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "NE", offset, textUp, textDown) - dwg.add(dwg.text(textUp, insert=(txtPtUp), fill='black',font_family = "sans-serif",font_size = 12)) - dwg.add(dwg.text(textDown, insert=(txtPtDwn), fill='black',font_family = "sans-serif",font_size = 16)) + # column Information + beam_pt = self.FC + theta = 45 + offset = 70 + textUp = "Column " + self.dataObj.col_Designation + textDown = " " + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) + + # Plate Information + beam_pt = self.FR + self.dataObj.plate_thick/2 * np.array([-1,0]) + theta = 45 + offset = self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = "PLT. " + str(int(self.dataObj.plate_ht))+'x'+ str(int(self.dataObj.plate_width))+ 'x' + str(int(self.dataObj.plate_thick)) + textDown = "" + self.dataObj.drawOrientedArrow(dwg, beam_pt, theta, "SE", offset, textUp, textDown) + + # Weld Information + weldPt = self.FX + self.dataObj.weld_thick/2 * np.array([1,0]) + theta = 45 + offset = self.dataObj.weld_thick + self.dataObj.plate_thick + self.dataObj.beam_B /2 + 80 + textUp = " z " + str(int(self.dataObj.weld_thick)) + " mm" + textDown = u"\u25C1" + self.dataObj.drawOrientedArrow(dwg, weldPt, theta, "NE", offset, textUp, textDown) + dwg.save() + print "********** Column Flange Beam Web Side Saved *************" - def addSMarker(self, dwg): - ''' - Draws start arrow to given line - ''' - smarker = dwg.marker(insert=(-8,0), size=(10,10), orient="auto") - smarker.add(dwg.polyline([(-2.5,0), (0,3), (-8,0), (0,-3)], fill='black')) - dwg.defs.add(smarker) - return smarker - def drawFaintLine(self,ptOne,ptTwo,dwg): - ''' - Draw faint line to show dimensions. - ''' - dwg.add(dwg.line(ptOne,ptTwo).stroke('#D8D8D8',width = 2.5,linecap = 'square')) - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/Connections/Shear/Finplate/filletweld.py b/Connections/Shear/Finplate/filletweld.py index 91d8cef..28f2ca8 100644 --- a/Connections/Shear/Finplate/filletweld.py +++ b/Connections/Shear/Finplate/filletweld.py @@ -6,7 +6,6 @@ Created on 27-May-2015 import numpy from ModelUtils import * from OCC.BRepAlgoAPI import BRepAlgoAPI_Fuse - class FilletWeld(object): def __init__(self,b,h,L): diff --git a/Connections/Shear/Finplate/fin.log b/Connections/Shear/Finplate/fin.log index 6b8c338..c4b9255 100644 --- a/Connections/Shear/Finplate/fin.log +++ b/Connections/Shear/Finplate/fin.log @@ -1,950 +1,79 @@ - +
- Thu, 01 Oct 2015 15:37:28 + Wed, 09 Dec 2015 16:40:18 INFO : Overall finplate connection design is safe
- Thu, 01 Oct 2015 15:37:28 + Wed, 09 Dec 2015 16:40:18 DEBUG :=========End Of design===========
- Thu, 01 Oct 2015 15:37:28 + Wed, 09 Dec 2015 16:40:18 INFO : Overall finplate connection design is safe
- Thu, 01 Oct 2015 15:37:28 + Wed, 09 Dec 2015 16:40:18 DEBUG :=========End Of design===========
- Thu, 01 Oct 2015 15:39:26 + Wed, 09 Dec 2015 16:40:20 INFO : Overall finplate connection design is safe
- Thu, 01 Oct 2015 15:39:26 + Wed, 09 Dec 2015 16:40:20 DEBUG :=========End Of design===========
- Thu, 01 Oct 2015 15:39:26 + Wed, 09 Dec 2015 16:40:28 INFO : Overall finplate connection design is safe
- Thu, 01 Oct 2015 15:39:26 + Wed, 09 Dec 2015 16:40:28 DEBUG :=========End Of design===========
- Thu, 01 Oct 2015 15:40:31 + Wed, 09 Dec 2015 16:40:28 INFO : Overall finplate connection design is safe
- Thu, 01 Oct 2015 15:40:31 + Wed, 09 Dec 2015 16:40:28 DEBUG :=========End Of design===========
- Mon, 12 Oct 2015 16:22:07 + Wed, 09 Dec 2015 16:40:29 INFO : Overall finplate connection design is safe
- Mon, 12 Oct 2015 16:22:07 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 16:22:07 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 16:22:07 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:37:55 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:37:55 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:37:55 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:37:55 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:39:46 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:39:46 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:39:46 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:39:46 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:40:35 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:40:35 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:40:35 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:40:35 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:41:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:41:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:41:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:41:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:41:19 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:41:19 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:42:10 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:42:10 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:42:10 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:42:10 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:42:14 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:42:14 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:43:50 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:43:50 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:43:50 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:43:50 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:43:53 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:43:53 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:46:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:46:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:46:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:46:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:47:24 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:47:24 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:47:24 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:47:24 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:48:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:48:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:48:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:48:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:48:32 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:48:32 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:51:05 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:51:05 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:51:05 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:51:05 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:51:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:51:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:51:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:51:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:51:16 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:51:16 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:52:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:52:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:52:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:52:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:52:31 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:52:31 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:54:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:54:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:54:27 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:54:27 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 17:54:30 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 17:54:30 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:08:42 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:08:42 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:08:42 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:08:42 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:08:45 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:08:45 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:14:00 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:14:00 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:14:00 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:14:00 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:14:04 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:14:04 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:28:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:28:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:28:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:28:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:28:16 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:28:16 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:31:01 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:31:01 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:31:01 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:31:01 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:31:05 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:31:05 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:32:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:32:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:32:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:32:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:32:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:32:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:33:07 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:33:07 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:33:07 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:33:07 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:33:12 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:33:12 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:35:16 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:35:16 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:35:16 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:35:16 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:35:19 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:35:19 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:38:33 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:38:33 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:38:33 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:38:33 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:38:37 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:38:37 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:15 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:15 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:17 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:17 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:53 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:53 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:53 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:53 - DEBUG - :=========End Of design=========== -
- -
- Mon, 12 Oct 2015 18:39:56 - INFO - : Overall finplate connection design is safe - -
- -
- Mon, 12 Oct 2015 18:39:56 - DEBUG - :=========End Of design=========== -
- -
- Tue, 20 Oct 2015 17:38:46 - INFO - : Overall finplate connection design is safe - -
- -
- Tue, 20 Oct 2015 17:38:46 - DEBUG - :=========End Of design=========== -
- -
- Tue, 20 Oct 2015 17:38:46 - INFO - : Overall finplate connection design is safe - -
- -
- Tue, 20 Oct 2015 17:38:46 - DEBUG - :=========End Of design=========== -
- -
- Tue, 20 Oct 2015 17:38:50 - INFO - : Overall finplate connection design is safe - -
- -
- Tue, 20 Oct 2015 17:38:50 + Wed, 09 Dec 2015 16:40:29 DEBUG :=========End Of design===========
diff --git a/Connections/Shear/Finplate/fin2DCreatorTop.py b/Connections/Shear/Finplate/fin2DCreatorTop.py new file mode 100644 index 0000000..eb2bcab --- /dev/null +++ b/Connections/Shear/Finplate/fin2DCreatorTop.py @@ -0,0 +1,8 @@ +''' +Created on 20-Oct-2015 + +@author: deepa +''' +class Fin2DCreatorTop(object): + def __init__(self,commonDataObj): + obj = commonDataObj \ No newline at end of file diff --git a/Connections/Shear/Finplate/finPlate.ui b/Connections/Shear/Finplate/finPlate.ui index d27e2c0..80f2f0d 100644 --- a/Connections/Shear/Finplate/finPlate.ui +++ b/Connections/Shear/Finplate/finPlate.ui @@ -559,7 +559,7 @@ 0 0 1332 - 28 + 25 @@ -691,7 +691,7 @@ 000.0 - + 6 @@ -3237,10 +3237,10 @@ - 180 + 190 70 - 60 - 50 + 81 + 51 diff --git a/Connections/Shear/Finplate/finPlateCalc.py b/Connections/Shear/Finplate/finPlateCalc.py index ce86a35..9579e0e 100644 --- a/Connections/Shear/Finplate/finPlateCalc.py +++ b/Connections/Shear/Finplate/finPlateCalc.py @@ -211,24 +211,24 @@ def finConn(uiObj): #clause 10.2.2 is800 max_spacing = int(min(100 + 4 * t_thinner, 200)); #clause 10.2.3.3 is800 - min_edge_dist = int(1.5 * (dia_hole)) + 10; # 10 mm added than min. value - if min_edge_dist%10 != 0: - min_edge_dist = (min_edge_dist/10)*10 + 10; + min_end_dist = int(1.5 * (dia_hole)) + 10; # 10 mm added than min. value + if min_end_dist%10 != 0: + min_end_dist = (min_end_dist/10)*10 + 10; else: - min_edge_dist = min_edge_dist; + min_end_dist = min_end_dist; max_edge_dist = int((12 * t_thinner * cmath.sqrt(250/beam_fy)).real)-1; # Determine single or double line of bolts - length_avail = (web_plate_l-2*min_edge_dist); + length_avail = (web_plate_l-2*min_end_dist); pitch = round(length_avail/(bolts_required-1),3); ## Calculation of moment demand - M1 = bolt_shear_capacity * (20+min_edge_dist/2); + M1 = bolt_shear_capacity * (20+min_end_dist/2); # Single line of bolts if pitch >= min_pitch: bolt_line =1; @@ -252,7 +252,7 @@ def finConn(uiObj): pitch = round(length_avail/(bolts_one_line-1),3); gauge = min_gauge; - M1 = bolt_shear_capacity * (20+ min_edge_dist + gauge/2); + M1 = bolt_shear_capacity * (20+ min_end_dist + gauge/2); if pitch >= min_pitch: K = bolts_one_line / 2; @@ -278,21 +278,25 @@ def finConn(uiObj): # Width input (optional) and validation if web_plate_w != 0: if bolt_line == 1: - web_plate_w_req = 2 * min_edge_dist - end_dist = web_plate_w/2 + web_plate_w_req = 2 * min_end_dist + #end_dist = web_plate_w/2 + edge_dist = web_plate_w/2 if bolt_line == 2: - web_plate_w_req = gauge + 2 * min_edge_dist - end_dist = (web_plate_w - gauge)/2 + web_plate_w_req = gauge + 2 * min_end_dist + #end_dist = (web_plate_w - gauge)/2 + edge_dist = (web_plate_w - gauge)/2 if web_plate_w == 0: if bolt_line == 1: - web_plate_w_req = 2 * min_edge_dist; + web_plate_w_req = 2 * min_end_dist; web_plate_w = web_plate_w_req - end_dist = web_plate_w /2 + #end_dist = web_plate_w /2 + edge_dist = web_plate_w /2 if bolt_line == 2: - web_plate_w_req = gauge + 2 * min_edge_dist; + web_plate_w_req = gauge + 2 * min_end_dist; web_plate_w = web_plate_w_req; - end_dist = (web_plate_w - gauge)/2 + #end_dist = (web_plate_w - gauge)/2 + edge_dist = (web_plate_w - gauge)/2 # if web_plate_w < web_plate_w_req: @@ -315,7 +319,7 @@ def finConn(uiObj): web_plate_l_req1 = math.sqrt((moment_demand*1000*6*1.1)/(1.2*beam_fy*web_plate_t)); # Single line of bolts if bolt_line == 1: - web_plate_l_req2 = (bolts_required-1) * min_pitch + 2 * min_edge_dist; + web_plate_l_req2 = (bolts_required-1) * min_pitch + 2 * min_end_dist; if web_plate_l == 0 or web_plate_l == min_plate_height or web_plate_l == max_plate_height: web_plate_l_req = max(web_plate_l_req1, web_plate_l_req2, web_plate_l); else: @@ -323,7 +327,7 @@ def finConn(uiObj): # Multi line of bolts if bolt_line == 2: - web_plate_l_req2 = (bolts_one_line-1) * min_pitch + 2 * min_edge_dist; + web_plate_l_req2 = (bolts_one_line-1) * min_pitch + 2 * min_end_dist; if web_plate_l == 0 or web_plate_l == min_plate_height or web_plate_l == max_plate_height: web_plate_l_req = max(web_plate_l_req1, web_plate_l_req2, web_plate_l); @@ -389,8 +393,8 @@ def finConn(uiObj): outputObj['Bolt']['numofrow'] = bolts_one_line outputObj['Bolt']['numofcol'] = bolt_line outputObj['Bolt']['pitch'] = pitch - outputObj['Bolt']['enddist'] = float(end_dist) - outputObj['Bolt']['edge'] = float(min_edge_dist) + outputObj['Bolt']['edge']= float(edge_dist) + outputObj['Bolt']['enddist'] = float(min_end_dist) outputObj['Bolt']['gauge'] = float(gauge) outputObj['Weld'] = {} diff --git a/Connections/Shear/Finplate/finPlateMain.py b/Connections/Shear/Finplate/finPlateMain.py index d42cf3b..f07dca3 100644 --- a/Connections/Shear/Finplate/finPlateMain.py +++ b/Connections/Shear/Finplate/finPlateMain.py @@ -8,14 +8,14 @@ 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 OCC import VERSION, BRepTools 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 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 @@ -24,7 +24,7 @@ from bolt import Bolt from nut import Nut import os.path from utilities import osdagDisplayShape -from OCC.Display.pyqt4Display import qtViewer3d +from OCC.Display.qtDisplay import qtViewer3d from colWebBeamWebConnectivity import ColWebBeamWeb from colFlangeBeamWebConnectivity import ColFlangeBeamWeb from OCC import IGESControl @@ -33,8 +33,7 @@ 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 +from drawing_2D import FinCommonData # Developed by deepa class MainController(QtGui.QMainWindow): @@ -45,8 +44,6 @@ class MainController(QtGui.QMainWindow): self.ui = Ui_MainWindow() self.ui.setupUi(self) - self.ui.comboConnLoc.currentIndexChanged[str].connect(self.setimage_connection) - #self.ui.comboConnLoc.currentIndexChanged[str].connect(self.changeColtoBeamSection) self.ui.combo_Beam.addItems(get_beamcombolist()) self.ui.comboColSec.addItems(get_columncombolist()) @@ -60,7 +57,7 @@ class MainController(QtGui.QMainWindow): 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)) @@ -145,16 +142,6 @@ class MainController(QtGui.QMainWindow): self.fuse_model = None self.disableViewButtons() - def changeColtoBeamSection(self): - if self.ui.comboConnLoc.currentText() == "Beam-Beam": - self.ui.lbl_ISsection.setText("Beam section") - self.ui.comboColSec.clear() - self.ui.comboColSec.addItems(get_beamcombolist()) - else: - self.ui.lbl_ISsection.setText("Column section") - self.ui.comboColSec.clear() - self.ui.comboColSec.addItems(get_beamcombolist()) - def showFontDialogue(self): font, ok = QtGui.QFontDialog.getFont() @@ -164,11 +151,12 @@ class MainController(QtGui.QMainWindow): self.ui.textEdit.setFont(font) def callZoomin(self): - self.display.ZoomFactor(1.5) + self.display.ZoomFactor(2) def callZoomout(self): self.display.ZoomFactor(0.5) + def callRotation(self): self.display.Rotation(15,0) def call_Pannig(self): @@ -213,6 +201,7 @@ class MainController(QtGui.QMainWindow): 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() @@ -231,6 +220,8 @@ class MainController(QtGui.QMainWindow): def populateWeldThickCombo(self): ''' Returns the weld thickness on the basis column flange and plate thickness check + ThickerPart between column Flange and plate thickness again get checked according to the IS 800 Table 21 (Name of the table :Minimum Size of First Rum or of a + Single Run Fillet Weld) ''' newlist = ["Select weld thickness"] weldlist = [3,4,5,6,8,10,12,16] @@ -305,23 +296,22 @@ class MainController(QtGui.QMainWindow): self.ui.lbl_connectivity.show() loc = self.ui.comboConnLoc.currentText() if loc == "Column flange-Beam web": - pixmap = QtGui.QPixmap(":/newPrefix/images/colF2.png") - pixmap.scaledToHeight(600) - pixmap.scaledToWidth(55) + pixmap.scaledToHeight(60) + pixmap.scaledToWidth(50) self.ui.lbl_connectivity.setPixmap(pixmap) #self.ui.lbl_connectivity.show() elif(loc == "Column web-Beam web"): picmap = QtGui.QPixmap(":/newPrefix/images/colW3.png") picmap.scaledToHeight(60) - picmap.scaledToWidth(55) + picmap.scaledToWidth(50) self.ui.lbl_connectivity.setPixmap(picmap) else: self.ui.lbl_connectivity.hide() def getuser_inputs(self): - '''(nothing) -> Dictionary + '''(none) -> Dictionary Returns the dictionary object with the user input fields for designing fin plate connection @@ -411,6 +401,7 @@ class MainController(QtGui.QMainWindow): def save_design(self): + self.outdict = self.outputdict() self.inputdict = self.getuser_inputs() self.save_yaml(self.outdict,self.inputdict) @@ -442,7 +433,7 @@ class MainController(QtGui.QMainWindow): #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. @@ -517,7 +508,7 @@ class MainController(QtGui.QMainWindow): def dockbtn_clicked(self,widget): - '''(QWidget) -> NoneType + '''(QWidget) -> None This method dock and undock widget(QdockWidget) ''' @@ -531,7 +522,7 @@ class MainController(QtGui.QMainWindow): def combotype_currentindexchanged(self,index): - '''(Number) -> NoneType + '''(Number) -> None ''' items = self.gradeType[str(index)] @@ -545,7 +536,7 @@ class MainController(QtGui.QMainWindow): def check_range(self, widget,lblwidget, minVal, maxVal): - '''(QlineEdit,QLable,Number,Number)---> NoneType + '''(QlineEdit, QLable, Number, Number)---> None Validating F_u(ultimate Strength) and F_y (Yeild Strength) textfields ''' textStr = widget.text() @@ -632,7 +623,7 @@ class MainController(QtGui.QMainWindow): This method displaying Design messages(log messages)to textedit widget. ''' - afile = QtCore.QFile('./Connections/Shear/Finplate/fin.log') + afile = QtCore.QFile('./fin.log') if not afile.open(QtCore.QIODevice.ReadOnly):#ReadOnly QtGui.QMessageBox.information(None, 'info', afile.errorString()) @@ -652,11 +643,11 @@ class MainController(QtGui.QMainWindow): 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 PySide import QtCore, QtGui +# return 'pyside' +# except: +# pass try: from PyQt4 import QtCore, QtGui return 'pyqt4' @@ -687,11 +678,8 @@ class MainController(QtGui.QMainWindow): 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 - + from OCC.Display.qtDisplay import qtViewer3d + self.ui.modelTab = qtViewer3d(self) #self.ui.model2dTab = qtViewer3d(self) @@ -707,7 +695,7 @@ class MainController(QtGui.QMainWindow): # background gradient display.set_bg_gradient_color(23,1,32,23,1,32) - #display.set_bg_gradient_color(255,255,255,255,255,255) + #display_2d.set_bg_gradient_color(255,255,255,255,255,255) # display black trihedron display.display_trihedron() display.View.SetProj(1, 1, 1) @@ -725,10 +713,10 @@ class MainController(QtGui.QMainWindow): 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.set_bg_gradient_color(186,195,201,255,255,255) self.display.View_Front() self.display.View_Iso() self.display.FitAll() @@ -759,18 +747,89 @@ class MainController(QtGui.QMainWindow): def fetchBeamPara(self): beam_sec = self.ui.combo_Beam.currentText() dictbeamdata = get_beamdata(beam_sec) + print dictbeamdata return dictbeamdata def fetchColumnPara(self): column_sec = self.ui.comboColSec.currentText() dictcoldata = get_columndata(column_sec) + print dictcoldata return dictcoldata + def boltHeadThick_Calculation(self,boltDia): + ''' + This routine takes the bolt diameter and return bolt head thickness as per IS:3757(1989) + + bolt Head Dia + <--------> + __________ + | | | T = Thickness + |________| | + | | + | | + | | + + ''' + dict = {5:4, 6:5, 8:6, 10:7, 12:8, 16:10, 20:12.5, 22:14, 24:15, 27:17, 30:18.7, 36:22.5 } + return dict[boltDia] + + + def boltHeadDia_Calculation(self,boltDia): + ''' + This routine takes the bolt diameter and return bolt head diameter as per IS:3757(1989) + + bolt Head Dia + <--------> + __________ + | | + |________| + | | + | | + | | + + ''' + dict = {5:7, 6:8, 8:10, 10:15, 12:20, 16:27, 20:34, 22:36, 24:41, 27:46, 30:50, 36:60 } + return dict[boltDia] + + def boltLength_Calculation(self,boltDia): + ''' + This routine takes the bolt diameter and return bolt head diameter as per IS:3757(1985) + + bolt Head Dia + <--------> + __________ ______ + | | | + |________| | + | | | + | | | + | | | + | | | + | | | l= length + | | | + | | | + | | | + |__| ___|__ + + ''' + dict = {5:40, 6:40, 8:40, 10:40, 12:40, 16:50, 20:50, 22:50, 24:50, 27:60, 30:65, 36:75 } + + return dict[boltDia] + + def nutThick_Calculation(self,boltDia): + ''' + Returns the thickness of the nut depending upon the nut diameter as per IS1363-3(2002) + ''' + dict = {5:5, 6:5.65, 8:7.15, 10:8.75, 12:11.3, 16:15, 20:17.95, 22:19.0, 24:21.25, 27:23, 30:25.35, 36:30.65 } + + return dict[boltDia] + def create3DColWebBeamWeb(self): ''' creating 3d cad model with column web beam web + ''' uiObj = self.getuser_inputs() + print uiObj resultObj = finConn(uiObj) dictbeamdata = self.fetchBeamPara() @@ -811,12 +870,13 @@ class MainController(QtGui.QMainWindow): plate_thick = uiObj['Plate']['Thickness (mm)'] bolt_dia = uiObj["Bolt"]["Diameter (mm)"] bolt_r = bolt_dia/2 - bolt_R = bolt_r + 7 + bolt_R = self.boltHeadDia_Calculation(bolt_dia) /2 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 # + bolt_T = self.boltHeadThick_Calculation(bolt_dia) + bolt_Ht = self.boltLength_Calculation(bolt_dia) + #bolt_Ht = 50.0 # minimum bolt length as per Indian Standard IS 3757(1989) + nut_T = self.nutThick_Calculation(bolt_dia)# bolt_dia = nut_dia + nut_Ht = 12.2 #150 #plate = Plate(L= 300,W =100, T = 10) plate = Plate(L= fillet_length,W =plate_width, T = plate_thick) @@ -890,11 +950,15 @@ class MainController(QtGui.QMainWindow): plate_thick = uiObj['Plate']['Thickness (mm)'] bolt_dia = uiObj["Bolt"]["Diameter (mm)"] bolt_r = bolt_dia/2 - bolt_R = bolt_r + 7 + bolt_R = self.boltHeadDia_Calculation(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 + bolt_T = self.boltHeadThick_Calculation(bolt_dia) + #bolt_T = 10.0 # minimum bolt thickness As per Indian Standard + bolt_Ht = self.boltLength_Calculation(bolt_dia) + # bolt_Ht =100.0 # minimum bolt length as per Indian Standard + nut_T = self.nutThick_Calculation(bolt_dia)# bolt_dia = nut_dia + #nut_T = 12.0 # minimum nut thickness As per Indian Standard nut_Ht = 12.2 # #plate = Plate(L= 300,W =100, T = 10) @@ -965,7 +1029,7 @@ class MainController(QtGui.QMainWindow): self.display3Dmodel("Beam") - def call_3DColumn(self): + def call_3DColumn(self): ''' ''' if self.ui.chkBxCol.isChecked(): @@ -1008,6 +1072,7 @@ class MainController(QtGui.QMainWindow): status = resultObj['Bolt']['status'] self.call_3DModel(status) + self.call2D_Drawing() def create2Dcad(self,connectivity): ''' Returns the fuse model of finplate @@ -1143,8 +1208,7 @@ class MainController(QtGui.QMainWindow): 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) @@ -1152,21 +1216,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") - - def mkAndSaveSvg(self, connectivity): - conXZ = ColWebBeamWebXZ(connectivity) - conXZDwg = conXZ.mkOSDAGDrawing2D('test.svg') - conXZDwg.saveSvg() + self.display2DModel( self.fuse_model,"Left") + + def call2D_Drawing(self): + ''' This routine saves the 2D SVG image as per the connectivity selected + SVG image created through svgwrite pacage which takes design INPUT and OUTPUT parameters from Finplate GUI. + ''' uiObj = self.getuser_inputs() resultObj = finConn(uiObj) dictbeamdata = self.fetchBeamPara() dictcoldata = self.fetchColumnPara() - fin2DFront = Fin2DCreatorFront(uiObj,resultObj,dictbeamdata,dictcoldata) - fin2DFront.saveToSvg() + finCommonObj = FinCommonData(uiObj,resultObj,dictbeamdata,dictcoldata) + finCommonObj.saveToSvg() def call_Topview(self): @@ -1246,7 +1310,7 @@ def set_osdaglogger(): logger.setLevel(logging.DEBUG) # create the logging file handler - fh = logging.FileHandler("./Connections/Shear/Finplate/fin.log", mode="a") + fh = logging.FileHandler("./fin.log", mode="a") #,datefmt='%a, %d %b %Y %H:%M:%S' #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') @@ -1281,43 +1345,9 @@ 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/finSide.svg b/Connections/Shear/Finplate/finSide.svg new file mode 100644 index 0000000..e7a1fb8 --- /dev/null +++ b/Connections/Shear/Finplate/finSide.svg @@ -0,0 +1,2 @@ + +2 @100 mm c/c50 mm 50 mmBeam ISMB 400Column ISSC 200 PLT. 300x100x10 z 6 mm \ No newline at end of file diff --git a/Connections/Shear/Finplate/finTop.svg b/Connections/Shear/Finplate/finTop.svg new file mode 100644 index 0000000..5c5edba --- /dev/null +++ b/Connections/Shear/Finplate/finTop.svg @@ -0,0 +1,2 @@ + +50 mmBeam ISMB 400Column ISSC 200 PLT. 300x100x10 z 6 mm20 mm \ No newline at end of file diff --git a/Connections/Shear/Finplate/finfront.svg b/Connections/Shear/Finplate/finfront.svg new file mode 100644 index 0000000..9a8693b --- /dev/null +++ b/Connections/Shear/Finplate/finfront.svg @@ -0,0 +1,2 @@ + +2 @100 mm c/c50 mm33 mm50 mm20 mm50 mmPLT. 300X100X10Column ISSC 2003 nos 20Ø holesfor M20 bolts (grade 8.8)Beam ISMB 400 z 6 mm \ No newline at end of file diff --git a/Connections/Shear/Finplate/icons_rc.py b/Connections/Shear/Finplate/icons_rc.py index 9a81679..fea1a28 100644 --- a/Connections/Shear/Finplate/icons_rc.py +++ b/Connections/Shear/Finplate/icons_rc.py @@ -2,8 +2,7 @@ # Resource object code # -# Created: Thu Oct 1 12:21:41 2015 -# by: The Resource Compiler for PyQt (Qt v4.8.6) +# Created by: The Resource Compiler for PyQt4 (Qt v4.8.6) # # WARNING! All changes made in this file will be lost! @@ -705,6 +704,266 @@ qt_resource_data = "\ \x2d\x31\x37\x54\x31\x30\x3a\x34\x33\x3a\x32\x34\x2d\x30\x36\x3a\ \x30\x30\x25\x20\xe2\x45\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ +\x00\x00\x10\x1f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x02\x82\x00\x00\x01\xd0\x08\x02\x00\x00\x00\xba\x3c\x9c\x23\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x0f\xd1\x49\x44\x41\x54\x78\x9c\xed\ +\xdd\xcf\x6b\x9c\x07\x7e\xc7\xf1\xef\x63\x5b\x96\x6d\x45\xb6\x93\ +\xb4\x2b\xda\x6d\x8b\x6e\x65\x4b\x28\x75\xd3\x53\xa1\x3d\x14\x02\ +\x65\xbb\x3d\x95\xb2\x86\x42\xd8\x43\xc1\xbd\x14\x5a\xcc\x9e\x1d\ +\x1f\xcb\xe2\xa5\x57\x5f\x7a\x08\x14\x42\xa1\xb7\x1e\x0a\xb9\xed\ +\x3f\x60\x28\xf9\x03\xd4\xd2\x12\x26\x6d\xb4\x76\x14\x5b\x96\x65\ +\xf9\xe9\x41\x91\xa2\xe8\xe7\xa3\xd1\xcc\x7c\xe6\x99\x79\xbd\x10\ +\xe2\x19\xe9\xd1\x3c\xdf\x31\x0c\x6f\x3d\xbf\xac\x66\xa5\x59\x2d\ +\x00\x20\xe1\x4a\x7a\x00\x00\x98\x5f\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x01\ +\x83\x76\xed\xe8\x17\x57\x9a\xd5\x09\x8f\x01\xc4\x35\xde\xf9\x30\ +\x01\xc7\x76\xf7\x28\xef\x47\x98\x37\xf6\x86\x61\x5c\x3a\xa6\x17\ +\x98\x67\x32\x0c\xa3\x74\xae\xf4\x3e\xbc\xbb\xbc\xbf\xfc\xe0\x93\ +\x8d\xd1\x4f\x03\x4c\x3d\x19\x86\x8b\x1a\x3a\xbd\x00\x32\x0c\xe7\ +\x36\xf4\xd1\xe6\xbe\x37\xf8\xa4\x17\xee\x94\x36\x0c\xcd\x25\x5a\ +\xd0\xc9\xc4\x4e\xf4\x4e\xdb\x5b\xb2\xcb\x0b\x9f\xb6\x99\xa1\x47\ +\xec\x0d\xc3\x89\x86\x48\xef\x67\x1f\x7f\xb0\xbb\xf0\xde\x87\x9f\ +\x8e\x6f\xa3\x63\xcd\x9e\x2b\xcb\x60\x92\x64\x18\xbe\x75\xde\x02\ +\x9d\x72\x8d\xd5\x7e\x8f\x4f\x37\x5c\xad\x47\x9e\x6a\x57\x96\x41\ +\x8a\x0c\x43\x55\xe7\x0e\x8d\xfc\xe4\x6e\x97\x5a\x8f\x2f\xd5\xdd\ +\xf5\xfd\xac\x36\x4c\x2d\x19\x86\x33\x8a\x15\x2f\xd0\xf8\x52\x7d\ +\xba\xf8\x0b\x87\x79\x20\xc3\xf0\x8d\x43\xa7\x75\xfb\x15\xa1\x93\ +\x52\x7d\xde\x3c\xf7\xeb\x55\xc3\x0c\x90\x61\x98\x35\xe7\x4a\xaf\ +\xee\x42\x96\x0c\xc3\x2c\x90\x5e\xe8\x29\x19\x86\x1e\xeb\x5e\x5f\ +\xe9\x85\xe9\x24\xc3\xd0\x57\x67\x36\x58\x7a\x61\xfa\xc9\x30\xf4\ +\xdb\xee\xc5\x59\xfb\x49\x96\x5e\xe8\x17\x19\x86\x59\xf0\xd9\xc7\ +\x1f\x8c\xe3\x9e\x25\x60\xdc\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x18\xc6\x83\x4f\x36\xf6\x97\ +\x07\xed\xda\xe9\x2b\xaf\x34\xab\xe3\x9c\x05\x7a\x4c\x86\x81\xae\ +\x0e\xa6\xf7\x5c\xce\xec\x74\x49\x35\xf3\x4a\x86\x81\x13\x9d\xd2\ +\xdd\x7b\xf7\xee\x75\x7f\x9e\xc7\x8f\x1f\x9f\xb9\x8e\x54\x33\x9f\ +\x64\x18\xf8\x8e\x51\xa5\xf7\xbc\x3f\x28\xd5\xcc\x27\x19\x06\x4e\ +\x4c\xef\xd0\xdd\x1d\x82\x54\x33\x9f\x64\x18\xe6\xd4\x34\xa4\xf7\ +\xbc\xa4\x9a\xd9\x23\xc3\x30\x5f\x8e\xad\xef\x34\xa7\xf7\xbc\x26\ +\x99\xea\x52\x6b\x2e\x4c\x86\x61\x8e\x9c\xb4\x07\x7c\x66\x96\x66\ +\xa9\xd3\x35\xba\x54\x97\x1d\x6b\x2e\x4c\x86\x61\xee\x3c\x79\xf2\ +\xe4\xe0\xc3\x3b\x77\xee\x9c\xf9\x23\x5d\x9a\x34\x87\xa9\x2e\xc7\ +\xc0\xb9\x30\x19\x86\x79\x77\xa8\xca\xc7\x92\xea\x93\x38\x5d\xcd\ +\x05\xc9\x30\x70\x36\xa9\xbe\x08\xa9\xe6\x14\x32\x0c\x8c\x86\x54\ +\x5f\x84\x54\xcf\x2d\x19\x86\xb9\x73\xb0\x85\x5d\xda\x39\x42\x93\ +\x4c\x75\xcd\x5c\xad\xa5\x7a\x26\xc9\x30\xcc\x91\x87\x77\x97\x0f\ +\x5d\x2c\xdd\xa5\x79\x3d\x4d\x75\xcd\xe5\x8e\xf5\x04\x52\xad\xd0\ +\xa3\x25\xc3\x30\x5f\x1e\xde\x5d\x3e\xf8\xb0\xcb\x5f\x6b\xe8\x69\ +\xaa\xcb\x31\xf0\x13\x5c\x30\xd5\x83\x76\x4d\x89\x47\x48\x86\x61\ +\xae\x1d\xaa\xf2\xae\xdd\x36\xef\xa7\xae\x4b\xcc\xa6\x30\xd5\x1d\ +\xb7\x28\xd5\x47\x75\x3c\xe6\xcf\x48\xc8\x30\x70\x86\x51\xc5\x4c\ +\xaa\xa7\x39\xd5\xa7\xcc\xff\xe8\xd1\xa3\xfd\xe5\xfb\xf7\xef\x4f\ +\x64\x9c\x39\x22\xc3\xc0\x08\x48\x75\x1f\x53\x7d\xd2\x3c\x07\xbb\ +\xcb\xb8\xc9\x30\x30\x21\x52\x3d\x0d\xa9\x96\xde\x69\x23\xc3\xc0\ +\x14\x99\x64\xaa\x3b\x6e\x6e\x84\x22\xa9\xee\x78\xb4\x99\x14\x19\ +\x06\x7a\x66\x84\x77\x34\x4d\xe1\x8e\xf5\xb8\x53\x3d\x44\x7a\x0f\ +\x9d\x0f\x76\x99\xf4\x68\xc9\x30\x30\x83\x46\x78\x47\x53\xdf\x53\ +\x3d\xdc\x2e\xef\x49\x97\x62\x69\xf0\xc8\xc9\x30\x30\xbf\x66\xf8\ +\x74\xf5\x93\x27\x4f\x3a\x1e\x12\xd8\x75\xca\x25\xd0\xd2\x3b\x56\ +\x32\x0c\x70\x9a\x19\x4e\xb5\xf4\x4e\x03\x19\x06\xb8\xa8\x1e\xa5\ +\xfa\xf4\x1b\x7f\xd5\x77\xf2\x64\x18\x60\x12\x82\xa9\x3e\x29\xbd\ +\xbb\xab\x9d\xeb\xd8\x35\x23\x27\xc3\x00\xd3\x62\x1c\xa9\x3e\xd4\ +\xe0\xc9\xdf\x51\xcd\xe9\x64\x18\xa0\x4f\x86\x48\xb5\xf4\x4e\x33\ +\x19\x06\x98\x35\xba\xdb\x23\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\ +\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\xa3\xf1\xf0\ +\xee\xf2\x83\x4f\x36\xde\xfb\xf0\xd3\xcf\x3e\xfe\x20\x3d\x0b\xd0\ +\x1b\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\ +\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x1c\xef\xce\x9d\x3b\ +\x55\xf5\xe4\xc9\x93\xf4\x20\x30\xcb\x64\x18\xa8\xaa\x7a\xf0\xc9\ +\xc6\xb1\x5f\xdf\x8d\xf1\x99\xd4\x1a\x86\x23\xc3\x30\xbf\x4e\x4a\ +\xef\xbd\x7b\xf7\xf6\x97\x1f\x3f\x7e\xdc\xe5\xa9\xba\xd4\x5a\xaa\ +\xe1\x28\x19\x86\xf9\xd2\x25\xbd\x5d\xbe\x7e\x48\x97\x5a\x4b\x35\ +\x1c\x25\xc3\x30\x47\x4e\x6a\x70\x9d\xd0\xd1\x8e\x0d\xee\xb8\xa6\ +\x54\xc3\x51\x32\x0c\x73\x67\x37\x63\x5d\x82\xd7\x25\x9c\x52\x0d\ +\x17\x21\xc3\x30\xa7\xba\x84\x6a\x54\xa9\xae\xce\xb5\x96\x6a\xe6\ +\x8d\x0c\x03\x27\x1a\x55\xaa\x6b\xa4\x3b\xd6\x52\xcd\x2c\x91\x61\ +\xe0\x42\x3a\x86\x6a\xc2\xc7\xc0\xa5\x9a\xbe\x90\x61\x98\x3b\x77\ +\xee\xdc\x99\x7c\x39\x26\x79\x0c\x5c\xaa\xe9\x11\x19\x86\x39\xf2\ +\xf0\xee\xf2\xee\xc5\xd2\xd3\x59\x0e\xa9\xee\x32\xd2\x58\x0d\xda\ +\xb5\x2e\xab\xad\x34\xab\x63\x1d\x63\xae\xc8\x30\xcc\x97\x87\x77\ +\x97\xeb\xd4\x3b\x97\xf6\x4d\x67\x39\xa4\xba\xcb\x48\xf4\x88\x0c\ +\xc3\x3c\xda\x8d\xf1\xe9\xa4\xba\xa7\xa9\xae\x0b\xfc\x9b\xef\xcf\ +\xd9\xf1\x02\x78\x2e\x4e\x86\x81\xe3\x4d\x32\xd5\x35\xf1\x5a\xf7\ +\x34\xd5\x1d\xb7\x38\xf4\xaf\x47\x27\x3d\xf9\xa3\x47\x8f\x76\x17\ +\xee\xdf\xbf\x7f\xe6\x33\x73\x2e\x32\x0c\x5c\xd4\xe9\x67\x0a\x3b\ +\x9e\x6e\x9c\xc2\x1d\xeb\x29\x4c\x75\xc7\x35\x2f\x9e\xea\xfd\xee\ +\x32\x6e\x32\x0c\x8c\x57\xc7\xcb\x79\xba\xd4\x5a\xaa\x3b\xcd\x74\ +\xd6\x9a\xc7\x6e\x4b\x77\x53\x64\x18\x98\x0a\x5d\x6a\x2d\xd5\x5d\ +\x36\x77\xb4\xc1\xa7\xfc\xa0\xfa\xc6\xc9\x30\xd0\x1b\x52\xdd\xe5\ +\xa9\xce\xac\xf5\x10\xe9\x75\x4a\x78\x7c\x64\x18\x98\x29\x73\x9e\ +\xea\x3a\x6e\xf2\xe1\x76\x79\x4f\x4a\xaf\x9b\x86\x47\x4b\x86\x81\ +\xb9\x33\xc3\xa9\x3e\xb4\xc5\x8e\x3b\xd0\xbb\x4e\xd9\xe5\x95\xde\ +\xf1\x91\x61\x80\x63\xcc\x76\xaa\xf7\x49\x6f\x9c\x0c\x03\x0c\xa9\ +\xa7\xa9\x76\xb4\x79\xaa\xc8\x30\xc0\x18\x4d\x49\xaa\xa5\x77\x6a\ +\xc9\x30\x40\xd8\xb8\x53\x7d\xa8\xc1\xd2\x3b\x55\x64\x18\xa0\x07\ +\x2e\x98\x6a\xe9\x9d\x5a\x32\x0c\x30\x23\xb4\xb6\x8f\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x80\xde\xdb\x68\xd7\x9b\x6a\x76\x97\x9b\xa6\x59\xaa\ +\xdb\xd9\x79\xba\x93\x61\x00\x7a\x6f\xab\x5e\xdc\x68\x6e\xb6\xd5\ +\x6e\xb7\x5b\x6f\xda\x9d\xa5\x46\x86\x01\x60\x22\xb6\x6a\xf3\x52\ +\x5d\xbe\x51\x37\xab\xea\x59\xfd\xdf\xd5\x5a\x48\x4f\x74\x0e\x32\ +\x0c\x40\xbf\x2d\xd6\xf5\x9d\xe6\x75\x55\x3d\xaf\xa7\x55\xed\x5b\ +\xcd\xdb\xe9\x89\xce\x41\x86\x01\xe8\xbd\x1b\xb5\xbc\x55\x2f\x5e\ +\xb5\x5b\x37\x9a\xe5\xf4\x2c\xe7\x23\xc3\x00\xcc\x82\xcd\xf6\xeb\ +\xab\xcd\xe2\x62\xdd\xd8\xaa\xcd\xc5\xba\x9e\x1e\xa7\x2b\x19\x06\ +\xa0\xf7\x36\xda\xf5\xaa\xda\xbd\x40\x7a\xbb\x7d\xb9\xd8\xc8\x30\ +\x00\x4c\xca\x56\x6d\x2e\xef\x9d\x12\x7e\x53\x6f\xb2\xc3\x9c\x8b\ +\x0c\x03\xd0\x6f\xcf\xeb\xd9\x4e\x6d\x3f\x6b\xff\x77\xf7\xe1\xe5\ +\x5e\xa5\xad\x4f\xb3\x02\xc0\x51\x4b\x75\x6b\xa9\xb9\x95\x9e\x62\ +\x48\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x40\ +\xbf\x0d\xda\xdf\xab\xfa\xc9\x4a\xf3\x77\xe9\x41\x86\x21\xc3\x00\ +\xf4\xdd\xdf\x56\xfd\x76\x7a\x86\x21\xc9\x30\x00\x7d\xf7\xfb\x55\ +\xcf\x07\xed\xf7\x57\x9a\xff\x49\x4f\x72\x6e\x32\x0c\x40\x8f\x0d\ +\xda\x1f\xef\x2d\xfe\x65\xd5\x3f\x26\x47\x19\x8a\x0c\x03\xd0\x6b\ +\x7f\xba\xb7\x70\x33\x39\xc5\xb0\x64\x18\x80\xbe\x1a\xb4\xef\x57\ +\xed\xfe\xc7\x1d\x6d\xd5\xcd\x41\xfb\x1b\x2b\xcd\x7f\x87\x67\x3a\ +\x27\x19\x06\xa0\xbf\x3e\xac\xba\x55\xd5\x54\x55\xd5\x4a\xd5\x1f\ +\x54\xc9\x30\x00\x4c\xc8\xad\xaa\x77\x0e\x3c\xbc\x39\x68\x37\x56\ +\x7a\xf5\x27\x87\x65\x18\x80\xbe\x5a\x69\x7e\x32\x68\x7f\x5e\xf5\ +\x27\x55\x55\xf5\xcf\x2b\xcd\xbf\x57\xf5\xa9\xc1\x25\xc3\x00\xf4\ +\xdf\x95\xaa\x17\xe9\x19\x86\x24\xc3\x00\xcc\x86\x26\x3d\xc0\x30\ +\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x80\x5e\x6b\xd3\x03\x5c\ +\x88\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\ +\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\xd0\x6b\xbb\x37\x2c\ +\xf5\xf2\xbf\xd0\x2a\x19\x06\x80\x20\x19\x06\x60\x8c\xbe\x6e\x7f\ +\xd9\x56\x7b\xa5\xb9\x7a\xbd\xde\xaa\xaa\x8d\x76\xfd\x52\x73\x69\ +\xa9\x6e\xa7\xe7\x9a\x16\x32\x0c\x23\xf0\xe0\x93\x8d\xfd\xe5\xf7\ +\x3e\xfc\xf4\xe0\xb7\x3e\xfb\xf8\x83\x89\x8f\x03\x53\xa4\xad\xf6\ +\x65\x3d\x5f\xaa\x2b\x55\xb5\x55\x2f\xb6\x6b\xeb\x4a\x7b\xb5\xb7\ +\x87\x90\x47\x4f\x86\x61\x48\x07\xd3\x7b\x8a\x43\x55\x3e\x56\xbf\ +\x52\x7d\xe8\x85\xaf\x34\xab\x99\x39\xe8\x89\xe5\xe6\x9d\x9d\xf6\ +\x75\x5b\x6f\xaa\xaa\xad\xf6\x4a\x5d\xbd\xd9\xbc\x9b\x1e\xea\x3b\ +\x76\xf7\xd7\x17\x9a\xc5\x6b\xb5\x54\x55\x1b\xed\xfa\xe5\xe6\xca\ +\x8d\xba\x39\x99\xad\xcb\x30\x9c\xc3\x49\xe9\x3d\x25\x45\x83\x76\ +\xed\xcc\xa7\x9d\xf2\x54\x9f\xf2\x0b\x87\x06\xd3\xc5\xf5\xe6\xad\ +\x17\xed\xc6\xe5\xe6\xf9\x76\xbb\xb5\xd0\x5c\x4d\x8f\x73\x8c\x97\ +\xf5\xfc\x52\x5d\xae\xaa\xcd\xda\x78\x55\x2f\x17\xdb\xeb\x13\xdb\ +\x5f\x97\x61\x38\xcd\xc5\x0b\xd4\x65\xb5\x51\xa5\x7a\x84\xa4\x97\ +\x11\x5a\xac\x1b\xaf\xea\xe5\xf3\xf6\xd9\x42\x2d\x5e\xaf\xe5\xf4\ +\x38\x87\xbd\xd5\xbc\xfd\xa6\x7d\xb3\xd3\x6e\x57\x53\x3b\xed\xce\ +\xd5\xba\xf6\x56\xf3\xf6\xc4\xb6\x2e\xc3\xf0\x8d\x43\x9d\x3b\xb6\ +\x43\x63\x2a\xd0\xa8\x52\x7d\x41\x43\xec\xeb\x43\x47\xcb\xcd\x3b\ +\xeb\xed\xe7\x57\x9b\x6b\x63\x78\xee\x11\xfc\x85\xa5\x9b\xcd\xbb\ +\x4f\xdb\x2f\x9e\xb6\x5f\x34\xd5\xdc\x6a\x7e\xf5\xe2\x4f\xd8\x9d\ +\x0c\x43\xad\x34\xab\x27\x45\x6e\x7a\x0a\x74\x74\x92\x91\x84\x59\ +\x7a\x99\x98\xa6\x2e\xed\x9e\x7c\x9d\x4e\x0b\xcd\xe2\x8b\xf6\xd9\ +\xb5\x89\xef\xac\xcb\x30\x54\xcd\x53\x75\x1c\x6d\x26\xa7\xdd\xaa\ +\x17\x8b\x75\x23\xb5\xf9\x5f\x1c\xf8\xcd\xf5\x8f\x9b\xd5\x43\xdf\ +\xdd\x6e\xb7\xae\xd4\xe2\x4e\x6d\x4f\x70\xa2\x2a\x19\x86\x79\x20\ +\xbd\x64\xad\xb7\x9f\xbf\xae\x57\x6d\xb5\xdb\xed\xd6\xd5\xba\x7e\ +\xbb\xf9\xde\xee\xd7\x07\x1f\xad\x55\xd5\xca\x47\xab\x93\x1c\xe6\ +\xa7\x55\x3f\xab\xfa\x45\xbb\xf6\x67\x55\x1b\xcd\x37\x9b\xde\x68\ +\xd7\x2f\xd5\xa5\x9b\xcd\xaf\x6c\xb4\xeb\x5f\xb5\x5f\x4e\xf2\x5a\ +\x6e\x19\x86\xd9\xe4\x68\x33\xd3\xe3\x9d\xe6\xd7\x0e\x3e\x1c\xfc\ +\xe6\x5a\xfd\xa0\x6a\xef\x34\xf1\xe0\xa3\xb5\x71\x97\xf8\x8f\xda\ +\xb5\x95\xaa\x7f\xaa\x5a\xa8\x7a\xbf\xea\x5f\xab\xfe\xa2\xaa\xa9\ +\xba\xdd\xae\x3d\x6d\x56\x37\xeb\xeb\x57\xf5\xf2\xdd\xe6\xd7\xab\ +\x6a\xb9\x79\xe7\x97\xed\xe0\x79\x3d\x5b\xaa\x5b\x63\x1d\x69\x9f\ +\x0c\x43\xbf\x05\xaf\x2c\x83\x73\x19\xfc\xd6\x5a\xfd\xa8\xea\x5a\ +\xd5\xed\xaa\x9d\xaa\xd7\x55\x55\xb5\x5d\xf5\xa2\x06\x7f\xb3\x56\ +\x9b\x55\x1b\x55\x5f\x7e\xfb\xb1\xf2\x6a\xf5\x9c\x5b\xf8\xf6\x1e\ +\xa3\xad\x76\xed\x87\x55\x2b\x55\xd7\xaa\xae\x54\x2d\x54\x5d\xae\ +\x7a\x5d\xb5\x5d\xdf\x6c\xa7\xaa\xfe\x6d\xef\xd0\xf4\x46\xfb\x65\ +\x55\x3d\x6d\xbf\xb8\xdd\x7c\x6f\xa3\x5d\x7f\x55\x9b\xaf\xdb\x57\ +\x4b\xcd\x84\x32\xdc\x78\x7f\x42\x7f\x9d\x72\x95\x96\xb7\x36\xd3\ +\x66\xf0\x0f\x6b\xb5\x50\xb5\x54\xf5\xba\x6a\xa7\x6a\xbd\xea\x87\ +\x55\x3b\x7b\x49\x3e\xf8\xf9\x65\xd5\x66\xd5\x8b\xaa\xcd\xbd\x8f\ +\xfd\xe5\xfd\x54\xaf\x57\x7d\x59\xb5\x79\x78\x2b\x3f\xad\x5a\xa8\ +\x5a\xa8\xba\x52\xd5\xec\xa5\xf7\x75\xd5\x56\xd5\x46\xd5\x57\x55\ +\x1b\x55\x9f\x57\xfd\x4b\xd5\x9d\xaa\xe5\x66\x75\xf2\xff\x0e\x87\ +\xc8\x30\xcc\x88\x41\xbb\xe6\xed\xcc\xf4\x1b\xfc\xf5\x5a\xfd\xa0\ +\x6a\xa1\x6a\xbd\xea\x47\x55\x97\xf6\x3e\x9a\x03\xcb\x75\x24\xcc\ +\x47\x3f\x6f\x55\xbd\xa8\xfa\xf0\x98\x4d\x3c\xd8\x4b\xef\x66\xd5\ +\x57\x7b\xe9\xfd\xaf\xaa\xff\xac\xfa\x8f\x03\xab\x1d\xbd\x4a\x2b\ +\x42\x86\x01\x98\xb4\xc1\xdf\xaf\xd5\xf7\xab\xbe\xde\x7b\x7c\xb5\ +\x6a\xa9\xea\xc6\x81\xcf\x4b\x55\x97\xbf\x9b\xe7\xe6\xbb\xcd\xde\ +\xdd\xd5\xfd\x9d\x63\x9e\xfc\xaf\xaa\x36\xaa\x9e\x56\xad\x55\x6d\ +\x35\xab\x07\xbf\xb5\x7f\xb1\xf4\x94\x34\xb8\x64\x18\x80\x88\xc1\ +\x9f\xaf\xd5\xfb\x55\xdd\xae\x94\x1e\xfc\x78\xad\x7e\xf7\xb8\x54\ +\xff\xe1\x31\x2b\xf7\xab\x6b\x32\x0c\x40\x5f\x1d\xbd\x3c\xa2\x77\ +\x51\x93\x61\x00\x7a\xec\x60\x89\xfb\x58\x34\x19\x06\x80\x18\xf7\ +\x0d\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\x0c\x03\x40\x8c\ +\x0c\x03\x40\x8c\x0c\x03\x40\xcc\xff\x03\x56\x7d\x74\x4f\xbc\xfa\ +\x6e\xda\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x27\xbc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -1343,6 +1602,460 @@ qt_resource_data = "\ \x42\x33\x57\xae\x5c\x89\x0d\x1b\x36\x00\x78\x78\xc4\xb9\x5b\x68\ \x3a\x11\x91\x69\x4b\xfa\x5f\x5f\xdd\xb6\x9d\x4d\x12\x53\x9f\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x15\x64\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x02\x82\x00\x00\x02\x29\x08\x02\x00\x00\x00\xb9\x49\xce\x6f\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x15\x16\x49\x44\x41\x54\x78\x9c\xed\ +\xdd\x6f\xa8\x64\x77\x7d\xc7\xf1\xef\xc9\x9f\x12\xdd\xdd\xa8\x4d\ +\x43\x49\x69\x22\x8a\x04\xca\x16\x1a\xf3\xc7\xa2\x04\x29\xa1\x6a\ +\x13\x54\x82\x16\x8d\x22\x2c\x6b\x41\x59\xc4\xd4\xc4\x75\x9f\xb4\ +\xb8\x24\xcd\x83\xb8\x0f\xd6\xa4\x20\x4b\x9e\xb8\xa5\x04\xdc\x3e\ +\x88\x09\xa1\x18\x2c\x25\x20\xd9\xc6\x84\xec\x83\x68\x29\x6d\x42\ +\x94\x06\x44\x68\x0d\xcd\xa6\x89\x4d\xee\xba\x3a\x7d\x30\xdc\xc9\ +\xd9\xbb\x77\xee\x9d\x7b\xef\x9c\xf9\x9c\x99\x79\xbd\xb8\x2c\x73\ +\xe7\xce\x9d\xfb\x9b\x61\x67\xde\x73\x7e\xe7\x77\x66\x9a\xc1\x60\ +\x50\x00\x40\xc2\x45\xe9\x01\x00\xc0\xf2\x92\x61\x00\x88\x91\x61\ +\x00\x88\x91\x61\x00\x88\x91\x61\x00\x88\x91\x61\x00\x88\x91\x61\ +\x00\x88\x91\x61\x00\x88\x91\x61\x00\x88\x91\x61\x00\x88\x91\x61\ +\x98\xb5\xa6\x69\xc6\xfd\xc8\x9b\xcb\xc2\xb2\x91\x61\xe8\x91\x76\ +\xa1\x25\x19\x96\x81\x0c\x43\x4f\x49\x32\x2c\x03\x19\x86\x8c\xbb\ +\x6e\xdb\x33\x3c\x71\xf8\xc4\xab\xe7\xff\x74\xff\x4d\x97\x1c\x7f\ +\xfc\x8d\xd1\xb7\x92\x0c\x8b\xaa\xf1\x90\x86\x19\x1b\x36\x75\x94\ +\xe1\xb6\x49\x92\x3c\xe2\xc1\x0b\x0b\x40\x86\x61\xd6\x36\xc8\xf0\ +\xc8\xba\x3d\x2e\x49\x86\x85\x23\xc3\x30\x6b\x93\x64\xb8\x6d\x4b\ +\x9b\xc8\x25\xc9\x30\x57\xec\x1b\xa6\xa7\xd6\x3d\xaa\x67\xd9\x02\ +\x33\x6e\x9b\xb8\xaa\xc6\x35\xb8\xec\x48\x86\xb9\x22\xc3\xf4\xd1\ +\xb8\x23\x6b\x17\x2c\x30\x1b\x54\x76\x5a\x16\xec\x1e\x83\xc5\x63\ +\x52\x9a\xde\xd9\xe0\xdd\x2d\xc6\xe9\xed\x7f\xe3\x6d\xdc\x96\x49\ +\x3c\x7b\xfc\xa6\xe1\x89\x6b\xf6\x3f\x5e\x55\x77\xdd\xb6\xc7\xc4\ +\x35\xcc\x29\x5b\xc3\xf4\xd4\xc6\xc7\xf3\xac\x91\xda\xe6\xeb\xba\ +\xb2\x93\x6b\xef\x69\x1e\xdd\x63\xed\x06\x8f\x3b\x02\x4a\x8f\x21\ +\x4b\x86\xe9\xbb\x75\x03\xd3\xd6\xe9\x21\xb6\xfd\x09\xed\xe4\xd6\ +\x7d\x05\x33\x2e\xc9\x66\xad\x21\xcb\xa4\x34\xbd\x33\xe1\x42\xe2\ +\xa9\x4c\xc3\xce\x63\x65\xdb\x46\x93\xd2\x9b\x5e\x72\xab\xfb\xa1\ +\x3d\x33\xc0\x6c\xd8\x1a\x66\x5e\x6d\x69\x9b\xaf\xa6\x5d\xdc\x99\ +\x85\x76\x5a\x36\x9d\x54\x58\xa3\x69\xbc\x46\x87\x59\x90\x61\xe6\ +\xde\xb8\xc0\x6c\x90\xe4\x4d\xcd\x5d\x65\xb7\x64\xab\x49\x06\xba\ +\x23\xc3\x2c\x94\x49\x92\x3c\xce\x62\xa7\x77\x9c\xd1\x2a\xeb\xf6\ +\xcd\x1f\xce\x75\x03\x33\x20\xc3\x2c\xac\xad\x6e\xf3\xb5\xdb\xb3\ +\x9c\x49\x06\x66\x4f\x86\x59\x0a\x5b\x5d\x6e\x2d\xc9\xc0\x6c\xc8\ +\x30\x4b\x67\xab\x87\xd8\x8e\x92\xac\xc7\xc0\xd4\xc9\x30\x4b\x6d\ +\x4b\xcb\xad\x6d\x22\x03\x53\x27\xc3\x50\xb5\xf5\xb5\x5d\xd7\xec\ +\x7f\x5c\x89\x81\x9d\x93\x61\x58\x6b\xc2\xb5\x5d\x4a\x0c\xec\x9c\ +\x0c\xc3\x46\x86\x49\x76\x48\x0f\xd0\x11\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\ +\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x06\x80\x18\x19\x86\ +\xb9\x74\xcd\xfe\xc7\xd3\x43\x00\xa6\x40\x86\xa1\x8f\xb6\x54\xd9\ +\xc3\x27\x5e\xad\xaa\xbb\x6e\xdb\xd3\xd9\x70\x80\xae\xc8\x30\x64\ +\xec\x70\x73\xf6\xc0\x81\x03\xc3\x13\xc7\x8e\x1d\x1b\x9e\x18\xc6\ +\x78\x48\x92\x61\x5e\xc8\x30\x74\x62\x5a\x95\x9d\xfc\x92\xa3\x1e\ +\x97\x24\xc3\xfc\x90\x61\xd8\xbe\x9d\xb4\x76\xf2\xd0\x6e\xe3\x0a\ +\x25\x19\xe6\x85\x0c\x43\x27\xa6\x5e\xd9\x6d\xff\x75\x49\x86\x3e\ +\x93\x61\xd8\xbe\x6c\x6b\x27\x34\x49\x92\x81\x14\x19\x86\x25\x32\ +\x2e\xc9\xb5\x3a\xc1\xfe\xec\xf1\x9b\x66\x3d\x26\x58\x6e\x32\x0c\ +\x4b\x6a\xdd\xb5\x5d\x0e\x47\x86\x19\x93\x61\xd8\xbe\x63\xc7\x8e\ +\xcd\xc5\xbc\xf4\xc6\xc6\x6d\x22\x37\x4d\x33\x3a\x3d\x18\x0c\x66\ +\x3a\x26\x58\x1a\x32\x0c\x3b\xd2\xee\x96\x24\x03\x5b\x25\xc3\xb0\ +\x7d\x47\x8f\x1e\xbd\xf3\xce\x3b\x47\xdf\x4a\x32\xb0\x55\x32\x0c\ +\x3b\x72\xf4\xe8\xd1\xd1\xe9\x65\x4e\xb2\x1e\xc3\xf6\xc8\x30\x4c\ +\xcd\xa6\x49\x5e\x80\x1e\xd7\x98\x24\xdb\x44\x86\xed\x91\x61\xe8\ +\xc4\xba\x49\x5e\xb0\x4d\xe4\x1a\xb3\xdc\x5a\x92\x61\x72\x32\x0c\ +\x9d\x1b\x25\x79\x99\x67\xad\x4b\x92\x61\x3d\x32\x0c\xb3\x63\x47\ +\xf2\xe8\xb4\x24\xc3\x50\xe3\xc1\x40\xdf\x0c\x9f\xac\x7b\xf5\x8e\ +\xc7\xc3\xf7\x7d\x6c\xbf\xc3\xd4\x9a\xb7\xb9\x68\xf7\x75\x1b\xda\ +\x49\x6e\x5b\x80\x24\xb7\xad\x79\xdf\xae\x21\x4f\x41\x2c\x39\x19\ +\xa6\x77\xe6\x31\xc3\x6d\x5d\x24\x79\xc1\x7a\x5c\x92\x0c\xab\x64\ +\x98\xde\x99\xa3\x0c\x8f\xce\x19\x57\x65\x49\xde\xd4\xba\x3d\x2e\ +\x49\x66\x69\xc8\x30\xbd\x33\x8f\x19\x6e\xeb\x22\xc9\xcb\x3c\x6b\ +\x5d\x92\xcc\x42\x93\x61\x7a\x67\xde\x33\xdc\x26\xc9\xdb\x26\xc9\ +\x2c\x09\x19\xa6\x77\x16\x29\xc3\xa3\x4b\xae\x79\xdb\xcb\x11\x6b\ +\xbb\x26\x21\xc9\x2c\x30\x19\xa6\x77\x16\x35\xc3\xed\x33\x25\x79\ +\xdb\xac\xed\x62\xc1\xc8\x30\xbd\xb3\x0c\x19\x1e\x19\xd7\x4e\x6b\ +\xbb\x26\x21\xc9\x2c\x00\x19\xa6\x77\x96\x2a\xc3\x6d\x92\xbc\x6d\ +\x66\xad\x99\x5f\x32\x4c\xef\x2c\x6d\x86\xdb\xba\x48\xf2\x32\xcf\ +\x5a\x97\x24\xd3\x57\x32\x4c\xef\xc8\xf0\x1a\x76\x24\x6f\x9b\x24\ +\xd3\x7f\x32\x4c\xef\xc8\xf0\x06\x24\x79\xdb\xec\x48\xa6\x9f\x64\ +\x98\xde\x91\xe1\x49\xd8\x91\xbc\x13\x92\x4c\x7f\xc8\x30\xbd\x23\ +\xc3\x5b\x25\xc9\xdb\x66\xd6\x9a\x38\x19\xa6\x77\x64\x78\x27\xac\ +\xed\xda\x36\x49\x26\x42\x86\xe9\x1d\x19\x9e\x16\x49\xde\x36\xb3\ +\xd6\xcc\xcc\x45\xe9\x01\x00\x5d\x69\xe7\xb6\x9d\xcf\xd1\xe9\x6d\ +\xf4\x78\xdc\x75\xb6\xbb\x35\x77\x49\x1e\xb7\x1d\xbc\x46\xd3\xd8\ +\x6e\x61\xfa\x64\x18\x96\xc2\xba\xf9\x6c\x77\x74\x81\x93\x3c\x61\ +\x65\xc7\x39\x75\xea\x54\x55\x5d\x7f\xfd\xf5\x53\x1a\x0e\x9c\x43\ +\x86\x61\xe9\x8c\xf2\xb9\xee\x26\x72\x75\x93\xe4\x4e\x7b\x3c\x95\ +\xd0\x42\x84\x0c\xc3\xf2\xda\x74\xd6\xba\xa6\x97\xe4\x9d\x6c\x22\ +\xab\x2c\x0b\x4c\x86\x81\xaa\xee\x93\xbc\xf1\xac\xb5\xd0\xb2\xb4\ +\x64\x18\x58\x2b\xb5\xb6\x6b\x1c\x95\x65\x81\xc9\x30\xb0\x91\xd9\ +\xac\xed\x12\x5a\x96\x96\x0c\x03\x93\xea\x62\x6d\x57\xdf\x58\x11\ +\xcd\x8c\xc9\x30\xb0\x65\x1d\xed\x48\x9e\x8d\x6d\x87\xd6\x41\xc3\ +\x74\x41\x86\x81\x1d\xe9\x6d\x92\xb7\x97\x5b\xad\x65\xc6\x64\x18\ +\x98\x9a\xd9\x24\x79\xd3\xbe\x6e\xbc\xa7\x59\x68\xe9\x15\x19\x06\ +\x3a\xb1\x93\xe5\xd6\x3b\xdf\x41\x3b\xbc\x06\xc5\xa5\xff\x64\x18\ +\xe8\xdc\xa6\xcb\xad\xb7\xd4\xdd\x0d\xfa\x3d\xee\x93\x27\xa0\xb7\ +\x64\x18\x98\xa9\x75\x97\x5b\x8f\xbb\x0c\x2c\x3c\x19\x06\x32\xb4\ +\x16\x4a\x86\x01\x20\x48\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\ +\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x61\x0a\xae\xd9\xff\ +\xf8\xc6\x17\xb8\xf3\xce\x3b\xab\xea\xe8\xd1\xa3\x33\x19\x0e\x30\ +\x37\x64\x18\xb6\x6f\xd3\xfa\xae\x31\x8c\xf1\x90\x24\x03\x25\xc3\ +\x30\x15\x07\x0e\x1c\x98\xe4\x62\xc7\x8e\x1d\x1b\x9d\x96\x64\xa0\ +\x64\x18\x76\x62\xc2\xfa\xae\x7b\x79\x49\x06\x4a\x86\x21\x45\x92\ +\x81\x92\x61\xe8\x83\x4d\x93\xac\xc7\xb0\xa8\x64\x18\xb6\x6f\x94\ +\xcc\xad\xce\x4e\x6f\x60\xdd\x24\xdb\x44\x86\x45\x25\xc3\x30\x05\ +\xed\x4d\xd8\x2e\x92\x6c\xd6\x1a\x16\x95\x0c\xc3\xf6\x8d\x2a\xd8\ +\x4e\x63\x17\x49\xb6\x23\x19\x16\x95\x0c\xc3\x14\xb4\x13\x28\xc9\ +\xc0\xe4\x64\x18\xa6\x4c\x92\x81\xc9\xc9\x30\x74\x68\xd3\x24\x77\ +\xbd\xb6\xab\x2c\xb7\x86\x7e\x93\x61\x98\x91\x75\x93\xdc\xf5\xda\ +\xae\xb2\xdc\x1a\xfa\xad\x19\x0c\x06\xe9\x31\xc0\x39\x9a\xa6\xa9\ +\xaa\xbb\x6e\xdb\x93\x1e\xc8\x9b\x0e\x9f\x78\xb5\xaa\x9e\x3d\x7e\ +\xd3\xe8\x9c\xf6\xbb\x49\xef\x24\x69\xed\x34\xb6\x4d\x31\xc9\x23\ +\xed\xe4\xb7\x2d\x52\x92\x87\xf7\xe7\xa9\x53\xa7\xae\xbf\xfe\xfa\ +\xaa\xf2\xfc\x46\xff\xc9\x30\xbd\x33\x77\x19\x1e\xd9\x61\xcf\x24\ +\x79\xe7\x64\x98\xb9\x23\xc3\xf4\xce\x1c\x65\x78\x78\x8e\x24\xf7\ +\x87\x0c\x33\x77\x64\x98\xde\x99\xbb\x0c\xaf\x39\xf3\x7c\x5d\x24\ +\xb9\x8b\x1e\xd7\x98\x24\xcf\x51\x8f\x65\x98\xb9\x23\xc3\xf4\xce\ +\xfc\x66\xb8\x4d\x92\x23\x64\x98\xb9\x23\xc3\xf4\xce\x62\x64\xb8\ +\xad\x8b\x24\x9b\xb5\x5e\x97\x0c\x33\x77\x64\x98\xde\x59\xbc\x0c\ +\xb7\x49\x72\xa7\x64\x98\xb9\x23\xc3\xf4\xce\x62\x67\xb8\xcd\xda\ +\xae\xa9\x93\x61\xe6\x8e\x0c\xd3\x3b\xcb\x93\xe1\x36\x49\x9e\x0a\ +\x19\x66\xee\xc8\x30\xbd\xb3\x9c\x19\x5e\x73\xcd\xe7\xb3\xb6\x6b\ +\x12\x6b\x32\x3c\xe4\x59\x8e\x3e\x93\x61\x7a\x67\xc9\x33\xdc\x26\ +\xc9\x5b\xb5\x6e\x86\xdb\x3c\xe3\xd1\x37\x32\x4c\xef\xc8\xf0\xba\ +\xac\xed\x9a\xc4\x9a\x0c\x0f\x6f\xc8\xb8\x3f\xed\xd9\x8f\x3e\x90\ +\x61\x7a\x47\x86\x37\x65\x47\xf2\x38\xeb\x66\x78\x92\x3f\xed\x99\ +\x90\x14\x19\xa6\x77\x64\x78\x72\xb3\x9c\xb5\xae\x79\x48\xf2\xa6\ +\x19\xde\xf4\x4f\x7b\x4a\x64\xc6\x7c\xd0\x21\xcc\xbd\xe1\x4b\x96\ +\xe1\x6b\x85\xa1\x1d\x7e\xa6\xe1\x92\x7c\x4c\xf2\xba\x7f\x7a\xf8\ +\x2a\x70\x48\x92\x99\x01\x19\x86\x05\xd1\x9e\x3f\xe8\x3a\xc9\x8b\ +\xf7\x31\xc9\xa3\x3f\xdd\xbe\x69\x92\xcc\x0c\xc8\x30\x2c\xa0\xae\ +\x93\xbc\xee\x26\x72\x75\x93\xe4\x75\x37\x91\x6b\xe6\x47\x24\x37\ +\x8d\x5d\x78\x74\x42\x86\x61\xc1\x75\x91\xe4\x4d\x67\xad\x6b\x7a\ +\x49\xde\x74\xd6\xba\xb6\x32\xfe\x71\xbb\xa2\x27\xa1\xc4\x74\xc1\ +\xff\x2a\x7a\xc7\x12\xad\xc9\x0d\x87\xb1\xbd\xfb\xaa\x9d\xe4\x91\ +\x05\x58\xdb\x55\x1b\x1e\x37\xbc\xa9\x53\xa7\x4e\xad\x7b\xbe\xb7\ +\xe5\xa2\x23\xb6\x86\x61\x49\x8d\xe2\x3d\xcb\xb5\x5d\xb5\xe3\x24\ +\x6f\xba\x39\x3b\xae\xa3\x93\xfc\x14\x66\x4f\x86\x81\xaa\xd5\x2d\ +\xfb\xf6\x11\x50\xa9\xe5\xd6\x3b\x99\x37\x1e\x91\x5b\xe6\x85\x0c\ +\x03\x6f\x3a\x3f\xc6\x43\x5d\x2f\xb7\x9e\x9c\xbe\xb2\x60\x64\x18\ +\x58\x5f\x7b\x3f\x68\xfb\xd0\x9d\x2e\x96\x5b\xb7\x09\x2d\x4b\x45\ +\x86\x81\xcd\x6d\x9a\xe4\xed\xf5\x78\xf4\xa6\x57\x3b\x1e\x60\x27\ +\xb6\xbd\xce\x0b\x26\x27\xc3\xc0\xd6\xac\x9b\xe4\xe0\x11\xbd\x3b\ +\xb1\xa5\xd0\x5a\x26\x4d\x17\x64\x18\xd8\xbe\x51\x99\xa6\x38\x6b\ +\x3d\x45\x3b\xdc\x9c\xd5\x5d\x66\x40\x86\x81\x29\xe8\x68\x47\xf2\ +\xa6\x84\x96\x79\x27\xc3\xc0\x94\x4d\x37\xc9\x3b\x09\xad\xca\xd2\ +\x7f\x32\x0c\x74\x68\x92\x24\x0b\x2d\xcb\x4c\x86\x81\x19\x19\x97\ +\xe4\xc9\x7f\x0b\x16\x8f\x0c\x03\x01\xe2\x0a\x43\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\ +\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x00\x31\x32\x0c\x40\xdf\ +\xdd\x71\xc7\x1d\x6f\x79\xcb\x5b\xaa\xea\xec\xd9\xb3\xbb\x77\xef\ +\xfe\xfa\xd7\xbf\x9e\x1e\xd1\xd4\xc8\x30\x00\x7d\xf7\xd0\x43\x0f\ +\x1d\x3c\x78\x70\x65\x65\xe5\xc9\x27\x9f\xfc\xf9\xcf\x7f\x2e\xc3\ +\x00\x30\x23\x8f\x3d\xf6\xd8\x95\x57\x5e\x79\xfb\xed\xb7\x57\xd5\ +\xbe\x7d\xfb\xf6\xee\xdd\x9b\x1e\xd1\x34\xc9\x30\x00\xbd\x76\xf3\ +\xcd\x37\xff\xf4\xa7\x3f\xad\xaa\xbb\xef\xbe\xfb\xcc\x99\x33\xf7\ +\xdc\x73\x4f\x7a\x44\xd3\x24\xc3\x00\xf4\xdd\x97\xbe\xf4\xa5\x87\ +\x1f\x7e\xf8\x89\x27\x9e\xf8\xf2\x97\xbf\x9c\x1e\xcb\x94\xc9\x30\ +\x00\x73\xe0\xf8\xf1\xe3\x37\xde\x78\xe3\xc7\x3f\xfe\xf1\xef\x7d\ +\xef\x7b\xb7\xdc\x72\x4b\x7a\x38\x53\x23\xc3\x00\xf4\xdd\xc1\x83\ +\x07\x2f\xbc\xf0\xc2\xc3\x87\x0f\x57\xd5\xc9\x93\x27\x65\x18\x00\ +\x66\xe7\xd1\x47\x1f\xbd\xf7\xde\x7b\x87\xa7\x4f\x9f\x3e\x9d\x1d\ +\xcc\x74\xc9\x30\x00\xbd\x76\xe4\xc8\x91\x17\x5e\x78\xe1\x33\x9f\ +\xf9\xcc\x05\x17\x5c\x30\x18\x0c\xde\xf3\x9e\xf7\xa4\x47\x34\x4d\ +\x32\x0c\x40\xaf\x1d\x3a\x74\xe8\xd0\xa1\x43\xe9\x51\x74\x45\x86\ +\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\x01\x20\x46\x86\ +\x01\xe8\xb5\xa6\xf9\xc5\x60\x70\x79\x7a\x14\x5d\x91\x61\x00\xfa\ +\xab\x69\xfe\xa9\xea\xbd\xe9\x51\x74\x48\x86\x01\xe8\xb3\x5d\x55\ +\xd5\x34\x1f\x19\x0c\xbe\x9f\x1e\x49\x27\x64\x18\x80\x9e\x6a\x9a\ +\x4f\x56\xfd\x5d\xd5\x4a\xd5\xa7\xd3\x63\xe9\x8a\x0c\x03\xd0\x5b\ +\x5f\x5c\x3d\xb1\xbb\x69\xae\x1e\x0c\x9e\x4f\x8e\xa5\x1b\x32\x0c\ +\x40\x6f\xed\x5a\x3d\x71\x75\xd5\xad\xc9\x81\x74\x46\x86\x01\xe8\ +\xa3\xa6\xf9\x4a\xd5\xfe\xaa\xc1\xea\x19\x7b\x92\xa3\xe9\x8c\x0c\ +\x03\xd0\x4f\xb7\xac\x6e\x0d\x37\x55\x55\xb5\xa7\x69\xfe\x60\x30\ +\xf8\xf7\xe4\x88\x3a\x20\xc3\x00\xf4\x4e\xd3\x7c\xba\xea\x2f\x5b\ +\x93\xd2\x55\xb5\xa7\xea\xba\xd8\x80\x3a\x23\xc3\x00\xf4\xd0\x0d\ +\x55\xbb\xaa\x76\x9f\x3b\x29\xbd\xa7\x69\x2e\x19\x0c\xde\x48\x8e\ +\x6b\xda\x64\x18\x80\xde\x19\x0c\x0e\x56\x55\xd3\xbc\xba\x9a\xe1\ +\xa6\xea\xad\x83\xc1\xb1\xaa\x63\xd9\x81\x4d\x9d\x0c\x03\xd0\x5b\ +\xcf\x54\xfd\x71\xd5\x1b\x55\xff\x56\xf5\xb9\xaa\xdf\xa4\xc7\x33\ +\x7d\x32\x0c\xc0\x5c\x18\x6c\x7e\x91\x39\x24\xc3\x00\x10\x23\xc3\ +\x00\xf4\x56\x93\x1e\x40\xe7\x64\x18\x80\x39\x30\x18\x98\x94\x06\ +\x00\xa6\x4a\x86\x01\x20\x46\x86\x01\xe8\xb9\xc5\x9c\x8e\x1e\x92\ +\x61\x00\x88\x91\x61\x00\xfa\x6f\x61\x37\x88\x65\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\ +\x18\x00\x62\x64\x18\x00\x62\x64\x18\xe6\xc0\x35\xfb\x1f\xdf\xe0\ +\xa7\x87\x4f\xbc\x5a\x55\x77\xdd\xb6\x67\x56\xc3\x81\xd9\x4b\x1e\ +\x37\x7c\xe8\xd0\xa1\x95\x95\x95\x6b\xaf\xbd\x76\xdf\xbe\x7d\x55\ +\x75\xf0\xe0\xc1\x3d\x7b\xf6\x1c\x3e\x7c\x78\x2a\x57\x2e\xc3\xf4\ +\xce\x60\x30\x68\x9a\x66\x98\x96\xa1\x85\x0f\xcc\xc6\x95\x9d\xd0\ +\x52\xdd\x63\x30\x4b\x67\xce\x9c\x39\x71\xe2\xc4\xbb\xde\xf5\xae\ +\xaa\x7a\xf4\xd1\x47\x9f\x7a\xea\xa9\xbd\x7b\xf7\x4e\xeb\xca\x65\ +\x98\x3e\x1a\x96\x78\xf4\xed\x02\x04\x66\x87\xa1\x9d\xe4\x23\xde\ +\x16\xec\x1e\x83\xaa\xea\xc9\xe7\x0d\xdf\x77\xdf\x7d\x2f\xbe\xf8\ +\xe2\x6b\xaf\xbd\x56\x55\xaf\xbf\xfe\xfa\xde\xbd\x7b\x1f\x78\xe0\ +\x81\x69\x5d\xb9\x0c\xd3\x53\xed\xf0\xf4\x3f\x30\x33\xa8\xec\x96\ +\xae\x64\xdd\x7b\xac\x3f\x77\x17\xcc\x9d\x7d\xfb\xf6\x7d\xeb\x5b\ +\xdf\x7a\xf7\xbb\xdf\xfd\xf4\xd3\x4f\x5f\x77\xdd\x75\x53\xbc\x66\ +\x19\x66\x0e\xf4\x36\xc9\x93\xd7\x77\xc6\x9f\x58\xbe\xee\x3d\x16\ +\xbf\xbb\x60\x7e\xdd\x7a\xeb\xad\x3f\xf8\xc1\x0f\xbe\xf1\x8d\x6f\ +\xbc\xff\xfd\xef\xff\xc2\x17\xbe\x30\xc5\x6b\x96\x61\xe6\x4c\x3f\ +\x93\x3c\xe3\xca\x6e\xc9\x68\x6c\xe3\xee\xae\xb6\xa9\xec\xa5\x86\ +\x85\xf4\xcd\x6f\x7e\xf3\x7d\xef\x7b\xdf\x07\x3f\xf8\xc1\xe9\x5e\ +\xad\x0c\x33\xc7\xe2\xd3\xb0\x7d\xae\xef\xf9\xc6\xdd\x5d\x43\x6b\ +\x02\x3c\x5f\x37\x0d\x66\xe3\xb2\xcb\x2e\xfb\xec\x67\x3f\x3b\xdd\ +\xeb\x94\x61\x16\x84\x69\xd8\x2d\x19\x97\x64\xf5\x85\x0d\x9c\x39\ +\x73\xe6\xbb\xdf\xfd\xee\x27\x3e\xf1\x89\x29\x5e\xa7\x0c\xb3\x80\ +\x36\x9d\x86\x95\xe4\x36\xe9\x65\x1e\x4c\xf3\x7f\x69\x73\xcf\xea\ +\x33\xc3\xbf\xd4\xe0\xb1\x89\xae\xf9\x86\x1b\x6e\xf8\xf1\x8f\x7f\ +\x7c\xf6\xec\xd9\x93\x27\x4f\xde\x7c\xf3\xcd\x8f\x3c\xf2\xc8\xb4\ +\x06\x23\xc3\x2c\xb2\x7e\xee\x48\x06\xb6\xa8\xb3\x57\x8a\x7f\x52\ +\xcd\xdd\x4d\xad\x54\xfd\x73\x0d\x9e\xde\xe8\xaf\x3c\xf3\xcc\x33\ +\x1d\x0d\x41\x86\x59\x16\x92\x0c\xcb\xa9\xd9\xdf\xd4\x3b\xaa\xde\ +\x5e\x6f\xfe\x7b\x43\xd5\x45\x55\x3f\xac\xfa\x55\xd5\x15\x55\xaf\ +\x57\xfd\x79\x35\xf7\x34\xb5\x52\x83\xbf\x99\xf5\xe4\x50\x63\x3e\ +\x8a\x25\x77\xfe\x62\xa5\x3a\xaf\xc7\xc3\x54\x3f\x7b\xfc\xa6\xd1\ +\x39\xc3\x05\x4d\x1e\x3e\xd0\x9d\xd5\xc7\xe6\x6b\x55\xff\x5b\xf5\ +\x7b\x35\xfe\x11\xd7\x1c\x38\x37\xb4\xbb\xab\x2e\xaa\xba\xa8\xea\ +\xc2\xd5\x13\xed\x6f\x2f\xa8\xfa\xcd\xea\xd7\xc3\x55\x97\x56\x35\ +\xab\x5f\x55\x75\xba\x06\x7f\x35\xd3\xc7\xb5\xad\x61\x96\xdd\x56\ +\xd7\x76\x39\xa4\x07\x66\xa0\xf5\xfa\x78\xf7\x39\x67\xfe\x7d\xd5\ +\xdb\xab\x7e\xeb\xdc\xb2\xfe\xc5\xb9\xd1\x1d\xac\x56\x76\xd0\x2a\ +\xee\xd9\xaa\x33\xad\xf3\xcf\x54\xad\x54\x55\xd5\x2f\xab\x56\x56\ +\xbf\x7e\x58\x83\x1f\xda\x1a\x86\x1e\x58\x77\x13\xf9\x7c\x1e\x3e\ +\xd0\x91\x75\x1f\x83\x9f\xac\x7a\xe8\x3f\xce\xdd\x9c\x5d\xb7\xb8\ +\x83\xaa\xb3\x55\x2b\xab\xad\x1d\x7d\xb5\xbf\xfd\x65\xd5\x2b\x55\ +\x57\x55\xbd\x58\xb5\x52\xf5\xdc\x26\xfb\x86\xbb\x23\xc3\xb0\x89\ +\x35\x4f\x07\x1e\x32\x30\x03\x6b\x1e\x77\xf7\x56\x9d\xad\x3a\x5b\ +\xf5\xeb\xaa\x5f\x55\xbd\x54\xf5\x52\xd5\x23\xdf\x5f\xaf\xaf\xa3\ +\x6f\x5f\xa9\x3a\x5d\x75\xba\x75\xe2\xbf\xea\x2b\x07\xbe\xf2\x81\ +\x0f\x7c\xe0\x53\xcf\x7d\xaa\xaa\xea\xb1\xaa\x4b\xab\x7e\x51\x83\ +\x53\xc9\x07\xb5\x49\x69\xd8\x84\xee\x42\xdc\xcb\x55\x17\x57\x5d\ +\x54\x75\x49\xd5\xae\xaa\xdd\x55\xbf\x5f\xf5\x87\x1f\xa9\x37\x56\ +\x93\xfc\x8f\x57\x57\xbd\x52\xf5\x3f\x35\x38\x33\x78\xa4\x69\x5e\ +\xae\xfa\xcf\xaa\xe7\xaa\x4e\xb4\x1e\xbf\x87\x0e\x1d\x7a\xf0\xc1\ +\x07\x2f\xbf\xfc\xf2\xc1\x5f\x0f\x9a\x5b\x9b\xfa\x49\xd5\x2b\x35\ +\x78\x3d\xfc\x00\x97\x61\x00\xfa\xee\x5f\xab\x2e\xad\xda\x53\x75\ +\x69\xd5\xc5\xab\x49\x7e\x6b\xd5\xae\xaa\xb7\x55\xbd\xb3\xea\x8f\ +\x9e\xaf\x5f\x56\xbd\x54\xf5\x64\xd3\x5c\xb6\xfa\x5b\xaf\x55\x5d\ +\xdd\x34\xcf\xaf\x96\xf8\xc8\x91\x23\xaf\xbc\xf2\xca\x0b\x2f\xbc\ +\x50\x55\x87\xaf\x39\xfc\xf2\x3b\x5f\xbe\xff\xfe\xfb\x43\x37\xe8\ +\x4d\x26\xa5\x01\xe8\xa3\x35\xf3\xd2\x4d\xd5\x3b\xab\xae\xaa\x7a\ +\xdb\x6a\x8f\x77\xb7\x92\x7c\x71\xd5\xa0\xea\xcf\xaa\x7e\xbd\x3a\ +\x77\xfd\xdf\x55\x2f\x57\x3d\x5d\xf5\xc0\xb9\x99\xfb\xd8\xc7\x3e\ +\xd6\x34\xcd\xae\x5d\xbb\xbe\xf3\x9d\xef\xcc\xf6\x06\xad\xcf\xd6\ +\x30\x00\x7d\xb4\xe6\x73\xc7\x7f\xd3\xaa\xe9\x25\x4d\x73\x55\xd5\ +\x95\xab\x3d\xde\x53\xb5\xab\xea\xe2\xaa\x37\xaa\x2e\xac\xba\xb8\ +\xea\x82\xaa\xdf\xad\xfa\x9d\xaa\xaa\xfa\x5c\xd3\x3c\xd8\xfa\xdd\ +\x1b\x6f\xbc\xf1\xc8\x91\x23\x9f\xff\xfc\xe7\x67\x77\x4b\x36\x24\ +\xc3\x00\xf4\xd4\xb8\xf9\xda\x37\x5a\xe7\x5f\xda\x34\x57\x55\x5d\ +\x51\x75\x69\xd5\x9f\x56\x5d\xb8\xfa\x75\x71\xd5\x25\x55\x57\x9f\ +\xf7\x16\x5c\x4f\x3d\xf5\xd4\xb5\xd7\x5e\xfb\xfc\xf3\xcf\x77\x39\ +\xf0\x2d\x30\x29\x0d\xc0\x82\xf8\x87\xa6\x19\x36\xf8\x82\x56\x8f\ +\x7f\xbb\xea\xc2\xaa\xf7\x0e\x06\x55\x75\xc7\x1d\x77\x9c\x3e\x7d\ +\xfa\xf8\xf1\xe3\xb7\xdf\x7e\xfb\xca\xca\xca\x03\x0f\x3c\x90\x1e\ +\xb2\x0c\x03\xb0\x28\xfe\xb6\x69\x2e\xa8\xfa\xbf\xaa\xb3\x55\xbf\ +\x5a\x3d\xc6\xe9\x64\xd5\x13\x83\x41\x55\x7d\xfb\xdb\xdf\xbe\xff\ +\xfe\xfb\x7f\xf4\xa3\x1f\x0d\x2f\xfc\xa1\x0f\x7d\xe8\xc3\x1f\xfe\ +\xf0\xd7\xbe\xf6\xb5\xe8\x90\x65\x18\x80\x05\xf2\xc5\xa6\x19\x36\ +\xf8\x27\x55\x2f\x55\x3d\xd7\xde\xa3\x7c\xc9\x25\x83\xc1\xe0\xa3\ +\x1f\xfd\xe8\x43\x0f\x3d\xf4\xd5\xaf\x7e\xf5\xbe\xfb\xee\xbb\xe2\ +\x8a\x2b\x7e\xf6\xb3\x9f\x05\x47\x5b\x32\x0c\xc0\xe2\x79\x47\xd3\ +\xbc\x3c\x27\x75\x93\x61\x00\x88\xb1\x52\x1a\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\ +\x62\x64\x18\x00\x62\x64\x18\x00\x62\x64\x18\x00\x62\xfe\x1f\xa8\ +\xfe\xfc\x86\xf8\x01\xb9\x64\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x06\xa7\ +\x00\ +\x00\x18\xe7\x78\x9c\xd5\x58\xdb\x6e\xdb\x46\x10\x7d\xf7\x57\xb0\ +\xcc\x4b\x8c\x8a\xe4\xde\x2f\x8c\xe5\x3e\x34\x68\x51\xa0\x68\x81\ +\x36\x41\x9f\x69\x72\x25\xb1\xa1\x48\x81\xa4\x2c\xa9\x5f\xdf\x59\ +\x4a\xbc\x49\x94\x6b\xa7\x0e\xd2\xca\x36\x6c\xee\xcc\xec\xce\x9c\ +\x3d\x33\x9c\xf1\xdd\x77\xfb\x75\xe6\x3c\x9a\xb2\x4a\x8b\x7c\xee\ +\x62\x1f\xb9\x8e\xc9\xe3\x22\x49\xf3\xe5\xdc\xfd\xf8\xe1\x07\x4f\ +\xb9\x4e\x55\x47\x79\x12\x65\x45\x6e\xe6\x6e\x5e\xb8\xdf\xdd\xdf\ +\xdc\x7d\xe3\x79\xce\xf7\xa5\x89\x6a\x93\x38\xbb\xb4\x5e\x39\x3f\ +\xe5\x9f\xaa\x38\xda\x18\xe7\xed\xaa\xae\x37\x61\x10\xec\x76\x3b\ +\x3f\x3d\x2d\xfa\x45\xb9\x0c\x6e\x1d\xcf\xbb\xbf\xb9\xb9\xab\x1e\ +\x97\x37\x8e\xe3\xc0\xb9\x79\x15\x16\xd5\xc3\xdc\x1d\x58\x14\x1b\ +\x93\x57\xbb\xa8\x8e\x57\x0f\x45\xf1\xa9\xb1\xdb\x96\x69\x40\x10\ +\xd2\x01\xe8\xba\xbd\x65\x12\x77\x86\x9b\x6d\x99\x35\xaa\x49\x1c\ +\x98\xcc\xac\x4d\x5e\x57\x01\xf6\x71\x30\x50\x8f\x7b\xf5\xd8\xfa\ +\x9d\x3e\x9a\xb8\x58\xaf\x8b\xbc\x6a\x2c\xf3\xea\xcd\x40\xb9\x4c\ +\x16\x23\xaf\x76\xb4\x51\xc2\x5a\xeb\x00\x91\x80\x10\x0f\x34\xbc\ +\xea\x90\xd7\xd1\xde\x1b\x9b\x42\x74\x53\xa6\x10\x00\x0a\x40\xd6\ +\x6b\x3e\x4f\x2b\xdc\x67\x00\xe2\x55\x67\x1a\xe9\xf0\x74\xb8\xb8\ +\x0d\xfc\x74\x06\xed\x82\x5f\x15\xdb\x32\x36\x0b\xb0\x34\x7e\x6e\ +\xea\xe0\xfd\x87\xf7\x9d\xd0\x43\x7e\x52\x27\x83\x6d\xda\x7b\x1b\ +\x9d\x3b\xba\xcc\x3c\x5a\x9b\x6a\x13\xc5\xa6\x0a\xda\xf5\xc6\x7e\ +\x97\x26\xf5\x6a\xee\x4a\xc6\x7c\xa4\x19\x53\x0a\xeb\x66\x7d\x65\ +\xd2\xe5\xaa\x06\x82\x21\x4e\x7c\x2a\x08\x41\x4c\x36\x82\x34\x99\ +\xbb\x10\x31\x69\x1e\x06\x3c\xc4\x47\xe9\x69\xef\xb0\x93\x20\x9f\ +\x29\x9f\x39\xa5\xd6\xf4\xb8\x73\x1b\x44\x98\x14\xb1\xf5\x6a\xee\ +\xfe\x62\x76\x0e\x3c\x6c\x2d\x0f\x1c\xec\xde\x83\xd6\x5d\x62\x16\ +\x95\xd5\x3e\x1e\x68\x9f\x58\x23\x00\x11\x40\x68\xa2\xf2\xc7\x32\ +\x4a\x52\x30\x38\x2a\x1d\xd5\xc6\x12\xaa\xd8\xf1\x44\xfb\x01\x2e\ +\x86\x9b\x28\xcd\x21\xa4\xaa\xc8\xd2\xe4\xb4\x19\x6c\x57\xd5\xc5\ +\xa6\xd5\x02\xef\xea\x43\x06\x2e\xd9\x45\x2f\x2e\xb2\xa2\x0c\xdf\ +\x20\x84\x31\x4e\xde\x35\x4b\x05\x40\x98\xd6\x87\x10\xbf\x73\x7b\ +\x9b\x62\xb1\xa8\x0c\x6c\x8c\x06\x6b\x0d\x4c\x60\x41\x15\xc7\xae\ +\x13\x9c\x5c\x0f\xc6\x1e\x3e\x1d\x50\x0b\x25\xb8\x91\x99\x18\xf6\ +\x8f\xb2\x5d\x74\xa8\xba\x43\x1a\x2e\x85\xab\xd2\x00\xf7\xdf\x3c\ +\x11\xfa\x14\x32\x9c\xf6\xdb\xe0\xb9\xcb\x10\xf1\x09\x66\xa4\x37\ +\x3a\xc0\xaa\x54\xd2\x5e\x3d\x66\xbd\x2e\x01\x5d\x4c\x7d\xa9\xb8\ +\xec\x77\x38\x90\x29\xdd\xe5\xe9\xb0\x8f\x79\x5a\x43\xf2\x6c\x2b\ +\x53\xfe\x6e\x09\xf8\x6b\xfe\xb1\x32\x17\x5a\x1f\xca\x28\xaf\x80\ +\xed\xeb\xb9\xbb\x8e\xea\x32\xdd\xbf\xc5\x3e\x45\x12\x0b\x8c\x67\ +\x08\xbe\xb0\x2f\x98\xd6\x98\xe0\x99\x87\x39\x1c\x45\xb0\x94\x33\ +\x4f\x12\xe1\x83\x27\x54\xdc\xf6\x18\x7f\x19\x34\x3d\xfc\x0f\x78\ +\x7a\xe8\x05\x88\x92\x49\x44\xd9\x24\xa2\xe4\xd5\x10\x45\xbe\x56\ +\x0c\x23\xc4\xc5\x09\x52\x42\x95\xc0\x92\xcd\x04\xe4\xa8\xd0\x12\ +\x11\x00\x17\xb2\x95\x6b\xf2\x0c\x40\x27\xf3\x6d\x00\xd3\xd7\xcc\ +\x38\x8f\x7c\x5e\xce\x4d\xe3\x7e\xe5\x8e\xa6\xef\x73\xf2\xee\x9f\ +\x62\x39\x42\x14\x63\x45\x9a\x2b\x81\x1b\xe2\x02\xf6\xd3\x62\xe6\ +\x29\xa1\x7c\x29\xa1\x30\xcf\x3c\x02\x87\x6b\x02\x94\xbf\x7d\x21\ +\x17\xa6\x2e\x49\xc9\xcf\xe1\xfc\xb5\xf4\xf9\x07\x96\x7c\x1d\x40\ +\x89\x82\xef\x16\x50\x81\x34\xd7\x02\x00\x05\x4e\x09\xa8\x22\x0a\ +\xea\x06\x56\xc2\x47\x1c\x4b\xfd\x3a\x80\x7a\xe2\xf9\x90\x0e\x74\ +\x3f\x17\xd4\x6b\xa9\x37\xd8\xfa\xeb\x26\x9f\xed\x41\xff\x47\xe9\ +\xc7\x28\xe3\x5d\xfa\x11\xa2\x18\x05\x86\x20\xad\x7c\x8d\x04\x87\ +\xec\x43\xda\xe7\x48\xbc\x06\x57\x34\x56\x5f\x82\x29\x77\x81\x6d\ +\x90\x9a\xbf\xba\xee\xca\xb6\x56\xc9\x63\x6a\x76\x7d\x17\xf5\x10\ +\x75\xde\x6d\xa2\xa5\x69\xee\x1b\xce\x5e\x34\x9f\x93\xe0\xa1\x28\ +\x13\x53\xb6\x22\xd1\x7c\x46\xa2\x13\x25\x8e\xa3\xc7\xcd\xd8\x3b\ +\xbb\x6b\x27\x47\xd3\xf2\x6a\x15\x25\xc5\x6e\xee\x92\x73\xe1\x5f\ +\x45\xb1\xb6\x56\xf2\x5c\x10\xef\x41\x5b\xc1\x76\x52\xf3\x4b\x21\ +\x9c\xc4\x25\xf7\x89\xc6\x5c\x9f\x0b\xdb\xa6\xd2\xdb\x1e\x2f\x6a\ +\xb3\xbf\x30\xdf\x96\xa5\x55\xc8\xa2\x83\x81\x80\x9b\x5f\x6d\xd5\ +\xab\x56\xc5\x6e\x59\x5a\xe0\x16\x51\xd6\x21\xd7\x99\xee\xd2\x1c\ +\x02\xf1\x4e\x0d\x34\xe6\x94\x5f\xd1\x68\x5b\x69\x25\xc5\x15\x0d\ +\x08\x50\x5c\xb3\x86\xf8\x08\xbb\x22\x5b\x47\xfb\x74\x9d\xfe\x65\ +\xc0\x45\xdc\x76\xc7\x9d\x8e\x75\xbd\xe5\x4f\x7d\xb0\xb3\xc1\xfe\ +\x60\xd7\x46\xfc\xb4\x0b\x54\x83\xeb\x2d\x91\x2e\xf9\xd3\xac\xaf\ +\x4d\x1d\x25\x51\x1d\xf5\x64\x6a\x57\x64\x7b\x30\x4c\x58\xe1\x6f\ +\xef\x7f\xe8\x0a\x4d\x1c\x87\x7f\x14\xe5\xa7\xbe\x46\x58\x85\xe8\ +\xa1\xd8\x02\x14\x5d\x39\xb2\x9d\x7e\x1c\xda\x94\x8c\xea\xfb\x74\ +\x0d\xfc\xb0\xe3\xd4\xb7\x30\xd5\x00\xa7\x3b\xc1\x48\xd9\xc6\xd2\ +\x6f\x7a\xdc\xb6\x34\xc7\x71\x69\x72\xc2\x4c\xe2\x75\x6a\x8d\x82\ +\xdf\xeb\x34\xcb\x7e\xb2\x87\x74\xe5\xa9\xdb\x34\xad\x33\x73\xdf\ +\x9c\x79\xfc\xb3\x8d\x22\x38\x85\xd1\x56\xb3\x41\x94\x77\x41\x8b\ +\x41\xf3\xb4\x3c\xbb\xa3\x2c\x7a\x30\xd9\xdc\xfd\xd9\x52\xca\xc1\ +\xe7\x37\xb8\x2c\x8b\xed\x66\x5d\x24\xe6\x44\x3a\xb7\x47\xf6\x44\ +\xc2\x16\x56\x48\xf7\xd6\xd5\x53\xb5\x5e\x40\x18\xe1\x9b\x05\x8e\ +\x99\x88\xde\xd9\x87\x41\x9d\xae\xea\xb2\xf8\x64\x6c\x15\x87\xd7\ +\xa0\x3c\x3d\x1e\x49\x1a\x42\x09\xe5\x4c\x72\xa5\x68\xbb\x0e\xc0\ +\x98\x32\x03\x0e\xd5\x21\x6b\xd7\xce\xf7\xf2\x92\x08\x72\xb6\x2c\ +\xa3\x43\x98\x17\xf9\xb8\xbc\x59\xe7\xa8\x1a\xd4\xdf\x53\x36\x10\ +\x18\x27\x85\xc4\xb4\x6f\x35\xda\x24\xe0\x8c\xf8\x82\x6b\x36\xa8\ +\x83\x40\x5e\x2a\x7c\x0a\xe5\x7d\xd0\x2c\xcf\x5d\x8a\xb0\xaf\x14\ +\xbc\xbb\xfb\x77\xc9\x55\x2c\xe2\x24\x12\x5c\x5e\xc1\x02\xa8\xf0\ +\xf6\xa2\xc0\x72\x7a\x3b\x06\x07\xde\x19\xdc\x7e\xd1\x57\x06\x87\ +\x5c\x80\x03\xaf\x32\x4c\x10\x84\x3b\x09\x0e\x96\x02\xd1\x21\x38\ +\x54\x68\x9f\x51\x2d\xd8\x39\x38\x0c\x0b\x2d\xfe\x2d\x38\x0d\x51\ +\x04\x1f\x63\x81\xa1\xdb\xd4\x88\xc2\x8b\xef\xb5\xb1\xf0\xd8\x39\ +\x1a\x1a\x5a\x32\xc2\x90\x98\x42\x03\x5e\x31\x12\xde\xc3\x23\xaa\ +\x30\x64\x87\x3f\x21\xc6\x68\x10\x1f\xb4\x11\x79\x06\x1a\x09\x4d\ +\x74\x6c\x5e\x92\x36\xc4\x57\x0c\xfa\x70\x84\xe5\x6b\xa7\xcd\x60\ +\x66\xec\x12\x87\xfa\x30\x01\x70\x7c\x81\x06\xc5\x47\xc9\x88\x1b\ +\x8c\x83\x73\x82\x89\x51\xe2\x78\x40\x0b\xb8\x40\x81\x7b\x48\xeb\ +\xcb\x59\x70\x66\x27\xe9\x63\xd7\x73\xfb\x0c\xd8\xb4\xd2\x89\x7e\ +\x51\x86\x29\x79\x7b\xce\x2a\x8e\x20\xc3\x08\xe5\xaf\xce\x2a\x7c\ +\x91\x63\xd0\x2e\x08\x35\x6c\xb7\x7a\x1c\x99\x4f\x39\x13\x78\x88\ +\xa3\xc7\x04\xf3\x39\xd5\x6c\x5c\x81\x14\xa4\x23\x82\x76\xf0\x49\ +\x1c\x01\xc5\x2f\x89\x23\xc4\x70\x81\x23\xd3\x9a\x32\x85\xc5\xeb\ +\xe3\x38\x8d\xa4\x84\x4a\x30\xc5\x48\x62\xeb\x04\x19\x31\x12\xc8\ +\xc7\x9a\x5c\x54\x63\x24\xa9\xaf\x08\xcc\x15\x2f\x47\x72\x13\xd5\ +\xab\x29\x24\x6d\x10\xa3\xb4\x45\xe8\x3c\x6d\x21\x59\xe0\x50\xcd\ +\x37\xfb\x56\x62\xb1\x85\xd7\x6f\xf8\xb0\xad\xeb\xe1\xda\x9f\x45\ +\x9a\x87\x0d\x8a\x17\xf0\x75\x1e\xdb\x9e\xc7\x61\x4c\xfa\x04\x92\ +\x54\xcd\x14\xbc\xe2\x60\x73\x4a\x1d\x8f\x4a\x18\x43\x10\xd7\x08\ +\xa6\x88\x11\xae\xd6\x77\xda\xfe\xdf\xb3\x59\xec\xfb\xf8\x1c\x3c\ +\xa9\x8b\xd2\x83\x0e\xf4\x31\xaa\xb7\xa5\xb1\x03\xd5\x7f\x35\x6a\ +\x0e\xb3\x10\x55\x42\xce\x88\x96\x90\xc5\x1c\xb1\x3e\x6a\x7c\x25\ +\xe8\xe9\xf1\xe5\x89\xb0\xef\x82\xe5\xfd\xcd\x9d\xed\xff\xee\x6f\ +\xfe\x06\x06\xce\xf7\x72\ \x00\x00\x15\x5b\ \xff\ \xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x00\x00\x01\x00\ @@ -4429,6 +5142,393 @@ qt_resource_data = "\ \x8c\x02\x52\x74\x44\x83\x02\x14\x00\x23\x96\x51\xc0\xaf\xee\xe4\ \xd1\xcf\xe7\xdf\xb9\xa5\x52\x55\x4f\x58\xa8\x78\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x18\x0c\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x02\x82\x00\x00\x01\xd0\x08\x02\x00\x00\x00\xba\x3c\x9c\x23\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x17\xbe\x49\x44\x41\x54\x78\x9c\xed\ +\xdd\x5d\xa8\x65\x79\x5e\xdf\xe1\xef\xea\xae\xae\xaa\xae\xea\xae\ +\x17\xdb\xcc\x31\x8e\x92\x8d\x0a\x6a\x24\x8d\xa2\x01\x83\x20\x09\ +\xc2\x20\xc1\x2b\x51\x48\x2e\xa4\x21\x22\x21\xa1\x2e\x92\x80\xd6\ +\x5d\x6e\x04\xa5\x63\xae\x42\x79\xa3\x41\x52\x20\x06\xc6\x5c\xc4\ +\x9b\xb9\x11\x4c\xe2\x85\x2f\xa8\x44\xa6\x19\x86\x44\x32\xb3\xc1\ +\x97\xc9\xd6\x99\xea\xaa\xa9\xea\xaa\xa9\xae\xee\x5a\x5e\xac\xe9\ +\xdd\xab\xf6\x39\x67\x9f\x7d\xce\xd9\x6b\xfd\xd7\xcb\xf3\x5c\x34\ +\xe7\x75\xaf\xd5\x45\x9f\xfa\xf4\xff\xf7\x3b\xfb\x9c\xea\xa0\x5a\ +\x04\x00\x28\xe1\x42\xe9\x1b\x00\x80\xf9\x92\x61\xf8\xd8\xaa\x5e\ +\x9a\x0f\x01\x7d\xaa\xfc\xa5\x03\x49\x56\xf5\x72\xfd\xb2\x2f\x0a\ +\xa0\x37\x32\x0c\x1f\x37\xf8\xed\xb7\x6e\xdc\xbe\x7b\xbf\x79\xd9\ +\x97\x06\xd0\x03\x19\x66\xee\x9a\x06\xbf\xfd\xd6\x8d\xf5\x5b\xd6\ +\x25\x8e\x18\x03\x1d\x93\x61\x66\xad\x3d\x8b\x6e\x97\x38\x62\x0c\ +\xf4\x42\x86\x99\xb5\x76\x86\x1b\xc7\xc5\xd8\x57\x0a\xd0\x05\x19\ +\x66\xd6\xda\x13\xe9\xf6\xf1\x57\x8c\x81\x7e\xc8\x30\xb3\xb6\x65\ +\x31\x6c\x46\x0d\xf4\x40\x86\x99\xb5\xc3\x19\x6e\x88\x31\xd0\x0f\ +\x19\x66\xd6\x8e\xcb\x70\xcc\xa8\x81\x5e\xc8\x30\xb3\xb6\x25\xc3\ +\x0d\x31\x06\x3a\x25\xc3\xcc\xda\x89\x19\x6e\x98\x51\x03\x1d\x91\ +\x61\x66\x6d\xc7\x0c\x37\x4e\x8c\xb1\xaf\x26\xe0\xb4\x64\x98\x59\ +\x3b\x55\x86\x63\x46\x0d\xec\x9b\x0c\x33\x6b\xa7\xcd\x70\xe3\xb8\ +\x18\x9b\x51\x03\xa7\x25\xc3\xcc\xda\xd9\x32\xdc\xb0\x30\x06\xce\ +\x4f\x86\x99\xb5\xf3\x64\xb8\x61\x61\x0c\x9c\x87\x0c\x33\x6b\xe7\ +\xcf\x70\x2c\x8c\x81\x73\x90\x61\x66\x6d\x2f\x19\x6e\x98\x51\x03\ +\x67\x20\xc3\xcc\xda\x1e\x33\x9c\xe3\x4b\x1c\x31\x06\x8e\x71\xa1\ +\xf4\x0d\xc0\x14\x6c\x04\xf8\x70\x8f\xdb\x6f\x5f\xd5\x4b\x25\x06\ +\x1a\x4e\xc3\xcc\xda\x1e\xbf\x45\xab\x79\x9c\xf6\xab\xed\xb7\x1f\ +\xf9\x29\xbe\xfa\x00\x19\x66\xd6\xce\x99\xe1\xe3\x0e\xc1\xeb\x37\ +\x5a\x18\x03\xdb\xc9\x30\xb3\x76\xe6\x0c\x6f\x9f\x42\x37\xaf\xae\ +\x1f\x56\x8c\x81\xe3\xd8\x0d\xc3\xe9\x6c\x99\x42\x1f\x97\xf3\xf5\ +\x87\x6d\xe4\xd9\xc2\x18\x70\x1a\x66\xd6\xce\xf6\xab\x1d\x72\x52\ +\x80\x37\x72\x7b\xdc\x23\x1c\xf9\x2e\x5f\x92\x30\x2b\x4e\xc3\xb0\ +\x93\x13\xbf\x17\x7a\x17\xed\xcf\xbd\x7d\xf7\x7e\xfb\x73\xd7\x5d\ +\x6f\xfe\xcf\x40\x8c\x61\x26\x64\x18\x4e\xb0\x97\x00\xb7\xad\x1f\ +\xc7\x8c\x1a\x90\x61\x38\xd6\x19\xd6\xc0\xbb\x3b\x71\x61\xec\x58\ +\x0c\x73\x60\x37\xcc\xac\x1d\xb7\x1b\x3e\x67\x80\x8f\xdb\x0d\x6f\ +\xf9\xe0\xc3\x1f\xef\xfb\xa8\x61\x0e\x9c\x86\xe9\xdb\xf0\xc7\xad\ +\x7b\x9f\x42\x6f\xb7\xe3\x8c\x3a\x62\x0c\x53\xe4\x34\x4c\x7f\x9a\ +\x96\x34\x06\xf2\x1f\xde\xc6\x69\x78\x5f\x01\x3e\xd5\x69\x78\xe3\ +\xb3\x8e\xbc\xa2\xef\xa3\x86\xa9\x92\x61\x7a\xb2\x6e\x70\x7b\xc6\ +\x5b\xfc\x3f\xbf\x75\x86\xf7\xbb\x06\x3e\x5b\x86\xdb\x9f\x7b\xe4\ +\xa5\x87\xf3\xe7\x06\xec\x8b\x0c\xd3\x87\xc3\x2b\xd8\x81\x2c\x3e\ +\xdb\x07\xf4\xec\x6f\x0a\x7d\x9e\x0c\xb7\x1f\xe1\xf0\x83\x28\x31\ +\x4c\x8c\x0c\xd3\xb9\x76\xea\x86\xf6\x5d\x48\xed\x33\x7a\xf6\xb7\ +\x06\x3e\x7f\x86\xdb\x8f\x93\xa3\xc6\xe6\x51\x62\x98\x04\x19\xa6\ +\x73\x1b\x27\xce\x0c\xe3\x84\xb7\xf1\x3f\x07\xfb\x7d\x32\xd2\xbe\ +\x32\x9c\x17\xbb\xdb\x58\xdf\xad\x2f\x5e\x98\x00\x19\xa6\x73\xed\ +\x89\xf4\x10\x16\x9f\x9d\x06\xb8\xb1\xc7\x0c\xb7\x1f\x30\x2f\xfe\ +\x31\xfa\xe2\x85\x09\xf0\x84\x25\x7a\x55\xfc\xa7\x39\x76\x34\x85\ +\xee\xc7\x28\x6e\x12\x38\x15\x19\xa6\x80\x22\xcf\x94\x1d\x75\x80\ +\x81\xa9\x92\x61\x8a\xe9\xed\xd7\xff\xf5\x30\x85\x06\x38\x1b\x19\ +\xa6\xa4\x8d\x19\x75\x8e\x8a\xf1\x79\x8e\xc5\x87\x03\xec\x10\x0c\ +\x0c\x8a\x0c\x53\x5e\x47\x0b\x63\x53\x68\x60\xf8\x64\x98\xa1\xd8\ +\xe3\xaf\xff\x13\x60\x60\x2c\x64\x98\x61\x39\xe7\xaf\xff\xb3\x06\ +\x06\xc6\x45\x86\x19\x9c\xb3\xcd\xa8\x0f\xff\xac\x2e\x87\x60\x60\ +\xf8\x64\x98\x81\x3a\xd5\x93\x9a\x4c\xa1\x81\x91\x92\x61\x06\x6d\ +\xc7\x27\x35\xe5\x50\x80\xa3\xc1\xc0\x18\xc8\x30\x43\xb7\xcb\x93\ +\x9a\xac\x81\x81\x91\x92\x61\xc6\x61\xfb\xc2\xf8\xf0\x47\x02\x8c\ +\x82\x0c\x33\x26\xc7\x2d\x8c\x73\xfc\xf8\x1a\x60\xc8\x64\x98\xf1\ +\xd9\x65\x61\xbc\x71\x62\x06\x18\x26\x19\x66\x94\x76\x59\x18\x3b\ +\x16\x03\xc3\x27\xc3\x8c\xd8\x2e\xcf\x30\x16\x63\x60\xc8\x64\x98\ +\xd1\xdb\xe5\x19\xc6\x66\xd4\xc0\x30\xc9\x30\x13\x71\xe2\xc2\xd8\ +\xb1\x18\x18\x20\x19\x66\x3a\xb6\x2f\x8c\xcd\xa8\x81\x01\x92\x61\ +\xa6\xe6\xb8\x59\xf4\x96\x48\x03\x94\x22\xc3\x4c\x93\x85\x31\x30\ +\x0a\x32\xcc\x94\x59\x18\x03\x03\x27\xc3\x4c\x9c\x27\x35\x01\x43\ +\x26\xc3\xcc\xc2\x8e\x33\xea\x88\x31\xd0\x2f\x19\x66\x46\xfc\x14\ +\x4c\x60\x68\x64\x98\x79\xf1\x53\x30\x81\x41\x91\x61\xe6\x68\xc7\ +\x85\xb1\x12\x03\x5d\x93\x61\xe6\xeb\xc4\xe3\xaf\x12\x03\x5d\x93\ +\x61\xe6\x6e\x63\x61\xbc\xf1\x46\x80\x4e\xc9\x30\xbc\x30\xa3\x8e\ +\xad\x30\xd0\x23\x19\x86\x17\x68\x30\xd0\x27\x19\x06\x80\x62\x64\ +\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\ +\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\ +\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\ +\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\ +\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\ +\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\ +\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\ +\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\ +\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\ +\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\ +\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\ +\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\ +\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\x91\ +\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\x00\x8a\ +\x91\x61\x00\x28\x46\x86\xa1\x2b\xb7\xef\xde\x4f\xf2\xf6\x5b\x37\ +\x4a\xdf\x08\x30\x5c\x32\x0c\xdd\x12\x63\x60\x0b\x19\x86\x7d\x6a\ +\xa2\xdb\xb8\x73\xe7\x4e\x92\x5b\xb7\x6e\x45\x8c\x81\x63\xc8\x30\ +\xec\xc7\xe1\x00\xb7\x5f\x5e\xc7\x58\x89\x81\x36\x19\x86\x3d\x58\ +\x37\xb8\x1d\xe0\xb6\x75\x8c\x1d\x8b\x81\x36\x19\x86\x73\x39\x31\ +\xc0\x6d\x77\xee\xdc\x31\xa3\x06\xda\x64\x18\xce\xe8\xb8\x29\xf4\ +\x76\x16\xc6\x40\x9b\x0c\xc3\xa9\x9d\x2d\xc0\x6d\x16\xc6\x40\x43\ +\x86\xe1\x74\x4e\x35\x85\xde\xce\xc2\x18\x90\x61\xd8\xd5\x1e\x03\ +\xdc\x66\x61\x0c\x73\x26\xc3\x70\xb2\xf3\x4f\xa1\xb7\xb3\x30\x86\ +\xd9\x92\x61\x38\x41\x47\x87\xe0\xc3\x2c\x8c\x61\x86\x64\x18\xb6\ +\x69\x1a\xdc\x75\x80\xdb\x2c\x8c\x61\x56\x64\x18\x4e\xd0\x67\x83\ +\xdb\x17\x6d\xcf\xa8\x81\xa9\x92\x61\xd8\xa6\x48\x83\xdb\x97\x6e\ +\x62\x0c\x4c\x95\x0c\xc3\xa0\x59\x18\xc3\xb4\xc9\x30\x8c\x80\x19\ +\x35\x4c\x95\x0c\xc3\x38\x98\x51\xc3\x24\xc9\x30\x8c\x49\x3b\xc6\ +\xab\x7a\x79\x50\x2d\xca\xde\x0f\x70\x4e\x32\x0c\xe3\xb3\x8e\xf1\ +\xaa\x5e\x26\x11\x63\x18\x2f\x19\x86\xb1\x5a\x2f\x8c\xc5\x18\xc6\ +\x4b\x86\x61\xc4\x36\x66\xd4\x11\x63\x18\x1b\x19\x86\xd1\xb3\x30\ +\x86\xf1\x92\x61\x98\x08\x0b\x63\x18\x23\x19\x86\x49\xb1\x30\x86\ +\x71\x91\x61\x98\x1a\x0b\x63\x18\x11\x19\x86\x69\xb2\x30\x86\x51\ +\x90\x61\x98\x32\x0b\x63\x18\x38\x19\x86\xe9\xb3\x30\x86\xc1\x92\ +\x61\x98\x05\x33\x6a\x18\x26\x19\x86\x19\x31\xa3\x86\xa1\x91\x61\ +\x98\x1d\x33\x6a\x18\x0e\x19\x86\x39\xf2\xa4\x26\x18\x08\x19\x86\ +\x6d\x6e\xdd\xba\xd5\x14\x6b\x92\x2c\x8c\xa1\x38\x19\x86\x13\x4c\ +\xbb\xc4\xb1\x30\x86\xa2\x64\x18\xb6\x69\xd6\xa8\xcd\x79\x71\xf2\ +\x31\x36\xa3\x86\xfe\xc9\x30\x9c\x60\xdd\xa7\xc9\xc7\xd8\xc2\x18\ +\xfa\x27\xc3\x70\xb2\x76\x9f\xe6\x16\x63\x25\x86\x4e\xc9\x30\xec\ +\x6a\x23\xc6\x13\x2e\x71\x2c\x8c\xa1\x2f\x95\xaf\x2e\xba\xd6\xfc\ +\x3d\xfe\xf6\x5b\x37\x4a\xdf\xc8\x09\x6e\xdf\xbd\x9f\xd6\x7d\x36\ +\xaf\x36\x0e\x17\xb7\x89\xf1\x91\xef\x9a\x98\xf5\xbf\x69\xc4\x18\ +\x3a\x20\xc3\x74\x6e\x02\x19\x6e\x6c\x14\xb7\xdd\xa7\xf9\xc4\xd8\ +\xdf\x18\xb0\x5f\x32\x4c\xe7\xc6\x9e\xe1\xf5\xb7\x68\xad\x5f\x6d\ +\x7f\x96\x18\x03\xe7\x21\xc3\x74\x6e\x02\x19\x6e\x5e\xd8\x32\x88\ +\x36\xa3\x06\xce\x46\x86\xe9\xdc\x64\x32\xdc\x10\xe3\x88\x31\xec\ +\x8f\x0c\xd3\xb9\x89\x65\x38\x5b\x07\xd1\x66\xd4\xc0\xa9\xc8\x30\ +\x9d\x9b\x5e\x86\x1b\x8e\xc5\x0d\x31\x86\xf3\x90\x61\x3a\x37\xd5\ +\x0c\x37\xc4\x38\x66\xd4\x70\x0e\x32\x4c\xe7\xa6\x9d\xe1\x98\x51\ +\x7f\x44\x8c\xe1\x0c\x64\x98\xce\x4d\x3e\xc3\x0d\x31\x6e\x98\x51\ +\xc3\xa9\xc8\x30\x9d\x9b\x49\x86\x1b\x66\xd4\x0d\x31\x86\x1d\xc9\ +\x30\x9d\x9b\x55\x86\x1b\x62\x1c\x33\x6a\xd8\x8d\x0c\xd3\xb9\x19\ +\x66\x38\x66\xd4\x1f\x11\x63\xd8\x4e\x86\xe9\xdc\x3c\x33\xdc\x10\ +\xe3\x86\x19\x35\x1c\x47\x86\xe9\xdc\x9c\x33\xdc\x30\xa3\x6e\x88\ +\x31\x1c\x26\xc3\x74\x4e\x86\x1b\x62\x1c\x33\x6a\x38\x44\x86\xe9\ +\x9c\x0c\xaf\x99\x51\x37\x1c\x8b\x61\x4d\x86\xe9\x9c\x0c\x6f\x70\ +\x2c\x6e\x88\x31\x44\x86\xe9\x81\x0c\x1f\x49\x8c\x63\x46\x0d\x32\ +\x4c\x0f\x64\xf8\x38\x66\xd4\x0d\x31\x66\xce\x64\x98\xce\xc9\xf0\ +\x76\x62\xdc\x30\xa3\x66\x9e\x64\x98\xce\xc9\xf0\x2e\xcc\xa8\x1b\ +\x62\xcc\xdc\xc8\x30\x9d\x93\xe1\xdd\x89\x71\xcc\xa8\x99\x19\x19\ +\xa6\x73\x32\x7c\x2a\x66\xd4\x0d\x31\x66\x26\x64\x98\xce\xc9\xf0\ +\x19\x88\x71\xc3\x8c\x9a\xc9\x93\x61\x3a\x27\xc3\x67\x66\x46\xdd\ +\x10\x63\x26\x4c\x86\xe9\x9c\x0c\x9f\x93\x18\xc7\x8c\x9a\xe9\x92\ +\x61\x3a\x27\xc3\xe7\x67\x46\xdd\x10\x63\xa6\x47\x86\xe9\x9c\x0c\ +\xef\x8b\x18\x37\xcc\xa8\x99\x12\x19\xa6\x73\x32\xbc\x5f\x66\xd4\ +\x0d\x31\x66\x1a\x64\x98\xce\xc9\x70\x17\xc4\x38\x66\xd4\x4c\x82\ +\x0c\xd3\x39\x19\xee\x88\x19\x75\xc3\xb1\x98\x51\x93\x61\x3a\x27\ +\xc3\x9d\x72\x2c\x6e\x88\x31\x23\x25\xc3\x74\x4e\x86\x7b\x20\xc6\ +\x31\xa3\x66\x9c\x64\x98\xce\xc9\x70\x3f\xcc\xa8\x1b\x62\xcc\xb8\ +\xc8\x30\x9d\x93\xe1\x3e\x89\x71\xc3\x8c\x9a\xb1\x90\x61\x3a\x27\ +\xc3\xfd\x33\xa3\x6e\x88\x31\xc3\x27\xc3\x74\x4e\x86\x4b\x11\xe3\ +\x98\x51\x33\x78\x32\x4c\xe7\x64\xb8\x20\x33\xea\x86\x18\x33\x58\ +\x32\x4c\xe7\x64\xb8\x38\x31\x6e\x98\x51\x33\x40\x32\x4c\xe7\x64\ +\x78\x20\xcc\xa8\x1b\x62\xcc\xa0\xc8\x30\x9d\x93\xe1\x41\x11\xe3\ +\x98\x51\x33\x24\x32\x4c\xe7\x64\x78\x68\xcc\xa8\x1b\x8e\xc5\x0c\ +\xc1\x85\xd2\x37\x00\xf4\xad\xe9\x6b\x13\xa1\xe6\x9f\xeb\xe2\x6e\ +\x79\x17\xd0\x05\x19\x86\x99\xda\x28\x6e\x3b\xb7\x5b\xde\x35\x0d\ +\xed\x43\x3f\x94\x25\xc3\x30\x6b\xeb\xe2\x1e\x3e\xfb\x6e\x79\xd7\ +\x78\x6d\x4c\xdd\xf5\x98\xe2\x64\x18\xf8\x38\x48\x47\xc6\x78\x1a\ +\x33\xea\x59\xad\xbd\x19\x11\x19\x06\x92\xa9\xcf\xa8\xe7\xf3\x4d\ +\xe0\x8c\x8e\x0c\x03\x1f\x9b\xde\x8c\x7a\x97\x27\x68\x41\x41\x32\ +\x0c\x6c\x9a\xc6\x8c\x7a\xc7\xe7\x65\x79\xb6\x12\x65\xc9\x30\x70\ +\x84\xb1\x3f\xa9\x69\x97\x43\xb0\x00\x33\x04\x32\x0c\x1c\x6b\x8c\ +\x0b\x63\x01\x66\x5c\x64\x18\x38\xc1\x58\x16\xc6\xa6\xd0\x8c\x91\ +\x0c\x03\x3b\x19\xf2\xc2\x58\x80\x19\x2f\x19\x06\x76\x35\xcc\x85\ +\xb1\x29\x34\xa3\x26\xc3\xc0\xe9\x0c\x67\x61\x2c\xc0\x4c\x80\x0c\ +\x03\x67\x51\x76\x61\x6c\x0a\xcd\x64\xc8\x30\x70\x76\xfd\x2f\x8c\ +\x05\x98\x89\x91\x61\xe0\x5c\xfa\x5c\x18\xef\xf2\x33\x29\x05\x98\ +\x71\x91\x61\x60\x0f\xba\x5e\x18\x9f\x18\xe0\xe6\x03\x34\x98\xd1\ +\x91\x61\x60\x6f\xba\x58\x18\xef\x38\x85\x86\x91\x92\x61\x60\xcf\ +\xf6\xb8\x30\x3e\xee\x10\x2c\xc0\x4c\x86\x0c\x03\xfb\x77\xfe\x19\ +\xf5\x2e\x4f\x46\x6a\x3f\x14\x8c\x94\x0c\x03\x5d\x39\xdb\x8c\x7a\ +\x97\x29\xf4\x70\x7e\x84\x35\x9c\x93\x0c\x03\xdd\xda\x7d\x46\xbd\ +\xf1\x59\xed\x57\xb7\xb4\x19\x46\x4d\x86\x81\xce\xed\xf8\xa4\xa6\ +\xf6\x5b\xda\x1c\x82\x99\x30\x19\x06\x7a\xb2\x7d\x61\x7c\xe4\x37\ +\x6d\x09\x30\x93\x27\xc3\x40\xaf\x76\x7c\xe6\x92\x29\x34\x33\x21\ +\xc3\x40\x01\x5b\x16\xc6\x02\xcc\xac\xc8\x30\x50\xc6\xe1\x85\x71\ +\x4c\xa1\x99\x1f\x19\x06\x4a\xda\xe5\x5b\xb4\x60\xc2\x64\x18\x28\ +\x6f\x1d\x63\x0d\x66\x6e\x64\x18\x18\x0a\x0d\x66\x86\x64\x18\x00\ +\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\x18\ +\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\ +\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\ +\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\ +\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\ +\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\ +\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x38\xc1\xad\x5b\xb7\xee\xdc\ +\xb9\x53\xfa\x2e\x80\x69\x92\x61\x38\x99\x12\x03\x1d\x91\x61\xd8\ +\xa6\xa9\xef\xad\x5b\xb7\x6e\xdd\xba\xb5\x7e\x15\x60\x5f\x64\x18\ +\x4e\x76\xe7\xce\x9d\x26\xc3\x62\x0c\xec\x97\x0c\xc3\x4e\xd6\xc7\ +\xe2\x88\x31\xb0\x3f\x32\x0c\xa7\xb0\x11\x63\x25\x06\xce\x49\x86\ +\xe1\xd4\x2c\x8c\x81\x7d\x91\x61\x38\x23\x0b\x63\xe0\xfc\x64\x18\ +\xce\xce\xc2\x18\x38\x27\x19\x86\xf3\xb2\x30\x06\xce\x4c\x86\x61\ +\x3f\x2c\x8c\x81\x33\x90\x61\xd8\x27\x0b\x63\xe0\x54\x64\x18\xf6\ +\xcc\xc2\x18\xd8\x9d\x0c\x43\x27\x2c\x8c\x81\x5d\xc8\x30\x74\xc8\ +\xc2\x18\xd8\x4e\x86\xa1\x73\x16\xc6\xc0\x71\x64\x18\xfa\x60\x46\ +\x0d\x1c\x49\x86\xa1\x3f\x66\xd4\xc0\x06\x19\x86\xbe\x99\x51\x03\ +\x6b\x32\x0c\x05\x78\x52\x13\xd0\x90\x61\x28\xc6\xc2\x18\x90\x61\ +\xd8\xa6\x87\x3a\x5a\x18\xc3\x9c\xc9\x30\x9c\xa0\x9f\x3a\x5a\x18\ +\xc3\x3c\xc9\x30\x6c\xd3\x67\x1d\x2d\x8c\x61\x86\x64\x18\x4e\xd0\ +\xf3\x06\xd7\xc2\x18\x66\x45\x86\x61\x27\x3d\x6f\x70\x2d\x8c\x61\ +\x26\xaa\x83\x6a\x51\xfa\x1e\x98\xb8\x55\xbd\x4c\xf2\xf6\x5b\x37\ +\x4a\xdf\xc8\x09\x6e\xdf\xbd\x9f\xd6\x7d\x36\xaf\xe6\x50\x02\x9b\ +\x2e\x1e\xf9\xae\x2e\xf4\x7c\xb9\x31\x6a\xff\x11\xf9\x0b\x8d\xd1\ +\x91\x61\x3a\x37\xf6\x0c\x37\xc4\x78\xb0\x64\x98\x51\x93\x61\x3a\ +\x37\xea\x0c\xbf\xfd\xd6\x8d\xe3\x8e\xc5\x69\x05\xa0\x9f\x34\xf6\ +\x7c\xb9\xb1\x90\x61\x46\x4d\x86\xe9\xdc\xd8\x33\xdc\x7e\x35\x62\ +\x3c\x3c\x32\xcc\xa8\xc9\x30\x9d\x9b\x46\x86\xf3\xe2\x98\xda\x8c\ +\x7a\x38\x64\x98\x51\x93\x61\x3a\x37\x99\x0c\xb7\xdf\xde\x18\x48\ +\x8c\x67\x5e\x62\x19\x66\xd4\x64\x98\xce\x4d\x2c\xc3\xed\xf7\xc6\ +\x8c\x7a\x00\x64\x98\x51\x93\x61\x3a\x37\xc9\x0c\xb7\x3f\x26\xa5\ +\x63\x3c\xf3\x19\xb5\x0c\x33\x6a\x32\x4c\xe7\x26\x9c\xe1\x0c\x72\ +\x46\xdd\xcf\xe5\x86\x43\x86\x19\x35\x19\xa6\x73\xd3\xce\x70\xfb\ +\x83\x1b\x03\x89\xf1\x7c\x4a\x2c\xc3\x8c\x9a\x0c\xd3\xb9\x39\x64\ +\xb8\xfd\x29\x29\x3d\xa3\xee\xff\x72\x65\xc9\x30\xa3\x26\xc3\x74\ +\x6e\x3e\x19\x6e\x7f\x62\x4a\xc7\x78\x3e\x33\x6a\x19\x66\xd4\x64\ +\x98\xce\xcd\x2d\xc3\x19\xe4\x8c\xba\x9f\xcb\x15\x21\xc3\x8c\x9a\ +\xdf\xb0\x04\xdd\xda\xf8\x65\x85\x7e\x6d\x22\xd0\x26\xc3\xd0\x95\ +\xe6\x24\x7d\xfb\xee\xfd\xc3\xbf\xac\xd0\xaf\x4d\x04\x1a\x32\x0c\ +\xdd\x5a\xff\x72\x88\x23\x63\xbc\x3e\xa7\xa6\x97\x18\xf7\x79\x39\ +\x60\x17\x32\x0c\x9d\x5b\x1f\x8b\x73\x28\x81\x1b\x43\xe3\x74\x5c\ +\x47\x33\x6a\x18\x1a\x19\x86\x9e\x6c\xc4\x78\x08\x0b\x63\xc7\x62\ +\x28\x4e\x86\xa1\x57\x83\x5a\x18\x9b\x51\x43\x71\x32\x0c\x05\x0c\ +\x64\x61\xdc\xf3\x48\x1c\x38\x4c\x86\xa1\x0c\x0b\x63\x20\x32\x0c\ +\x65\x59\x18\xc3\xcc\xc9\x30\x94\x67\x61\x0c\xb3\x25\xc3\x30\x14\ +\x16\xc6\x30\x43\x32\x0c\x03\x32\xc0\x19\x75\x3f\x97\x83\xd9\x92\ +\x61\x18\x9c\x41\xcd\xa8\xfb\xbc\x1c\xcc\x90\x0c\xc3\x40\x0d\x64\ +\x46\xdd\xff\xe5\x60\x56\x64\x18\x86\x6b\xb0\x4f\x6a\xea\xfa\x72\ +\x30\x1f\x32\x0c\x43\xb7\x3e\x16\xc7\xc2\x18\x26\x47\x86\x61\x34\ +\x9a\x1e\x5b\x18\xc3\x94\xc8\x30\x8c\x89\x85\x31\x4c\x8c\x0c\xc3\ +\xc8\x6c\xcc\xa8\x33\x98\x85\xb1\x12\xc3\x19\xc8\x30\x8c\xd5\x41\ +\xb5\x58\xd5\xcb\x0c\x66\x61\xec\x58\x0c\x67\x20\xc3\x30\x62\x07\ +\xd5\x22\xc9\xaa\x5e\x0e\x61\x61\x3c\x84\x19\x75\xf3\xff\x25\xcd\ +\x1f\x0b\x8c\x82\x0c\xc3\xe8\xb5\x8f\xc5\xf1\x53\x30\xc5\x98\x51\ +\x91\x61\x98\x82\xf5\xb1\x38\xf3\x5e\x18\xb7\xaf\xbe\xaa\x97\x4a\ +\xcc\xf0\xc9\x30\x4c\xc7\x46\x8c\x67\xbb\x30\x5e\x5f\xdd\xb1\x98\ +\xe1\x93\x61\x98\x1a\x0b\xe3\x8d\xab\x8b\x31\x43\x26\xc3\x30\x4d\ +\x16\xc6\x31\xa3\x66\x0c\x64\x18\x26\x6b\x80\x33\xea\x7e\x2e\x77\ +\xdc\xd5\x1d\x8b\x19\x20\x19\x86\x89\x1b\xd4\x8c\xba\xcf\xcb\x1d\ +\xbe\xba\x19\x35\x03\x24\xc3\x30\x0b\x03\x99\x51\xf7\x7f\xb9\x8d\ +\x4b\xa7\x35\xa3\x8e\x18\x33\x00\x32\x0c\x73\x31\xd8\x27\x35\x75\ +\x7d\xb9\x2d\x57\xb7\x30\xa6\x38\x19\x86\x79\xb1\x30\xde\xb8\xba\ +\x12\x53\x96\x0c\xc3\x1c\x59\x18\x37\x97\x83\xe2\x64\x18\xe6\x6b\ +\x9e\x0b\x63\x01\x66\x50\x64\x18\x66\x6d\xb0\x0b\xe3\x8e\xae\xb5\ +\x6e\x70\xfb\x72\x50\x90\x0c\x03\x43\x5c\x18\xef\x3d\xfc\x1b\x01\ +\x86\x81\x90\x61\xe0\xeb\x06\xb5\x30\xde\xe3\x29\xbc\x7d\xe4\xd5\ +\x60\x86\x46\x86\x81\x17\x0c\x64\x61\xbc\x97\x91\xf8\x96\x00\xaf\ +\xdf\xe5\xdb\xa4\x29\x4b\x86\x81\x4d\xd3\x58\x18\x6f\x99\x42\x6b\ +\x30\xc3\x21\xc3\xc0\xd1\xc6\xbb\x30\x16\x60\x46\x44\x86\x81\x6d\ +\xc6\xb5\x30\xde\x65\x0a\x1d\x0d\x66\x48\x64\x18\x38\xd9\xb8\x16\ +\xc6\x02\xcc\x88\xc8\x30\xb0\x93\x01\xce\xa8\xf3\x62\x62\x63\x0a\ +\xcd\x08\xc9\x30\x70\x0a\x83\x9a\x51\x67\xb7\x01\xb5\x00\x33\x64\ +\x32\x0c\x9c\xda\x10\x66\xd4\x5b\x7e\x00\x96\x29\x34\x23\x22\xc3\ +\xc0\x59\x94\x7d\x52\x93\xef\x85\x66\x32\x64\x18\x38\xbb\xfe\x17\ +\xc6\x02\xcc\xc4\xc8\x30\xec\xd9\xed\xbb\xf7\xdb\x2f\xbc\xfd\xd6\ +\x8d\xa2\xb7\xd3\x87\x7e\x16\xc6\x9e\x8c\xc4\x24\xc9\x30\xec\xd3\ +\xba\xc1\xeb\xed\xe9\xed\xbb\xf7\xe7\x50\xe2\x74\xb9\x30\x16\x60\ +\x26\x4c\x86\x61\x3f\xda\x01\x6e\xbf\xb0\xaa\x97\x33\x3c\x16\x67\ +\x7f\x0b\x63\x53\x68\xa6\x4d\x86\xe1\xbc\xd6\x01\xce\x51\x3d\x68\ +\x1f\x8b\x33\xcb\x18\x9f\x79\x61\x2c\xc0\xcc\x81\x0c\xc3\xd9\x6d\ +\x0f\xf0\xc6\xbb\x66\x1b\xe3\x33\x2c\x8c\x4d\xa1\x99\x0f\x19\x86\ +\x33\x3a\x3c\x85\xde\x6e\x23\xc6\x73\x28\x71\x4e\xbf\x30\x16\x60\ +\xe6\x46\x86\xe1\xd4\x4e\x1b\xe0\x36\x0b\xe3\x6c\x5d\x18\xb7\xdf\ +\xde\x66\x0a\xcd\x54\xc9\x30\x9c\xc2\x8e\x53\xe8\x13\x59\x18\x1f\ +\xb7\x30\x16\x60\xe6\x46\x86\x61\x57\xe7\x39\x04\x1f\x36\xdb\x19\ +\x75\x8e\x59\x18\x1f\x66\x0a\xcd\x1c\xc8\x30\x9c\x6c\xbf\x01\x6e\ +\x9b\xe1\x8c\x3a\x5b\x17\xc6\x0d\x01\x66\x3e\x64\x18\xb6\xd9\xd7\ +\x14\x7a\x3b\x33\xea\x76\x89\x4d\xa1\x99\x15\x19\x86\x93\xf5\xd0\ +\x03\x4f\x6a\x6a\xde\xd2\xbc\x20\xc0\xcc\x87\x0c\xc3\x36\x3d\xf7\ +\x60\xb6\x0b\xe3\xe6\x5f\x79\xfd\x6a\xa9\x3b\x81\xfe\xc9\x30\x9d\ +\x6b\xfe\x92\x9d\x4f\x54\xce\x6f\xfb\xc2\xb8\x3d\x27\x9f\x0c\xe9\ +\x65\xb6\x64\x98\xfe\xcc\x67\xd6\xba\x17\x1b\x0b\xe3\x74\xf9\x9d\ +\x62\x40\x29\x32\x4c\x1f\xe6\xb9\xf8\x3c\xbf\xf6\x9f\xdb\xc6\x1b\ +\x81\x69\x90\x61\xfa\x33\xcf\xc5\xe7\xf9\xad\xff\xdc\x04\x18\xa6\ +\x47\x86\xe9\xdb\x3c\x9f\x29\x7b\x7e\x1a\x0c\x93\x24\xc3\x94\x31\ +\xc3\x67\xca\x02\x1c\x26\xc3\x14\x63\x46\x0d\x20\xc3\x14\x66\x46\ +\x0d\xcc\x99\x0c\x33\x08\x66\xd4\xc0\x3c\xc9\x30\x43\xe1\x49\x4d\ +\xc0\x0c\xc9\x30\xc3\x62\x61\x0c\xcc\x8a\x0c\x33\x44\x16\xc6\xc0\ +\x4c\xc8\x30\xc3\x65\x61\x0c\x4c\x9e\x0c\x33\x68\x16\xc6\xc0\xb4\ +\xc9\x30\x23\x60\x61\x0c\x6c\xf7\xb0\xbe\x57\xa5\x6a\x5e\xae\xaa\ +\xea\x6a\x46\xf3\xb7\x84\x0c\x33\x1a\x16\xc6\xc0\x71\x9e\xe6\xf1\ +\x95\xea\x5a\x9d\xfa\x59\xfd\xf4\x79\xfd\xe1\xd5\x6a\x34\x7f\x3f\ +\xc8\x30\x23\x63\x61\x0c\x6c\x78\x9a\x27\x2f\xe5\xe5\x2b\xb9\x96\ +\xe4\x41\xbe\x7c\x31\xaf\x94\xbe\xa3\x53\x90\x61\xc6\xc7\xc2\x18\ +\x68\xbb\x94\x57\x3f\xac\x3e\x48\xf2\x5e\xee\x27\xf5\x6b\xd5\xcd\ +\xd2\x77\x74\x0a\x32\xcc\x58\x59\x18\x03\x6b\x57\xf2\xfa\xd3\x3c\ +\x7e\xbf\x7e\x7a\xa5\x7a\xbd\xf4\xbd\x9c\x8e\x0c\x33\x6e\x16\xc6\ +\x40\xe3\x49\xfd\xe8\x62\x75\xe9\x52\xae\x3c\xcd\x93\x4b\x79\xb5\ +\xf4\xed\xec\x4a\x86\x99\x02\x0b\x63\x98\xb9\x87\xf5\xbd\x24\xcd\ +\x37\x48\x3f\xab\xbf\x76\xa9\x92\x61\xe8\x97\x19\x35\xcc\xd9\xd3\ +\x3c\x79\xfd\xa3\x95\xf0\xf3\x3c\x2f\x7b\x33\xa7\x22\xc3\x4c\x8a\ +\x19\x35\xcc\xd0\x7b\x79\xf0\x61\x9e\x3d\xa8\xff\xa6\x79\xf5\xe5\ +\x51\xa5\x6d\x4c\xf7\x0a\x3b\x32\xa3\x86\x59\xb9\x9a\xeb\x57\xab\ +\xeb\xa5\xef\xe2\x8c\x64\x98\x69\xf2\xa4\x26\x60\x14\x64\x98\x29\ +\xb3\x30\x06\x06\x4e\x86\x99\x3e\x0b\x63\x60\xb0\x64\x98\xb9\xb0\ +\x30\x06\x06\x48\x86\x99\x11\x0b\x63\x98\xaa\x55\xfd\x73\x07\xd5\ +\x7f\x28\x7d\x17\x67\x21\xc3\xcc\x8e\x85\x31\x4c\xcc\xaa\xfe\x9d\ +\xe4\xfd\x44\x86\x61\x3c\xb6\x2f\x8c\x9b\x37\x02\xc3\xb7\xaa\xbf\ +\x29\xb9\x90\x3c\x5f\xd5\x3f\x79\x50\xfd\x66\xe9\xdb\x39\xb5\xaa\ +\xf9\xcb\x08\x66\xab\x39\x16\x1f\xe6\x4b\x03\x46\x61\x55\xff\x7c\ +\xf2\x23\xc9\xa5\xe4\xd7\x0e\xaa\x5f\xde\xfb\xe3\x3f\xaa\xdf\xad\ +\x53\x5f\xa8\x2e\xbe\x9a\xd7\x92\x3c\xac\xef\xbd\x54\xbd\xd4\xfc\ +\xd4\xcc\xbd\x70\x1a\x66\xee\xda\x33\xea\x8d\x37\x02\x03\xb7\xaa\ +\x3f\x99\x7c\x22\xb9\x90\xd4\xc9\xf7\xae\xea\xeb\x07\xd5\x83\xfd\ +\x5e\xa2\x4e\xfd\xb5\xbc\x77\x35\x17\x92\x3c\xcd\xe3\x67\x79\x7a\ +\xa1\xbe\x98\x6a\x6f\x8f\x2f\xc3\x90\xb4\x62\x2c\xc0\x30\x2a\xff\ +\x22\xf9\xce\xe4\x95\xe4\x83\xe4\x42\xf2\x43\xc9\x67\xf6\x7b\x81\ +\xd7\xab\x6f\xf8\xb0\xfe\xa0\xce\xf3\x24\x75\xea\x0b\xb9\x78\xad\ +\x7a\x63\x8f\x8f\x2f\xc3\xf0\x31\x0d\x86\xb1\x69\x8e\xc2\x97\x93\ +\xaf\x26\x17\x92\x83\x55\xfd\xd2\x41\xb5\xe7\x5f\xed\xf0\x6a\xf5\ +\xda\xe3\xfa\xe1\xcb\xd5\x7b\xcf\xea\xa7\xaf\x54\x17\xf7\xfb\xe0\ +\x32\x0c\xc0\x78\x1d\x24\xaf\x24\xcf\x93\x3a\xb9\x90\x7c\x6b\xf2\ +\x9d\xc9\xe7\xf7\x7b\x8d\x4b\xb9\xf2\x7e\xbe\xf6\x5e\xfd\xe0\x95\ +\x5c\x7a\x35\xaf\xef\xf7\xc1\x7d\x8b\x16\x00\x23\xb6\xaa\xff\x24\ +\xb9\x94\x3c\x4c\xfe\xf2\xa0\xfa\x89\xee\x2e\x74\xaf\xfe\xd2\x95\ +\xea\xda\xe5\x5c\xdd\xef\xc3\x3a\x0d\x03\x30\x6a\x77\x92\x7f\x9a\ +\x7c\x25\xf9\xf5\x4e\x2f\x53\xe5\xa5\xbd\x37\x38\x32\x0c\x00\xbb\ +\xa9\x9f\xe6\xf1\xa5\x5c\xd9\xef\x83\xca\x30\x00\x6c\x73\xaf\xfe\ +\xd2\x07\x79\xbf\x4e\xfd\xac\x7e\x7a\x31\xaf\xde\xa8\x3e\xb1\xc7\ +\x07\x97\x61\x00\xd8\xe6\x1b\xaa\xbf\xdb\xdd\x83\xcb\x30\x00\x14\ +\x23\xc3\x00\xf0\xb1\xd5\xf7\x2c\x0f\x3e\xb7\xe8\xed\x72\x32\x0c\ +\xc0\x4c\xad\xfe\xd3\x32\x49\xfe\x32\x79\x29\x79\x39\x79\x29\xb9\ +\x94\x2c\x93\xcf\xf5\x77\x0f\x32\x0c\xc0\x1c\x7d\xbd\xc1\x49\x3e\ +\x99\x3c\x4a\x9e\x25\x1f\x24\xff\x37\x07\x77\x17\x7d\xde\x86\x0c\ +\x03\x30\x57\xdf\x96\xdc\x4c\x5e\x49\xfe\x20\xf9\xf3\xe4\x2f\x72\ +\xf0\x5f\x17\x3d\xdf\x82\x0c\x03\x30\x3b\xab\xbb\xcb\xfc\xbd\xe4\ +\x5a\xf2\x20\xf9\xab\x24\xc9\x17\x92\x3f\x29\x70\x27\x32\x0c\xc0\ +\x8c\xac\x7e\x69\x99\xef\x4b\x6e\x24\x4f\x92\x2f\x25\x9f\x4b\x7e\ +\x37\xf9\x54\xf2\xff\x72\xb0\x5c\xf4\x7f\x3f\x32\x0c\xc0\x2c\xac\ +\x7e\x6e\x99\x7f\x92\xdc\x4c\xea\xe4\xcb\xc9\x17\x92\xcf\x26\x7f\ +\x3f\xf9\x54\x92\x1c\xfc\xe9\xa2\xc8\x5d\xc9\x30\x00\xd3\xb7\xfa\ +\xef\xcb\xbc\x91\x5c\xfe\x68\x0a\xfd\xd9\xe4\x37\x72\xf0\x57\x8b\ +\xd2\xf7\x25\xc3\x00\x4c\xda\xea\x57\x97\xf9\x8e\xe4\x46\xf2\x20\ +\xf9\xf3\xe4\x9d\xe4\x33\x39\xf8\xc3\x45\xe9\xfb\xfa\x3a\x19\x06\ +\x60\x9a\x56\xbf\xb0\xcc\x0f\x24\x37\x93\xa7\xc9\x97\x92\xcf\x27\ +\xbf\x9f\x83\xff\xb6\x28\x7d\x5f\x2f\x90\x61\x00\xa6\x66\xf5\x6f\ +\x96\xf9\x54\x72\x33\xa9\x92\x77\x93\x2f\x26\x9f\x4d\x7e\x25\x07\ +\xcf\x16\xa5\x6f\x6d\x93\x0c\x03\x30\x29\xab\x4f\x2f\xf3\x4d\xc9\ +\x95\xe4\x41\xf2\xff\x93\x77\x92\x4f\xe7\xe0\x0b\x8b\xd2\xf7\x75\ +\x34\x19\x06\x60\x22\x56\xbf\xbc\xcc\x77\x27\x37\x92\x87\x1f\x7d\ +\x1f\xd6\x6f\xe7\xe0\x7f\x2d\x4a\xdf\xd7\x36\xd5\x41\xb5\x28\x7d\ +\x0f\x00\x70\x16\xab\x7a\x99\x24\xf9\xa3\xe4\x2b\xc9\x8f\x26\xc9\ +\xef\x25\x5f\x4d\xfe\x4f\xf2\xc7\x39\xf8\xf5\x45\xc1\x7b\xdb\x91\ +\xd3\x30\x00\x63\xf7\x0f\x3f\x7e\xf1\xf3\xc9\x3b\xc9\xaf\xe5\xe0\ +\xe1\xa2\xd8\xed\x9c\x86\x0c\x03\x30\x11\x9f\x49\x3e\xf3\xd3\xf9\ +\xcd\x6a\x51\xfa\x46\x4e\xc1\x50\x1a\x80\xb1\xfa\x68\x28\x9d\x24\ +\xff\x23\xb9\x9e\x3c\x4a\xfe\x22\xf9\xb7\xd5\xa2\xd4\x2d\x9d\x96\ +\xd3\x30\x00\x53\xf0\x87\xc9\x3f\x48\xae\x25\xdf\x95\xfc\x46\xbd\ +\x7c\x27\xf9\xc5\x6a\x51\xfa\xa6\x4e\xe6\x34\x0c\xc0\x88\xb5\x0f\ +\xc4\x3f\x93\x7c\x6f\xf2\x1d\xc9\xb5\xe4\xe5\xe4\xdd\xe4\x77\x93\ +\xff\x5c\x2d\x4a\xdd\xdb\x2e\x64\x18\x80\xe9\xa8\xeb\xe5\x4f\x25\ +\x6f\x26\xdf\x92\x5c\x4b\xde\x4f\xde\x4d\x7e\xba\x5a\x94\xbe\xaf\ +\x63\xc9\x30\x00\x53\xf3\x2d\xf5\xf2\xc7\x92\x37\x93\x37\x92\xeb\ +\xc9\x57\x93\x2f\x26\xb7\xab\x45\xe9\xfb\x3a\x82\x0c\x03\x30\x4d\ +\xff\xa8\x5e\xfe\x50\xf2\x3d\xc9\xb5\xe4\xd5\xe4\xdd\xe4\x7f\x27\ +\xff\xb1\x5a\x94\xbe\xaf\x17\xc8\x30\x00\x93\xb5\xaa\x97\xff\x3a\ +\x79\x33\xf9\xb6\xe4\xda\x47\x3f\x61\xfa\x77\x92\xbb\xd5\xa2\xf4\ +\xad\x7d\x9d\x0c\x03\x30\x71\x17\xeb\xe5\x3f\x4f\xde\x4c\xbe\x39\ +\xb9\x96\x7c\x2d\xf9\x72\xf2\x2f\xab\x45\xe9\xfb\x4a\x64\x18\x80\ +\x99\xf8\xf6\x7a\xf9\xa3\xc9\x9b\xc9\xcd\xe4\x7a\x72\x3f\xf9\xb3\ +\xe4\xc7\x92\xbf\x49\xde\x49\xfe\x5d\xb5\xd8\xf8\xf8\x47\xf5\xbb\ +\x75\xea\x57\xaa\x4b\x97\x73\x35\xc9\xc3\xfa\xde\xcb\xd5\x85\x2b\ +\xb9\xb6\xdf\xbb\x92\x61\x00\x66\xe4\x1f\xd7\xcb\x1f\x4c\xbe\x2b\ +\xb9\x96\xbc\x99\x3c\x4f\x1e\x27\x5f\x4c\xde\x49\xfe\x7d\xb5\x68\ +\x7f\xe4\xa3\xfa\xdd\x27\x79\x74\xa5\xba\x76\x35\xd7\x9f\xe4\xe1\ +\xe3\xfa\xe1\xa5\xbc\xfa\x5a\x75\x73\xbf\xf7\xe3\xc7\x77\x00\x30\ +\x23\xff\xb3\x5a\xfc\x56\xbd\xfc\x99\xe4\xcd\xe4\xdb\x93\xcb\xc9\ +\x95\x64\x91\x3c\x4a\x7e\xa0\x5e\xfe\x71\xb5\x58\x7f\xe4\x6b\xd5\ +\xcd\xe7\xf5\xf3\x0f\xeb\x67\xa9\xf2\x61\xfd\xe1\xc5\x5c\xde\x7b\ +\x83\xe3\x34\x0c\xc0\x3c\x7d\xba\x5e\xde\x4c\xde\x48\x2e\x27\x97\ +\x93\x07\xc9\x1f\x24\xff\xaa\x5a\x6c\x7c\xd8\xfd\xfa\xaf\x93\x54\ +\xa9\xae\x57\x7f\xa7\x8b\xdb\x70\x1a\x06\x60\x8e\xfe\x2c\xb9\x99\ +\x7c\x39\xb9\x99\x7c\x32\x79\x2d\xf9\xc1\xe4\x97\xea\xe5\xcf\x56\ +\x8b\xf6\x87\xbd\x52\x5d\x7a\x5c\x3f\xb8\x9c\xd7\x3b\xba\x0d\x19\ +\x06\x60\x8e\x7e\x2b\x79\x23\xf9\xc6\xe4\x8d\xe4\xfb\x93\x9b\xc9\ +\xcd\xe4\x27\x93\xff\x52\x2f\x3f\x57\x2d\xd6\x1f\xf6\xac\x7e\x7a\ +\x21\x97\x3e\xcc\xb3\x8e\x6e\xc3\x50\x1a\x80\xb9\x7b\x5e\x2f\x5f\ +\x4f\x5e\x4f\xfe\x59\xf2\xe3\xc9\x0f\x57\x8b\xe6\xed\x0f\xeb\x7b\ +\x75\x9e\x5f\xab\xbe\xf1\x61\x7d\xaf\x4e\x7d\xad\x7a\x63\xef\x97\ +\x96\x61\x00\x38\xc2\x93\x3c\x7a\x5c\x7f\xf5\x8d\xea\x9b\x9b\x57\ +\xdf\xad\x57\x17\xab\xcb\x57\x73\x7d\xbf\x57\x31\x94\x06\x80\x23\ +\x3c\xac\xbf\x92\xe4\x7e\xfd\xd7\x37\xaa\x4f\x3c\xac\xef\xbd\x9f\ +\x27\x1f\xd4\xef\x5f\xad\xf6\x9c\x61\xa7\x61\x00\x28\xc6\x69\x18\ +\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\x64\ +\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\x62\ +\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\x80\ +\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\x06\ +\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\x19\ +\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\x18\ +\x19\x06\x80\x62\x64\x18\x00\x8a\x91\x61\x00\x28\x46\x86\x01\xa0\ +\x18\x19\x06\x80\x62\xfe\x16\x2b\x3d\x07\xbe\x5e\x24\x27\x96\x00\ +\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x2a\xaf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -6052,11 +7152,23 @@ qt_resource_name = "\ \x0e\x5e\x8b\x87\ \x00\x7a\ \x00\x6f\x00\x6f\x00\x6d\x00\x5f\x00\x6f\x00\x75\x00\x74\x00\x5f\x00\x30\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x09\ +\x00\xa9\x83\x87\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x46\x00\x46\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x07\ \x0d\x2b\x57\xe7\ \x00\x5a\ \x00\x2d\x00\x58\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ +\x01\xa4\x83\x87\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x57\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0d\ +\x00\x19\xff\x67\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x46\x00\x6c\x00\x61\x00\x6e\x00\x67\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ +\x00\x09\ \x08\x05\x80\x07\ \x00\x62\ \x00\x65\x00\x61\x00\x6d\x00\x32\x00\x2e\x00\x6a\x00\x70\x00\x67\ @@ -6096,6 +7208,10 @@ qt_resource_name = "\ \x07\xc7\xb7\xe7\ \x00\x69\ \x00\x6e\x00\x70\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x09\ +\x03\xea\x83\x87\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x77\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0e\xf6\xf7\x07\ \x00\x7a\ @@ -6121,25 +7237,29 @@ qt_resource_name = "\ qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x18\x00\x02\x00\x00\x00\x12\x00\x00\x00\x03\ -\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xc5\ -\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x01\x4a\x6a\ -\x00\x00\x01\x28\x00\x00\x00\x00\x00\x01\x00\x00\xf7\xd0\ -\x00\x00\x00\xec\x00\x00\x00\x00\x00\x01\x00\x00\xd4\x27\ -\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x01\x47\x86\ -\x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x01\x3d\x16\ -\x00\x00\x01\x40\x00\x00\x00\x00\x00\x01\x00\x01\x11\x26\ -\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x00\x96\x2f\ -\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x68\x66\ -\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x53\x07\ -\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x01\x00\x00\xc4\xe5\ -\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xda\x7f\ -\x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x01\x4d\x3a\ -\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\xbb\x27\ +\x00\x00\x00\x18\x00\x02\x00\x00\x00\x16\x00\x00\x00\x03\ +\x00\x00\x00\x92\x00\x01\x00\x00\x00\x01\x00\x00\x78\x92\ +\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00\xa9\xfb\ \x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x47\ -\x00\x00\x00\xac\x00\x00\x00\x00\x00\x01\x00\x00\x97\x6f\ +\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x8e\xb0\ +\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x63\x2a\ +\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x01\x24\x06\ +\x00\x00\x01\x3c\x00\x00\x00\x00\x00\x01\x00\x01\x00\x5d\ +\x00\x00\x01\xa8\x00\x00\x00\x00\x00\x01\x00\x01\x3e\x99\ +\x00\x00\x01\xf8\x00\x00\x00\x00\x00\x01\x00\x01\x8b\xcc\ +\x00\x00\x01\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x81\x5c\ +\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x01\x3d\x5c\ +\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x01\x00\x00\xc2\x65\ +\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x7f\x3d\ +\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x94\x9c\ +\x00\x00\x01\x26\x00\x00\x00\x00\x00\x01\x00\x00\xf1\x1b\ +\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x01\x06\xb5\ +\x00\x00\x02\x3a\x00\x00\x00\x00\x00\x01\x00\x01\x91\x80\ +\x00\x00\x01\x10\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x5d\ +\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x6a\ +\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x01\x00\x00\xc3\xa5\ \x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x58\x00\x00\x00\x00\x00\x01\x00\x01\x12\x63\ +\x00\x00\x01\xc0\x00\x00\x00\x00\x00\x01\x00\x01\x56\xa9\ " def qInitResources(): diff --git a/Connections/Shear/Finplate/nut.py b/Connections/Shear/Finplate/nut.py index a0d9397..a6767af 100644 --- a/Connections/Shear/Finplate/nut.py +++ b/Connections/Shear/Finplate/nut.py @@ -3,30 +3,39 @@ Created on 12-Dec-2014 NUT COMMENT @author: deepa ''' -from OCC.BRepFilletAPI import BRepFilletAPI_MakeFillet -#from OCC import TopoDS.TopoDS_Compound -from OCC.BRepAlgoAPI import BRepAlgoAPI_Cut, BRepAlgoAPI_Fuse -import numpy -from ModelUtils import * + import math +import numpy +from OCC.BRepAlgoAPI import BRepAlgoAPI_Cut +from ModelUtils import getGpPt,getGpDir,makeEdgesFromPoints,makeWireFromEdges,makePrismFromFace,makeFaceFromWire from OCC.BRepPrimAPI import BRepPrimAPI_MakeCylinder -#from OCC.BRepAlgo import BRepAlgo_BooleanOperation - -from OCC.TopAbs import TopAbs_EDGE #TopAbs_FACE -from OCC.TopExp import TopExp_Explorer -from OCC.TopoDS import TopoDS_Compound, topods -from OCC.TopTools import * -from OCC.Geom import * -from OCC.gp import gp_Pnt,gp_Ax2,gp_DZ,gp_Ax3,gp_Pnt2d,gp_Dir2d,gp_Ax2d -from OCC.Geom import * -from OCC.Geom2d import * -from OCC.GCE2d import * -import OCC.BRepLib as BRepLib -from OCC.BRepOffsetAPI import * -import OCC.BRep as BRep +from OCC.gp import gp_Ax2 class Nut(object): + ''' + a3 X-------------------+ a2 + X X|X + X X | X + X X | X + X X | X + X X | X + X X | X + X X 60 | X +a4 X XXXXXXXXXXXXXXXXX a1 + X X + X X + XX X + X X + X X + X X + X X + X-------------------X + a6 + a5 + + ''' + def __init__(self,R,T,H,innerR1): self.R = R self.H = H @@ -68,83 +77,11 @@ class Nut(object): aFace = makeFaceFromWire(wire) extrudeDir = self.T * self.wDir # extrudeDir is a numpy array prism = makePrismFromFace(aFace, extrudeDir) - mkFillet = BRepFilletAPI_MakeFillet(prism) - anEdgeExplorer = TopExp_Explorer(prism, TopAbs_EDGE) - while anEdgeExplorer.More(): - aEdge = topods.Edge(anEdgeExplorer.Current()) - mkFillet.Add(self.T / 17. , aEdge) - anEdgeExplorer.Next() - prism = mkFillet.Shape() cylOrigin = self.secOrigin - #cylOrigin = self.secOrigin + self.T * self.wDir innerCyl = BRepPrimAPI_MakeCylinder(gp_Ax2(getGpPt(cylOrigin), getGpDir(self.wDir)), self.r1, self.H).Shape() - #outerCyl = BRepPrimAPI_MakeCylinder(gp_Ax2(getGpPt(cylOrigin), getGpDir(self.wDir)), self.r2, self.H).Shape() - #nutBody = BRepAlgoAPI_Fuse(prism, outerCyl).Shape() - #my_cyl = BRepPrimAPI_MakeCylinder(9.0, 6.0).Shape() - #result_shape = BRepAlgoAPI_Cut(nutBody, innerCyl).Shape() - result_shape = BRepAlgoAPI_Cut(prism, innerCyl).Shape() - -# self.secOrigin = gp_Pnt(0 , 0 , 0) -# neckNormal = gp_DZ() -# # Threading : Create Surfaces -# -# nutAx2_bis = gp_Ax3(self.secOrigin , neckNormal) -# aCyl1 = Geom_CylindricalSurface(nutAx2_bis , self.T * 0.99) -# aCyl2 = Geom_CylindricalSurface(nutAx2_bis , self.T * 1.05) -# #aCyl3 = Geom_CylindricalSurface(nutAx2_bis , self.T * 1.11) -# aCyl1_handle = aCyl1.GetHandle() -# aCyl2_handle = aCyl2.GetHandle() -# #aCyl3_handle = aCyl3.GetHandle() -# -# # Threading : Define 2D Curves -# aPnt = gp_Pnt2d(2. * math.pi , self.H / 2.) -# aDir = gp_Dir2d(2. * math.pi , self.H / 4.) -# aAx2d = gp_Ax2d(aPnt , aDir) -# aMajor = 2. * math.pi -# aMinor = self.H / 7. -# anEllipse1 = Geom2d_Ellipse(aAx2d , aMajor , aMinor) -# anEllipse2 = Geom2d_Ellipse(aAx2d , aMajor , aMinor / 4.) -# anEllipse1_handle = anEllipse1.GetHandle() -# anEllipse2_handle = anEllipse2.GetHandle() -# aArc1 = Geom2d_TrimmedCurve(anEllipse1_handle, 0 , math.pi) -# aArc2 = Geom2d_TrimmedCurve(anEllipse2_handle, 0 , math.pi) -# aArc1_handle = aArc1.GetHandle() -# aArc2_handle = aArc2.GetHandle() -# anEllipsePnt1 = anEllipse1.Value(0) -# anEllipsePnt2 = anEllipse1.Value(math.pi) -# aSegment = GCE2d_MakeSegment(anEllipsePnt1 , anEllipsePnt2) -# -# # Threading : Build Edges and Wires -# -# aEdge1OnSurf1 = BRepBuilderAPI_MakeEdge( aArc1_handle , aCyl1_handle) -# aEdge2OnSurf1 = BRepBuilderAPI_MakeEdge( aSegment.Value() , aCyl1_handle) -# aEdge1OnSurf2 = BRepBuilderAPI_MakeEdge( aArc2_handle , aCyl2_handle) -# aEdge2OnSurf2 = BRepBuilderAPI_MakeEdge( aSegment.Value() , aCyl2_handle) -# threadingWire1 = BRepBuilderAPI_MakeWire(aEdge1OnSurf1.Edge() , aEdge2OnSurf1.Edge())#aEdge3OnSurf1.Edge()) -# self.threading1 = threadingWire1 -# threadingWire2 = BRepBuilderAPI_MakeWire(aEdge1OnSurf2.Edge() , aEdge2OnSurf2.Edge())#aEdge3OnSurf2.Edge()) -# BRepLib.breplib.BuildCurves3d(threadingWire1.Shape()) -# BRepLib.breplib.BuildCurves3d(threadingWire2.Shape()) -# -# # Create Threading -# -# aTool = BRepOffsetAPI_ThruSections(True) -# aTool.AddWire(threadingWire1.Wire()) -# aTool.AddWire(threadingWire2.Wire()) -# aTool.CheckCompatibility(False) -# myThreading = aTool.Shape() -# -# #Building the resulting compound -# -# aRes = TopoDS_Compound() -# aBuilder = BRep.BRep_Builder() -# aBuilder.MakeCompound(aRes) -# aBuilder.Add(aRes, result_shape) -# aBuilder.Add(aRes, myThreading) -# final_shape = BRepAlgoAPI_Cut(result_shape, myThreading).Shape() - + result_shape = BRepAlgoAPI_Cut(prism, innerCyl).Shape() return result_shape diff --git a/Connections/Shear/Finplate/nutBoltPlacement.py b/Connections/Shear/Finplate/nutBoltPlacement.py index 5956037..12ea898 100644 --- a/Connections/Shear/Finplate/nutBoltPlacement.py +++ b/Connections/Shear/Finplate/nutBoltPlacement.py @@ -3,14 +3,48 @@ Created on 07-Jun-2015 @author: deepa ''' -import numpy from bolt import Bolt from nut import Nut from OCC.BRepPrimAPI import BRepPrimAPI_MakeSphere from ModelUtils import getGpPt class NutBoltArray(): + + ''' + gDir + +----------------------------> + | + | + | P origin + | +-------+---------------+ + | | | | +pDir | | | End distance | + | | v | + | | X X | + | | | + | | | + | | | + v | | + | Gauge distance | + | X-------X | + | + | + | | | + | | Pitch | + | | | + | v | + | X X+----> + + | Edge distance + | | + | | + | | + +-----------------------+ + + Nut Bolt Placement + + ''' + def __init__(self,boltPlaceObj,nut,bolt,gap): + self.origin = None self.gaugeDir = None self.pitchDir = None @@ -32,6 +66,9 @@ class NutBoltArray(): self.models = [] def initialiseNutBolts(self): + ''' + Initializing the Nut and Bolt + ''' b = self.bolt n = self.nut for i in range(self.row * self.col): @@ -39,6 +76,7 @@ class NutBoltArray(): self.nuts.append(Nut(n.R, n.T,n.H, n.r1)) def initBoltPlaceParams(self,boltPlaceObj): + self.pitch = boltPlaceObj['Bolt']['pitch'] self.gauge = boltPlaceObj['Bolt']['gauge'] #self.gauge = 30 @@ -46,22 +84,26 @@ class NutBoltArray(): self.end = boltPlaceObj['Bolt']['enddist'] self.row = boltPlaceObj['Bolt']['numofrow'] self.col = boltPlaceObj['Bolt']['numofcol'] - #self.row = 3 - #self.col = 2 def calculatePositions(self): + ''' + Calculates the exact position for nuts and bolts. + ''' self.positions = [] for rw in range(self.row): for col in range(self.col): pos = self.origin - pos = pos + self.end * self.gaugeDir + #pos = pos + self.end * self.gaugeDir + pos = pos + self.edge * self.gaugeDir pos = pos + col * self.gauge * self.gaugeDir - pos = pos + self.edge * self.pitchDir + #pos = pos + self.edge * self.pitchDir + pos = pos + self.end * self.pitchDir pos = pos + rw * self.pitch * self.pitchDir self.positions.append(pos) def place(self, origin, gaugeDir, pitchDir, boltDir): + self.origin = origin self.gaugeDir = gaugeDir self.pitchDir = pitchDir diff --git a/Connections/Shear/Finplate/osdag_gui.py b/Connections/Shear/Finplate/osdag_gui.py deleted file mode 100644 index 9017dbb..0000000 --- a/Connections/Shear/Finplate/osdag_gui.py +++ /dev/null @@ -1,1284 +0,0 @@ -''' -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(''' -
- %(asctime)s - %(levelname)s - %(message)s -
''') - 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('''''') - - #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('''''') - - app = QtGui.QApplication(sys.argv) - window = MainController() - window.show() - sys.exit(app.exec_()) - - - - - diff --git a/Connections/Shear/Finplate/plate.py b/Connections/Shear/Finplate/plate.py index 981b726..afc0b97 100644 --- a/Connections/Shear/Finplate/plate.py +++ b/Connections/Shear/Finplate/plate.py @@ -9,6 +9,37 @@ from ModelUtils import * class Plate(object): + ''' + + a2 XX-------------------------+ + |X X + | X X + | X X + | X--------------------------X + | | | ++--------------> | | a1 | +| w dir | | | +| | | | +| | | +----------> gDir | +| | | | | +| | | | | +| | | | | +| | | | | +v | | | | + | | v | +v dir | | | + | | pDir | + | | | + | | | + | | | + | | | + a3 X | | + X | | + X+--------------------------+ + + a4 + + ''' def __init__(self,L, W, T): self.L = L diff --git a/Connections/Shear/Finplate/saveINPUT.txt b/Connections/Shear/Finplate/saveINPUT.txt index 478e639..2be0ef5 100644 --- a/Connections/Shear/Finplate/saveINPUT.txt +++ b/Connections/Shear/Finplate/saveINPUT.txt @@ -2,59 +2,59 @@ S'Member' p1 (dp2 -S'columSection' +S'ColumSection' p3 S'ISSC 200' p4 -sS'fy(MPa)' +sS'fu (MPa)' p5 -I250 -sS'fu(MPa)' -p6 I410 -sS'beamSection' -p7 +sS'BeamSection' +p6 S'ISMB 400' +p7 +sS'fy (MPa)' p8 -sS'connectivity' +I250 +sS'Connectivity' p9 S'Column web-Beam web' p10 ssS'Plate' p11 (dp12 -S'thickness(mm)' +S'Width (mm)' p13 -I12 -sS'height(mm)' +I0 +sS'Height (mm)' p14 -I300 -sS'width(mm)' +I0 +sS'Thickness (mm)' p15 -I100 +I10 ssS'Load' p16 (dp17 -S'shearForce(kN)' +S'ShearForce (kN)' p18 I140 ssS'Weld' p19 (dp20 -S'size(mm)' +S'Size (mm)' p21 I6 ssS'Bolt' p22 (dp23 -S'grade' +S'Grade' p24 F8.8 -sS'type' +sS'Diameter (mm)' p25 -S'HSFG' +I20 +sS'Type' p26 -sS'diameter(mm)' +S'HSFG' p27 -I20 ss. \ No newline at end of file diff --git a/Connections/Shear/Finplate/ui_finPlate.py b/Connections/Shear/Finplate/ui_finPlate.py index c4b4b50..4a4536b 100644 --- a/Connections/Shear/Finplate/ui_finPlate.py +++ b/Connections/Shear/Finplate/ui_finPlate.py @@ -2,8 +2,7 @@ # Form implementation generated from reading ui file 'finPlate.ui' # -# Created: Wed Sep 30 17:44:35 2015 -# by: PyQt4 UI code generator 4.10.4 +# Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! @@ -219,7 +218,7 @@ class Ui_MainWindow(object): self.verticalLayout_2.addWidget(self.splitter) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1332, 28)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1332, 25)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuFile = QtGui.QMenu(self.menubar) self.menuFile.setObjectName(_fromUtf8("menuFile")) @@ -258,14 +257,14 @@ class Ui_MainWindow(object): font.setWeight(50) self.txtFy.setFont(font) self.txtFy.setObjectName(_fromUtf8("txtFy")) - self.lbl_ISsection = QtGui.QLabel(self.dockWidgetContents) - self.lbl_ISsection.setGeometry(QtCore.QRect(6, 155, 151, 25)) + self.label_3 = QtGui.QLabel(self.dockWidgetContents) + self.label_3.setGeometry(QtCore.QRect(6, 155, 151, 25)) font = QtGui.QFont() font.setPointSize(11) font.setBold(False) font.setWeight(50) - self.lbl_ISsection.setFont(font) - self.lbl_ISsection.setObjectName(_fromUtf8("lbl_ISsection")) + self.label_3.setFont(font) + self.label_3.setObjectName(_fromUtf8("label_3")) self.comboConnLoc = QtGui.QComboBox(self.dockWidgetContents) self.comboConnLoc.setGeometry(QtCore.QRect(150, 40, 161, 25)) font = QtGui.QFont() @@ -1035,7 +1034,7 @@ class Ui_MainWindow(object): self.comboWldSize.addItem(_fromUtf8("")) self.comboWldSize.addItem(_fromUtf8("")) self.lbl_connectivity = QtGui.QLabel(self.dockWidgetContents) - self.lbl_connectivity.setGeometry(QtCore.QRect(180, 70, 60, 50)) + self.lbl_connectivity.setGeometry(QtCore.QRect(190, 70, 81, 51)) self.lbl_connectivity.setScaledContents(True) self.lbl_connectivity.setObjectName(_fromUtf8("lbl_connectivity")) self.label_9 = QtGui.QLabel(self.dockWidgetContents) @@ -1510,7 +1509,7 @@ class Ui_MainWindow(object): self.menuGraphics.setTitle(_translate("MainWindow", "Graphics", None)) self.inputDock.setWindowTitle(_translate("MainWindow", "Input dock", None)) self.txtFy.setPlaceholderText(_translate("MainWindow", "000.0", None)) - self.lbl_ISsection.setText(_translate("MainWindow", "

Column section *

", None)) + self.label_3.setText(_translate("MainWindow", "

Column section *

", None)) self.comboConnLoc.setItemText(0, _translate("MainWindow", "Select Connectivity", None)) self.comboConnLoc.setItemText(1, _translate("MainWindow", "Column flange-Beam web", None)) self.comboConnLoc.setItemText(2, _translate("MainWindow", "Column web-Beam web", None)) @@ -1689,3 +1688,13 @@ class Ui_MainWindow(object): self.actionQuit_fin_plate_design.setText(_translate("MainWindow", "Quit fin plate design", None)) import icons_rc + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + MainWindow = QtGui.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/fin.log b/fin.log index d2e8b78..7130074 100644 --- a/fin.log +++ b/fin.log @@ -1 +1,66 @@ + +
+ Wed, 30 Sep 2015 11:07:02 + INFO + : Overall finplate connection design is safe + +
+ +
+ Wed, 30 Sep 2015 11:07:02 + DEBUG + :=========End Of design=========== +
+ +
+ Wed, 30 Sep 2015 11:07:02 + INFO + : Overall finplate connection design is safe + +
+ +
+ Wed, 30 Sep 2015 11:07:02 + DEBUG + :=========End Of design=========== +
+ +
+ Wed, 21 Oct 2015 16:34:32 + INFO + : Overall finplate connection design is safe + +
+ +
+ Wed, 21 Oct 2015 16:34:32 + DEBUG + :=========End Of design=========== +
+ +
+ Wed, 21 Oct 2015 16:34:32 + INFO + : Overall finplate connection design is safe + +
+ +
+ Wed, 21 Oct 2015 16:34:32 + DEBUG + :=========End Of design=========== +
+ +
+ Wed, 21 Oct 2015 16:34:33 + INFO + : Overall finplate connection design is safe + +
+ +
+ Wed, 21 Oct 2015 16:34:33 + DEBUG + :=========End Of design=========== +
diff --git a/finfront.svg b/finfront.svg deleted file mode 100644 index 25d66dd..0000000 --- a/finfront.svg +++ /dev/null @@ -1,2 +0,0 @@ - -2 @55.0mm c/c40.0mm40.0mm40mmPLT. 190X80X16Column ISSC 2503 nos 16Ø holesfor M20 bolts (grade 8.8)Beam ISMB 400 z 6 mm \ No newline at end of file diff --git a/osdagMainPage.py b/osdagMainPage.py index d083d08..860e9a8 100644 --- a/osdagMainPage.py +++ b/osdagMainPage.py @@ -7,10 +7,6 @@ import sys from PyQt4 import QtGui,QtCore from ui_osdagpage import Ui_MainWindow from Connections.Shear.Finplate.finPlateMain import launchFinPlateController -#from finPlateMain import * - -#from finPlateMain import launchFinPlateController - class OsdagMainWindow(QtGui.QMainWindow): diff --git a/saveINPUT.txt b/saveINPUT.txt index 83b3434..f490b56 100644 --- a/saveINPUT.txt +++ b/saveINPUT.txt @@ -4,7 +4,7 @@ p1 (dp2 S'ColumSection' p3 -S'ISSC 250' +S'ISSC 200' p4 sS'fu (MPa)' p5 @@ -18,7 +18,7 @@ p8 I250 sS'Connectivity' p9 -S'Column web-Beam web' +S'Column flange-Beam web' p10 ssS'Plate' p11 @@ -31,7 +31,7 @@ p14 I0 sS'Thickness (mm)' p15 -I16 +I12 ssS'Load' p16 (dp17 @@ -52,7 +52,7 @@ p24 F8.8 sS'Diameter (mm)' p25 -I16 +I20 sS'Type' p26 S'HSFG' diff --git a/test.svg b/test.svg deleted file mode 100644 index 1bf5b49..0000000 --- a/test.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/utilities/__init__.py b/utilities/__init__.py index 08f538d..5498698 100644 --- a/utilities/__init__.py +++ b/utilities/__init__.py @@ -18,7 +18,7 @@ def colorTheEdges(shp, display,color,width): Ex.Next() def setDefaultEdgeStyle(shp, display): - colorTheEdges(shp, display, Quantity_NOC_BLACK, 2.2) + colorTheEdges(shp, display, Quantity_NOC_BLACK, 1.5) #return shps -- cgit