FreeCAD / src /Mod /BIM /ArchPrecast.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
# SPDX-License-Identifier: LGPL-2.1-or-later
# ***************************************************************************
# * *
# * Copyright (c) 2016 Yorik van Havre <yorik@uncreated.net> *
# * *
# * This file is part of FreeCAD. *
# * *
# * FreeCAD is free software: you can redistribute it and/or modify it *
# * under the terms of the GNU Lesser General Public License as *
# * published by the Free Software Foundation, either version 2.1 of the *
# * License, or (at your option) any later version. *
# * *
# * FreeCAD 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 *
# * Lesser General Public License for more details. *
# * *
# * You should have received a copy of the GNU Lesser General Public *
# * License along with FreeCAD. If not, see *
# * <https://www.gnu.org/licenses/>. *
# * *
# ***************************************************************************
__title__ = "FreeCAD Precast concrete module"
__author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
## @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
"""This module contains tools to build basic precast concrete elements:
Beams, pillars, slabs and panels"""
import FreeCAD
import ArchCommands
import ArchComponent
from FreeCAD import Vector
from draftutils import params
if FreeCAD.GuiUp:
from PySide.QtCore import QT_TRANSLATE_NOOP
from draftutils.translate import translate
else:
# \cond
def translate(ctxt, txt):
return txt
def QT_TRANSLATE_NOOP(ctxt, txt):
return txt
# \endcond
class _Precast(ArchComponent.Component):
"The base Precast class"
def __init__(self, obj):
ArchComponent.Component.__init__(self, obj)
self.Type = "Precast"
_Precast.setProperties(self, obj)
def setProperties(self, obj):
pl = obj.PropertiesList
if not "Length" in pl:
obj.addProperty(
"App::PropertyDistance",
"Length",
"Structure",
QT_TRANSLATE_NOOP("App::Property", "The length of this element"),
locked=True,
)
if not "Width" in pl:
obj.addProperty(
"App::PropertyDistance",
"Width",
"Structure",
QT_TRANSLATE_NOOP("App::Property", "The width of this element"),
locked=True,
)
if not "Height" in pl:
obj.addProperty(
"App::PropertyDistance",
"Height",
"Structure",
QT_TRANSLATE_NOOP("App::Property", "The height of this element"),
locked=True,
)
if not "Nodes" in pl:
obj.addProperty(
"App::PropertyVectorList",
"Nodes",
"Structure",
QT_TRANSLATE_NOOP("App::Property", "The structural nodes of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
ArchComponent.Component.onDocumentRestored(self, obj)
_Precast.setProperties(self, obj)
def loads(self, state):
self.Type = "Precast"
def execute(self, obj):
if self.clone(obj):
return
class _PrecastBeam(_Precast):
"The Precast Beam"
def __init__(self, obj):
_Precast.__init__(self, obj)
self.setProperties(obj)
obj.IfcType = "Beam"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "Chamfer" in pl:
obj.addProperty(
"App::PropertyDistance",
"Chamfer",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The size of the chamfer of this element"),
locked=True,
)
if not "DentLength" in pl:
obj.addProperty(
"App::PropertyDistance",
"DentLength",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The dent length of this element"),
locked=True,
)
if not "DentHeight" in pl:
obj.addProperty(
"App::PropertyDistance",
"DentHeight",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The dent height of this element"),
locked=True,
)
if not "Dents" in pl:
obj.addProperty(
"App::PropertyStringList",
"Dents",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The dents of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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
or chamfer >= width / 2
or chamfer >= height / 2
):
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
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)
self.setProperties(obj)
obj.IfcType = "Beam"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "Chamfer" in pl:
obj.addProperty(
"App::PropertyDistance",
"Chamfer",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The chamfer length of this element"),
locked=True,
)
if not "BeamBase" in pl:
obj.addProperty(
"App::PropertyDistance",
"BeamBase",
"Beam",
QT_TRANSLATE_NOOP("App::Property", "The base length of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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
or slant * 2 >= width
or base * 2 + slant * 2 >= height
):
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
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)
self.setProperties(obj)
obj.IfcType = "Column"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "Chamfer" in pl:
obj.addProperty(
"App::PropertyDistance",
"Chamfer",
"Column",
QT_TRANSLATE_NOOP("App::Property", "The size of the chamfer of this element"),
locked=True,
)
if not "GrooveDepth" in pl:
obj.addProperty(
"App::PropertyDistance",
"GrooveDepth",
"Column",
QT_TRANSLATE_NOOP("App::Property", "The groove depth of this element"),
locked=True,
)
if not "GrooveHeight" in pl:
obj.addProperty(
"App::PropertyDistance",
"GrooveHeight",
"Column",
QT_TRANSLATE_NOOP("App::Property", "The groove height of this element"),
locked=True,
)
if not "GrooveSpacing" in pl:
obj.addProperty(
"App::PropertyDistance",
"GrooveSpacing",
"Column",
QT_TRANSLATE_NOOP(
"App::Property", "The spacing between the grooves of this element"
),
locked=True,
)
if not "GrooveNumber" in pl:
obj.addProperty(
"App::PropertyInteger",
"GrooveNumber",
"Column",
QT_TRANSLATE_NOOP("App::Property", "The number of grooves of this element"),
locked=True,
)
if not "Dents" in pl:
obj.addProperty(
"App::PropertyStringList",
"Dents",
"Column",
QT_TRANSLATE_NOOP("App::Property", "The dents of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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
or chamfer >= width / 2
or chamfer >= length / 2
):
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
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)
self.setProperties(obj)
obj.IfcType = "Plate"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "Chamfer" in pl:
obj.addProperty(
"App::PropertyDistance",
"Chamfer",
"Panel",
QT_TRANSLATE_NOOP("App::Property", "The size of the chamfer of this element"),
locked=True,
)
if not "DentWidth" in pl:
obj.addProperty(
"App::PropertyDistance",
"DentWidth",
"Panel",
QT_TRANSLATE_NOOP("App::Property", "The dent width of this element"),
locked=True,
)
if not "DentHeight" in pl:
obj.addProperty(
"App::PropertyDistance",
"DentHeight",
"Panel",
QT_TRANSLATE_NOOP("App::Property", "The dent height of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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
or chamfer + dentwidth >= width
or dentheight >= height
):
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
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)
self.setProperties(obj)
obj.IfcType = "Slab"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "SlabType" in pl:
obj.addProperty(
"App::PropertyEnumeration",
"SlabType",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The type of this slab"),
locked=True,
)
obj.SlabType = ["Champagne", "Hat"]
if not "SlabBase" in pl:
obj.addProperty(
"App::PropertyDistance",
"SlabBase",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The size of the base of this element"),
locked=True,
)
if not "HoleNumber" in pl:
obj.addProperty(
"App::PropertyInteger",
"HoleNumber",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The number of holes in this element"),
locked=True,
)
if not "HoleMajor" in pl:
obj.addProperty(
"App::PropertyDistance",
"HoleMajor",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The major radius of the holes of this element"),
locked=True,
)
if not "HoleMinor" in pl:
obj.addProperty(
"App::PropertyDistance",
"HoleMinor",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The minor radius of the holes of this element"),
locked=True,
)
if not "HoleSpacing" in pl:
obj.addProperty(
"App::PropertyDistance",
"HoleSpacing",
"Slab",
QT_TRANSLATE_NOOP("App::Property", "The spacing between the holes of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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 base == 0:
base = min(height / 4, 50)
obj.SlabBase = base
if (
length == 0
or width == 0
or height == 0
or width <= slant * 2
or height < base * 2
or (holenumber > 0 and (holespacing == 0 or holemajor == 0 or holeminor == 0))
or holemajor < holeminor
):
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
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)
self.setProperties(obj)
obj.IfcType = "Stair"
def setProperties(self, obj):
pl = obj.PropertiesList
if not "DownLength" in pl:
obj.addProperty(
"App::PropertyDistance",
"DownLength",
"Stairs",
QT_TRANSLATE_NOOP("App::Property", "The length of the down floor of this element"),
locked=True,
)
if not "RiserNumber" in pl:
obj.addProperty(
"App::PropertyInteger",
"RiserNumber",
"Stairs",
QT_TRANSLATE_NOOP("App::Property", "The number of risers in this element"),
locked=True,
)
if not "Riser" in pl:
obj.addProperty(
"App::PropertyDistance",
"Riser",
"Stairs",
QT_TRANSLATE_NOOP("App::Property", "The riser height of this element"),
locked=True,
)
if not "Tread" in pl:
obj.addProperty(
"App::PropertyDistance",
"Tread",
"Stairs",
QT_TRANSLATE_NOOP("App::Property", "The tread depth of this element"),
locked=True,
)
def onDocumentRestored(self, obj):
_Precast.onDocumentRestored(self, obj)
self.setProperties(obj)
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 width == 0 or steps == 0 or riser == 0 or tread == 0 or height == 0:
FreeCAD.Console.PrintWarning(
obj.Label + " " + translate("Arch", "has a null shape") + "\n"
)
return
if length < tread:
length = tread # minimum
import math
import 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:
return None
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
def unsetEdit(self, vobj, mode):
if mode != 0:
return None
import FreeCADGui
if hasattr(self, "dentd"):
self.Object.Dents = self.dentd.getValues()
del self.dentd
FreeCADGui.Control.closeDialog()
return True
class _PrecastTaskPanel:
"""The TaskPanel for precast creation"""
def __init__(self):
import FreeCADGui
from PySide import QtCore, QtGui, QtSvgWidgets
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 = QtSvgWidgets.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
)
# restore presets
self.restoreValue(self.valueChamfer, params.get_param_arch("PrecastChamfer"))
self.restoreValue(self.valueDentLength, params.get_param_arch("PrecastDentLength"))
self.restoreValue(self.valueDentWidth, params.get_param_arch("PrecastDentWidth"))
self.restoreValue(self.valueDentHeight, params.get_param_arch("PrecastDentHeight"))
self.restoreValue(self.valueBase, params.get_param_arch("PrecastBase"))
self.restoreValue(self.valueHoleMajor, params.get_param_arch("PrecastHoleMajor"))
self.restoreValue(self.valueHoleMinor, params.get_param_arch("PrecastHoleMinor"))
self.restoreValue(self.valueHoleSpacing, params.get_param_arch("PrecastHoleSpacing"))
self.restoreValue(self.valueGrooveDepth, params.get_param_arch("PrecastGrooveDepth"))
self.restoreValue(self.valueGrooveHeight, params.get_param_arch("PrecastGrooveHeight"))
self.restoreValue(self.valueGrooveSpacing, params.get_param_arch("PrecastGrooveSpacing"))
self.restoreValue(self.valueDownLength, params.get_param_arch("PrecastDownLength"))
self.restoreValue(self.valueRiser, params.get_param_arch("PrecastRiser"))
self.restoreValue(self.valueTread, params.get_param_arch("PrecastTread"))
self.retranslateUi(self.form)
self.form.hide()
def restoreValue(self, widget, val):
widget.setText(FreeCAD.Units.Quantity(val, FreeCAD.Units.Length).UserString)
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
params.set_param_arch("PrecastChamfer", value)
def setDentLength(self, value):
self.DentLength = value
params.set_param_arch("PrecastDentLength", value)
def setDentWidth(self, value):
self.DentWidth = value
params.set_param_arch("PrecastDentWidth", value)
def setDentHeight(self, value):
self.DentHeight = value
params.set_param_arch("PrecastDentHeight", value)
def setBase(self, value):
self.Base = value
params.set_param_arch("PrecastBase", value)
def setHoleMajor(self, value):
self.HoleMajor = value
params.set_param_arch("PrecastHoleMajor", value)
def setHoleMinor(self, value):
self.HoleMinor = value
params.set_param_arch("PrecastHoleMinor", value)
def setHoleSpacing(self, value):
self.HoleSpacing = value
params.set_param_arch("PrecastHoleSpacing", value)
def setGrooveDepth(self, value):
self.GrooveDepth = value
params.set_param_arch("PrecastGrooveDepth", value)
def setGrooveHeight(self, value):
self.GrooveHeight = value
params.set_param_arch("PrecastGrooveHeight", value)
def setGrooveSpacing(self, value):
self.GrooveSpacing = value
params.set_param_arch("PrecastGrooveSpacing", value)
def setDownLength(self, value):
self.DownLength = value
params.set_param_arch("PrecastDownLength", value)
def setRiser(self, value):
self.Riser = value
params.set_param_arch("PrecastRiser", value)
def setTread(self, value):
self.Tread = value
params.set_param_arch("PrecastTread", value)
def retranslateUi(self, dialog):
from PySide import QtGui
self.form.setWindowTitle(translate("Arch", "Precast elements"))
self.labelSlabType.setText(translate("Arch", "Slab type"))
self.labelChamfer.setText(translate("Arch", "Chamfer"))
self.labelDentLength.setText(translate("Arch", "Dent length"))
self.labelDentWidth.setText(translate("Arch", "Dent width"))
self.labelDentHeight.setText(translate("Arch", "Dent height"))
self.labelBase.setText(translate("Arch", "Slab base"))
self.labelHoleNumber.setText(translate("Arch", "Number of holes"))
self.labelHoleMajor.setText(translate("Arch", "Major diameter of holes"))
self.labelHoleMinor.setText(translate("Arch", "Minor diameter of holes"))
self.labelHoleSpacing.setText(translate("Arch", "Spacing between holes"))
self.labelGrooveNumber.setText(translate("Arch", "Number of grooves"))
self.labelGrooveDepth.setText(translate("Arch", "Depth of grooves"))
self.labelGrooveHeight.setText(translate("Arch", "Height of grooves"))
self.labelGrooveSpacing.setText(translate("Arch", "Spacing between grooves"))
self.labelRiserNumber.setText(translate("Arch", "Number of risers"))
self.labelDownLength.setText(translate("Arch", "Length of down floor"))
self.labelRiser.setText(translate("Arch", "Height of risers"))
self.labelTread.setText(translate("Arch", "Depth of treads"))
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, QtSvgWidgets
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 = QtSvgWidgets.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(translate("Arch", "Precast options"))
self.labelDents.setText(translate("Arch", "Dents list"))
self.buttonAdd.setText(translate("Arch", "Add dent"))
self.buttonRemove.setText(translate("Arch", "Remove dent"))
self.labelLength.setText(translate("Arch", "Length"))
self.labelWidth.setText(translate("Arch", "Width"))
self.labelHeight.setText(translate("Arch", "Height"))
self.labelSlant.setText(translate("Arch", "Slant"))
self.labelLevel.setText(translate("Arch", "Level"))
self.labelRotation.setText(translate("Arch", "Rotation"))
self.labelOffset.setText(translate("Arch", "Offset"))
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