FreeCAD

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

23
"""The BIM workbench"""
24

25
import os
26
import FreeCAD
27
import FreeCADGui
28
import Arch_rc
29

30
class BIMWorkbench(Workbench):
31

32
    def __init__(self):
33

34
        def QT_TRANSLATE_NOOP(context, text):
35
            return text
36

37
        bdir = os.path.join(FreeCAD.getResourceDir(), "Mod", "BIM")
38
        tt = QT_TRANSLATE_NOOP("BIM","The BIM workbench is used to model buildings")
39
        self.__class__.MenuText = QT_TRANSLATE_NOOP("BIM", "BIM")
40
        self.__class__.ToolTip =  tt
41
        self.__class__.Icon = os.path.join(bdir,"Resources", "icons",
42
                                                "BIMWorkbench.svg")
43

44
    def Initialize(self):
45

46
        # add translations and icon paths
47
        FreeCADGui.addIconPath(":/icons")
48
        FreeCADGui.addLanguagePath(":/translations")
49

50
        # Create menus and toolbars
51
        self.createTools()
52

53
        # Load Arch & Draft preference pages
54
        self.loadPreferences()
55

56
        Log("Loading BIM module... done\n")
57
        FreeCADGui.updateLocale()
58

59

60
    def createTools(self):
61

62
        "Create tolbars and menus"
63

64
        def QT_TRANSLATE_NOOP(context, text):
65
            return text
66

67
        # Import Draft & BIM commands
68
        import DraftTools
69
        import bimcommands
70
        from nativeifc import ifc_commands
71

72
        # build menus and toolbars
73
        self.draftingtools = [
74
            "BIM_Sketch",
75
            "Draft_Line",
76
            "Draft_Wire",
77
            "Draft_Circle",
78
            "Draft_Arc",
79
            "Draft_Arc_3Points",
80
            "Draft_Fillet",
81
            "Draft_Ellipse",
82
            "Draft_Polygon",
83
            "Draft_Rectangle",
84
            "Draft_BSpline",
85
            "Draft_BezCurve",
86
            "Draft_CubicBezCurve",
87
            "Draft_Point",
88
        ]
89

90
        self.annotationtools = [
91
            "BIM_Text",
92
            "Draft_ShapeString",
93
            "BIM_DimensionAligned",
94
            "BIM_DimensionHorizontal",
95
            "BIM_DimensionVertical",
96
            "BIM_Leader",
97
            "Draft_Label",
98
            "Arch_Axis",
99
            "Arch_AxisSystem",
100
            "Arch_Grid",
101
            "Arch_SectionPlane",
102
            "Draft_Hatch",
103
            "BIM_TDPage",
104
            "BIM_TDView",
105
            "BIM_Shape2DView",
106
        ]
107

108
        self.bimtools = [
109
            "BIM_Project",
110
            "Arch_Site",
111
            "Arch_Building",
112
            "Arch_Level",
113
            "Arch_Space",
114
            "Separator",
115
            "Arch_Wall",
116
            "Arch_CurtainWall",
117
            "BIM_Column",
118
            "BIM_Beam",
119
            "BIM_Slab",
120
            "BIM_Door",
121
            "Arch_Window",
122
            "Arch_Pipe",
123
            "Arch_PipeConnector",
124
            "Arch_Stairs",
125
            "Arch_Roof",
126
            "Arch_Panel",
127
            "Arch_Frame",
128
            "Arch_Fence",
129
            "Arch_Truss",
130
            "Arch_Equipment",
131
            "Arch_Rebar",
132
        ]
133

134
        self.generictools = [
135
            "Arch_Profile",
136
            "BIM_Box",
137
            "BIM_Builder",
138
            "Draft_Facebinder",
139
            "BIM_Library",
140
            "Arch_Component",
141
            "Arch_Reference",
142
        ]
143

144
        self.modify_gen = [
145
            "Draft_Move",
146
            "BIM_Copy",
147
            "Draft_Rotate",
148
            "BIM_Clone",
149
            "BIM_SimpleCopy",
150
            "BIM_Compound",
151
        ]
152
        self.modify_2d = [
153
            "Draft_Offset",
154
            "BIM_Offset2D",
155
            "Draft_Trimex",
156
            "Draft_Join",
157
            "Draft_Split",
158
            "Draft_Scale",
159
            "Draft_Stretch",
160
            "Draft_Draft2Sketch",
161
        ]
