FreeCAD

Форк
0
/
ArchPrecast.py 
1498 строк · 58.8 Кб
1
#***************************************************************************
2
#*   Copyright (c) 2016 Yorik van Havre <yorik@uncreated.net>              *
3
#*                                                                         *
4
#*   This program is free software; you can redistribute it and/or modify  *
5
#*   it under the terms of the GNU Lesser General Public License (LGPL)    *
6
#*   as published by the Free Software Foundation; either version 2 of     *
7
#*   the License, or (at your option) any later version.                   *
8
#*   for detail see the LICENCE text file.                                 *
9
#*                                                                         *
10
#*   This program is distributed in the hope that it will be useful,       *
11
#*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12
#*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13
#*   GNU Library General Public License for more details.                  *
14
#*                                                                         *
15
#*   You should have received a copy of the GNU Library General Public     *
16
#*   License along with this program; if not, write to the Free Software   *
17
#*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
18
#*   USA                                                                   *
19
#*                                                                         *
20
#***************************************************************************
21

22
__title__  = "FreeCAD Precast concrete module"
23
__author__ = "Yorik van Havre"
24
__url__    = "https://www.freecad.org"
25

26
"""This module contains tools to build basic precast concrete elements:
27
Beams, pillars, slabs and panels"""
28

29
import ArchCommands,ArchComponent,FreeCAD
30
from FreeCAD import Vector
31
from draftutils import params
32

33
if FreeCAD.GuiUp:
34
    from draftutils.translate import translate
35
    from PySide.QtCore import QT_TRANSLATE_NOOP
36
else:
37
    # \cond
38
    def translate(ctxt,txt):
39
        return txt
40
    def QT_TRANSLATE_NOOP(ctxt,txt):
41
        return txt
42
    # \endcond
43

44
## @package ArchPrecast
45
#  \ingroup ARCH
46
#  \brief Precast options for ArchStructure
47
#
48
#  This module provides additional presets for the Arch Structure
49
#  tool, to build a series of precast concrete elements
50

51
class _Precast(ArchComponent.Component):
52

53
    "The base Precast class"
54

55
    def __init__(self,obj):
56

57
        ArchComponent.Component.__init__(self,obj)
58
        _Precast.setProperties(self,obj)
59

60
    def setProperties(self,obj):
61

62
        pl = obj.PropertiesList
63
        if not "Length" in pl:
64
            obj.addProperty("App::PropertyDistance","Length","Structure",QT_TRANSLATE_NOOP("App::Property","The length of this element"))
65
        if not "Width" in pl:
66
            obj.addProperty("App::PropertyDistance","Width","Structure",QT_TRANSLATE_NOOP("App::Property","The width of this element"))
67
        if not "Height" in pl:
68
            obj.addProperty("App::PropertyDistance","Height","Structure",QT_TRANSLATE_NOOP("App::Property","The height of this element"))
69
        if not "Nodes" in pl:
70
            obj.addProperty("App::PropertyVectorList","Nodes","Structure",QT_TRANSLATE_NOOP("App::Property","The structural nodes of this element"))
71
        self.Type = "Precast"
72

73
    def onDocumentRestored(self,obj):
74

75
        ArchComponent.Component.onDocumentRestored(self,obj)
76
        _Precast.setProperties(self,obj)
77

78
    def execute(self,obj):
79

80
        if self.clone(obj):
81
            return
82

83

84
class _PrecastBeam(_Precast):
85

86
    "The Precast Beam"
87

88
    def __init__(self,obj):
89

90
        _Precast.__init__(self,obj)
91
        self.setProperties(obj)
92
        obj.IfcType = "Beam"
93

94
    def setProperties(self,obj):
95

96
        pl = obj.PropertiesList
97
        if not "Chamfer" in pl:
