1351 lines
54 KiB
Python
1351 lines
54 KiB
Python
#***************************************************************************
|
|
#* *
|
|
#* Copyright (c) 2016 Yorik van Havre <yorik@uncreated.net> *
|
|
#* *
|
|
#* This program is free software; you can redistribute it and/or modify *
|
|
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
|
#* as published by the Free Software Foundation; either version 2 of *
|
|
#* the License, or (at your option) any later version. *
|
|
#* for detail see the LICENCE text file. *
|
|
#* *
|
|
#* This program is distributed in the hope that it will be useful, *
|
|
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
#* GNU Library General Public License for more details. *
|
|
#* *
|
|
#* You should have received a copy of the GNU Library General Public *
|
|
#* License along with this program; if not, write to the Free Software *
|
|
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
|
#* USA *
|
|
#* *
|
|
#***************************************************************************
|
|
|
|
__title__="FreeCAD Precast concrete module"
|
|
__author__ = "Yorik van Havre"
|
|
__url__ = "http://www.freecadweb.org"
|
|
|
|
"""This module contains tools to build basic precast concrete elements:
|
|
Beams, pillars, slabs and panels"""
|
|
|
|
import ArchCommands,ArchComponent,FreeCAD
|
|
from FreeCAD import Vector
|
|
if FreeCAD.GuiUp:
|
|
import FreeCADGui
|
|
from PySide import QtCore, QtGui
|
|
from DraftTools import translate
|
|
from PySide.QtCore import QT_TRANSLATE_NOOP
|
|
else:
|
|
# \cond
|
|
def translate(ctxt,txt):
|
|
return txt
|
|
def QT_TRANSLATE_NOOP(ctxt,txt):
|
|
return txt
|
|
# \endcond
|
|
|
|
## @package ArchPrecast
|
|
# \ingroup ARCH
|
|
# \brief Precast options for ArchStructure
|
|
#
|
|
# This module provides additional presets for the Arch Structure
|
|
# tool, to build a series of precast concrete elements
|
|
|
|
class _Precast(ArchComponent.Component):
|
|
|
|
"The base Precast class"
|
|
|
|
def __init__(self,obj):
|
|
|
|
ArchComponent.Component.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","Length","Arch",QT_TRANSLATE_NOOP("App::Property","The length of this element"))
|
|
obj.addProperty("App::PropertyDistance","Width","Arch",QT_TRANSLATE_NOOP("App::Property","The width of this element"))
|
|
obj.addProperty("App::PropertyDistance","Height","Arch",QT_TRANSLATE_NOOP("App::Property","The height of this element"))
|
|
obj.addProperty("App::PropertyLinkList","Armatures","Arch",QT_TRANSLATE_NOOP("App::Property","Armatures contained in this element"))
|
|
obj.addProperty("App::PropertyVectorList","Nodes","Arch",QT_TRANSLATE_NOOP("App::Property","The structural nodes of this element"))
|
|
self.Type = "Precast"
|
|
obj.Role = ["Beam","Column","Panel","Slab","Stairs"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
|
|
class _PrecastBeam(_Precast):
|
|
|
|
"The Precast Beam"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","Chamfer","Arch",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
|
|
obj.addProperty("App::PropertyDistance","DentLength","Arch",QT_TRANSLATE_NOOP("App::Property","The dent length of this element"))
|
|
obj.addProperty("App::PropertyDistance","DentHeight","Arch",QT_TRANSLATE_NOOP("App::Property","The dent height of this element"))
|
|
obj.addProperty("App::PropertyStringList","Dents","Arch",QT_TRANSLATE_NOOP("App::Property","The dents of this element"))
|
|
obj.Role = ["Beam"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
chamfer = obj.Chamfer.Value
|
|
dentlength = obj.DentLength.Value
|
|
dentheight = obj.DentHeight.Value
|
|
dents = obj.Dents
|
|
|
|
if (length == 0) or (width == 0) or (height == 0):
|
|
return
|
|
if (chamfer >= width/2) or (chamfer >= height/2):
|
|
return
|
|
|
|
import Part
|
|
p = []
|
|
if chamfer > 0:
|
|
p.append(Vector(0,chamfer,0))
|
|
p.append(Vector(0,width-chamfer,0))
|
|
p.append(Vector(0,width,chamfer))
|
|
p.append(Vector(0,width,height-chamfer))
|
|
p.append(Vector(0,width-chamfer,height))
|
|
p.append(Vector(0,chamfer,height))
|
|
p.append(Vector(0,0,height-chamfer))
|
|
p.append(Vector(0,0,chamfer))
|
|
else:
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(0,width,0))
|
|
p.append(Vector(0,width,height))
|
|
p.append(Vector(0,0,height))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(length,0,0))
|
|
if (dentlength > 0) and (dentheight > 0):
|
|
p = []
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(dentlength,0,0))
|
|
p.append(Vector(dentlength,width,0))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
d1 = f.extrude(Vector(0,0,dentheight))
|
|
d2 = d1.copy()
|
|
d2.translate(Vector(length-dentlength,0,0))
|
|
shape = shape.cut(d1)
|
|
shape = shape.cut(d2)
|
|
for dent in dents:
|
|
dent = dent.split(";")
|
|
if len(dent) == 7:
|
|
dentlength = float(dent[0])
|
|
dentwidth = float(dent[1])
|
|
dentheight = float(dent[2])
|
|
dentslant = float(dent[3])
|
|
dentchamfer = chamfer
|
|
dentlevel = float(dent[4])
|
|
dentrotation = float(dent[5])
|
|
dentoffset = float(dent[6])
|
|
if (dentlength == 0) or (dentwidth == 0) or (dentheight == 0):
|
|
continue
|
|
if dentslant >= dentheight:
|
|
continue
|
|
p = []
|
|
p.append(Vector(0-dentchamfer,0,0))
|
|
p.append(Vector(dentlength,0,dentslant))
|
|
p.append(Vector(dentlength,0,dentheight))
|
|
p.append(Vector(0-dentchamfer,0,dentheight))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
dentshape = f.extrude(Vector(0,dentwidth,0))
|
|
dentshape.rotate(Vector(0,0,0),Vector(0,0,1),dentrotation)
|
|
if dentrotation == 0:
|
|
dentshape.translate(Vector(length,dentoffset,0))
|
|
elif dentrotation == 90:
|
|
dentshape.translate(Vector(length-dentoffset,width,0))
|
|
elif dentrotation == 180:
|
|
dentshape.translate(Vector(0,width-dentoffset,0))
|
|
elif dentrotation == 270:
|
|
dentshape.translate(Vector(dentoffset,0,0))
|
|
dentshape.translate(Vector(0,0,dentlevel))
|
|
shape = shape.fuse(dentshape)
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _PrecastIbeam(_Precast):
|
|
|
|
"The Precast Ibeam"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","Chamfer","Arch",QT_TRANSLATE_NOOP("App::Property","The chamfer length of this element"))
|
|
obj.addProperty("App::PropertyDistance","BeamBase","Arch",QT_TRANSLATE_NOOP("App::Property","The base length of this element"))
|
|
obj.Role = ["Beam"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
base = obj.BeamBase.Value
|
|
slant = obj.Chamfer.Value
|
|
|
|
if (length == 0) or (width == 0) or (height == 0):
|
|
return
|
|
if (slant*2 >= width) or (base*2+slant*2 >= height):
|
|
return
|
|
|
|
import Part
|
|
p = []
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(0,0,base))
|
|
p.append(Vector(0,slant,base+slant))
|
|
p.append(Vector(0,slant,height-(base+slant)))
|
|
p.append(Vector(0,0,height-base))
|
|
p.append(Vector(0,0,height))
|
|
p.append(Vector(0,width,height))
|
|
p.append(Vector(0,width,height-base))
|
|
p.append(Vector(0,width-slant,height-(base+slant)))
|
|
p.append(Vector(0,width-slant,base+slant))
|
|
p.append(Vector(0,width,base))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(length,0,0))
|
|
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _PrecastPillar(_Precast):
|
|
|
|
"The Precast Pillar"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","Chamfer","Arch",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
|
|
obj.addProperty("App::PropertyDistance","GrooveDepth","Arch",QT_TRANSLATE_NOOP("App::Property","The groove depth of this element"))
|
|
obj.addProperty("App::PropertyDistance","GrooveHeight","Arch",QT_TRANSLATE_NOOP("App::Property","The groove height of this element"))
|
|
obj.addProperty("App::PropertyDistance","GrooveSpacing","Arch",QT_TRANSLATE_NOOP("App::Property","The spacing between the grooves of this element"))
|
|
obj.addProperty("App::PropertyInteger","GrooveNumber","Arch",QT_TRANSLATE_NOOP("App::Property","The number of grooves of this element"))
|
|
obj.addProperty("App::PropertyStringList","Dents","Arch",QT_TRANSLATE_NOOP("App::Property","The dents of this element"))
|
|
obj.Role = ["Column"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
chamfer = obj.Chamfer.Value
|
|
groovedepth = obj.GrooveDepth.Value
|
|
grooveheight = obj.GrooveHeight.Value
|
|
spacing = obj.GrooveSpacing.Value
|
|
number = obj.GrooveNumber
|
|
dents = obj.Dents
|
|
|
|
if (length == 0) or (width == 0) or (height == 0):
|
|
return
|
|
if (chamfer >= width/2) or (chamfer >= length/2):
|
|
return
|
|
|
|
import Part
|
|
p = []
|
|
if chamfer > 0:
|
|
p.append(Vector(chamfer,0,0))
|
|
p.append(Vector(length-chamfer,0,0))
|
|
p.append(Vector(length,chamfer,0))
|
|
p.append(Vector(length,width-chamfer,0))
|
|
p.append(Vector(length-chamfer,width,0))
|
|
p.append(Vector(chamfer,width,0))
|
|
p.append(Vector(0,width-chamfer,0))
|
|
p.append(Vector(0,chamfer,0))
|
|
else:
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(length,0,0))
|
|
p.append(Vector(length,width,0))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(0,0,height))
|
|
|
|
if (groovedepth > 0) and (grooveheight > 0) and (spacing > 0) and (number > 0) and (groovedepth < length/2) and (groovedepth < width/2):
|
|
p1 = []
|
|
p1.append(Vector(0,0,0))
|
|
p1.append(Vector(length,0,0))
|
|
p1.append(Vector(length,width,0))
|
|
p1.append(Vector(0,width,0))
|
|
p1.append(p1[0])
|
|
p1 = Part.makePolygon(p1)
|
|
f1 = Part.Face(p1)
|
|
groove = f1.extrude(Vector(0,0,grooveheight))
|
|
p2 = []
|
|
p2.append(Vector(groovedepth,groovedepth,0))
|
|
p2.append(Vector(length-groovedepth,groovedepth,0))
|
|
p2.append(Vector(length-groovedepth,width-groovedepth,0))
|
|
p2.append(Vector(groovedepth,width-groovedepth,0))
|
|
p2.append(p2[0])
|
|
p2 = Part.makePolygon(p2)
|
|
f2 = Part.Face(p2)
|
|
s = f2.extrude(Vector(0,0,grooveheight))
|
|
groove = groove.cut(s)
|
|
for i in range(number):
|
|
g = groove.copy()
|
|
g.translate(Vector(0,0,spacing + i*(spacing+grooveheight)))
|
|
shape = shape.cut(g)
|
|
|
|
for dent in dents:
|
|
dent = dent.split(";")
|
|
if len(dent) == 7:
|
|
dentlength = float(dent[0])
|
|
dentwidth = float(dent[1])
|
|
dentheight = float(dent[2])
|
|
dentslant = float(dent[3])
|
|
dentchamfer = chamfer
|
|
dentlevel = float(dent[4])
|
|
dentrotation = float(dent[5])
|
|
dentoffset = float(dent[6])
|
|
if (dentlength == 0) or (dentwidth == 0) or (dentheight == 0):
|
|
continue
|
|
if dentslant >= dentheight:
|
|
continue
|
|
p = []
|
|
p.append(Vector(0-dentchamfer,0,0))
|
|
p.append(Vector(dentlength,0,dentslant))
|
|
p.append(Vector(dentlength,0,dentheight))
|
|
p.append(Vector(0-dentchamfer,0,dentheight))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
dentshape = f.extrude(Vector(0,dentwidth,0))
|
|
dentshape.rotate(Vector(0,0,0),Vector(0,0,1),dentrotation)
|
|
if dentrotation == 0:
|
|
dentshape.translate(Vector(length,dentoffset,0))
|
|
elif dentrotation == 90:
|
|
dentshape.translate(Vector(length-dentoffset,width,0))
|
|
elif dentrotation == 180:
|
|
dentshape.translate(Vector(0,width-dentoffset,0))
|
|
elif dentrotation == 270:
|
|
dentshape.translate(Vector(dentoffset,0,0))
|
|
dentshape.translate(Vector(0,0,dentlevel))
|
|
shape = shape.fuse(dentshape)
|
|
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _PrecastPanel(_Precast):
|
|
|
|
"The Precast Panel"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","Chamfer","Arch",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
|
|
obj.addProperty("App::PropertyDistance","DentWidth","Arch",QT_TRANSLATE_NOOP("App::Property","The dent width of this element"))
|
|
obj.addProperty("App::PropertyDistance","DentHeight","Arch",QT_TRANSLATE_NOOP("App::Property","The dent height of this element"))
|
|
obj.Role = ["Plate"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
chamfer = obj.Chamfer.Value
|
|
dentheight = obj.DentHeight.Value
|
|
dentwidth = obj.DentWidth.Value
|
|
|
|
if (length == 0) or (width == 0) or (height == 0):
|
|
return
|
|
if ((chamfer+dentwidth) >= width) or (dentheight >= height):
|
|
return
|
|
|
|
import Part
|
|
p = []
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(length,0,0))
|
|
p.append(Vector(length,width,0))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(0,0,height))
|
|
if chamfer > 0:
|
|
p = []
|
|
p.append(Vector(0,width-chamfer,0))
|
|
p.append(Vector(chamfer,width,0))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
s = f.extrude(Vector(0,0,height))
|
|
shape = shape.cut(s)
|
|
p = []
|
|
p.append(Vector(length,width-chamfer,0))
|
|
p.append(Vector(length-chamfer,width,0))
|
|
p.append(Vector(length,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
s = f.extrude(Vector(0,0,height))
|
|
shape = shape.cut(s)
|
|
p = []
|
|
p.append(Vector(0,width-chamfer,0))
|
|
p.append(Vector(0,width,chamfer))
|
|
p.append(Vector(0,width,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
s = f.extrude(Vector(length,0,0))
|
|
shape = shape.cut(s)
|
|
p = []
|
|
p.append(Vector(0,width-chamfer,height))
|
|
p.append(Vector(0,width,height-chamfer))
|
|
p.append(Vector(0,width,height))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
s = f.extrude(Vector(length,0,0))
|
|
shape = shape.cut(s)
|
|
if (dentheight > 0) and (dentwidth > 0):
|
|
p = []
|
|
p.append(Vector(0,((width-chamfer)-dentwidth)/2,0))
|
|
p.append(Vector(0,((width-chamfer)-dentwidth)/2+dentwidth,0))
|
|
p.append(Vector(0,((width-chamfer)-dentwidth)/2+dentwidth,dentheight))
|
|
p.append(Vector(0,((width-chamfer)-dentwidth)/2,dentheight))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
s = f.extrude(Vector(length,0,0))
|
|
shape = shape.cut(s)
|
|
s.translate(Vector(0,0,height))
|
|
shape = shape.fuse(s)
|
|
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _PrecastSlab(_Precast):
|
|
|
|
"The Precast Slab"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyEnumeration","SlabType","Arch",QT_TRANSLATE_NOOP("App::Property","The type of this slab"))
|
|
obj.addProperty("App::PropertyDistance","SlabBase","Arch",QT_TRANSLATE_NOOP("App::Property","The size of the base of this element"))
|
|
obj.addProperty("App::PropertyInteger","HoleNumber","Arch",QT_TRANSLATE_NOOP("App::Property","The number of holes in this element"))
|
|
obj.addProperty("App::PropertyDistance","HoleMajor","Arch",QT_TRANSLATE_NOOP("App::Property","The major radius of the holes of this element"))
|
|
obj.addProperty("App::PropertyDistance","HoleMinor","Arch",QT_TRANSLATE_NOOP("App::Property","The minor radius of the holes of this element"))
|
|
obj.addProperty("App::PropertyDistance","HoleSpacing","Arch",QT_TRANSLATE_NOOP("App::Property","The spacing between the holes of this element"))
|
|
obj.Role = ["Slab"]
|
|
obj.SlabType = ["Champagne","Hat"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
slabtype = obj.SlabType
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
base = obj.SlabBase.Value
|
|
holenumber = obj.HoleNumber
|
|
holemajor = obj.HoleMajor.Value
|
|
holeminor = obj.HoleMinor.Value
|
|
holespacing = obj.HoleSpacing.Value
|
|
|
|
slant = (height-base) / 3 # this gives the inclination of the vertical walls
|
|
|
|
if (length == 0) or (width == 0) or (height == 0):
|
|
return
|
|
if base >= height:
|
|
return
|
|
if height < (base*2):
|
|
return
|
|
if (holenumber > 0) and ( (holespacing == 0) or (holemajor == 0) or (holeminor == 0) ):
|
|
return
|
|
if holemajor < holeminor:
|
|
return
|
|
import Part
|
|
|
|
p = []
|
|
if slabtype == "Champagne":
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(0,slant,height-base))
|
|
p.append(Vector(0,0,height-base))
|
|
p.append(Vector(0,0,height))
|
|
p.append(Vector(0,width,height))
|
|
p.append(Vector(0,width,height-base))
|
|
p.append(Vector(0,width-slant,height-base))
|
|
p.append(Vector(0,width,0))
|
|
elif slabtype == "Hat":
|
|
p.append(Vector(0,0,0))
|
|
p.append(Vector(0,0,base))
|
|
p.append(Vector(0,slant,base))
|
|
p.append(Vector(0,slant*2,height))
|
|
p.append(Vector(0,width-slant*2,height))
|
|
p.append(Vector(0,width-slant,base))
|
|
p.append(Vector(0,width,base))
|
|
p.append(Vector(0,width,0))
|
|
else:
|
|
return None
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(length,0,0))
|
|
|
|
if holenumber > 0:
|
|
holespan = holenumber * holeminor + (holenumber - 1) * holespacing
|
|
holestart = (width/2 - holespan/2) + holeminor/2
|
|
if holeminor != holemajor:
|
|
e = Part.Ellipse(Vector(0,0,0),Vector(0,holeminor/2,0),Vector(0,0,holemajor/2)).toShape()
|
|
e.translate(Vector(0,0,-holemajor/2))
|
|
else:
|
|
e = Part.Circle(Vector(0,0,0),Vector(1,0,0),holemajor/2).toShape()
|
|
w = Part.Wire([e])
|
|
f = Part.Face(w)
|
|
tube = f.extrude(Vector(length,0,0))
|
|
for i in range(holenumber):
|
|
x = holestart + i*(holeminor+holespacing)
|
|
s = tube.copy()
|
|
s.translate(Vector(0,x,height/2))
|
|
shape = shape.cut(s)
|
|
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _PrecastStairs(_Precast):
|
|
|
|
"The Precast Stairs"
|
|
|
|
def __init__(self,obj):
|
|
|
|
_Precast.__init__(self,obj)
|
|
obj.addProperty("App::PropertyDistance","DownLength","Arch",QT_TRANSLATE_NOOP("App::Property","The length of the down floor of this element"))
|
|
obj.addProperty("App::PropertyInteger","RiserNumber","Arch",QT_TRANSLATE_NOOP("App::Property","The number of risers in this element"))
|
|
obj.addProperty("App::PropertyDistance","Riser","Arch",QT_TRANSLATE_NOOP("App::Property","The riser height of this element"))
|
|
obj.addProperty("App::PropertyDistance","Tread","Arch",QT_TRANSLATE_NOOP("App::Property","The tread depth of this element"))
|
|
obj.Role = ["Stairs"]
|
|
|
|
def execute(self,obj):
|
|
|
|
if self.clone(obj):
|
|
return
|
|
|
|
pl = obj.Placement
|
|
length = obj.Length.Value
|
|
width = obj.Width.Value
|
|
height = obj.Height.Value
|
|
downlength = obj.DownLength.Value
|
|
steps = obj.RiserNumber
|
|
riser = obj.Riser.Value
|
|
tread = obj.Tread.Value
|
|
|
|
if not width:
|
|
return
|
|
if not steps:
|
|
return
|
|
if not riser:
|
|
return
|
|
if not tread:
|
|
return
|
|
if not height:
|
|
return
|
|
if length < tread:
|
|
length = tread # minimum
|
|
|
|
import math,Part
|
|
|
|
p = [Vector(0,0,0)] # relative moves
|
|
if downlength:
|
|
p.append(Vector(0,downlength,0))
|
|
for i in range(steps-1):
|
|
p.append(Vector(0,0,riser))
|
|
p.append(Vector(0,tread,0))
|
|
p.append(Vector(0,0,riser))
|
|
p.append(Vector(0,length,0))
|
|
ang1 = math.atan(riser/tread)
|
|
ang2 = ang1/2
|
|
rdist = math.tan(ang2)*height
|
|
if length > (tread+rdist):
|
|
p.append(Vector(0,0,-height))
|
|
p.append(Vector(0,-(length-(tread+rdist))))
|
|
else:
|
|
rest = length-(tread+rdist)
|
|
addh = math.tan(ang1)*rest
|
|
p.append(Vector(0,0,-(height+addh)))
|
|
# absolutize
|
|
r = [p[0]]
|
|
for m in p[1:]:
|
|
r.append(r[-1].add(m))
|
|
p = r
|
|
if downlength:
|
|
bdist = math.tan(ang1)*height
|
|
p.append(Vector(0,downlength+bdist,-height))
|
|
p.append(Vector(0,0,-height))
|
|
else:
|
|
hdist = height*(math.tan(ang1))
|
|
p.append(Vector(0,hdist,0))
|
|
p.append(p[0])
|
|
p = Part.makePolygon(p)
|
|
f = Part.Face(p)
|
|
shape = f.extrude(Vector(width,0,0))
|
|
|
|
shape = self.processSubShapes(obj,shape,pl)
|
|
self.applyShape(obj,shape,pl)
|
|
|
|
|
|
class _ViewProviderPrecast(ArchComponent.ViewProviderComponent):
|
|
"The View Provider of the Precast object"
|
|
|
|
def __init__(self,vobj):
|
|
ArchComponent.ViewProviderComponent.__init__(self,vobj)
|
|
vobj.ShapeColor = ArchCommands.getDefaultColor("Structure")
|
|
|
|
def getIcon(self):
|
|
import Arch_rc
|
|
if hasattr(self,"Object"):
|
|
if self.Object.CloneOf:
|
|
return ":/icons/Arch_Structure_Clone.svg"
|
|
return ":/icons/Arch_Structure_Tree.svg"
|
|
|
|
def setEdit(self,vobj,mode):
|
|
if mode == 0:
|
|
import FreeCADGui
|
|
taskd = ArchComponent.ComponentTaskPanel()
|
|
taskd.obj = self.Object
|
|
taskd.update()
|
|
if hasattr(self.Object,"Dents"):
|
|
self.dentd = _DentsTaskPanel()
|
|
self.dentd.form.show()
|
|
self.dentd.fillDents(self.Object.Dents)
|
|
taskd.form = [taskd.form,self.dentd.form]
|
|
FreeCADGui.Control.showDialog(taskd)
|
|
return True
|
|
return False
|
|
|
|
def unsetEdit(self,vobj,mode):
|
|
import FreeCADGui
|
|
if hasattr(self,"dentd"):
|
|
self.Object.Dents = self.dentd.getValues()
|
|
del self.dentd
|
|
FreeCADGui.Control.closeDialog()
|
|
return False
|
|
|
|
|
|
class _PrecastTaskPanel:
|
|
|
|
'''The TaskPanel for precast creation'''
|
|
|
|
def __init__(self):
|
|
|
|
import FreeCADGui
|
|
from PySide import QtCore,QtGui,QtSvg
|
|
self.form = QtGui.QWidget()
|
|
self.grid = QtGui.QGridLayout(self.form)
|
|
self.PrecastTypes = ["Beam","I-Beam","Pillar","Panel","Slab","Stairs"]
|
|
self.SlabTypes = ["Champagne","Hat"]
|
|
|
|
# image display
|
|
self.preview = QtSvg.QSvgWidget(":/ui/ParametersBeam.svg")
|
|
self.preview.setMaximumWidth(200)
|
|
self.preview.setMinimumHeight(120)
|
|
self.grid.addWidget(self.preview,0,0,1,2)
|
|
|
|
# parameters
|
|
self.labelSlabType = QtGui.QLabel()
|
|
self.valueSlabType = QtGui.QComboBox()
|
|
self.valueSlabType.addItems(self.SlabTypes)
|
|
self.valueSlabType.setCurrentIndex(0)
|
|
self.grid.addWidget(self.labelSlabType,1,0,1,1)
|
|
self.grid.addWidget(self.valueSlabType,1,1,1,1)
|
|
|
|
self.labelChamfer = QtGui.QLabel()
|
|
self.valueChamfer = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelChamfer,2,0,1,1)
|
|
self.grid.addWidget(self.valueChamfer,2,1,1,1)
|
|
|
|
self.labelDentLength = QtGui.QLabel()
|
|
self.valueDentLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelDentLength,3,0,1,1)
|
|
self.grid.addWidget(self.valueDentLength,3,1,1,1)
|
|
|
|
self.labelDentWidth = QtGui.QLabel()
|
|
self.valueDentWidth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelDentWidth,4,0,1,1)
|
|
self.grid.addWidget(self.valueDentWidth,4,1,1,1)
|
|
|
|
self.labelDentHeight = QtGui.QLabel()
|
|
self.valueDentHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelDentHeight,5,0,1,1)
|
|
self.grid.addWidget(self.valueDentHeight,5,1,1,1)
|
|
|
|
self.labelBase = QtGui.QLabel()
|
|
self.valueBase = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelBase,6,0,1,1)
|
|
self.grid.addWidget(self.valueBase,6,1,1,1)
|
|
|
|
self.labelHoleNumber = QtGui.QLabel()
|
|
self.valueHoleNumber = QtGui.QSpinBox()
|
|
self.grid.addWidget(self.labelHoleNumber,7,0,1,1)
|
|
self.grid.addWidget(self.valueHoleNumber,7,1,1,1)
|
|
|
|
self.labelHoleMajor = QtGui.QLabel()
|
|
self.valueHoleMajor = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelHoleMajor,8,0,1,1)
|
|
self.grid.addWidget(self.valueHoleMajor,8,1,1,1)
|
|
|
|
self.labelHoleMinor = QtGui.QLabel()
|
|
self.valueHoleMinor = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelHoleMinor,9,0,1,1)
|
|
self.grid.addWidget(self.valueHoleMinor,9,1,1,1)
|
|
|
|
self.labelHoleSpacing = QtGui.QLabel()
|
|
self.valueHoleSpacing = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelHoleSpacing,10,0,1,1)
|
|
self.grid.addWidget(self.valueHoleSpacing,10,1,1,1)
|
|
|
|
self.labelGrooveNumber = QtGui.QLabel()
|
|
self.valueGrooveNumber = QtGui.QSpinBox()
|
|
self.grid.addWidget(self.labelGrooveNumber,11,0,1,1)
|
|
self.grid.addWidget(self.valueGrooveNumber,11,1,1,1)
|
|
|
|
self.labelGrooveDepth = QtGui.QLabel()
|
|
self.valueGrooveDepth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelGrooveDepth,12,0,1,1)
|
|
self.grid.addWidget(self.valueGrooveDepth,12,1,1,1)
|
|
|
|
self.labelGrooveHeight = QtGui.QLabel()
|
|
self.valueGrooveHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelGrooveHeight,13,0,1,1)
|
|
self.grid.addWidget(self.valueGrooveHeight,13,1,1,1)
|
|
|
|
self.labelGrooveSpacing = QtGui.QLabel()
|
|
self.valueGrooveSpacing = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelGrooveSpacing,14,0,1,1)
|
|
self.grid.addWidget(self.valueGrooveSpacing,14,1,1,1)
|
|
|
|
self.labelRiserNumber = QtGui.QLabel()
|
|
self.valueRiserNumber = QtGui.QSpinBox()
|
|
self.grid.addWidget(self.labelRiserNumber,15,0,1,1)
|
|
self.grid.addWidget(self.valueRiserNumber,15,1,1,1)
|
|
|
|
self.labelDownLength = QtGui.QLabel()
|
|
self.valueDownLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelDownLength,16,0,1,1)
|
|
self.grid.addWidget(self.valueDownLength,16,1,1,1)
|
|
|
|
self.labelRiser = QtGui.QLabel()
|
|
self.valueRiser = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelRiser,17,0,1,1)
|
|
self.grid.addWidget(self.valueRiser,17,1,1,1)
|
|
|
|
self.labelTread = QtGui.QLabel()
|
|
self.valueTread = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelTread,18,0,1,1)
|
|
self.grid.addWidget(self.valueTread,18,1,1,1)
|
|
|
|
# signals/slots
|
|
QtCore.QObject.connect(self.valueChamfer,QtCore.SIGNAL("valueChanged(double)"),self.setChamfer)
|
|
QtCore.QObject.connect(self.valueDentLength,QtCore.SIGNAL("valueChanged(double)"),self.setDentLength)
|
|
QtCore.QObject.connect(self.valueDentWidth,QtCore.SIGNAL("valueChanged(double)"),self.setDentWidth)
|
|
QtCore.QObject.connect(self.valueDentHeight,QtCore.SIGNAL("valueChanged(double)"),self.setDentHeight)
|
|
QtCore.QObject.connect(self.valueBase,QtCore.SIGNAL("valueChanged(double)"),self.setBase)
|
|
QtCore.QObject.connect(self.valueHoleMajor,QtCore.SIGNAL("valueChanged(double)"),self.setHoleMajor)
|
|
QtCore.QObject.connect(self.valueHoleMinor,QtCore.SIGNAL("valueChanged(double)"),self.setHoleMinor)
|
|
QtCore.QObject.connect(self.valueHoleSpacing,QtCore.SIGNAL("valueChanged(double)"),self.setHoleSpacing)
|
|
QtCore.QObject.connect(self.valueGrooveDepth,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveDepth)
|
|
QtCore.QObject.connect(self.valueGrooveHeight,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveHeight)
|
|
QtCore.QObject.connect(self.valueGrooveSpacing,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveSpacing)
|
|
QtCore.QObject.connect(self.valueDownLength,QtCore.SIGNAL("valueChanged(double)"),self.setDownLength)
|
|
QtCore.QObject.connect(self.valueRiser,QtCore.SIGNAL("valueChanged(double)"),self.setRiser)
|
|
QtCore.QObject.connect(self.valueTread,QtCore.SIGNAL("valueChanged(double)"),self.setTread)
|
|
self.retranslateUi(self.form)
|
|
self.form.hide()
|
|
|
|
def getValues(self):
|
|
d = {}
|
|
d["SlabType"] = self.SlabTypes[self.valueSlabType.currentIndex()]
|
|
d["Chamfer"] = self.Chamfer
|
|
d["DentLength"] = self.DentLength
|
|
d["DentWidth"] = self.DentWidth
|
|
d["DentHeight"] = self.DentHeight
|
|
d["Base"] = self.Base
|
|
d["HoleNumber"] = self.valueHoleNumber.value()
|
|
d["HoleMajor"] = self.HoleMajor
|
|
d["HoleMinor"] = self.HoleMinor
|
|
d["HoleSpacing"] = self.HoleSpacing
|
|
d["GrooveNumber"] = self.valueGrooveNumber.value()
|
|
d["GrooveDepth"] = self.GrooveDepth
|
|
d["GrooveHeight"] = self.GrooveHeight
|
|
d["GrooveSpacing"] = self.GrooveSpacing
|
|
d["RiserNumber"] = self.valueRiserNumber.value()
|
|
d["DownLength"] = self.DownLength
|
|
d["Riser"] = self.Riser
|
|
d["Tread"] = self.Tread
|
|
if hasattr(self,"Dents"):
|
|
d["Dents"] = self.Dents.getValues()
|
|
return d
|
|
|
|
def setChamfer(self,value):
|
|
self.Chamfer = value
|
|
|
|
def setDentLength(self,value):
|
|
self.DentLength = value
|
|
|
|
def setDentWidth(self,value):
|
|
self.DentWidth = value
|
|
|
|
def setDentHeight(self,value):
|
|
self.DentHeight = value
|
|
|
|
def setBase(self,value):
|
|
self.Base = value
|
|
|
|
def setHoleMajor(self,value):
|
|
self.HoleMajor = value
|
|
|
|
def setHoleMinor(self,value):
|
|
self.HoleMinor = value
|
|
|
|
def setHoleSpacing(self,value):
|
|
self.HoleSpacing = value
|
|
|
|
def setGrooveDepth(self,value):
|
|
self.GrooveDepth = value
|
|
|
|
def setGrooveHeight(self,value):
|
|
self.GrooveHeight = value
|
|
|
|
def setGrooveSpacing(self,value):
|
|
self.GrooveSpacing = value
|
|
|
|
def setDownLength(self,value):
|
|
self.DownLength = value
|
|
|
|
def setRiser(self,value):
|
|
self.Riser = value
|
|
|
|
def setTread(self,value):
|
|
self.Tread = value
|
|
|
|
def retranslateUi(self, dialog):
|
|
from PySide import QtGui
|
|
self.form.setWindowTitle(QtGui.QApplication.translate("Arch", "Precast elements", None))
|
|
self.labelSlabType.setText(QtGui.QApplication.translate("Arch", "Slab type", None))
|
|
self.labelChamfer.setText(QtGui.QApplication.translate("Arch", "Chamfer", None))
|
|
self.labelDentLength.setText(QtGui.QApplication.translate("Arch", "Dent length", None))
|
|
self.labelDentWidth.setText(QtGui.QApplication.translate("Arch", "Dent width", None))
|
|
self.labelDentHeight.setText(QtGui.QApplication.translate("Arch", "Dent height", None))
|
|
self.labelBase.setText(QtGui.QApplication.translate("Arch", "Slab base", None))
|
|
self.labelHoleNumber.setText(QtGui.QApplication.translate("Arch", "Number of holes", None))
|
|
self.labelHoleMajor.setText(QtGui.QApplication.translate("Arch", "Major diameter of holes", None))
|
|
self.labelHoleMinor.setText(QtGui.QApplication.translate("Arch", "Minor diameter of holes", None))
|
|
self.labelHoleSpacing.setText(QtGui.QApplication.translate("Arch", "Spacing between holes", None))
|
|
self.labelGrooveNumber.setText(QtGui.QApplication.translate("Arch", "Number of grooves", None))
|
|
self.labelGrooveDepth.setText(QtGui.QApplication.translate("Arch", "Depth of grooves", None))
|
|
self.labelGrooveHeight.setText(QtGui.QApplication.translate("Arch", "Height of grooves", None))
|
|
self.labelGrooveSpacing.setText(QtGui.QApplication.translate("Arch", "Spacing between grooves", None))
|
|
self.labelRiserNumber.setText(QtGui.QApplication.translate("Arch", "Number of risers", None))
|
|
self.labelDownLength.setText(QtGui.QApplication.translate("Arch", "Length of down floor", None))
|
|
self.labelRiser.setText(QtGui.QApplication.translate("Arch", "Height of risers", None))
|
|
self.labelTread.setText(QtGui.QApplication.translate("Arch", "Depth of treads", None))
|
|
|
|
def setPreset(self,preset):
|
|
self.preview.hide()
|
|
if preset == "Beam":
|
|
self.preview.load(":/ui/ParametersBeam.svg")
|
|
self.labelSlabType.hide()
|
|
self.valueSlabType.hide()
|
|
self.labelChamfer.show()
|
|
self.valueChamfer.show()
|
|
self.labelDentLength.show()
|
|
self.valueDentLength.show()
|
|
self.labelDentWidth.hide()
|
|
self.valueDentWidth.hide()
|
|
self.labelDentHeight.show()
|
|
self.valueDentHeight.show()
|
|
self.labelBase.hide()
|
|
self.valueBase.hide()
|
|
self.labelHoleNumber.hide()
|
|
self.valueHoleNumber.hide()
|
|
self.labelHoleMajor.hide()
|
|
self.valueHoleMajor.hide()
|
|
self.labelHoleMinor.hide()
|
|
self.valueHoleMinor.hide()
|
|
self.labelHoleSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelGrooveNumber.hide()
|
|
self.valueGrooveNumber.hide()
|
|
self.labelGrooveDepth.hide()
|
|
self.valueGrooveDepth.hide()
|
|
self.labelGrooveHeight.hide()
|
|
self.valueGrooveHeight.hide()
|
|
self.labelGrooveSpacing.hide()
|
|
self.valueGrooveSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelRiserNumber.hide()
|
|
self.valueRiserNumber.hide()
|
|
self.labelDownLength.hide()
|
|
self.valueDownLength.hide()
|
|
self.labelRiser.hide()
|
|
self.valueRiser.hide()
|
|
self.labelTread.hide()
|
|
self.valueTread.hide()
|
|
elif preset == "Pillar":
|
|
self.preview.load(":/ui/ParametersPillar.svg")
|
|
self.labelSlabType.hide()
|
|
self.valueSlabType.hide()
|
|
self.labelChamfer.show()
|
|
self.valueChamfer.show()
|
|
self.labelDentLength.hide()
|
|
self.valueDentLength.hide()
|
|
self.labelDentWidth.hide()
|
|
self.valueDentWidth.hide()
|
|
self.labelDentHeight.hide()
|
|
self.valueDentHeight.hide()
|
|
self.labelBase.hide()
|
|
self.valueBase.hide()
|
|
self.labelHoleNumber.hide()
|
|
self.valueHoleNumber.hide()
|
|
self.labelHoleMajor.hide()
|
|
self.valueHoleMajor.hide()
|
|
self.labelHoleMinor.hide()
|
|
self.valueHoleMinor.hide()
|
|
self.labelHoleSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelGrooveNumber.show()
|
|
self.valueGrooveNumber.show()
|
|
self.labelGrooveDepth.show()
|
|
self.valueGrooveDepth.show()
|
|
self.labelGrooveHeight.show()
|
|
self.valueGrooveHeight.show()
|
|
self.labelGrooveSpacing.show()
|
|
self.valueGrooveSpacing.show()
|
|
self.labelRiserNumber.hide()
|
|
self.valueRiserNumber.hide()
|
|
self.labelDownLength.hide()
|
|
self.valueDownLength.hide()
|
|
self.labelRiser.hide()
|
|
self.valueRiser.hide()
|
|
self.labelTread.hide()
|
|
self.valueTread.hide()
|
|
elif preset == "Panel":
|
|
self.preview.load(":/ui/ParametersPanel.svg")
|
|
self.labelSlabType.hide()
|
|
self.valueSlabType.hide()
|
|
self.labelChamfer.show()
|
|
self.valueChamfer.show()
|
|
self.labelDentLength.hide()
|
|
self.valueDentLength.hide()
|
|
self.labelDentWidth.show()
|
|
self.valueDentWidth.show()
|
|
self.labelDentHeight.show()
|
|
self.valueDentHeight.show()
|
|
self.labelBase.hide()
|
|
self.valueBase.hide()
|
|
self.labelHoleNumber.hide()
|
|
self.valueHoleNumber.hide()
|
|
self.labelHoleMajor.hide()
|
|
self.valueHoleMajor.hide()
|
|
self.labelHoleMinor.hide()
|
|
self.valueHoleMinor.hide()
|
|
self.labelHoleSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelGrooveNumber.hide()
|
|
self.valueGrooveNumber.hide()
|
|
self.labelGrooveDepth.hide()
|
|
self.valueGrooveDepth.hide()
|
|
self.labelGrooveHeight.hide()
|
|
self.valueGrooveHeight.hide()
|
|
self.labelGrooveSpacing.hide()
|
|
self.valueGrooveSpacing.hide()
|
|
self.labelRiserNumber.hide()
|
|
self.valueRiserNumber.hide()
|
|
self.labelDownLength.hide()
|
|
self.valueDownLength.hide()
|
|
self.labelRiser.hide()
|
|
self.valueRiser.hide()
|
|
self.labelTread.hide()
|
|
self.valueTread.hide()
|
|
elif preset == "Slab":
|
|
self.preview.load(":/ui/ParametersSlab.svg")
|
|
self.labelSlabType.show()
|
|
self.valueSlabType.show()
|
|
self.labelChamfer.hide()
|
|
self.valueChamfer.hide()
|
|
self.labelDentLength.hide()
|
|
self.valueDentLength.hide()
|
|
self.labelDentWidth.hide()
|
|
self.valueDentWidth.hide()
|
|
self.labelDentHeight.hide()
|
|
self.valueDentHeight.hide()
|
|
self.labelBase.show()
|
|
self.valueBase.show()
|
|
self.labelHoleNumber.show()
|
|
self.valueHoleNumber.show()
|
|
self.labelHoleMajor.show()
|
|
self.valueHoleMajor.show()
|
|
self.labelHoleMinor.show()
|
|
self.valueHoleMinor.show()
|
|
self.labelHoleSpacing.show()
|
|
self.valueHoleSpacing.show()
|
|
self.labelGrooveNumber.hide()
|
|
self.valueGrooveNumber.hide()
|
|
self.labelGrooveDepth.hide()
|
|
self.valueGrooveDepth.hide()
|
|
self.labelGrooveHeight.hide()
|
|
self.valueGrooveHeight.hide()
|
|
self.labelGrooveSpacing.hide()
|
|
self.valueGrooveSpacing.hide()
|
|
self.labelRiserNumber.hide()
|
|
self.valueRiserNumber.hide()
|
|
self.labelDownLength.hide()
|
|
self.valueDownLength.hide()
|
|
self.labelRiser.hide()
|
|
self.valueRiser.hide()
|
|
self.labelTread.hide()
|
|
self.valueTread.hide()
|
|
elif preset == "I-Beam":
|
|
self.preview.load(":/ui/ParametersIbeam.svg")
|
|
self.labelSlabType.hide()
|
|
self.valueSlabType.hide()
|
|
self.labelChamfer.show()
|
|
self.valueChamfer.show()
|
|
self.labelDentLength.hide()
|
|
self.valueDentLength.hide()
|
|
self.labelDentWidth.hide()
|
|
self.valueDentWidth.hide()
|
|
self.labelDentHeight.hide()
|
|
self.valueDentHeight.hide()
|
|
self.labelBase.show()
|
|
self.valueBase.show()
|
|
self.labelHoleNumber.hide()
|
|
self.valueHoleNumber.hide()
|
|
self.labelHoleMajor.hide()
|
|
self.valueHoleMajor.hide()
|
|
self.labelHoleMinor.hide()
|
|
self.valueHoleMinor.hide()
|
|
self.labelHoleSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelGrooveNumber.hide()
|
|
self.valueGrooveNumber.hide()
|
|
self.labelGrooveDepth.hide()
|
|
self.valueGrooveDepth.hide()
|
|
self.labelGrooveHeight.hide()
|
|
self.valueGrooveHeight.hide()
|
|
self.labelGrooveSpacing.hide()
|
|
self.valueGrooveSpacing.hide()
|
|
self.labelRiserNumber.hide()
|
|
self.valueRiserNumber.hide()
|
|
self.labelDownLength.hide()
|
|
self.valueDownLength.hide()
|
|
self.labelRiser.hide()
|
|
self.valueRiser.hide()
|
|
self.labelTread.hide()
|
|
self.valueTread.hide()
|
|
elif preset == "Stairs":
|
|
self.preview.load(":/ui/ParametersStairs.svg")
|
|
self.labelSlabType.hide()
|
|
self.valueSlabType.hide()
|
|
self.labelChamfer.hide()
|
|
self.valueChamfer.hide()
|
|
self.labelDentLength.hide()
|
|
self.valueDentLength.hide()
|
|
self.labelDentWidth.hide()
|
|
self.valueDentWidth.hide()
|
|
self.labelDentHeight.hide()
|
|
self.valueDentHeight.hide()
|
|
self.labelBase.hide()
|
|
self.valueBase.hide()
|
|
self.labelHoleNumber.hide()
|
|
self.valueHoleNumber.hide()
|
|
self.labelHoleMajor.hide()
|
|
self.valueHoleMajor.hide()
|
|
self.labelHoleMinor.hide()
|
|
self.valueHoleMinor.hide()
|
|
self.labelHoleSpacing.hide()
|
|
self.valueHoleSpacing.hide()
|
|
self.labelGrooveNumber.hide()
|
|
self.valueGrooveNumber.hide()
|
|
self.labelGrooveDepth.hide()
|
|
self.valueGrooveDepth.hide()
|
|
self.labelGrooveHeight.hide()
|
|
self.valueGrooveHeight.hide()
|
|
self.labelGrooveSpacing.hide()
|
|
self.valueGrooveSpacing.hide()
|
|
self.labelRiserNumber.show()
|
|
self.valueRiserNumber.show()
|
|
self.labelDownLength.show()
|
|
self.valueDownLength.show()
|
|
self.labelRiser.show()
|
|
self.valueRiser.show()
|
|
self.labelTread.show()
|
|
self.valueTread.show()
|
|
self.preview.show()
|
|
|
|
|
|
class _DentsTaskPanel:
|
|
|
|
'''The TaskPanel for dent creation'''
|
|
|
|
def __init__(self):
|
|
|
|
import FreeCADGui
|
|
from PySide import QtCore,QtGui,QtSvg
|
|
self.form = QtGui.QWidget()
|
|
self.grid = QtGui.QGridLayout(self.form)
|
|
self.Rotations = ["N","S","E","O"]
|
|
self.RotationAngles = [90,270,0,180]
|
|
|
|
# dents list
|
|
self.labelDents = QtGui.QLabel()
|
|
self.listDents = QtGui.QListWidget()
|
|
self.grid.addWidget(self.labelDents,0,0,1,2)
|
|
self.grid.addWidget(self.listDents,1,0,1,2)
|
|
|
|
# buttons
|
|
self.buttonAdd = QtGui.QPushButton()
|
|
self.buttonRemove = QtGui.QPushButton()
|
|
self.grid.addWidget(self.buttonAdd,2,0,1,1)
|
|
self.grid.addWidget(self.buttonRemove,2,1,1,1)
|
|
|
|
# image display
|
|
self.preview = QtSvg.QSvgWidget(":/ui/ParametersDent.svg")
|
|
self.preview.setMaximumWidth(200)
|
|
self.preview.setMinimumHeight(120)
|
|
self.grid.addWidget(self.preview,3,0,1,2)
|
|
|
|
# parameters
|
|
self.labelLength = QtGui.QLabel()
|
|
self.valueLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelLength,4,0,1,1)
|
|
self.grid.addWidget(self.valueLength,4,1,1,1)
|
|
|
|
self.labelWidth = QtGui.QLabel()
|
|
self.valueWidth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelWidth,5,0,1,1)
|
|
self.grid.addWidget(self.valueWidth,5,1,1,1)
|
|
|
|
self.labelHeight = QtGui.QLabel()
|
|
self.valueHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelHeight,6,0,1,1)
|
|
self.grid.addWidget(self.valueHeight,6,1,1,1)
|
|
|
|
self.labelSlant = QtGui.QLabel()
|
|
self.valueSlant = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelSlant,7,0,1,1)
|
|
self.grid.addWidget(self.valueSlant,7,1,1,1)
|
|
|
|
self.labelLevel = QtGui.QLabel()
|
|
self.valueLevel = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelLevel,8,0,1,1)
|
|
self.grid.addWidget(self.valueLevel,8,1,1,1)
|
|
|
|
self.labelRotation = QtGui.QLabel()
|
|
self.valueRotation = QtGui.QComboBox()
|
|
self.valueRotation.addItems(self.Rotations)
|
|
self.valueRotation.setCurrentIndex(0)
|
|
self.grid.addWidget(self.labelRotation,9,0,1,1)
|
|
self.grid.addWidget(self.valueRotation,9,1,1,1)
|
|
|
|
self.labelOffset = QtGui.QLabel()
|
|
self.valueOffset = FreeCADGui.UiLoader().createWidget("Gui::InputField")
|
|
self.grid.addWidget(self.labelOffset,10,0,1,1)
|
|
self.grid.addWidget(self.valueOffset,10,1,1,1)
|
|
|
|
# signals/slots
|
|
QtCore.QObject.connect(self.valueLength,QtCore.SIGNAL("valueChanged(double)"),self.setLength)
|
|
QtCore.QObject.connect(self.valueWidth,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
|
|
QtCore.QObject.connect(self.valueHeight,QtCore.SIGNAL("valueChanged(double)"),self.setHeight)
|
|
QtCore.QObject.connect(self.valueSlant,QtCore.SIGNAL("valueChanged(double)"),self.setSlant)
|
|
QtCore.QObject.connect(self.valueLevel,QtCore.SIGNAL("valueChanged(double)"),self.setLevel)
|
|
QtCore.QObject.connect(self.valueRotation,QtCore.SIGNAL("currentIndexChanged(int)"),self.setDent)
|
|
QtCore.QObject.connect(self.valueOffset,QtCore.SIGNAL("valueChanged(double)"),self.setOffset)
|
|
QtCore.QObject.connect(self.buttonAdd,QtCore.SIGNAL("clicked()"),self.addDent)
|
|
QtCore.QObject.connect(self.buttonRemove,QtCore.SIGNAL("clicked()"),self.removeDent)
|
|
QtCore.QObject.connect(self.listDents,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.editDent)
|
|
self.retranslateUi(self.form)
|
|
self.form.hide()
|
|
|
|
def setLength(self,value):
|
|
self.Length = value
|
|
self.setDent()
|
|
|
|
def setWidth(self,value):
|
|
self.Width = value
|
|
self.setDent()
|
|
|
|
def setHeight(self,value):
|
|
self.Height = value
|
|
self.setDent()
|
|
|
|
def setSlant(self,value):
|
|
self.Slant = value
|
|
self.setDent()
|
|
|
|
def setLevel(self,value):
|
|
self.Level = value
|
|
self.setDent()
|
|
|
|
def setOffset(self,value):
|
|
self.Offset = value
|
|
self.setDent()
|
|
|
|
def fillDents(self,dents):
|
|
self.listDents.clear()
|
|
i = 1
|
|
for d in dents:
|
|
s = "Dent "+str(i)+" :"+d
|
|
self.listDents.addItem(s)
|
|
i += 1
|
|
|
|
def setDent(self,i=0):
|
|
if self.listDents.currentItem():
|
|
num = str(self.listDents.currentRow()+1)
|
|
rot = self.RotationAngles[self.valueRotation.currentIndex()]
|
|
s = "Dent "+num+" :"+str(self.Length)+";"+str(self.Width)+";"+str(self.Height)+";"+str(self.Slant)+";"+str(self.Level)+";"+str(rot)+";"+str(self.Offset)
|
|
self.listDents.currentItem().setText(s)
|
|
|
|
def addDent(self):
|
|
num = str(self.listDents.count()+1)
|
|
rot = self.RotationAngles[self.valueRotation.currentIndex()]
|
|
s = "Dent "+num+" :"+str(self.Length)+";"+str(self.Width)+";"+str(self.Height)+";"+str(self.Slant)+";"+str(self.Level)+";"+str(rot)+";"+str(self.Offset)
|
|
self.listDents.addItem(s)
|
|
self.listDents.setCurrentRow(self.listDents.count()-1)
|
|
self.editDent()
|
|
|
|
def removeDent(self):
|
|
if self.listDents.currentItem():
|
|
self.listDents.takeItem(self.listDents.currentRow())
|
|
|
|
def editDent(self,item=None):
|
|
if self.listDents.currentItem():
|
|
s = self.listDents.currentItem().text()
|
|
s = s.split(":")[1]
|
|
s = s.split(";")
|
|
self.valueLength.setText(FreeCAD.Units.Quantity(float(s[0]),FreeCAD.Units.Length).UserString)
|
|
self.valueWidth.setText(FreeCAD.Units.Quantity(float(s[1]),FreeCAD.Units.Length).UserString)
|
|
self.valueHeight.setText(FreeCAD.Units.Quantity(float(s[2]),FreeCAD.Units.Length).UserString)
|
|
self.valueSlant.setText(FreeCAD.Units.Quantity(float(s[3]),FreeCAD.Units.Length).UserString)
|
|
self.valueLevel.setText(FreeCAD.Units.Quantity(float(s[4]),FreeCAD.Units.Length).UserString)
|
|
self.valueRotation.setCurrentIndex(self.RotationAngles.index(int(s[5])))
|
|
self.valueOffset.setText(FreeCAD.Units.Quantity(float(s[6]),FreeCAD.Units.Length).UserString)
|
|
|
|
def retranslateUi(self, dialog):
|
|
from PySide import QtGui
|
|
self.form.setWindowTitle(QtGui.QApplication.translate("Arch", "Precast options", None))
|
|
self.labelDents.setText(QtGui.QApplication.translate("Arch", "Dents list", None))
|
|
self.buttonAdd.setText(QtGui.QApplication.translate("Arch", "Add dent", None))
|
|
self.buttonRemove.setText(QtGui.QApplication.translate("Arch", "Remove dent", None))
|
|
self.labelLength.setText(QtGui.QApplication.translate("Arch", "Length", None))
|
|
self.labelWidth.setText(QtGui.QApplication.translate("Arch", "Width", None))
|
|
self.labelHeight.setText(QtGui.QApplication.translate("Arch", "Height", None))
|
|
self.labelSlant.setText(QtGui.QApplication.translate("Arch", "Slant", None))
|
|
self.labelLevel.setText(QtGui.QApplication.translate("Arch", "Level", None))
|
|
self.labelRotation.setText(QtGui.QApplication.translate("Arch", "Rotation", None))
|
|
self.labelOffset.setText(QtGui.QApplication.translate("Arch", "Offset", None))
|
|
|
|
def getValues(self):
|
|
l = []
|
|
for i in range(self.listDents.count()):
|
|
s = self.listDents.item(i).text()
|
|
l.append(s.split(":")[1])
|
|
return l
|
|
|
|
|
|
def makePrecast(precasttype=None,length=0,width=0,height=0,slabtype="",chamfer=0,dentlength=0,dentwidth=0,dentheight=0,dents=[],base=0,holenumber=0,holemajor=0,holeminor=0,holespacing=0,groovenumber=0,groovedepth=0,grooveheight=0,groovespacing=0,risernumber=0,downlength=0,riser=0,tread=0):
|
|
|
|
"creates one of the precast objects in the current document"
|
|
|
|
if precasttype == "Beam":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Beam")
|
|
_PrecastBeam(obj)
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.Chamfer = chamfer
|
|
obj.Dents = dents
|
|
obj.DentLength = dentlength
|
|
obj.DentHeight = dentheight
|
|
elif precasttype == "Pillar":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Pillar")
|
|
_PrecastPillar(obj)
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.Chamfer = chamfer
|
|
obj.Dents = dents
|
|
obj.GrooveNumber = groovenumber
|
|
obj.GrooveDepth = groovedepth
|
|
obj.GrooveHeight = grooveheight
|
|
obj.GrooveSpacing = groovespacing
|
|
elif precasttype == "Panel":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Panel")
|
|
_PrecastPanel(obj)
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.Chamfer = chamfer
|
|
obj.DentWidth = dentwidth
|
|
obj.DentHeight = dentheight
|
|
elif precasttype == "Slab":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Slab")
|
|
_PrecastSlab(obj)
|
|
obj.SlabType = slabtype
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.SlabBase = base
|
|
obj.HoleNumber = holenumber
|
|
obj.HoleMajor = holemajor
|
|
obj.HoleMinor = holeminor
|
|
obj.HoleSpacing = holespacing
|
|
elif precasttype == "I-Beam":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Beam")
|
|
_PrecastIbeam(obj)
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.Chamfer = chamfer
|
|
obj.BeamBase = base
|
|
elif precasttype == "Stairs":
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Stairs")
|
|
_PrecastStairs(obj)
|
|
obj.Length = length
|
|
obj.Width = width
|
|
obj.Height = height
|
|
obj.RiserNumber = risernumber
|
|
obj.DownLength = downlength
|
|
obj.Riser = riser
|
|
obj.Tread = tread
|
|
else:
|
|
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Precast")
|
|
_Precast(obj)
|
|
if FreeCAD.GuiUp:
|
|
_ViewProviderPrecast(obj.ViewObject)
|
|
return obj
|
|
|