162
        self.modify_obj = [
163
            "Draft_Upgrade",
164
            "Draft_Downgrade",
165
            "Arch_Add",
166
            "Arch_Remove",
167
        ]
168
        self.modify_3d = [
169
            "Draft_OrthoArray",
170
            "Draft_PathArray",
171
            "Draft_PolarArray",
172
            "Draft_PointArray",
173
            "Arch_CutPlane",
174
            "Draft_Mirror",
175
            "BIM_Extrude",
176
            "BIM_Cut",
177
            "BIM_Fuse",
178
            "BIM_Common",
179
        ]
180

181
        sep = ["Separator"]
182
        self.modify = self.modify_gen + sep + self.modify_2d + sep + self.modify_obj + sep + self.modify_3d
183

184
        self.manage = [
185
            "BIM_Setup",
186
            "BIM_Views",
187
            "BIM_ProjectManager",
188
            "BIM_Windows",
189
            "BIM_IfcElements",
190
            "BIM_IfcQuantities",
191
            "BIM_IfcProperties",
192
            "BIM_Classification",
193
            "BIM_Layers",
194
            "BIM_Material",
195
            "Arch_Schedule",
196
            "BIM_Preflight",
197
            "Draft_AnnotationStyleEditor",
198
        ]
199

200
        self.utils = [
201
            "BIM_TogglePanels",
202
            "BIM_Trash",
203
            "BIM_WPView",
204
            "Draft_SelectGroup",
205
            "Draft_Slope",
206
            "Draft_WorkingPlaneProxy",
207
            "Draft_AddConstruction",
208
            "Arch_SplitMesh",
209
            "Arch_MeshToShape",
210
            "Arch_SelectNonSolidMeshes",
211
            "Arch_RemoveShape",
212
            "Arch_CloseHoles",
213
            "Arch_MergeWalls",
214
            "Arch_Check",
215
            "Arch_ToggleIfcBrepFlag",
216
            "Arch_ToggleSubs",
217
            "Arch_Survey",
218
            "BIM_Diff",
219
            "BIM_IfcExplorer",
220
            "Arch_IfcSpreadsheet",
221
            "BIM_ImagePlane",
222
            "BIM_Unclone",
223
            "BIM_Rewire",
224
            "BIM_Glue",
225
            "BIM_Reextrude",
226
            "Arch_PanelTools",
227
            "Arch_StructureTools",
228
        ]
229

230
        nudge = [
231
            "BIM_Nudge_Switch",
232
            "BIM_Nudge_Up",
233
            "BIM_Nudge_Down",
234
            "BIM_Nudge_Left",
235
            "BIM_Nudge_Right",
236
            "BIM_Nudge_RotateLeft",
237
            "BIM_Nudge_RotateRight",
238
            "BIM_Nudge_Extend",
239
            "BIM_Nudge_Shrink",
240
        ]
241

242
        # append BIM snaps
243

244
        from draftutils import init_tools
245
        self.snapbar = init_tools.get_draft_snap_commands()
246
        self.snapmenu = self.snapbar + [
247
            "BIM_SetWPTop",
248
            "BIM_SetWPFront",
249
            "BIM_SetWPSide",
250
        ]
251

252
        # create generic tools command
253

254
        class BIM_GenericTools:
255
            def __init__(self, tools):
256
                self.tools = tools
257
            def GetCommands(self):
258
                return self.tools
259
            def GetResources(self):
260
                t = QT_TRANSLATE_NOOP("BIM_GenericTools", "Generic 3D tools")
261
                return { "MenuText": t, "ToolTip": t, "Icon": "BIM_Box"}
262
            def IsActive(self):
263
                v = hasattr(FreeCADGui.getMainWindow().getActiveWindow(), "getSceneGraph")
264
                return v
265
        FreeCADGui.addCommand("BIM_GenericTools", BIM_GenericTools(self.generictools))
266
        self.bimtools.append("BIM_GenericTools")
267

268
        # load rebar tools (Reinforcement addon)
269

270
        try:
271
            import RebarTools
272
        except ImportError:
273
            pass
274
        else:
275
            # create popup group for Rebar tools
276
            class RebarGroupCommand:
277
                def GetCommands(self):