98
            obj.addProperty("App::PropertyDistance","Chamfer","Beam",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
99
        if not "DentLength" in pl:
100
            obj.addProperty("App::PropertyDistance","DentLength","Beam",QT_TRANSLATE_NOOP("App::Property","The dent length of this element"))
101
        if not "DentHeight" in pl:
102
            obj.addProperty("App::PropertyDistance","DentHeight","Beam",QT_TRANSLATE_NOOP("App::Property","The dent height of this element"))
103
        if not "Dents" in pl:
104
            obj.addProperty("App::PropertyStringList","Dents","Beam",QT_TRANSLATE_NOOP("App::Property","The dents of this element"))
105

106
    def onDocumentRestored(self,obj):
107

108
        _Precast.onDocumentRestored(self,obj)
109
        self.setProperties(obj)
110

111
    def execute(self,obj):
112

113
        if self.clone(obj):
114
            return
115

116
        pl = obj.Placement
117
        length = obj.Length.Value
118
        width = obj.Width.Value
119
        height = obj.Height.Value
120
        chamfer = obj.Chamfer.Value
121
        dentlength = obj.DentLength.Value
122
        dentheight = obj.DentHeight.Value
123
        dents = obj.Dents
124

125
        if length == 0 \
126
                or width == 0 \
127
                or height == 0 \
128
                or chamfer >= width / 2 \
129
                or chamfer >= height / 2:
130
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
131
            return
132

133
        import Part
134
        p = []
135
        if chamfer > 0:
136
            p.append(Vector(0,chamfer,0))
137
            p.append(Vector(0,width-chamfer,0))
138
            p.append(Vector(0,width,chamfer))
139
            p.append(Vector(0,width,height-chamfer))
140
            p.append(Vector(0,width-chamfer,height))
141
            p.append(Vector(0,chamfer,height))
142
            p.append(Vector(0,0,height-chamfer))
143
            p.append(Vector(0,0,chamfer))
144
        else:
145
            p.append(Vector(0,0,0))
146
            p.append(Vector(0,width,0))
147
            p.append(Vector(0,width,height))
148
            p.append(Vector(0,0,height))
149
        p.append(p[0])
150
        p = Part.makePolygon(p)
151
        f = Part.Face(p)
152
        shape = f.extrude(Vector(length,0,0))
153
        if (dentlength > 0) and (dentheight > 0):
154
            p = []
155
            p.append(Vector(0,0,0))
156
            p.append(Vector(dentlength,0,0))
157
            p.append(Vector(dentlength,width,0))
158
            p.append(Vector(0,width,0))
159
            p.append(p[0])
160
            p = Part.makePolygon(p)
161
            f = Part.Face(p)
162
            d1 = f.extrude(Vector(0,0,dentheight))
163
            d2 = d1.copy()
164
            d2.translate(Vector(length-dentlength,0,0))
165
            shape = shape.cut(d1)
166
            shape = shape.cut(d2)
167
        for dent in dents:
168
            dent = dent.split(";")
169
            if len(dent) == 7:
170
                dentlength = float(dent[0])
171
                dentwidth = float(dent[1])
172
                dentheight = float(dent[2])
173
                dentslant = float(dent[3])
174
                dentchamfer = chamfer
175
                dentlevel = float(dent[4])
176
                dentrotation = float(dent[5])
177
                dentoffset = float(dent[6])
178
                if (dentlength == 0) or (dentwidth == 0) or (dentheight == 0):
179
                    continue
180
                if dentslant >= dentheight:
181
                    continue
182
                p = []
183
                p.append(Vector(0-dentchamfer,0,0))
184
                p.append(Vector(dentlength,0,dentslant))
185
                p.append(Vector(dentlength,0,dentheight))
186
                p.append(Vector(0-dentchamfer,0,dentheight))
187
                p.append(p[0])
188
                p = Part.makePolygon(p)
189
                f = Part.Face(p)
190
                dentshape = f.extrude(Vector(0,dentwidth,0))
191
                dentshape.rotate(Vector(0,0,0),Vector(0,0,1),dentrotation)
192
                if dentrotation == 0:
193
                    dentshape.translate(Vector(length,dentoffset,0))
194
                elif dentrotation == 90:
195
                    dentshape.translate(Vector(length-dentoffset,width,0))
196
                elif dentrotation == 180:
197
                    dentshape.translate(Vector(0,width-dentoffset,0))
198
                elif dentrotation == 270:
199
                    dentshape.translate(Vector(dentoffset,0,0))
200
                dentshape.translate(Vector(0,0,dentlevel))
201
                shape = shape.fuse(dentshape)
202
        shape = self.processSubShapes(obj,shape,pl)
203
        self.applyShape(obj,shape,pl)
204

205

206
class _PrecastIbeam(_Precast):
207

208
    "The Precast Ibeam"
209

210
    def __init__(self,obj):
211

212
        _Precast.__init__(self,obj)
213
        self.setProperties(obj)
214
        obj.IfcType = "Beam"
215

216
    def setProperties(self,obj):
217

218
        pl = obj.PropertiesList
219
        if not "Chamfer" in pl:
220
            obj.addProperty("App::PropertyDistance","Chamfer","Beam",QT_TRANSLATE_NOOP("App::Property","The chamfer length of this element"))
221
        if not "BeamBase" in pl:
222
            obj.addProperty("App::PropertyDistance","BeamBase","Beam",QT_TRANSLATE_NOOP("App::Property","The base length of this element"))
223

224
    def onDocumentRestored(self,obj):
225

226
        _Precast.onDocumentRestored(self,obj)
227
        self.setProperties(obj)
228

229
    def execute(self,obj):
230

231
        if self.clone(obj):
232
            return
233

234
        pl = obj.Placement
235
        length = obj.Length.Value
236
        width = obj.Width.Value
237
        height = obj.Height.Value
238
        base = obj.BeamBase.Value
239
        slant = obj.Chamfer.Value
240

241
        if length == 0 \
242
                or width == 0 \
243
                or height == 0 \
244
                or slant * 2 >= width \
245
                or base * 2 + slant * 2 >= height:
246
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
247
            return
248

249
        import Part
250
        p = []
251
        p.append(Vector(0,0,0))
252
        p.append(Vector(0,0,base))
253
        p.append(Vector(0,slant,base+slant))
254
        p.append(Vector(0,slant,height-(base+slant)))
255
        p.append(Vector(0,0,height-base))
256
        p.append(Vector(0,0,height))
257
        p.append(Vector(0,width,height))
258
        p.append(Vector(0,width,height-base))
259
        p.append(Vector(0,width-slant,height-(base+slant)))
260
        p.append(Vector(0,width-slant,base+slant))
261
        p.append(Vector(0,width,base))
262
        p.append(Vector(0,width,0))
263
        p.append(p[0])
264
        p = Part.makePolygon(p)
265
        f = Part.Face(p)
266
        shape = f.extrude(Vector(length,0,0))
267

268
        shape = self.processSubShapes(obj,shape,pl)
269
        self.applyShape(obj,shape,pl)
270

271

272
class _PrecastPillar(_Precast):
273

274
    "The Precast Pillar"
275

276
    def __init__(self,obj):
277

278
        _Precast.__init__(self,obj)
279
        self.setProperties(obj)
280
        obj.IfcType = "Column"
281

282
    def setProperties(self,obj):
283

284
        pl = obj.PropertiesList
285
        if not "Chamfer" in pl:
286
            obj.addProperty("App::PropertyDistance","Chamfer","Column",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
287
        if not "GrooveDepth" in pl:
288
            obj.addProperty("App::PropertyDistance","GrooveDepth","Column",QT_TRANSLATE_NOOP("App::Property","The groove depth of this element"))
289
        if not "GrooveHeight" in pl:
290
            obj.addProperty("App::PropertyDistance","GrooveHeight","Column",QT_TRANSLATE_NOOP("App::Property","The groove height of this element"))
291
        if not "GrooveSpacing" in pl:
292
            obj.addProperty("App::PropertyDistance","GrooveSpacing","Column",QT_TRANSLATE_NOOP("App::Property","The spacing between the grooves of this element"))
293
        if not "GrooveNumber" in pl:
294
            obj.addProperty("App::PropertyInteger","GrooveNumber","Column",QT_TRANSLATE_NOOP("App::Property","The number of grooves of this element"))
295
        if not "Dents" in pl:
296
            obj.addProperty("App::PropertyStringList","Dents","Column",QT_TRANSLATE_NOOP("App::Property","The dents of this element"))
297

298
    def onDocumentRestored(self,obj):
299

300
        _Precast.onDocumentRestored(self,obj)
301
        self.setProperties(obj)
302

303
    def execute(self,obj):
304

305
        if self.clone(obj):
306
            return
307

308
        pl = obj.Placement
309
        length = obj.Length.Value
310
        width = obj.Width.Value
311
        height = obj.Height.Value
312
        chamfer = obj.Chamfer.Value
313
        groovedepth = obj.GrooveDepth.Value
314
        grooveheight = obj.GrooveHeight.Value
315
        spacing = obj.GrooveSpacing.Value
316
        number = obj.GrooveNumber
317
        dents = obj.Dents
318

319
        if length == 0 \
320
                or width == 0 \
321
                or height == 0 \
322
                or chamfer >= width / 2 \
323
                or chamfer >= length / 2:
324
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
325
            return
326

327
        import Part
328
        p = []
329
        if chamfer > 0:
330
            p.append(Vector(chamfer,0,0))
331
            p.append(Vector(length-chamfer,0,0))
332
            p.append(Vector(length,chamfer,0))
333
            p.append(Vector(length,width-chamfer,0))
334
            p.append(Vector(length-chamfer,width,0))
335
            p.append(Vector(chamfer,width,0))
336
            p.append(Vector(0,width-chamfer,0))
337
            p.append(Vector(0,chamfer,0))
338
        else:
339
            p.append(Vector(0,0,0))
340
            p.append(Vector(length,0,0))
341
            p.append(Vector(length,width,0))
342
            p.append(Vector(0,width,0))
343
        p.append(p[0])
344
        p = Part.makePolygon(p)
345
        f = Part.Face(p)
346
        shape = f.extrude(Vector(0,0,height))
347

348
        if (groovedepth > 0) and (grooveheight > 0) and (spacing > 0) and (number > 0) and (groovedepth < length/2) and (groovedepth < width/2):
349
            p1 = []
350
            p1.append(Vector(0,0,0))
351
            p1.append(Vector(length,0,0))
352
            p1.append(Vector(length,width,0))
353
            p1.append(Vector(0,width,0))
354
            p1.append(p1[0])
355
            p1 = Part.makePolygon(p1)
356
            f1 = Part.Face(p1)
357
            groove = f1.extrude(Vector(0,0,grooveheight))
358
            p2 = []
359
            p2.append(Vector(groovedepth,groovedepth,0))
360
            p2.append(Vector(length-groovedepth,groovedepth,0))
361
            p2.append(Vector(length-groovedepth,width-groovedepth,0))
362
            p2.append(Vector(groovedepth,width-groovedepth,0))
363
            p2.append(p2[0])
364
            p2 = Part.makePolygon(p2)
365
            f2 = Part.Face(p2)
366
            s = f2.extrude(Vector(0,0,grooveheight))
367
            groove = groove.cut(s)
368
            for i in range(number):
369
                g = groove.copy()
370
                g.translate(Vector(0,0,spacing + i*(spacing+grooveheight)))
371
                shape = shape.cut(g)
372

373
        for dent in dents:
374
            dent = dent.split(";")
375
            if len(dent) == 7:
376
                dentlength = float(dent[0])
377
                dentwidth = float(dent[1])
378
                dentheight = float(dent[2])
379
                dentslant = float(dent[3])
380
                dentchamfer = chamfer
381
                dentlevel = float(dent[4])
382
                dentrotation = float(dent[5])
383
                dentoffset = float(dent[6])
384
                if (dentlength == 0) or (dentwidth == 0) or (dentheight == 0):
385
                    continue
386
                if dentslant >= dentheight:
387
                    continue
388
                p = []
389
                p.append(Vector(0-dentchamfer,0,0))
390
                p.append(Vector(dentlength,0,dentslant))
391
                p.append(Vector(dentlength,0,dentheight))
392
                p.append(Vector(0-dentchamfer,0,dentheight))
393
                p.append(p[0])
394
                p = Part.makePolygon(p)
395
                f = Part.Face(p)
396
                dentshape = f.extrude(Vector(0,dentwidth,0))
397
                dentshape.rotate(Vector(0,0,0),Vector(0,0,1),dentrotation)
398
                if dentrotation == 0:
399
                    dentshape.translate(Vector(length,dentoffset,0))
400
                elif dentrotation == 90:
401
                    dentshape.translate(Vector(length-dentoffset,width,0))
402
                elif dentrotation == 180:
403
                    dentshape.translate(Vector(0,width-dentoffset,0))
404
                elif dentrotation == 270:
405
                    dentshape.translate(Vector(dentoffset,0,0))
406
                dentshape.translate(Vector(0,0,dentlevel))
407
                shape = shape.fuse(dentshape)
408

409
        shape = self.processSubShapes(obj,shape,pl)
410
        self.applyShape(obj,shape,pl)
411

412

413
class _PrecastPanel(_Precast):
414

415
    "The Precast Panel"
416

417
    def __init__(self,obj):
418

419
        _Precast.__init__(self,obj)
420
        self.setProperties(obj)
421
        obj.IfcType = "Plate"
422

423
    def setProperties(self,obj):
424

425
        pl = obj.PropertiesList
426
        if not "Chamfer" in pl:
427
            obj.addProperty("App::PropertyDistance","Chamfer","Panel",QT_TRANSLATE_NOOP("App::Property","The size of the chamfer of this element"))
428
        if not "DentWidth" in pl:
429
            obj.addProperty("App::PropertyDistance","DentWidth","Panel",QT_TRANSLATE_NOOP("App::Property","The dent width of this element"))
430
        if not "DentHeight" in pl:
431
            obj.addProperty("App::PropertyDistance","DentHeight","Panel",QT_TRANSLATE_NOOP("App::Property","The dent height of this element"))
432

433
    def onDocumentRestored(self,obj):
434

435
        _Precast.onDocumentRestored(self,obj)
436
        self.setProperties(obj)
437

438
    def execute(self,obj):
439

440
        if self.clone(obj):
441
            return
442

443
        pl = obj.Placement
444
        length = obj.Length.Value
445
        width = obj.Width.Value
446
        height = obj.Height.Value
447
        chamfer = obj.Chamfer.Value
448
        dentheight = obj.DentHeight.Value
449
        dentwidth = obj.DentWidth.Value
450

451
        if length == 0 \
452
                or width == 0 \
453
                or height == 0 \
454
                or chamfer + dentwidth >= width \
455
                or dentheight >= height:
456
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
457
            return
458

459
        import Part
460
        p = []
461
        p.append(Vector(0,0,0))
462
        p.append(Vector(length,0,0))
463
        p.append(Vector(length,width,0))
464
        p.append(Vector(0,width,0))
465
        p.append(p[0])
466
        p = Part.makePolygon(p)
467
        f = Part.Face(p)
468
        shape = f.extrude(Vector(0,0,height))
469
        if chamfer > 0:
470
            p = []
471
            p.append(Vector(0,width-chamfer,0))
472
            p.append(Vector(chamfer,width,0))
473
            p.append(Vector(0,width,0))
474
            p.append(p[0])
475
            p = Part.makePolygon(p)
476
            f = Part.Face(p)
477
            s = f.extrude(Vector(0,0,height))
478
            shape = shape.cut(s)
479
            p = []
480
            p.append(Vector(length,width-chamfer,0))
481
            p.append(Vector(length-chamfer,width,0))
482
            p.append(Vector(length,width,0))
483
            p.append(p[0])
484
            p = Part.makePolygon(p)
485
            f = Part.Face(p)
486
            s = f.extrude(Vector(0,0,height))
487
            shape = shape.cut(s)
488
            p = []
489
            p.append(Vector(0,width-chamfer,0))
490
            p.append(Vector(0,width,chamfer))
491
            p.append(Vector(0,width,0))
492
            p.append(p[0])
493
            p = Part.makePolygon(p)
494
            f = Part.Face(p)
495
            s = f.extrude(Vector(length,0,0))
496
            shape = shape.cut(s)
497
            p = []
498
            p.append(Vector(0,width-chamfer,height))
499
            p.append(Vector(0,width,height-chamfer))
500
            p.append(Vector(0,width,height))
501
            p.append(p[0])
502
            p = Part.makePolygon(p)
503
            f = Part.Face(p)
504
            s = f.extrude(Vector(length,0,0))
505
            shape = shape.cut(s)
506
        if (dentheight > 0) and (dentwidth > 0):
507
            p = []
508
            p.append(Vector(0,((width-chamfer)-dentwidth)/2,0))
509
            p.append(Vector(0,((width-chamfer)-dentwidth)/2+dentwidth,0))
510
            p.append(Vector(0,((width-chamfer)-dentwidth)/2+dentwidth,dentheight))
511
            p.append(Vector(0,((width-chamfer)-dentwidth)/2,dentheight))
512
            p.append(p[0])
513
            p = Part.makePolygon(p)
514
            f = Part.Face(p)
515
            s = f.extrude(Vector(length,0,0))
516
            shape = shape.cut(s)
517
            s.translate(Vector(0,0,height))
518
            shape = shape.fuse(s)
519

520
        shape = self.processSubShapes(obj,shape,pl)
521
        self.applyShape(obj,shape,pl)
522

523

524
class _PrecastSlab(_Precast):
525

526
    "The Precast Slab"
527

528
    def __init__(self,obj):
529

530
        _Precast.__init__(self,obj)
531
        self.setProperties(obj)
532
        obj.IfcType = "Slab"
533

534
    def setProperties(self,obj):
535

536
        pl = obj.PropertiesList
537
        if not "SlabType" in pl:
538
            obj.addProperty("App::PropertyEnumeration","SlabType","Slab",QT_TRANSLATE_NOOP("App::Property","The type of this slab"))
539
            obj.SlabType = ["Champagne","Hat"]
540
        if not "SlabBase" in pl:
541
            obj.addProperty("App::PropertyDistance","SlabBase","Slab",QT_TRANSLATE_NOOP("App::Property","The size of the base of this element"))
542
        if not "HoleNumber" in pl:
543
            obj.addProperty("App::PropertyInteger","HoleNumber","Slab",QT_TRANSLATE_NOOP("App::Property","The number of holes in this element"))
544
        if not "HoleMajor" in pl:
545
            obj.addProperty("App::PropertyDistance","HoleMajor","Slab",QT_TRANSLATE_NOOP("App::Property","The major radius of the holes of this element"))
546
        if not "HoleMinor" in pl:
547
            obj.addProperty("App::PropertyDistance","HoleMinor","Slab",QT_TRANSLATE_NOOP("App::Property","The minor radius of the holes of this element"))
548
        if not "HoleSpacing" in pl:
549
            obj.addProperty("App::PropertyDistance","HoleSpacing","Slab",QT_TRANSLATE_NOOP("App::Property","The spacing between the holes of this element"))
550

551
    def onDocumentRestored(self,obj):
552

553
        _Precast.onDocumentRestored(self,obj)
554
        self.setProperties(obj)
555

556
    def execute(self,obj):
557

558
        if self.clone(obj):
559
            return
560

561
        pl = obj.Placement
562
        slabtype = obj.SlabType
563
        length = obj.Length.Value
564
        width = obj.Width.Value
565
        height = obj.Height.Value
566
        base = obj.SlabBase.Value
567
        holenumber = obj.HoleNumber
568
        holemajor = obj.HoleMajor.Value
569
        holeminor = obj.HoleMinor.Value
570
        holespacing = obj.HoleSpacing.Value
571

572
        slant = (height - base) / 3 # this gives the inclination of the vertical walls
573
        if base == 0:
574
            base = min(height / 4, 50)
575
            obj.SlabBase = base
576

577
        if length == 0 \
578
                or width == 0 \
579
                or height == 0 \
580
                or width <= slant * 2 \
581
                or height < base * 2 \
582
                or (holenumber > 0 and (holespacing == 0 or holemajor == 0 or holeminor == 0)) \
583
                or holemajor < holeminor:
584
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
585
            return
586

587
        import Part
588
        p = []
589
        if slabtype == "Champagne":
590
            p.append(Vector(0,0,0))
591
            p.append(Vector(0,slant,height-base))
592
            p.append(Vector(0,0,height-base))
593
            p.append(Vector(0,0,height))
594
            p.append(Vector(0,width,height))
595
            p.append(Vector(0,width,height-base))
596
            p.append(Vector(0,width-slant,height-base))
597
            p.append(Vector(0,width,0))
598
        elif slabtype == "Hat":
599
            p.append(Vector(0,0,0))
600
            p.append(Vector(0,0,base))
601
            p.append(Vector(0,slant,base))
602
            p.append(Vector(0,slant*2,height))
603
            p.append(Vector(0,width-slant*2,height))
604
            p.append(Vector(0,width-slant,base))
605
            p.append(Vector(0,width,base))
606
            p.append(Vector(0,width,0))
607
        else:
608
            return None
609
        p.append(p[0])
610
        p = Part.makePolygon(p)
611
        f = Part.Face(p)
612
        shape = f.extrude(Vector(length,0,0))
613

614
        if holenumber > 0:
615
            holespan = holenumber * holeminor + (holenumber - 1) * holespacing
616
            holestart = (width/2 - holespan/2) + holeminor/2
617
            if holeminor != holemajor:
618
                e = Part.Ellipse(Vector(0,0,0),Vector(0,holeminor/2,0),Vector(0,0,holemajor/2)).toShape()
619
                e.translate(Vector(0,0,-holemajor/2))
620
            else:
621
                e = Part.Circle(Vector(0,0,0),Vector(1,0,0),holemajor/2).toShape()
622
            w = Part.Wire([e])
623
            f = Part.Face(w)
624
            tube = f.extrude(Vector(length,0,0))
625
            for i in range(holenumber):
626
                x = holestart + i*(holeminor+holespacing)
627
                s = tube.copy()
628
                s.translate(Vector(0,x,height/2))
629
                shape = shape.cut(s)
630

631
        shape = self.processSubShapes(obj,shape,pl)
632
        self.applyShape(obj,shape,pl)
633

634

635
class _PrecastStairs(_Precast):
636

637
    "The Precast Stairs"
638

639
    def __init__(self,obj):
640

641
        _Precast.__init__(self,obj)
642
        self.setProperties(obj)
643
        obj.IfcType = "Stair"
644

645
    def setProperties(self,obj):
646

647
        pl = obj.PropertiesList
648
        if not "DownLength" in pl:
649
            obj.addProperty("App::PropertyDistance","DownLength","Stairs",QT_TRANSLATE_NOOP("App::Property","The length of the down floor of this element"))
650
        if not "RiserNumber" in pl:
651
            obj.addProperty("App::PropertyInteger","RiserNumber","Stairs",QT_TRANSLATE_NOOP("App::Property","The number of risers in this element"))
652
        if not "Riser" in pl:
653
            obj.addProperty("App::PropertyDistance","Riser","Stairs",QT_TRANSLATE_NOOP("App::Property","The riser height of this element"))
654
        if not "Tread" in pl:
655
            obj.addProperty("App::PropertyDistance","Tread","Stairs",QT_TRANSLATE_NOOP("App::Property","The tread depth of this element"))
656

657
    def onDocumentRestored(self,obj):
658

659
        _Precast.onDocumentRestored(self,obj)
660
        self.setProperties(obj)
661

662
    def execute(self,obj):
663

664
        if self.clone(obj):
665
            return
666

667
        pl = obj.Placement
668
        length = obj.Length.Value
669
        width = obj.Width.Value
670
        height = obj.Height.Value
671
        downlength = obj.DownLength.Value
672
        steps = obj.RiserNumber
673
        riser = obj.Riser.Value
674
        tread = obj.Tread.Value
675

676
        if width == 0 \
677
                or steps == 0 \
678
                or riser == 0 \
679
                or tread == 0 \
680
                or height == 0:
681
            FreeCAD.Console.PrintWarning(obj.Label + " " + translate("Arch", "has a null shape") + "\n")
682
            return
683

684
        if length < tread:
685
            length = tread # minimum
686

687
        import math,Part
688

689
        p = [Vector(0,0,0)] # relative moves
690
        if downlength:
691
            p.append(Vector(0,downlength,0))
692
        for i in range(steps-1):
693
            p.append(Vector(0,0,riser))
694
            p.append(Vector(0,tread,0))
695
        p.append(Vector(0,0,riser))
696
        p.append(Vector(0,length,0))
697
        ang1 = math.atan(riser/tread)
698
        ang2 = ang1/2
699
        rdist = math.tan(ang2)*height
700
        if length > (tread+rdist):
701
            p.append(Vector(0,0,-height))
702
            p.append(Vector(0,-(length-(tread+rdist))))
703
        else:
704
            rest = length-(tread+rdist)
705
            addh = math.tan(ang1)*rest
706
            p.append(Vector(0,0,-(height+addh)))
707
        # absolutize
708
        r = [p[0]]
709
        for m in p[1:]:
710
            r.append(r[-1].add(m))
711
        p = r
712
        if downlength:
713
            bdist = math.tan(ang1)*height
714
            p.append(Vector(0,downlength+bdist,-height))
715
            p.append(Vector(0,0,-height))
716
        else:
717
            hdist = height*(math.tan(ang1))
718
            p.append(Vector(0,hdist,0))
719
        p.append(p[0])
720
        p = Part.makePolygon(p)
721
        f = Part.Face(p)
722
        shape = f.extrude(Vector(width,0,0))
723

724
        shape = self.processSubShapes(obj,shape,pl)
725
        self.applyShape(obj,shape,pl)
726

727

728
class _ViewProviderPrecast(ArchComponent.ViewProviderComponent):
729

730
    "The View Provider of the Precast object"
731

732
    def __init__(self,vobj):
733

734
        ArchComponent.ViewProviderComponent.__init__(self,vobj)
735
        vobj.ShapeColor = ArchCommands.getDefaultColor("Structure")
736

737
    def getIcon(self):
738

739
        import Arch_rc
740
        if hasattr(self,"Object"):
741
            if self.Object.CloneOf:
742
                return ":/icons/Arch_Structure_Clone.svg"
743
        return ":/icons/Arch_Structure_Tree.svg"
744

745
    def setEdit(self, vobj, mode):
746
        if mode != 0:
747
            return None
748

749
        import FreeCADGui
750
        taskd = ArchComponent.ComponentTaskPanel()
751
        taskd.obj = self.Object
752
        taskd.update()
753
        if hasattr(self.Object,"Dents"):
754
            self.dentd = _DentsTaskPanel()
755
            self.dentd.form.show()
756
            self.dentd.fillDents(self.Object.Dents)
757
            taskd.form = [taskd.form,self.dentd.form]
758
        FreeCADGui.Control.showDialog(taskd)
759
        return True
760

761
    def unsetEdit(self, vobj, mode):
762
        if mode != 0:
763
            return None
764

765
        import FreeCADGui
766
        if hasattr(self,"dentd"):
767
            self.Object.Dents = self.dentd.getValues()
768
            del self.dentd
769
        FreeCADGui.Control.closeDialog()
770
        return True
771

772

773
class _PrecastTaskPanel:
774

775
    '''The TaskPanel for precast creation'''
776

777
    def __init__(self):
778

779
        import FreeCADGui
780
        from PySide import QtCore, QtGui, QtSvgWidgets
781
        self.form = QtGui.QWidget()
782
        self.grid = QtGui.QGridLayout(self.form)
783
        self.PrecastTypes = ["Beam","I-Beam","Pillar","Panel","Slab","Stairs"]
784
        self.SlabTypes = ["Champagne","Hat"]
785

786
        # image display
787
        self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersBeam.svg")
788
        self.preview.setMaximumWidth(200)
789
        self.preview.setMinimumHeight(120)
790
        self.grid.addWidget(self.preview,0,0,1,2)
791

792
        # parameters
793
        self.labelSlabType = QtGui.QLabel()
794
        self.valueSlabType = QtGui.QComboBox()
795
        self.valueSlabType.addItems(self.SlabTypes)
796
        self.valueSlabType.setCurrentIndex(0)
797
        self.grid.addWidget(self.labelSlabType,1,0,1,1)
798
        self.grid.addWidget(self.valueSlabType,1,1,1,1)
799

800
        self.labelChamfer = QtGui.QLabel()
801
        self.valueChamfer = FreeCADGui.UiLoader().createWidget("Gui::InputField")
802
        self.grid.addWidget(self.labelChamfer,2,0,1,1)
803
        self.grid.addWidget(self.valueChamfer,2,1,1,1)
804

805
        self.labelDentLength = QtGui.QLabel()
806
        self.valueDentLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
807
        self.grid.addWidget(self.labelDentLength,3,0,1,1)
808
        self.grid.addWidget(self.valueDentLength,3,1,1,1)
809

810
        self.labelDentWidth = QtGui.QLabel()
811
        self.valueDentWidth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
812
        self.grid.addWidget(self.labelDentWidth,4,0,1,1)
813
        self.grid.addWidget(self.valueDentWidth,4,1,1,1)
814

815
        self.labelDentHeight = QtGui.QLabel()
816
        self.valueDentHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
817
        self.grid.addWidget(self.labelDentHeight,5,0,1,1)
818
        self.grid.addWidget(self.valueDentHeight,5,1,1,1)
819

820
        self.labelBase = QtGui.QLabel()
821
        self.valueBase = FreeCADGui.UiLoader().createWidget("Gui::InputField")
822
        self.grid.addWidget(self.labelBase,6,0,1,1)
823
        self.grid.addWidget(self.valueBase,6,1,1,1)
824

825
        self.labelHoleNumber = QtGui.QLabel()
826
        self.valueHoleNumber = QtGui.QSpinBox()
827
        self.grid.addWidget(self.labelHoleNumber,7,0,1,1)
828
        self.grid.addWidget(self.valueHoleNumber,7,1,1,1)
829

830
        self.labelHoleMajor = QtGui.QLabel()
831
        self.valueHoleMajor = FreeCADGui.UiLoader().createWidget("Gui::InputField")
832
        self.grid.addWidget(self.labelHoleMajor,8,0,1,1)
833
        self.grid.addWidget(self.valueHoleMajor,8,1,1,1)
834

835
        self.labelHoleMinor = QtGui.QLabel()
836
        self.valueHoleMinor = FreeCADGui.UiLoader().createWidget("Gui::InputField")
837
        self.grid.addWidget(self.labelHoleMinor,9,0,1,1)
838
        self.grid.addWidget(self.valueHoleMinor,9,1,1,1)
839

840
        self.labelHoleSpacing = QtGui.QLabel()
841
        self.valueHoleSpacing = FreeCADGui.UiLoader().createWidget("Gui::InputField")
842
        self.grid.addWidget(self.labelHoleSpacing,10,0,1,1)
843
        self.grid.addWidget(self.valueHoleSpacing,10,1,1,1)
844

845
        self.labelGrooveNumber = QtGui.QLabel()
846
        self.valueGrooveNumber = QtGui.QSpinBox()
847
        self.grid.addWidget(self.labelGrooveNumber,11,0,1,1)
848
        self.grid.addWidget(self.valueGrooveNumber,11,1,1,1)
849

850
        self.labelGrooveDepth = QtGui.QLabel()
851
        self.valueGrooveDepth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
852
        self.grid.addWidget(self.labelGrooveDepth,12,0,1,1)
853
        self.grid.addWidget(self.valueGrooveDepth,12,1,1,1)
854

855
        self.labelGrooveHeight = QtGui.QLabel()
856
        self.valueGrooveHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
857
        self.grid.addWidget(self.labelGrooveHeight,13,0,1,1)
858
        self.grid.addWidget(self.valueGrooveHeight,13,1,1,1)
859

860
        self.labelGrooveSpacing = QtGui.QLabel()
861
        self.valueGrooveSpacing = FreeCADGui.UiLoader().createWidget("Gui::InputField")
862
        self.grid.addWidget(self.labelGrooveSpacing,14,0,1,1)
863
        self.grid.addWidget(self.valueGrooveSpacing,14,1,1,1)
864

865
        self.labelRiserNumber = QtGui.QLabel()
866
        self.valueRiserNumber = QtGui.QSpinBox()
867
        self.grid.addWidget(self.labelRiserNumber,15,0,1,1)
868
        self.grid.addWidget(self.valueRiserNumber,15,1,1,1)
869

870
        self.labelDownLength = QtGui.QLabel()
871
        self.valueDownLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
872
        self.grid.addWidget(self.labelDownLength,16,0,1,1)
873
        self.grid.addWidget(self.valueDownLength,16,1,1,1)
874

875
        self.labelRiser = QtGui.QLabel()
876
        self.valueRiser = FreeCADGui.UiLoader().createWidget("Gui::InputField")
877
        self.grid.addWidget(self.labelRiser,17,0,1,1)
878
        self.grid.addWidget(self.valueRiser,17,1,1,1)
879

880
        self.labelTread = QtGui.QLabel()
881
        self.valueTread = FreeCADGui.UiLoader().createWidget("Gui::InputField")
882
        self.grid.addWidget(self.labelTread,18,0,1,1)
883
        self.grid.addWidget(self.valueTread,18,1,1,1)
884

885
        # signals/slots
886
        QtCore.QObject.connect(self.valueChamfer,QtCore.SIGNAL("valueChanged(double)"),self.setChamfer)
887
        QtCore.QObject.connect(self.valueDentLength,QtCore.SIGNAL("valueChanged(double)"),self.setDentLength)
888
        QtCore.QObject.connect(self.valueDentWidth,QtCore.SIGNAL("valueChanged(double)"),self.setDentWidth)
889
        QtCore.QObject.connect(self.valueDentHeight,QtCore.SIGNAL("valueChanged(double)"),self.setDentHeight)
890
        QtCore.QObject.connect(self.valueBase,QtCore.SIGNAL("valueChanged(double)"),self.setBase)
891
        QtCore.QObject.connect(self.valueHoleMajor,QtCore.SIGNAL("valueChanged(double)"),self.setHoleMajor)
892
        QtCore.QObject.connect(self.valueHoleMinor,QtCore.SIGNAL("valueChanged(double)"),self.setHoleMinor)
893
        QtCore.QObject.connect(self.valueHoleSpacing,QtCore.SIGNAL("valueChanged(double)"),self.setHoleSpacing)
894
        QtCore.QObject.connect(self.valueGrooveDepth,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveDepth)
895
        QtCore.QObject.connect(self.valueGrooveHeight,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveHeight)
896
        QtCore.QObject.connect(self.valueGrooveSpacing,QtCore.SIGNAL("valueChanged(double)"),self.setGrooveSpacing)
897
        QtCore.QObject.connect(self.valueDownLength,QtCore.SIGNAL("valueChanged(double)"),self.setDownLength)
898
        QtCore.QObject.connect(self.valueRiser,QtCore.SIGNAL("valueChanged(double)"),self.setRiser)
899
        QtCore.QObject.connect(self.valueTread,QtCore.SIGNAL("valueChanged(double)"),self.setTread)
900

901
        # restore presets
902
        self.restoreValue(self.valueChamfer, params.get_param_arch("PrecastChamfer"))
903
        self.restoreValue(self.valueDentLength, params.get_param_arch("PrecastDentLength"))
904
        self.restoreValue(self.valueDentWidth, params.get_param_arch("PrecastDentWidth"))
905
        self.restoreValue(self.valueDentHeight, params.get_param_arch("PrecastDentHeight"))
906
        self.restoreValue(self.valueBase, params.get_param_arch("PrecastBase"))
907
        self.restoreValue(self.valueHoleMajor, params.get_param_arch("PrecastHoleMajor"))
908
        self.restoreValue(self.valueHoleMinor, params.get_param_arch("PrecastHoleMinor"))
909
        self.restoreValue(self.valueHoleSpacing, params.get_param_arch("PrecastHoleSpacing"))
910
        self.restoreValue(self.valueGrooveDepth, params.get_param_arch("PrecastGrooveDepth"))
911
        self.restoreValue(self.valueGrooveHeight, params.get_param_arch("PrecastGrooveHeight"))
912
        self.restoreValue(self.valueGrooveSpacing, params.get_param_arch("PrecastGrooveSpacing"))
913
        self.restoreValue(self.valueDownLength, params.get_param_arch("PrecastDownLength"))
914
        self.restoreValue(self.valueRiser, params.get_param_arch("PrecastRiser"))
915
        self.restoreValue(self.valueTread, params.get_param_arch("PrecastTread"))
916

917
        self.retranslateUi(self.form)
918
        self.form.hide()
919

920
    def restoreValue(self, widget, val):
921
        widget.setText(FreeCAD.Units.Quantity(val, FreeCAD.Units.Length).UserString)
922

923
    def getValues(self):
924
        d = {}
925
        d["SlabType"] = self.SlabTypes[self.valueSlabType.currentIndex()]
926
        d["Chamfer"] = self.Chamfer
927
        d["DentLength"] = self.DentLength
928
        d["DentWidth"] = self.DentWidth
929
        d["DentHeight"] = self.DentHeight
930
        d["Base"] = self.Base
931
        d["HoleNumber"] = self.valueHoleNumber.value()
932
        d["HoleMajor"] = self.HoleMajor
933
        d["HoleMinor"] = self.HoleMinor
934
        d["HoleSpacing"] = self.HoleSpacing
935
        d["GrooveNumber"] = self.valueGrooveNumber.value()
936
        d["GrooveDepth"] = self.GrooveDepth
937
        d["GrooveHeight"] = self.GrooveHeight
938
        d["GrooveSpacing"] = self.GrooveSpacing
939
        d["RiserNumber"] = self.valueRiserNumber.value()
940
        d["DownLength"] = self.DownLength
941
        d["Riser"] = self.Riser
942
        d["Tread"] = self.Tread
943
        if hasattr(self,"Dents"):
944
            d["Dents"] = self.Dents.getValues()
945
        return d
946

947
    def setChamfer(self,value):
948
        self.Chamfer = value
949
        params.set_param_arch("PrecastChamfer",value)
950

951
    def setDentLength(self,value):
952
        self.DentLength = value
953
        params.set_param_arch("PrecastDentLength",value)
954

955
    def setDentWidth(self,value):
956
        self.DentWidth = value
957
        params.set_param_arch("PrecastDentWidth",value)
958

959
    def setDentHeight(self,value):
960
        self.DentHeight = value
961
        params.set_param_arch("PrecastDentHeight",value)
962

963
    def setBase(self,value):
964
        self.Base = value
965
        params.set_param_arch("PrecastBase",value)
966

967
    def setHoleMajor(self,value):
968
        self.HoleMajor = value
969
        params.set_param_arch("PrecastHoleMajor",value)
970

971
    def setHoleMinor(self,value):
972
        self.HoleMinor = value
973
        params.set_param_arch("PrecastHoleMinor",value)
974

975
    def setHoleSpacing(self,value):
976
        self.HoleSpacing = value
977
        params.set_param_arch("PrecastHoleSpacing",value)
978

979
    def setGrooveDepth(self,value):
980
        self.GrooveDepth = value
981
        params.set_param_arch("PrecastGrooveDepth",value)
982

983
    def setGrooveHeight(self,value):
984
        self.GrooveHeight = value
985
        params.set_param_arch("PrecastGrooveHeight",value)
986

987
    def setGrooveSpacing(self,value):
988
        self.GrooveSpacing = value
989
        params.set_param_arch("PrecastGrooveSpacing",value)
990

991
    def setDownLength(self,value):
992
        self.DownLength = value
993
        params.set_param_arch("PrecastDownLength",value)
994

995
    def setRiser(self,value):
996
        self.Riser = value
997
        params.set_param_arch("PrecastRiser",value)
998

999
    def setTread(self,value):
1000
        self.Tread = value
1001
        params.set_param_arch("PrecastTread",value)
1002

1003
    def retranslateUi(self, dialog):
1004
        from PySide import QtGui
1005
        self.form.setWindowTitle(translate("Arch", "Precast elements"))
1006
        self.labelSlabType.setText(translate("Arch", "Slab type"))
1007
        self.labelChamfer.setText(translate("Arch", "Chamfer"))
1008
        self.labelDentLength.setText(translate("Arch", "Dent length"))
1009
        self.labelDentWidth.setText(translate("Arch", "Dent width"))
1010
        self.labelDentHeight.setText(translate("Arch", "Dent height"))
1011
        self.labelBase.setText(translate("Arch", "Slab base"))
1012
        self.labelHoleNumber.setText(translate("Arch", "Number of holes"))
1013
        self.labelHoleMajor.setText(translate("Arch", "Major diameter of holes"))
1014
        self.labelHoleMinor.setText(translate("Arch", "Minor diameter of holes"))
1015
        self.labelHoleSpacing.setText(translate("Arch", "Spacing between holes"))
1016
        self.labelGrooveNumber.setText(translate("Arch", "Number of grooves"))
1017
        self.labelGrooveDepth.setText(translate("Arch", "Depth of grooves"))
1018
        self.labelGrooveHeight.setText(translate("Arch", "Height of grooves"))
1019
        self.labelGrooveSpacing.setText(translate("Arch", "Spacing between grooves"))
1020
        self.labelRiserNumber.setText(translate("Arch", "Number of risers"))
1021
        self.labelDownLength.setText(translate("Arch", "Length of down floor"))
1022
        self.labelRiser.setText(translate("Arch", "Height of risers"))
1023
        self.labelTread.setText(translate("Arch", "Depth of treads"))
1024

1025
    def setPreset(self,preset):
1026
        self.preview.hide()
1027
        if preset == "Beam":
1028
            self.preview.load(":/ui/ParametersBeam.svg")
1029
            self.labelSlabType.hide()
1030
            self.valueSlabType.hide()
1031
            self.labelChamfer.show()
1032
            self.valueChamfer.show()
1033
            self.labelDentLength.show()
1034
            self.valueDentLength.show()
1035
            self.labelDentWidth.hide()
1036
            self.valueDentWidth.hide()
1037
            self.labelDentHeight.show()
1038
            self.valueDentHeight.show()
1039
            self.labelBase.hide()
1040
            self.valueBase.hide()
1041
            self.labelHoleNumber.hide()
1042
            self.valueHoleNumber.hide()
1043
            self.labelHoleMajor.hide()
1044
            self.valueHoleMajor.hide()
1045
            self.labelHoleMinor.hide()
1046
            self.valueHoleMinor.hide()
1047
            self.labelHoleSpacing.hide()
1048
            self.valueHoleSpacing.hide()
1049
            self.labelGrooveNumber.hide()
1050
            self.valueGrooveNumber.hide()
1051
            self.labelGrooveDepth.hide()
1052
            self.valueGrooveDepth.hide()
1053
            self.labelGrooveHeight.hide()
1054
            self.valueGrooveHeight.hide()
1055
            self.labelGrooveSpacing.hide()
1056
            self.valueGrooveSpacing.hide()
1057
            self.valueHoleSpacing.hide()
1058
            self.labelRiserNumber.hide()
1059
            self.valueRiserNumber.hide()
1060
            self.labelDownLength.hide()
1061
            self.valueDownLength.hide()
1062
            self.labelRiser.hide()
1063
            self.valueRiser.hide()
1064
            self.labelTread.hide()
1065
            self.valueTread.hide()
1066
        elif preset == "Pillar":
1067
            self.preview.load(":/ui/ParametersPillar.svg")
1068
            self.labelSlabType.hide()
1069
            self.valueSlabType.hide()
1070
            self.labelChamfer.show()
1071
            self.valueChamfer.show()
1072
            self.labelDentLength.hide()
1073
            self.valueDentLength.hide()
1074
            self.labelDentWidth.hide()
1075
            self.valueDentWidth.hide()
1076
            self.labelDentHeight.hide()
1077
            self.valueDentHeight.hide()
1078
            self.labelBase.hide()
1079
            self.valueBase.hide()
1080
            self.labelHoleNumber.hide()
1081
            self.valueHoleNumber.hide()
1082
            self.labelHoleMajor.hide()
1083
            self.valueHoleMajor.hide()
1084
            self.labelHoleMinor.hide()
1085
            self.valueHoleMinor.hide()
1086
            self.labelHoleSpacing.hide()
1087
            self.valueHoleSpacing.hide()
1088
            self.labelGrooveNumber.show()
1089
            self.valueGrooveNumber.show()
1090
            self.labelGrooveDepth.show()
1091
            self.valueGrooveDepth.show()
1092
            self.labelGrooveHeight.show()
1093
            self.valueGrooveHeight.show()
1094
            self.labelGrooveSpacing.show()
1095
            self.valueGrooveSpacing.show()
1096
            self.labelRiserNumber.hide()
1097
            self.valueRiserNumber.hide()
1098
            self.labelDownLength.hide()
1099
            self.valueDownLength.hide()
1100
            self.labelRiser.hide()
1101
            self.valueRiser.hide()
1102
            self.labelTread.hide()
1103
            self.valueTread.hide()
1104
        elif preset == "Panel":
1105
            self.preview.load(":/ui/ParametersPanel.svg")
1106
            self.labelSlabType.hide()
1107
            self.valueSlabType.hide()
1108
            self.labelChamfer.show()
1109
            self.valueChamfer.show()
1110
            self.labelDentLength.hide()
1111
            self.valueDentLength.hide()
1112
            self.labelDentWidth.show()
1113
            self.valueDentWidth.show()
1114
            self.labelDentHeight.show()
1115
            self.valueDentHeight.show()
1116
            self.labelBase.hide()
1117
            self.valueBase.hide()
1118
            self.labelHoleNumber.hide()
1119
            self.valueHoleNumber.hide()
1120
            self.labelHoleMajor.hide()
1121
            self.valueHoleMajor.hide()
1122
            self.labelHoleMinor.hide()
1123
            self.valueHoleMinor.hide()
1124
            self.labelHoleSpacing.hide()
1125
            self.valueHoleSpacing.hide()
1126
            self.labelGrooveNumber.hide()
1127
            self.valueGrooveNumber.hide()
1128
            self.labelGrooveDepth.hide()
1129
            self.valueGrooveDepth.hide()
1130
            self.labelGrooveHeight.hide()
1131
            self.valueGrooveHeight.hide()
1132
            self.labelGrooveSpacing.hide()
1133
            self.valueGrooveSpacing.hide()
1134
            self.labelRiserNumber.hide()
1135
            self.valueRiserNumber.hide()
1136
            self.labelDownLength.hide()
1137
            self.valueDownLength.hide()
1138
            self.labelRiser.hide()
1139
            self.valueRiser.hide()
1140
            self.labelTread.hide()
1141
            self.valueTread.hide()
1142
        elif preset == "Slab":
1143
            self.preview.load(":/ui/ParametersSlab.svg")
1144
            self.labelSlabType.show()
1145
            self.valueSlabType.show()
1146
            self.labelChamfer.hide()
1147
            self.valueChamfer.hide()
1148
            self.labelDentLength.hide()
1149
            self.valueDentLength.hide()
1150
            self.labelDentWidth.hide()
1151
            self.valueDentWidth.hide()
1152
            self.labelDentHeight.hide()
1153
            self.valueDentHeight.hide()
1154
            self.labelBase.show()
1155
            self.valueBase.show()
1156
            self.labelHoleNumber.show()
1157
            self.valueHoleNumber.show()
1158
            self.labelHoleMajor.show()
1159
            self.valueHoleMajor.show()
1160
            self.labelHoleMinor.show()
1161
            self.valueHoleMinor.show()
1162
            self.labelHoleSpacing.show()
1163
            self.valueHoleSpacing.show()
1164
            self.labelGrooveNumber.hide()
1165
            self.valueGrooveNumber.hide()
1166
            self.labelGrooveDepth.hide()
1167
            self.valueGrooveDepth.hide()
1168
            self.labelGrooveHeight.hide()
1169
            self.valueGrooveHeight.hide()
1170
            self.labelGrooveSpacing.hide()
1171
            self.valueGrooveSpacing.hide()
1172
            self.labelRiserNumber.hide()
1173
            self.valueRiserNumber.hide()
1174
            self.labelDownLength.hide()
1175
            self.valueDownLength.hide()
1176
            self.labelRiser.hide()
1177
            self.valueRiser.hide()
1178
            self.labelTread.hide()
1179
            self.valueTread.hide()
1180
        elif preset == "I-Beam":
1181
            self.preview.load(":/ui/ParametersIbeam.svg")
1182
            self.labelSlabType.hide()
1183
            self.valueSlabType.hide()
1184
            self.labelChamfer.show()
1185
            self.valueChamfer.show()
1186
            self.labelDentLength.hide()
1187
            self.valueDentLength.hide()
1188
            self.labelDentWidth.hide()
1189
            self.valueDentWidth.hide()
1190
            self.labelDentHeight.hide()
1191
            self.valueDentHeight.hide()
1192
            self.labelBase.show()
1193
            self.valueBase.show()
1194
            self.labelHoleNumber.hide()
1195
            self.valueHoleNumber.hide()
1196
            self.labelHoleMajor.hide()
1197
            self.valueHoleMajor.hide()
1198
            self.labelHoleMinor.hide()
1199
            self.valueHoleMinor.hide()
1200
            self.labelHoleSpacing.hide()
1201
            self.valueHoleSpacing.hide()
1202
            self.labelGrooveNumber.hide()
1203
            self.valueGrooveNumber.hide()
1204
            self.labelGrooveDepth.hide()
1205
            self.valueGrooveDepth.hide()
1206
            self.labelGrooveHeight.hide()
1207
            self.valueGrooveHeight.hide()
1208
            self.labelGrooveSpacing.hide()
1209
            self.valueGrooveSpacing.hide()
1210
            self.labelRiserNumber.hide()
1211
            self.valueRiserNumber.hide()
1212
            self.labelDownLength.hide()
1213
            self.valueDownLength.hide()
1214
            self.labelRiser.hide()
1215
            self.valueRiser.hide()
1216
            self.labelTread.hide()
1217
            self.valueTread.hide()
1218
        elif preset == "Stairs":
1219
            self.preview.load(":/ui/ParametersStairs.svg")
1220
            self.labelSlabType.hide()
1221
            self.valueSlabType.hide()
1222
            self.labelChamfer.hide()
1223
            self.valueChamfer.hide()
1224
            self.labelDentLength.hide()
1225
            self.valueDentLength.hide()
1226
            self.labelDentWidth.hide()
1227
            self.valueDentWidth.hide()
1228
            self.labelDentHeight.hide()
1229
            self.valueDentHeight.hide()
1230
            self.labelBase.hide()
1231
            self.valueBase.hide()
1232
            self.labelHoleNumber.hide()
1233
            self.valueHoleNumber.hide()
1234
            self.labelHoleMajor.hide()
1235
            self.valueHoleMajor.hide()
1236
            self.labelHoleMinor.hide()
1237
            self.valueHoleMinor.hide()
1238
            self.labelHoleSpacing.hide()
1239
            self.valueHoleSpacing.hide()
1240
            self.labelGrooveNumber.hide()
1241
            self.valueGrooveNumber.hide()
1242
            self.labelGrooveDepth.hide()
1243
            self.valueGrooveDepth.hide()
1244
            self.labelGrooveHeight.hide()
1245
            self.valueGrooveHeight.hide()
1246
            self.labelGrooveSpacing.hide()
1247
            self.valueGrooveSpacing.hide()
1248
            self.labelRiserNumber.show()
1249
            self.valueRiserNumber.show()
1250
            self.labelDownLength.show()
1251
            self.valueDownLength.show()
1252
            self.labelRiser.show()
1253
            self.valueRiser.show()
1254
            self.labelTread.show()
1255
            self.valueTread.show()
1256
        self.preview.show()
1257

1258

1259
class _DentsTaskPanel:
1260

1261
    '''The TaskPanel for dent creation'''
1262

1263
    def __init__(self):
1264

1265
        import FreeCADGui
1266
        from PySide import QtCore, QtGui, QtSvgWidgets
1267
        self.form = QtGui.QWidget()
1268
        self.grid = QtGui.QGridLayout(self.form)
1269
        self.Rotations = ["N","S","E","O"]
1270
        self.RotationAngles = [90,270,0,180]
1271

1272
        # dents list
1273
        self.labelDents = QtGui.QLabel()
1274
        self.listDents = QtGui.QListWidget()
1275
        self.grid.addWidget(self.labelDents,0,0,1,2)
1276
        self.grid.addWidget(self.listDents,1,0,1,2)
1277

1278
        # buttons
1279
        self.buttonAdd = QtGui.QPushButton()
1280
        self.buttonRemove = QtGui.QPushButton()
1281
        self.grid.addWidget(self.buttonAdd,2,0,1,1)
1282
        self.grid.addWidget(self.buttonRemove,2,1,1,1)
1283

1284
        # image display
1285
        self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersDent.svg")
1286
        self.preview.setMaximumWidth(200)
1287
        self.preview.setMinimumHeight(120)
1288
        self.grid.addWidget(self.preview,3,0,1,2)
1289

1290
        # parameters
1291
        self.labelLength = QtGui.QLabel()
1292
        self.valueLength = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1293
        self.grid.addWidget(self.labelLength,4,0,1,1)
1294
        self.grid.addWidget(self.valueLength,4,1,1,1)
1295

1296
        self.labelWidth = QtGui.QLabel()
1297
        self.valueWidth = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1298
        self.grid.addWidget(self.labelWidth,5,0,1,1)
1299
        self.grid.addWidget(self.valueWidth,5,1,1,1)
1300

1301
        self.labelHeight = QtGui.QLabel()
1302
        self.valueHeight = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1303
        self.grid.addWidget(self.labelHeight,6,0,1,1)
1304
        self.grid.addWidget(self.valueHeight,6,1,1,1)
1305

1306
        self.labelSlant = QtGui.QLabel()
1307
        self.valueSlant = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1308
        self.grid.addWidget(self.labelSlant,7,0,1,1)
1309
        self.grid.addWidget(self.valueSlant,7,1,1,1)
1310

1311
        self.labelLevel = QtGui.QLabel()
1312
        self.valueLevel = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1313
        self.grid.addWidget(self.labelLevel,8,0,1,1)
1314
        self.grid.addWidget(self.valueLevel,8,1,1,1)
1315

1316
        self.labelRotation = QtGui.QLabel()
1317
        self.valueRotation = QtGui.QComboBox()
1318
        self.valueRotation.addItems(self.Rotations)
1319
        self.valueRotation.setCurrentIndex(0)
1320
        self.grid.addWidget(self.labelRotation,9,0,1,1)
1321
        self.grid.addWidget(self.valueRotation,9,1,1,1)
1322

1323
        self.labelOffset = QtGui.QLabel()
1324
        self.valueOffset = FreeCADGui.UiLoader().createWidget("Gui::InputField")
1325
        self.grid.addWidget(self.labelOffset,10,0,1,1)
1326
        self.grid.addWidget(self.valueOffset,10,1,1,1)
1327

1328
        # signals/slots
1329
        QtCore.QObject.connect(self.valueLength,QtCore.SIGNAL("valueChanged(double)"),self.setLength)
1330
        QtCore.QObject.connect(self.valueWidth,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
1331
        QtCore.QObject.connect(self.valueHeight,QtCore.SIGNAL("valueChanged(double)"),self.setHeight)
1332
        QtCore.QObject.connect(self.valueSlant,QtCore.SIGNAL("valueChanged(double)"),self.setSlant)
1333
        QtCore.QObject.connect(self.valueLevel,QtCore.SIGNAL("valueChanged(double)"),self.setLevel)
1334
        QtCore.QObject.connect(self.valueRotation,QtCore.SIGNAL("currentIndexChanged(int)"),self.setDent)
1335
        QtCore.QObject.connect(self.valueOffset,QtCore.SIGNAL("valueChanged(double)"),self.setOffset)
1336
        QtCore.QObject.connect(self.buttonAdd,QtCore.SIGNAL("clicked()"),self.addDent)
1337
        QtCore.QObject.connect(self.buttonRemove,QtCore.SIGNAL("clicked()"),self.removeDent)
1338
        QtCore.QObject.connect(self.listDents,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.editDent)
1339
        self.retranslateUi(self.form)
1340
        self.form.hide()
1341

1342
    def setLength(self,value):
1343
        self.Length = value
1344
        self.setDent()
1345

1346
    def setWidth(self,value):
1347
        self.Width = value
1348
        self.setDent()
1349

1350
    def setHeight(self,value):
1351
        self.Height = value
1352
        self.setDent()
1353

1354
    def setSlant(self,value):
1355
        self.Slant = value
1356
        self.setDent()
1357

1358
    def setLevel(self,value):
1359
        self.Level = value
1360
        self.setDent()
1361

1362
    def setOffset(self,value):
1363
        self.Offset = value
1364
        self.setDent()
1365

1366
    def fillDents(self,dents):
1367
        self.listDents.clear()
1368
        i = 1
1369
        for d in dents:
1370
            s = "Dent "+str(i)+" :"+d
1371
            self.listDents.addItem(s)
1372
            i += 1
1373

1374
    def setDent(self,i=0):
1375
        if self.listDents.currentItem():
1376
            num = str(self.listDents.currentRow()+1)
1377
            rot = self.RotationAngles[self.valueRotation.currentIndex()]
1378
            s = "Dent "+num+" :"+str(self.Length)+";"+str(self.Width)+";"+str(self.Height)+";"+str(self.Slant)+";"+str(self.Level)+";"+str(rot)+";"+str(self.Offset)
1379
            self.listDents.currentItem().setText(s)
1380

1381
    def addDent(self):
1382
        num = str(self.listDents.count()+1)
1383
        rot = self.RotationAngles[self.valueRotation.currentIndex()]
1384
        s = "Dent "+num+" :"+str(self.Length)+";"+str(self.Width)+";"+str(self.Height)+";"+str(self.Slant)+";"+str(self.Level)+";"+str(rot)+";"+str(self.Offset)
1385
        self.listDents.addItem(s)
1386
        self.listDents.setCurrentRow(self.listDents.count()-1)
1387
        self.editDent()
1388

1389
    def removeDent(self):
1390
        if self.listDents.currentItem():
1391
            self.listDents.takeItem(self.listDents.currentRow())
1392

1393
    def editDent(self,item=None):
1394
        if self.listDents.currentItem():
1395
            s = self.listDents.currentItem().text()
1396
            s = s.split(":")[1]
1397
            s = s.split(";")
1398
            self.valueLength.setText(FreeCAD.Units.Quantity(float(s[0]),FreeCAD.Units.Length).UserString)
1399
            self.valueWidth.setText(FreeCAD.Units.Quantity(float(s[1]),FreeCAD.Units.Length).UserString)
1400
            self.valueHeight.setText(FreeCAD.Units.Quantity(float(s[2]),FreeCAD.Units.Length).UserString)
1401
            self.valueSlant.setText(FreeCAD.Units.Quantity(float(s[3]),FreeCAD.Units.Length).UserString)
1402
            self.valueLevel.setText(FreeCAD.Units.Quantity(float(s[4]),FreeCAD.Units.Length).UserString)
1403
            self.valueRotation.setCurrentIndex(self.RotationAngles.index(int(s[5])))
1404
            self.valueOffset.setText(FreeCAD.Units.Quantity(float(s[6]),FreeCAD.Units.Length).UserString)
1405

1406
    def retranslateUi(self, dialog):
1407
        from PySide import QtGui
1408
        self.form.setWindowTitle(translate("Arch", "Precast options"))
1409
        self.labelDents.setText(translate("Arch", "Dents list"))
1410
        self.buttonAdd.setText(translate("Arch", "Add dent"))
1411
        self.buttonRemove.setText(translate("Arch", "Remove dent"))
1412
        self.labelLength.setText(translate("Arch", "Length"))
1413
        self.labelWidth.setText(translate("Arch", "Width"))
1414
        self.labelHeight.setText(translate("Arch", "Height"))
1415
        self.labelSlant.setText(translate("Arch", "Slant"))
1416
        self.labelLevel.setText(translate("Arch", "Level"))
1417
        self.labelRotation.setText(translate("Arch", "Rotation"))
1418
        self.labelOffset.setText(translate("Arch", "Offset"))
1419

1420
    def getValues(self):
1421
        l = []
1422
        for i in range(self.listDents.count()):
1423
            s = self.listDents.item(i).text()
1424
            l.append(s.split(":")[1])
1425
        return l
1426

1427

1428
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):
1429

1430
    "Creates one of the precast objects in the current document"
1431

1432
    if precasttype == "Beam":
1433
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Beam")
1434
        _PrecastBeam(obj)
1435
        obj.Length = length
1436
        obj.Width = width
1437
        obj.Height = height
1438
        obj.Chamfer = chamfer
1439
        obj.Dents = dents
1440
        obj.DentLength = dentlength
1441
        obj.DentHeight = dentheight
1442
    elif precasttype == "Pillar":
1443
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Pillar")
1444
        _PrecastPillar(obj)
1445
        obj.Length = length
1446
        obj.Width = width
1447
        obj.Height = height
1448
        obj.Chamfer = chamfer
1449
        obj.Dents = dents
1450
        obj.GrooveNumber = groovenumber
1451
        obj.GrooveDepth = groovedepth
1452
        obj.GrooveHeight = grooveheight
1453
        obj.GrooveSpacing = groovespacing
1454
    elif precasttype == "Panel":
1455
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Panel")
1456
        _PrecastPanel(obj)
1457
        obj.Length = length
1458
        obj.Width = width
1459
        obj.Height = height
1460
        obj.Chamfer = chamfer
1461
        obj.DentWidth = dentwidth
1462
        obj.DentHeight = dentheight
1463
    elif precasttype == "Slab":
1464
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Slab")
1465
        _PrecastSlab(obj)
1466
        obj.SlabType = slabtype
1467
        obj.Length = length
1468
        obj.Width = width
1469
        obj.Height = height
1470
        obj.SlabBase = base
1471
        obj.HoleNumber = holenumber
1472
        obj.HoleMajor = holemajor
1473
        obj.HoleMinor = holeminor
1474
        obj.HoleSpacing = holespacing
1475
    elif precasttype == "I-Beam":
1476
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Beam")
1477
        _PrecastIbeam(obj)
1478
        obj.Length = length
1479
        obj.Width = width
1480
        obj.Height = height
1481
        obj.Chamfer = chamfer
1482
        obj.BeamBase = base
1483
    elif precasttype == "Stairs":
1484
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Stairs")
1485
        _PrecastStairs(obj)
1486
        obj.Length = length
1487
        obj.Width = width
1488
        obj.Height = height
1489
        obj.RiserNumber = risernumber
1490
        obj.DownLength = downlength
1491
        obj.Riser = riser
1492
        obj.Tread = tread
1493
    else:
1494
        obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Precast")
1495
        _Precast(obj)
1496
    if FreeCAD.GuiUp:
1497
        _ViewProviderPrecast(obj.ViewObject)
1498
    return obj
1499

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.