| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | __title__ = "FreeCAD Precast concrete module" |
| | __author__ = "Yorik van Havre" |
| | __url__ = "https://www.freecad.org" |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | """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: |
| | |
| | def translate(ctxt, txt): |
| | return txt |
| |
|
| | def QT_TRANSLATE_NOOP(ctxt, txt): |
| | return txt |
| |
|
| | |
| |
|
| |
|
| | 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 |
| | 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 |
| |
|
| | import math |
| | import Part |
| |
|
| | p = [Vector(0, 0, 0)] |
| | 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))) |
| | |
| | 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"] |
| |
|
| | |
| | self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersBeam.svg") |
| | self.preview.setMaximumWidth(200) |
| | self.preview.setMinimumHeight(120) |
| | self.grid.addWidget(self.preview, 0, 0, 1, 2) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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.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] |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersDent.svg") |
| | self.preview.setMaximumWidth(200) |
| | self.preview.setMinimumHeight(120) |
| | self.grid.addWidget(self.preview, 3, 0, 1, 2) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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 |
| |
|