278
                    return tuple(["Arch_Rebar"] + RebarTools.RebarCommands)
279

280
                def GetResources(self):
281
                    return {
282
                        "MenuText": QT_TRANSLATE_NOOP(
283
                            "Arch_RebarTools", "Reinforcement tools"
284
                        ),
285
                        "ToolTip": QT_TRANSLATE_NOOP(
286
                            "Arch_RebarTools", "Reinforcement tools"
287
                        ),
288
                        "Icon": "Arch_Rebar",
289
                    }
290

291
                def IsActive(self):
292
                    v = hasattr(FreeCADGui.getMainWindow().getActiveWindow(), "getSceneGraph")
293
                    return v
294

295
            FreeCADGui.addCommand("Arch_RebarTools", RebarGroupCommand())
296
            self.bimtools[self.bimtools.index("Arch_Rebar")] = "Arch_RebarTools"
297
            RebarTools.load_translations()
298
            Log("Load Reinforcement Module...done\n")
299
            if hasattr(RebarTools, "updateLocale"):
300
                RebarTools.updateLocale()
301
            #self.rebar = RebarTools.RebarCommands + ["Arch_Rebar"]
302

303
        # load Reporting
304

305
        try:
306
            import report
307
        except ImportError:
308
            pass
309
        else:
310
            if "Report_Create" in Gui.listCommands():
311
                self.manage[self.manage.index("Arch_Schedule")] = "Report_Create"
312

313
        # load webtools
314

315
        try:
316
            import BIMServer, Git, Sketchfab
317
        except ImportError:
318
            pass
319
        else:
320
            self.utils.extend(
321
                [
322
                    "WebTools_Git",
323
                    "WebTools_BimServer",
324
                    "WebTools_Sketchfab",
325
                ]
326
            )
327

328
        # load flamingo
329

330
        try:
331
            import CommandsPolar, CommandsFrame, CommandsPipe
332
        except ImportError:
333
            flamingo = None
334
        else:
335
            flamingo = [
336
                "frameIt",
337
                "fillFrame",
338
                "insertPath",
339
                "insertSection",
340
                "FrameLineManager",
341
                "spinSect",
342
                "reverseBeam",
343
                "shiftBeam",
344
                "pivotBeam",
345
                "levelBeam",
346
                "alignEdge",
347
                "rotJoin",
348
                "alignFlange",
349
                "stretchBeam",
350
                "extend",
351
                "adjustFrameAngle",
352
                "insertPipe",
353
                "insertElbow",
354
                "insertReduct",
355
                "insertCap",
356
                "insertFlange",
357
                "insertUbolt",
358
                "insertPypeLine",
359
                "breakPipe",
360
                "mateEdges",
361
                "extend2intersection",
362
                "extend1intersection",
363
                "laydown",
364
                "raiseup",
365
            ]
366

367
        # load fasteners
368

369
        try:
370
            import FastenerBase, FastenersCmd
371
        except ImportError:
372
            fasteners = None
373
        else:
374
            fasteners = [
375
                c
376
                for c in FastenerBase.FSGetCommands("screws")
377
                if not isinstance(c, tuple)
378
            ]
379

380
        # load nativeifc tools
381

382
        ifctools = ifc_commands.get_commands()
383

384
        # create toolbars
385

386
        t1 = QT_TRANSLATE_NOOP("Workbench", "Drafting tools")
387
        t2 = QT_TRANSLATE_NOOP("Workbench", "Draft snap")
388
        t3 = QT_TRANSLATE_NOOP("Workbench", "3D/BIM tools")
389
        t4 = QT_TRANSLATE_NOOP("Workbench", "Annotation tools")
390
        t5 = QT_TRANSLATE_NOOP("Workbench", "2D modification tools")
391
        t6 = QT_TRANSLATE_NOOP("Workbench", "Manage tools")
392
        t7 = QT_TRANSLATE_NOOP("Workbench", "General modification tools")
393
        t8 = QT_TRANSLATE_NOOP("Workbench", "Object modification tools")
394
        t9 = QT_TRANSLATE_NOOP("Workbench", "3D modification tools")
395
        self.appendToolbar(t1, self.draftingtools)
396
        self.appendToolbar(t2, self.snapbar)
397
        self.appendToolbar(t3, self.bimtools)
398
        self.appendToolbar(t4, self.annotationtools)
