| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| __title__ = "FreeCAD Building" |
| __author__ = "Yorik van Havre" |
| __url__ = "https://www.freecad.org" |
|
|
| |
| |
| |
| |
| |
| |
|
|
| import FreeCAD |
| import ArchCommands |
| import ArchFloor |
| import Draft |
|
|
| from draftutils import params |
|
|
| if FreeCAD.GuiUp: |
| from PySide import QtCore |
| from PySide.QtCore import QT_TRANSLATE_NOOP |
| import FreeCADGui |
| from draftutils.translate import translate |
| else: |
| |
| def translate(ctxt, txt): |
| return txt |
|
|
| def QT_TRANSLATE_NOOP(ctxt, txt): |
| return txt |
|
|
| |
|
|
|
|
| |
| BuildingTypes = ['Undefined', |
| 'Agricultural - Barn', |
| 'Agricultural - Chicken coop or chickenhouse', |
| 'Agricultural - Cow-shed', |
| 'Agricultural - Farmhouse', |
| 'Agricultural - Granary', |
| 'Agricultural - Greenhouse', |
| 'Agricultural - Hayloft', |
| 'Agricultural - Pigpen or sty', |
| 'Agricultural - Root cellar', |
| 'Agricultural - Shed', |
| 'Agricultural - Silo', |
| 'Agricultural - Stable', |
| 'Agricultural - Storm cellar', |
| 'Agricultural - Well house', |
| 'Agricultural - Underground pit', |
|
|
| 'Commercial - Automobile repair shop', |
| 'Commercial - Bank', |
| 'Commercial - Car wash', |
| 'Commercial - Convention center', |
| 'Commercial - Forum', |
| 'Commercial - Gas station', |
| 'Commercial - Hotel', |
| 'Commercial - Market', |
| 'Commercial - Market house', |
| 'Commercial - Skyscraper', |
| 'Commercial - Shop', |
| 'Commercial - Shopping mall', |
| 'Commercial - Supermarket', |
| 'Commercial - Warehouse', |
| 'Commercial - Restaurant', |
|
|
| 'Residential - Apartment block', |
| 'Residential - Asylum', |
| 'Residential - Condominium', |
| 'Residential - Dormitory', |
| 'Residential - Duplex', |
| 'Residential - House', |
| 'Residential - Nursing home', |
| 'Residential - Townhouse', |
| 'Residential - Villa', |
| 'Residential - Bungalow', |
|
|
| 'Educational - Archive', |
| 'Educational - College classroom building', |
| 'Educational - College gymnasium', |
| 'Educational - College students union', |
| 'Educational - School', |
| 'Educational - Library', |
| 'Educational - Museum', |
| 'Educational - Art gallery', |
| 'Educational - Theater', |
| 'Educational - Amphitheater', |
| 'Educational - Concert hall', |
| 'Educational - Cinema', |
| 'Educational - Opera house', |
| 'Educational - Boarding school', |
|
|
| 'Government - Capitol', |
| 'Government - City hall', |
| 'Government - Consulate', |
| 'Government - Courthouse', |
| 'Government - Embassy', |
| 'Government - Fire station', |
| 'Government - Meeting house', |
| 'Government - Moot hall', |
| 'Government - Palace', |
| 'Government - Parliament', |
| 'Government - Police station', |
| 'Government - Post office', |
| 'Government - Prison', |
|
|
| 'Industrial - Brewery', |
| 'Industrial - Factory', |
| 'Industrial - Foundry', |
| 'Industrial - Power plant', |
| 'Industrial - Mill', |
|
|
| 'Military - Arsenal', |
| 'Military -Barracks', |
|
|
| 'Parking - Boathouse', |
| 'Parking - Garage', |
| 'Parking - Hangar', |
|
|
| 'Storage - Silo', |
| 'Storage - Hangar', |
|
|
| 'Religious - Church', |
| 'Religious - Basilica', |
| 'Religious - Cathedral', |
| 'Religious - Chapel', |
| 'Religious - Oratory', |
| 'Religious - Martyrium', |
| 'Religious - Mosque', |
| 'Religious - Mihrab', |
| 'Religious - Surau', |
| 'Religious - Imambargah', |
| 'Religious - Monastery', |
| 'Religious - Mithraeum', |
| 'Religious - Fire temple', |
| 'Religious - Shrine', |
| 'Religious - Synagogue', |
| 'Religious - Temple', |
| 'Religious - Pagoda', |
| 'Religious - Gurdwara', |
| 'Religious - Hindu temple', |
|
|
| 'Transport - Airport terminal', |
| 'Transport - Bus station', |
| 'Transport - Metro station', |
| 'Transport - Taxi station', |
| 'Transport - Railway station', |
| 'Transport - Signal box', |
| 'Transport - Lighthouse', |
|
|
| 'Infrastructure - Data centre', |
|
|
| 'Power station - Fossil-fuel power station', |
| 'Power station - Nuclear power plant', |
| 'Power station - Geothermal power', |
| 'Power station - Biomass-fuelled power plant', |
| 'Power station - Waste heat power plant', |
| 'Power station - Renewable energy power station', |
| 'Power station - Atomic energy plant', |
|
|
| 'Other - Apartment', |
| 'Other - Clinic', |
| 'Other - Community hall', |
| 'Other - Eatery', |
| 'Other - Folly', |
| 'Other - Food court', |
| 'Other - Hospice', |
| 'Other - Hospital', |
| 'Other - Hut', |
| 'Other - Bathhouse', |
| 'Other - Workshop', |
| 'Other - World trade centre' |
| ] |
| |
|
|
|
|
| def makeBuilding(objectslist=None, name=None): |
| """Obsolete, superseded by ArchBuildingPart.makeBuilding. |
| |
| makeBuilding([objectslist],[name]): creates a building including the |
| objects from the given list.""" |
|
|
| if not FreeCAD.ActiveDocument: |
| FreeCAD.Console.PrintError("No active document. Aborting\n") |
| return |
| obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython", "Building") |
| obj.Label = name if name else translate("Arch", "Building") |
| _Building(obj) |
| if FreeCAD.GuiUp: |
| _ViewProviderBuilding(obj.ViewObject) |
| if objectslist: |
| obj.Group = objectslist |
| return obj |
|
|
|
|
| class _CommandBuilding: |
| "the Arch Building command definition" |
|
|
| def GetResources(self): |
|
|
| return { |
| "Pixmap": "Arch_Building", |
| "MenuText": QtCore.QT_TRANSLATE_NOOP("Arch_Building", "Building"), |
| "Accel": "B, U", |
| "ToolTip": QtCore.QT_TRANSLATE_NOOP( |
| "Arch_Building", "Creates a building object including selected objects." |
| ), |
| } |
|
|
| def IsActive(self): |
|
|
| return not FreeCAD.ActiveDocument is None |
|
|
| def Activated(self): |
|
|
| sel = FreeCADGui.Selection.getSelection() |
| link = params.get_param_arch("FreeLinking") |
| buildingobj = [] |
| warning = False |
| for obj in sel: |
| if not Draft.getType(obj) in ["Site", "Building"]: |
| buildingobj.append(obj) |
| else: |
| if link: |
| buildingobj.append(obj) |
| else: |
| warning = True |
| if warning: |
| message = ( |
| translate( |
| "Arch", |
| "You can put anything but Site and Building objects in a Building object.\n\ |
| Building object is not allowed to accept Site and Building objects.\n\ |
| Site and Building objects will be removed from the selection.\n\ |
| You can change that in the preferences.", |
| ) |
| + "\n" |
| ) |
| ArchCommands.printMessage(message) |
| if sel and len(buildingobj) == 0: |
| message = ( |
| translate( |
| "Arch", |
| "There is no valid object in the selection.\n\ |
| Building creation aborted.", |
| ) |
| + "\n" |
| ) |
| ArchCommands.printMessage(message) |
| else: |
| ss = "[ " |
| for o in buildingobj: |
| ss += "FreeCAD.ActiveDocument." + o.Name + ", " |
| ss += "]" |
| FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Building")) |
| FreeCADGui.addModule("Arch") |
| FreeCADGui.doCommand("obj = Arch.makeBuilding(" + ss + ")") |
| FreeCADGui.addModule("Draft") |
| FreeCADGui.doCommand("Draft.autogroup(obj)") |
| FreeCAD.ActiveDocument.commitTransaction() |
| FreeCAD.ActiveDocument.recompute() |
|
|
|
|
| class _Building(ArchFloor._Floor): |
| "The Building object" |
|
|
| def __init__(self, obj): |
|
|
| ArchFloor._Floor.__init__(self, obj) |
| self.Type = "Building" |
| self.setProperties(obj) |
| obj.IfcType = "Building" |
|
|
| def setProperties(self, obj): |
|
|
| pl = obj.PropertiesList |
| if not "BuildingType" in pl: |
| obj.addProperty( |
| "App::PropertyEnumeration", |
| "BuildingType", |
| "Arch", |
| QT_TRANSLATE_NOOP("App::Property", "The type of this building"), |
| locked=True, |
| ) |
| obj.BuildingType = BuildingTypes |
| obj.setEditorMode("Height", 2) |
|
|
| def onDocumentRestored(self, obj): |
|
|
| ArchFloor._Floor.onDocumentRestored(self, obj) |
| self.setProperties(obj) |
|
|
| def loads(self, state): |
|
|
| self.Type = "Building" |
|
|
|
|
| class _ViewProviderBuilding(ArchFloor._ViewProviderFloor): |
| "A View Provider for the Building object" |
|
|
| def __init__(self, vobj): |
|
|
| ArchFloor._ViewProviderFloor.__init__(self, vobj) |
|
|
| def getIcon(self): |
|
|
| import Arch_rc |
|
|
| return ":/icons/Arch_Building_Tree.svg" |
|
|
| def setupContextMenu(self, vobj, menu): |
| from PySide import QtCore, QtGui |
| import Arch_rc |
|
|
| if FreeCADGui.activeWorkbench().name() != "BIMWorkbench": |
| return |
| action1 = QtGui.QAction( |
| QtGui.QIcon(":/icons/Arch_BuildingPart.svg"), "Convert to BuildingPart", menu |
| ) |
| QtCore.QObject.connect(action1, QtCore.SIGNAL("triggered()"), self.convertToBuildingPart) |
| menu.addAction(action1) |
|
|
| def convertToBuildingPart(self): |
| if hasattr(self, "Object"): |
| import ArchBuildingPart |
| from draftutils import todo |
|
|
| todo.ToDo.delay(ArchBuildingPart.convertFloors, self.Object) |
|
|
|
|
| if FreeCAD.GuiUp: |
|
|
| FreeCADGui.addCommand("Arch_Building", _CommandBuilding()) |
|
|