summaryrefslogtreecommitdiff
path: root/Connections/Shear
diff options
context:
space:
mode:
authordeepa-chaudhari2015-12-09 19:56:36 +0530
committerdeepa-chaudhari2015-12-09 19:56:36 +0530
commit2612ef3f3a7eb263b304006079e5208c71dcdbf0 (patch)
tree808b5f9600c8796bfa4294aecd1aca1d77bf5964 /Connections/Shear
parent24380b7be6c7985dcff6dc1a65118db4d3442bdd (diff)
downloadOsdagLive-2612ef3f3a7eb263b304006079e5208c71dcdbf0.tar.gz
OsdagLive-2612ef3f3a7eb263b304006079e5208c71dcdbf0.tar.bz2
OsdagLive-2612ef3f3a7eb263b304006079e5208c71dcdbf0.zip
svg-2d drawings
Diffstat (limited to 'Connections/Shear')
-rw-r--r--Connections/Shear/Finplate/ModelUtils.py9
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/icons.qrc8
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colF1.pngbin0 -> 6008 bytes
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colFF.pngbin0 -> 4127 bytes
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.pngbin0 -> 3319 bytes
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colFlange.svg191
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colW1.pngbin0 -> 5476 bytes
-rw-r--r--Connections/Shear/Finplate/ResourceFiles/images/colww.pngbin0 -> 6156 bytes
-rw-r--r--Connections/Shear/Finplate/bolt.py47
-rw-r--r--Connections/Shear/Finplate/drawing_2D.py1524
-rw-r--r--Connections/Shear/Finplate/filletweld.py1
-rw-r--r--Connections/Shear/Finplate/fin.log897
-rw-r--r--Connections/Shear/Finplate/fin2DCreatorTop.py8
-rw-r--r--Connections/Shear/Finplate/finPlate.ui10
-rw-r--r--Connections/Shear/Finplate/finPlateCalc.py42
-rw-r--r--Connections/Shear/Finplate/finPlateMain.py222
-rw-r--r--Connections/Shear/Finplate/finSide.svg2
-rw-r--r--Connections/Shear/Finplate/finTop.svg2
-rw-r--r--Connections/Shear/Finplate/finfront.svg2
-rw-r--r--Connections/Shear/Finplate/icons_rc.py1158
-rw-r--r--Connections/Shear/Finplate/nut.py121
-rw-r--r--Connections/Shear/Finplate/nutBoltPlacement.py52
-rw-r--r--Connections/Shear/Finplate/osdag_gui.py1284
-rw-r--r--Connections/Shear/Finplate/plate.py31
-rw-r--r--Connections/Shear/Finplate/saveINPUT.txt42
-rw-r--r--Connections/Shear/Finplate/ui_finPlate.py27
26 files changed, 2785 insertions, 2895 deletions
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 @@
<RCC>
<qresource prefix="newPrefix">
+ <file>images/colF2.png</file>
+ <file>images/colW3.png</file>
+ <file>images/colW1.png</file>
+ <file>images/colFlange.svg</file>
+ <file>images/colww.png</file>
+ <file>images/colFF.png</file>
<file>images/download1.png</file>
<file>images/beam2.jpg</file>
<file>images/favicon.png</file>
@@ -16,7 +22,5 @@
<file>images/X-Y.png</file>
<file>images/Z-X.png</file>
<file>images/Z-Y.png</file>
- <file>images/colF2.png</file>
- <file>images/colW3.png</file>
</qresource>
</RCC>
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
--- /dev/null
+++ b/Connections/Shear/Finplate/ResourceFiles/images/colF1.png
Binary files 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
--- /dev/null
+++ b/Connections/Shear/Finplate/ResourceFiles/images/colFF.png
Binary files 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
--- /dev/null
+++ b/Connections/Shear/Finplate/ResourceFiles/images/colFF_converted.png
Binary files 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 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="New document 1">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3849"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#00111d;stop-opacity:1;"
+ offset="0"
+ id="stop3851" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3849"
+ id="linearGradient3853"
+ x1="402.21429"
+ y1="787.36214"
+ x2="413.78573"
+ y2="787.36214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3071611,0,0,1.6499121,-157.32177,-726.57336)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3849-1"
+ id="linearGradient3853-0"
+ x1="402.21429"
+ y1="787.36212"
+ x2="413.78574"
+ y2="787.36212"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98410056,0,0,1.2386174,6.4869702,-148.5926)" />
+ <linearGradient
+ id="linearGradient3849-1"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#00111d;stop-opacity:1;"
+ offset="0"
+ id="stop3851-2" />
+ </linearGradient>
+ <linearGradient
+ y2="787.36212"
+ x2="413.78574"
+ y1="787.36212"
+ x1="402.21429"
+ gradientTransform="matrix(1.0031182,0,0,0.95662196,-868.77744,-213.92217)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3887"
+ xlink:href="#linearGradient3849-1"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="787.36212"
+ x2="413.78574"
+ y1="787.36212"
+ x1="402.21429"
+ gradientTransform="matrix(1.0028028,0,0,0.96095966,-1116.6487,-186.05179)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3887-6"
+ xlink:href="#linearGradient3849-1-6"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3849-1-6"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#00111d;stop-opacity:1;"
+ offset="0"
+ id="stop3851-2-8" />
+ </linearGradient>
+ <linearGradient
+ y2="787.36212"
+ x2="413.78574"
+ y1="787.36212"
+ x1="402.21429"
+ gradientTransform="matrix(1.0034345,0,0,0.9522843,-1098.9065,-209.5069)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3918"
+ xlink:href="#linearGradient3849-1-6"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="280.07957"
+ inkscape:cy="575.29159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1535"
+ inkscape:window-height="876"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3935" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:#f1c46a;fill-opacity:1;stroke:#000027;stroke-width:3.75475883;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3812"
+ width="244.67137"
+ height="542.65948"
+ x="136.37859"
+ y="301.88959" />
+ <rect
+ style="fill:#cda657;fill-opacity:1;stroke:url(#linearGradient3853);stroke-width:2.25252533;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3822"
+ width="13.120785"
+ height="542.17603"
+ x="369.43964"
+ y="301.41696" />
+ <rect
+ style="fill:#cda657;fill-opacity:1;stroke:#000065;stroke-width:1.92903209;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3822-4"
+ width="9.6424065"
+ height="541.07098"
+ x="140.32166"
+ y="302.54102" />
+ <rect
+ style="fill:#d3d9ce;fill-opacity:1;stroke:#000027;stroke-width:2.84774017;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3812-0"
+ width="243.56651"
+ height="313.56653"
+ x="452.86469"
+ y="-696.92615"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="fill:#989d97;fill-opacity:1;stroke:url(#linearGradient3887);stroke-width:1.50252235;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3822-1"
+ width="10.068918"
+ height="314.35461"
+ x="-464.53949"
+ y="382.10843"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ style="fill:#989d97;fill-opacity:1;stroke:url(#linearGradient3918);stroke-width:1.49934816;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3822-1-1"
+ width="10.072091"
+ height="312.92923"
+ x="-694.54108"
+ y="383.82111"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2.65382195px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 447.22438,844.21933 -377.305905,0"
+ id="path3939"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2.65382195px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 458.93867,297.50504 -377.30591,0"
+ id="path3939-6"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
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
--- /dev/null
+++ b/Connections/Shear/Finplate/ResourceFiles/images/colW1.png
Binary files 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
--- /dev/null
+++ b/Connections/Shear/Finplate/ResourceFiles/images/colww.png
Binary files 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 @@
-<link rel="stylesheet" type="text/css" href="./Connections/Shear/Finplate/log.css"/>
+<link rel="stylesheet" type="text/css" href="log.css"/>
<div class="LOG INFO">
- <span class="DATE">Thu, 01 Oct 2015 15:37:28</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:18</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Thu, 01 Oct 2015 15:37:28</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:18</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
<div class="LOG INFO">
- <span class="DATE">Thu, 01 Oct 2015 15:37:28</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:18</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Thu, 01 Oct 2015 15:37:28</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:18</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
<div class="LOG INFO">
- <span class="DATE">Thu, 01 Oct 2015 15:39:26</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:20</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Thu, 01 Oct 2015 15:39:26</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:20</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
<div class="LOG INFO">
- <span class="DATE">Thu, 01 Oct 2015 15:39:26</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:28</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Thu, 01 Oct 2015 15:39:26</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:28</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
<div class="LOG INFO">
- <span class="DATE">Thu, 01 Oct 2015 15:40:31</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:28</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Thu, 01 Oct 2015 15:40:31</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:28</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
<div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 16:22:07</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:29</span>
<span class="LEVEL">INFO</span>
<span class="MSG">: Overall finplate connection design is safe
</span>
</div>
<div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 16:22:07</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 16:22:07</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 16:22:07</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:37:55</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:37:55</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:37:55</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:37:55</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:39:46</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:39:46</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:39:46</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:39:46</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:40:35</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:40:35</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:40:35</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:40:35</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:41:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:41:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:41:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:41:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:41:19</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:41:19</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:42:10</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:42:10</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:42:10</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:42:10</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:42:14</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:42:14</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:43:50</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:43:50</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:43:50</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:43:50</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:43:53</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:43:53</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:46:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:46:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:46:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:46:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:47:24</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:47:24</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:47:24</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:47:24</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:48:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:48:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:48:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:48:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:48:32</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:48:32</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:51:05</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:51:05</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:51:05</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:51:05</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:51:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:51:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:51:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:51:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:51:16</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:51:16</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:52:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:52:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:52:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:52:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:52:31</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:52:31</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:54:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:54:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:54:27</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:54:27</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 17:54:30</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 17:54:30</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:08:42</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:08:42</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:08:42</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:08:42</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:08:45</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:08:45</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:14:00</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:14:00</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:14:00</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:14:00</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:14:04</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:14:04</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:28:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:28:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:28:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:28:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:28:16</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:28:16</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:31:01</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:31:01</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:31:01</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:31:01</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:31:05</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:31:05</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:32:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:32:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:32:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:32:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:32:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:32:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:33:07</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:33:07</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:33:07</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:33:07</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:33:12</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:33:12</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:35:16</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:35:16</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:35:16</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:35:16</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:35:19</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:35:19</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:38:33</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:38:33</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:38:33</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:38:33</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:38:37</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:38:37</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:15</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:15</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:17</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:17</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:53</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:53</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:53</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:53</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Mon, 12 Oct 2015 18:39:56</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Mon, 12 Oct 2015 18:39:56</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Tue, 20 Oct 2015 17:38:46</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Tue, 20 Oct 2015 17:38:46</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Tue, 20 Oct 2015 17:38:46</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Tue, 20 Oct 2015 17:38:46</span>
- <span class="LEVEL">DEBUG</span>
- <span class="MSG"> :=========End Of design===========</span>
- </div>
-
- <div class="LOG INFO">
- <span class="DATE">Tue, 20 Oct 2015 17:38:50</span>
- <span class="LEVEL">INFO</span>
- <span class="MSG">: Overall finplate connection design is safe
-</span>
- </div>
-
- <div class="LOG DEBUG">
- <span class="DATE">Tue, 20 Oct 2015 17:38:50</span>
+ <span class="DATE">Wed, 09 Dec 2015 16:40:29</span>
<span class="LEVEL">DEBUG</span>
<span class="MSG"> :=========End Of design===========</span>
</div>
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 @@
<x>0</x>
<y>0</y>
<width>1332</width>
- <height>28</height>
+ <height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -691,7 +691,7 @@
<string>000.0</string>
</property>
</widget>
- <widget class="QLabel" name="lbl_ISsection">
+ <widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>6</x>
@@ -3237,10 +3237,10 @@
<widget class="QLabel" name="lbl_connectivity">
<property name="geometry">
<rect>
- <x>180</x>
+ <x>190</x>
<y>70</y>
- <width>60</width>
- <height>50</height>
+ <width>81</width>
+ <height>51</height>
</rect>
</property>
<property name="scaledContents">
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 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><pattern height="6" id="diagonalHatch" patternTransform="rotate(45 2 2)" patternUnits="userSpaceOnUse" width="6"><path d="M -1,2 l 6,0" stroke="#000000" stroke-width="0.7" /></pattern><marker id="id58" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id57" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id60" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id59" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id62" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id61" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id63" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id64" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id65" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id66" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker></defs><rect fill="none" height="800" stroke="blue" stroke-width="2.5" width="200" x="0" y="0" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="185.0" x2="185.0" y1="0.0" y2="800.0" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="15.0" x2="15.0" y1="0.0" y2="800.0" /><polyline fill="none" points="33.0,200.0 173.0,200.0 173.0,216.0 107.45,216.0 107.45,584.0 173.0,584.0 173.0,600.0 33.0,600.0 33.0,584.0 98.55,584.0 98.55,216.0 33.0,216.0 33.0,200.0" stroke="blue" stroke-width="2.5" /><rect fill="url(#diagonalHatch)" height="300.0" stroke="white" stroke-width="2.5" width="6" x="82.55" y="233.0" /><rect fill="none" height="300.0" stroke="blue" stroke-width="2.5" width="10" x="88.55" y="233.0" /><circle cx="98.55" cy="283.0" fill="none" r="1.5" stroke="red" stroke-width="1.5" /><line stroke="red" stroke-dasharray="10 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="118.55" x2="68.55" y1="283.0" y2="283.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="273.0" y2="273.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="293.0" y2="293.0" /><circle cx="98.55" cy="383.0" fill="none" r="1.5" stroke="red" stroke-width="1.5" /><line stroke="red" stroke-dasharray="10 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="118.55" x2="68.55" y1="383.0" y2="383.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="373.0" y2="373.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="393.0" y2="393.0" /><circle cx="98.55" cy="483.0" fill="none" r="1.5" stroke="red" stroke-width="1.5" /><line stroke="red" stroke-dasharray="10 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="118.55" x2="68.55" y1="483.0" y2="483.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="473.0" y2="473.0" /><line stroke="black" stroke-linecap="square" stroke-width="1.5" x1="88.55" x2="107.45" y1="493.0" y2="493.0" /><line marker-end="url(#id58)" marker-start="url(#id57)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="228.55" x2="228.55" y1="283.0" y2="483.0" /><text fill="black" font-family="sans-serif" font-size="28" x="243.55" y="383.0">2 @100 mm c/c</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="283.0" y2="283.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="483.0" y2="483.0" /><line marker-end="url(#id60)" marker-start="url(#id59)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="228.55" x2="228.55" y1="233.0" y2="283.0" /><text fill="black" font-family="sans-serif" font-size="28" x="243.55" y="258.0">50 mm </text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="233.0" y2="233.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="283.0" y2="283.0" /><line marker-end="url(#id62)" marker-start="url(#id61)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="228.55" x2="228.55" y1="483.0" y2="533.0" /><text fill="black" font-family="sans-serif" font-size="28" x="243.55" y="508.0">50 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="483.0" y2="483.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="238.55" x2="218.55" y1="533.0" y2="533.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="98.55" x2="213.55" y1="233.0" y2="233.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="98.55" x2="213.55" y1="283.0" y2="283.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="98.55" x2="213.55" y1="533.0" y2="533.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="98.55" x2="213.55" y1="483.0" y2="483.0" /><polyline fill="none" marker-start="url(#id63)" points="173.0,200.0 216.0,157.0 450.0,157.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="239.4" y="139.0">Beam ISMB 400</text><text fill="black" font-family="sans-serif" font-size="28" x="239.4" y="175.0" /><polyline fill="none" marker-start="url(#id64)" points="185.0,800.0 255.0,870.0 525.0,870.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="282.0" y="852.0">Column ISSC 200</text><text fill="black" font-family="sans-serif" font-size="28" x="282.0" y="888.0"> </text><polyline fill="none" marker-start="url(#id65)" points="93.55,533.0 253.55,693.0 523.55,693.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="280.55" y="675.0">PLT. 300x100x10</text><text fill="black" font-family="sans-serif" font-size="28" x="280.55" y="711.0" /><polyline fill="none" marker-start="url(#id66)" points="85.55,233.0 251.55,67.0 539.55,67.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="280.35" y="49.0"> z 6 mm</text><text fill="black" font-family="sans-serif" font-size="28" x="280.35" y="85.0">◁</text></svg> \ 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 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><marker id="id68" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id67" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id69" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id70" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id71" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id72" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id74" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id73" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker></defs><polyline fill="none" points="0,0 200,0 200.0,15.0 104.5,15.0 104.5,185.0 200.0,185.0 200,200 0,200 0.0,185.0 95.5,185.0 95.5,15.0 0.0,15.0 0,0" stroke="blue" stroke-width="2.5" /><rect fill="none" height="140" stroke="blue" stroke-width="2.5" width="350" x="124.5" y="29.0" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="474.5" y1="94.55" y2="94.55" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="474.5" y1="103.45" y2="103.45" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="124.5" y1="103.45" y2="103.45" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="124.5" y1="113.45" y2="113.45" /><polyline fill="none" points="124.5,103.45 204.5,103.45 204.5,113.45 124.5,113.45" stroke="red" stroke-dasharray="5 5" stroke-width="2.5" /><polyline fill="black" points="107.0,100.95 113.0,100.95 107.0,94.95 107.0,100.95" stroke="black" stroke-width="2.5" /><polyline fill="black" points="107.0,115.95 107.0,121.95 113.0,115.95 107.0,115.95" stroke="black" stroke-width="2.5" /><rect fill="black" height="18.9" stroke="black" stroke-width="2.5" width="20" x="144.5" y="94.55" /><line stroke="black" stroke-linecap="square" stroke-width="2.5" x1="154.5" x2="154.5" y1="84.55" y2="123.45" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="204.5" x2="204.5" y1="94.55" y2="-158.45" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="154.5" x2="154.5" y1="94.55" y2="-158.45" /><line marker-end="url(#id68)" marker-start="url(#id67)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="154.5" x2="204.5" y1="-158.45" y2="-158.45" /><text fill="black" font-family="sans-serif" font-size="28" x="179.5" y="-178.45">50 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="154.5" x2="154.5" y1="-168.45" y2="-148.45" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="204.5" x2="204.5" y1="-168.45" y2="-148.45" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="154.5" x2="154.5" y1="94.55" y2="-58.45" /><polyline fill="none" marker-start="url(#id69)" points="474.5,103.45 474.5,103.45 708.5,103.45" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="497.9" y="85.45">Beam ISMB 400</text><text fill="black" font-family="sans-serif" font-size="28" x="497.9" y="121.45" /><polyline fill="none" marker-start="url(#id70)" points="0,200 170.0,370.0 440.0,370.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="197.0" y="352.0">Column ISSC 200</text><text fill="black" font-family="sans-serif" font-size="28" x="197.0" y="388.0"> </text><polyline fill="none" marker-start="url(#id71)" points="204.5,113.45 324.5,233.45 594.5,233.45" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="351.5" y="215.45">PLT. 300x100x10</text><text fill="black" font-family="sans-serif" font-size="28" x="351.5" y="251.45" /><polyline fill="none" marker-start="url(#id72)" points="104.5,103.45 -93.3310963706,-62.55 -381.331096371,-62.55" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="-352.531096371" y="-80.55"> z 6 mm</text><text fill="black" font-family="sans-serif" font-size="28" x="-410.131096371" y="-44.55">◁</text><line stroke="black" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="104.5" y1="245.0" y2="245.0" /><line stroke="black" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="124.5" y1="245.0" y2="245.0" /><line marker-end="url(#id74)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="54.5" x2="104.5" y1="235.0" y2="235.0" /><line marker-end="url(#id74)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="174.5" x2="124.5" y1="235.0" y2="235.0" /><text fill="black" font-family="sans-serif" font-size="28" x="184.5" y="235.0">20 mm</text><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="104.5" x2="104.5" y1="185.0" y2="270.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="124.5" x2="124.5" y1="169.0" y2="269.0" /></svg> \ 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 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<svg baseProfile="full" height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><pattern height="4" id="diagonalHatch" patternTransform="rotate(45 2 2)" patternUnits="userSpaceOnUse" width="4"><path d="M -1,2 l 6,0" stroke="#000000" stroke-width="0.7" /></pattern><marker id="id41" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id40" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id43" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id42" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id45" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id44" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id47" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id46" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id49" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id48" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id51" markerHeight="10" markerWidth="10" orient="auto" refX="8" refY="0"><polyline fill="black" points="2.5,0 0,3 8,0 0,-3" /></marker><marker id="id50" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id52" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id39" markerHeight="10" markerWidth="10" orient="auto" refX="2.5" refY="0"><polyline fill="black" points="2.5,0 0,3 10,0 0,-3" /></marker><marker id="id38" markerHeight="10" markerWidth="10" orient="auto" refX="-2.5" refY="0"><polyline fill="black" points="-2.5,0 0,3 -10,0 0,-3" /></marker><marker id="id53" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id54" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id55" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker><marker id="id56" markerHeight="10" markerWidth="10" orient="auto" refX="-8" refY="0"><polyline fill="black" points="-2.5,0 0,3 -8,0 0,-3" /></marker></defs><polyline fill="none" points="200,200 200,0 0,0 0,800 200,800 200,600" stroke="blue" stroke-width="2.5" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="95.5" x2="95.5" y1="0.0" y2="800" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="104.5" y1="0" y2="800.0" /><rect fill="url(#diagonalHatch)" height="300.0" stroke="white" stroke-width="2.0" width="6" x="104.5" y="233.0" /><rect fill="none" height="300.0" stroke="blue" stroke-width="2.5" width="100.0" x="104.5" y="233.0" /><polyline fill="none" points="124.5,233.0 124.5,200.0 474.5,200 474.5,600 124.5,600.0 124.5,533.0" stroke="blue" stroke-width="2.5" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="124.5" y1="233.0" y2="533.0" /><line stroke="red" stroke-dasharray="5 5" stroke-linecap="square" stroke-width="2.5" x1="200" x2="200" y1="200" y2="600" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="474.5" y1="216.0" y2="216.0" /><line stroke="blue" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="474.5" y1="584.0" y2="584.0" /><circle cx="154.5" cy="283.0" fill="none" r="10" stroke="blue" stroke-width="1.5" /><line stroke="red" stroke-linecap="square" stroke-width="2.0" x1="140.5" x2="168.5" y1="283.0" y2="283.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="154.5" x2="154.5" y1="233.0" y2="533.0" /><circle cx="154.5" cy="383.0" fill="none" r="10" stroke="blue" stroke-width="1.5" /><line stroke="red" stroke-linecap="square" stroke-width="2.0" x1="140.5" x2="168.5" y1="383.0" y2="383.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="154.5" x2="154.5" y1="233.0" y2="533.0" /><circle cx="154.5" cy="483.0" fill="none" r="10" stroke="blue" stroke-width="1.5" /><line stroke="red" stroke-linecap="square" stroke-width="2.0" x1="140.5" x2="168.5" y1="483.0" y2="483.0" /><line stroke="blue" stroke-dasharray="20 5 1 5" stroke-linecap="square" stroke-width="1.5" x1="154.5" x2="154.5" y1="233.0" y2="533.0" /><line marker-end="url(#id41)" marker-start="url(#id40)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="-80.0" x2="-80.0" y1="283.0" y2="483.0" /><text fill="black" font-family="sans-serif" font-size="28" x="-314.5" y="383.0">2 @100 mm c/c</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="283.0" y2="283.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="483.0" y2="483.0" /><line marker-end="url(#id43)" marker-start="url(#id42)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="-80.0" x2="-80.0" y1="283.0" y2="233.0" /><text fill="black" font-family="sans-serif" font-size="28" x="-200.0" y="258.0">50 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="283.0" y2="283.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="233.0" y2="233.0" /><line marker-end="url(#id45)" marker-start="url(#id44)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="-80.0" x2="-80.0" y1="200.0" y2="233.0" /><text fill="black" font-family="sans-serif" font-size="28" x="-205.0" y="216.5">33 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="200.0" y2="200.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="233.0" y2="233.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="104.5" x2="-60" y1="233.0" y2="233.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="154.5" x2="-60" y1="283.0" y2="283.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="154.5" x2="-60" y1="483.0" y2="483.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="104.5" x2="-60" y1="533.0" y2="533.0" /><line marker-end="url(#id47)" marker-start="url(#id46)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="-80.0" x2="-80.0" y1="483.0" y2="533.0" /><text fill="black" font-family="sans-serif" font-size="28" x="-200.0" y="508.0">50 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="483.0" y2="483.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="-90.0" x2="-70.0" y1="533.0" y2="533.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="124.5" x2="124.5" y1="600.0" y2="900.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="104.5" x2="104.5" y1="800.0" y2="900.0" /><line stroke="black" stroke-linecap="square" stroke-width="2.5" x1="124.5" x2="124.5" y1="840.0" y2="840.0" /><line stroke="black" stroke-linecap="square" stroke-width="2.5" x1="104.5" x2="104.5" y1="840.0" y2="840.0" /><line marker-end="url(#id49)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="174.5" x2="124.5" y1="850.0" y2="850.0" /><line marker-end="url(#id49)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="54.5" x2="104.5" y1="850.0" y2="850.0" /><text fill="black" font-family="sans-serif" font-size="28" x="-65.5" y="850.0">20 mm</text><line marker-end="url(#id51)" marker-start="url(#id50)" stroke="black" stroke-linecap="square" stroke-width="2.5" x1="154.5" x2="204.5" y1="-170.0" y2="-170.0" /><text fill="black" font-family="sans-serif" font-size="28" x="179.5" y="-135.0">50 mm</text><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="154.5" x2="154.5" y1="-160.0" y2="-180.0" /><line stroke="black" stroke-linecap="square" stroke-opacity="1.0" stroke-width="2.5" x1="204.5" x2="204.5" y1="-160.0" y2="-180.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="154.5" x2="154.5" y1="233.0" y2="-150.0" /><line stroke="#D8D8D8" stroke-linecap="square" stroke-opacity="0.7" stroke-width="2.5" x1="204.5" x2="204.5" y1="233.0" y2="-150.0" /><polyline fill="none" marker-start="url(#id52)" points="154.5,533.0 354.5,733.0 624.5,733.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="381.5" y="715.0">PLT. 300X100X10</text><text fill="black" font-family="sans-serif" font-size="28" x="381.5" y="751.0" /><polyline fill="none" marker-start="url(#id53)" points="100,0 -38.5640646055,-80.0 -308.564064606,-80.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="-281.564064606" y="-98.0">Column ISSC 200</text><text fill="black" font-family="sans-serif" font-size="28" x="-335.564064606" y="-62.0" /><polyline fill="none" marker-start="url(#id54)" points="154.5,283.0 304.5,133.0 754.5,133.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="349.5" y="115.0">3 nos 20Ø holes</text><text fill="black" font-family="sans-serif" font-size="28" x="349.5" y="151.0">for M20 bolts (grade 8.8)</text><polyline fill="none" marker-start="url(#id55)" points="474.5,400.0 474.5,400.0 708.5,400.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="497.9" y="382.0">Beam ISMB 400</text><text fill="black" font-family="sans-serif" font-size="28" x="497.9" y="418.0" /><polyline fill="none" marker-start="url(#id56)" points="104.5,233.0 -95.5,33.0 -383.5,33.0" stroke="black" stroke-width="2.5" /><text fill="black" font-family="sans-serif" font-size="28" x="-354.7" y="15.0"> z 6 mm</text><text fill="black" font-family="sans-serif" font-size="28" x="-412.3" y="51.0" /></svg> \ 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('''
- <div class="LOG %(levelname)s">
- <span class="DATE">%(asctime)s</span>
- <span class="LEVEL">%(levelname)s</span>
- <span class="MSG">%(message)s</span>
- </div>''')
- formatter.datefmt = '%a, %d %b %Y %H:%M:%S'
- fh.setFormatter(formatter)
-
- # add handler to logger object
- logger.addHandler(fh)
-
-def launchFinPlateController(osdagMainWindow):
- set_osdaglogger()
- rawLogger = logging.getLogger("raw")
- rawLogger.setLevel(logging.INFO)
- fh = logging.FileHandler("./Connections/Shear/Finplate/fin.log", mode="w")
- formatter = logging.Formatter('''%(message)s''')
- fh.setFormatter(formatter)
- rawLogger.addHandler(fh)
- rawLogger.info('''<link rel="stylesheet" type="text/css" href="./Connections/Shear/Finplate/log.css"/>''')
-
- #app = QtGui.QApplication(sys.argv)
- window = MainController()
- osdagMainWindow.hide()
-
- window.show()
- window.closed.connect(osdagMainWindow.show)
-
- #sys.exit(app.exec_())
-
-
-
-if __name__ == '__main__':
- #launchFinPlateController(None)
-
- # linking css to log file to display colour logs.
- set_osdaglogger()
- rawLogger = logging.getLogger("raw")
- rawLogger.setLevel(logging.INFO)
- fh = logging.FileHandler("fin.log", mode="w")
- formatter = logging.Formatter('''%(message)s''')
- fh.setFormatter(formatter)
- rawLogger.addHandler(fh)
- rawLogger.info('''<link rel="stylesheet" type="text/css" href="log.css"/>''')
-
- app = QtGui.QApplication(sys.argv)
- window = MainController()
- window.show()
- sys.exit(app.exec_())
-
-
-
-
-
diff --git a/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", "<html><head/><body><p>Column section *</p></body></html>", None))
+ self.label_3.setText(_translate("MainWindow", "<html><head/><body><p>Column section *</p></body></html>", 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_())
+