399
        self.appendToolbar(t7, self.modify_gen)
400
        self.appendToolbar(t5, self.modify_2d)
401
        self.appendToolbar(t8, self.modify_obj)
402
        self.appendToolbar(t9, self.modify_3d)
403
        self.appendToolbar(t6, self.manage)
404

405
        # create menus
406

407
        t1 =  QT_TRANSLATE_NOOP("Workbench", "&2D Drafting")
408
        t2 =  QT_TRANSLATE_NOOP("Workbench", "&3D/BIM")
409
        t3 =  QT_TRANSLATE_NOOP("Workbench", "Reinforcement tools")
410
        t4 =  QT_TRANSLATE_NOOP("Workbench", "&Annotation")
411
        t5 =  QT_TRANSLATE_NOOP("Workbench", "&Snapping")
412
        t6 =  QT_TRANSLATE_NOOP("Workbench", "&Modify")
413
        t7 =  QT_TRANSLATE_NOOP("Workbench", "&Manage")
414
        #t8 =  QT_TRANSLATE_NOOP("Workbench", "&IFC")
415
        t9 =  QT_TRANSLATE_NOOP("Workbench", "&Flamingo")
416
        t10 = QT_TRANSLATE_NOOP("Workbench", "&Fasteners")
417
        t11 = QT_TRANSLATE_NOOP("Workbench", "&Utils")
418
        t12 = QT_TRANSLATE_NOOP("Workbench", "Nudge")
419

420
        #self.bimtools_menu = list(self.bimtools)
421
        #if "Arch_RebarTools" in self.bimtools_menu:
422
        #    self.bimtools_menu.remove("Arch_RebarTools")
423
        self.appendMenu(t1, self.draftingtools)
424
        self.appendMenu(t2, self.bimtools)
425
        #if self.rebar:
426
        #    self.appendMenu([t2, t3], self.rebar)
427
        self.appendMenu(t4, self.annotationtools)
428
        self.appendMenu(t5, self.snapmenu)
429
        self.appendMenu(t6, self.modify)
430
        self.appendMenu(t7, self.manage)
431
        #if ifctools:
432
        #    self.appendMenu(t8, ifctools)
433
        if flamingo:
434
            self.appendMenu(t9, flamingo)
435
        if fasteners:
436
            self.appendMenu(t10, fasteners)
437
        self.appendMenu(t11, self.utils + ifctools)
438
        self.appendMenu([t11, t12], nudge)
439

440
    def loadPreferences(self):
441

442
        """Set up preferences pages"""
443

444
        def QT_TRANSLATE_NOOP(context, text):
445
            return text
446

447
        t1 = QT_TRANSLATE_NOOP("QObject", "BIM")
448
        t2 = QT_TRANSLATE_NOOP("QObject", "Draft")
449
        FreeCADGui.addPreferencePage(":/ui/preferences-arch.ui", t1)
450
        FreeCADGui.addPreferencePage(":/ui/preferences-archdefaults.ui", t1)
451
        FreeCADGui.addPreferencePage(":/ui/preferencesNativeIFC.ui", t1)
452
        if hasattr(FreeCADGui, "draftToolBar"):
453
            if hasattr(FreeCADGui.draftToolBar, "loadedPreferences"):
454
                return
455
        from draftutils import params
456
        params._param_observer_start()
457
        FreeCADGui.addPreferencePage(":/ui/preferences-draft.ui", t2)
458
        FreeCADGui.addPreferencePage(":/ui/preferences-draftinterface.ui", t2)
459
        FreeCADGui.addPreferencePage(":/ui/preferences-draftsnap.ui", t2)
460
        FreeCADGui.addPreferencePage(":/ui/preferences-draftvisual.ui", t2)
461
        FreeCADGui.addPreferencePage(":/ui/preferences-drafttexts.ui", t2)
462
        FreeCADGui.draftToolBar.loadedPreferences = True
463

464
    def setupMultipleObjectSelection(self):
465

466
        import BimSelect
467

468
        if hasattr(FreeCADGui, "addDocumentObserver") and not hasattr(
469
            self, "BimSelectObserver"
470
        ):
471
            self.BimSelectObserver = BimSelect.Setup()
472
            FreeCADGui.addDocumentObserver(self.BimSelectObserver)
473

474
    def Activated(self):
475

476
        import WorkingPlane
477
        from DraftGui import todo
478
        import BimStatus
479
        from nativeifc import ifc_observer
480
        from draftutils import grid_observer
481

482
        PARAMS = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM")
483

484
        if hasattr(FreeCADGui, "draftToolBar"):
485
            FreeCADGui.draftToolBar.Activated()
486
        if hasattr(FreeCADGui, "Snapper"):
487
            FreeCADGui.Snapper.show()
488
        WorkingPlane._view_observer_start()
489
        grid_observer._view_observer_setup()
490

491
        if PARAMS.GetBool("FirstTime", True) and (not hasattr(FreeCAD, "TestEnvironment")):
492
            todo.delay(FreeCADGui.runCommand, "BIM_Welcome")
493
        todo.delay(BimStatus.setStatusIcons, True)
494
        FreeCADGui.Control.clearTaskWatcher()
495

496
        class BimWatcher:
497
            def __init__(self, cmds, name, invert=False):
498
                self.commands = cmds
499
                self.title = name
500
                self.invert = invert
501

502
            def shouldShow(self):
503
                if self.invert:
504
                    return (FreeCAD.ActiveDocument != None) and (
505
                        FreeCADGui.Selection.getSelection() != []
506
                    )
507
                else:
508
                    return (FreeCAD.ActiveDocument != None) and (
509
                        not FreeCADGui.Selection.getSelection()
510
                    )
511

512
        FreeCADGui.Control.addTaskWatcher(
513
            [
514
                BimWatcher(self.draftingtools + self.annotationtools, "2D geometry"),
515
                BimWatcher(self.bimtools, "3D/BIM geometry"),
516
                BimWatcher(self.modify, "Modify", invert=True),
517
            ]
518
        )
519

520
        # restore views widget if needed
521
        if PARAMS.GetBool("RestoreBimViews", True):
522
            from bimcommands import BimViews
523

524
            w = BimViews.findWidget()
525
            if not w:
526
                FreeCADGui.runCommand("BIM_Views")
527
            else:
528
                w.show()
529
                w.toggleViewAction().setVisible(True)
530

531
        self.setupMultipleObjectSelection()
532

533
        # add NativeIFC document observer
534
        ifc_observer.add_observer()
535

536
        # adding a Help menu manipulator
537
        # https://github.com/FreeCAD/FreeCAD/pull/10933
538
        class BIM_WBManipulator:
539
            def modifyMenuBar(self):
540
                return [
541
                    {"insert": "BIM_Examples", "menuItem": "Std_ReportBug", "after": ""},
542
                    {"insert": "BIM_Tutorial", "menuItem": "Std_ReportBug", "after": ""},
543
                    {"insert": "BIM_Help", "menuItem": "Std_ReportBug", "after": ""},
544
                    {"insert": "BIM_Welcome", "menuItem": "Std_ReportBug", "after": ""},
545
                ]
546
        if not hasattr(Gui, "BIM_WBManipulator"):
547
            Gui.BIM_WBManipulator = BIM_WBManipulator()
548
        Gui.addWorkbenchManipulator(Gui.BIM_WBManipulator)
549

550
        Log("BIM workbench activated\n")
551

552

553
    def Deactivated(self):
554

555
        from DraftGui import todo
556
        import BimStatus
557
        from bimcommands import BimViews
558
        import WorkingPlane
559
        from nativeifc import ifc_observer
560
        from draftutils import grid_observer
561

562
        PARAMS = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM")
563

564
        if hasattr(self, "BimSelectObserver"):
565
            FreeCADGui.removeDocumentObserver(self.BimSelectObserver)
566
            del self.BimSelectObserver
567

568
        if hasattr(FreeCADGui, "draftToolBar"):
569
            FreeCADGui.draftToolBar.Deactivated()
570
        if hasattr(FreeCADGui, "Snapper"):
571
            FreeCADGui.Snapper.hide()
572
        WorkingPlane._view_observer_stop()
573
        grid_observer._view_observer_setup()
574

575
        # print("Deactivating status icon")
576
        todo.delay(BimStatus.setStatusIcons, False)
577
        FreeCADGui.Control.clearTaskWatcher()
578

579
        # store views widget state and vertical size
580
        w = BimViews.findWidget()
581
        if w:
582
            PARAMS.SetBool("RestoreBimViews", w.isVisible())
583
            PARAMS.SetInt("BimViewsSize", w.height())
584
            w.hide()
585
            w.toggleViewAction().setVisible(False)
586

587
        # add NativeIFC document observer
588
        ifc_observer.remove_observer()
589

590
        # Ifc stuff
591
        try:
592
            from nativeifc import ifc_status
593
            ifc_status.toggle_lock(False)
594
        except:
595
            pass
596

597
        # remove manipulator
598
        if hasattr(Gui, "BIM_WBManipulator"):
599
            Gui.removeWorkbenchManipulator(Gui.BIM_WBManipulator)
600
            del Gui.BIM_WBManipulator
601
            Gui.activeWorkbench().reloadActive()
602

603
        Log("BIM workbench deactivated\n")
604

605

606
    def ContextMenu(self, recipient):
607

608
        import DraftTools
609
        translate = FreeCAD.Qt.translate
610

611
        if recipient == "Tree":
612
            groups = False
613
            ungroupable = False
614
            for o in FreeCADGui.Selection.getSelection():
615
                if o.isDerivedFrom("App::DocumentObjectGroup") or o.hasExtension(
616
                    "App::GroupExtension"
617
                ):
618
                    groups = True
619
                else:
620
                    groups = False
621
                    break
622
            for o in FreeCADGui.Selection.getSelection():
623
                for parent in o.InList:
624
                    if parent.isDerivedFrom(
625
                        "App::DocumentObjectGroup"
626
                    ) or parent.hasExtension("App::GroupExtension"):
627
                        if o in parent.Group:
628
                            ungroupable = True
629
                        else:
630
                            ungroupable = False
631
                            break
632
            if groups:
633
                self.appendContextMenu("", ["Draft_SelectGroup"])
634
            if ungroupable:
635
                self.appendContextMenu("", ["BIM_Ungroup"])
636
            if (len(FreeCADGui.Selection.getSelection()) == 1) and (
637
                FreeCADGui.Selection.getSelection()[0].Name == "Trash"
638
            ):
639
                self.appendContextMenu("", ["BIM_EmptyTrash"])
640
        elif recipient == "View":
641
            self.appendContextMenu(translate("BIM", "Snapping"), self.snapmenu)
642
        if FreeCADGui.Selection.getSelection():
643
            if FreeCADGui.Selection.getSelection()[0].Name != "Trash":
644
                self.appendContextMenu("", ["BIM_Trash"])
645
            self.appendContextMenu("", ["Draft_AddConstruction", "Draft_AddToGroup"])
646
            allclones = False
647
            for obj in FreeCADGui.Selection.getSelection():
648
                if hasattr(obj, "CloneOf") and obj.CloneOf:
649
                    allclones = True
650
                else:
651
                    allclones = False
652
                    break
653
            if allclones:
654
                self.appendContextMenu("", ["BIM_ResetCloneColors"])
655
            if len(FreeCADGui.Selection.getSelection()) == 1:
656
                obj = FreeCADGui.Selection.getSelection()[0]
657
                if hasattr(obj, "Group"):
658
                    if obj.getTypeIdOfProperty("Group") == "App::PropertyLinkList":
659
                        self.appendContextMenu("", ["BIM_Reorder"])
660
                if obj.isDerivedFrom("TechDraw::DrawView"):
661
                    self.appendContextMenu("", ["BIM_MoveView"])
662

663
    def GetClassName(self):
664
        return "Gui::PythonWorkbench"
665

666

667
FreeCADGui.addWorkbench(BIMWorkbench)
668

669
# Preference pages for importing and exporting various file formats
670
# are independent of the loading of the workbench and can be loaded at startup
671

672
def QT_TRANSLATE_NOOP(context, text):
673
    return text
674
t = QT_TRANSLATE_NOOP("QObject", "Import-Export")
675
FreeCADGui.addPreferencePage(":/ui/preferences-ifc.ui", t)
676
FreeCADGui.addPreferencePage(":/ui/preferences-ifc-export.ui", t)
677
FreeCADGui.addPreferencePage(":/ui/preferences-dae.ui", t)
678

679
# Add unit tests
680
FreeCAD.__unit_test__ += ["TestArch"]
681
# The NativeIFC tests require internet connection and file download
682
# FreeCAD.__unit_test__ += ["nativeifc.ifc_selftest"]
683

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

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

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

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