749 lines
30 KiB
Python
749 lines
30 KiB
Python
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
# ***************************************************************************
|
|
# * *
|
|
# * Copyright (c) 2017 Yorik van Havre <yorik@uncreated.net> *
|
|
# * *
|
|
# * This file is part of FreeCAD. *
|
|
# * *
|
|
# * FreeCAD is free software: you can redistribute it and/or modify it *
|
|
# * under the terms of the GNU Lesser General Public License as *
|
|
# * published by the Free Software Foundation, either version 2.1 of the *
|
|
# * License, or (at your option) any later version. *
|
|
# * *
|
|
# * FreeCAD is distributed in the hope that it will be useful, but *
|
|
# * WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
# * Lesser General Public License for more details. *
|
|
# * *
|
|
# * You should have received a copy of the GNU Lesser General Public *
|
|
# * License along with FreeCAD. If not, see *
|
|
# * <https://www.gnu.org/licenses/>. *
|
|
# * *
|
|
# ***************************************************************************
|
|
|
|
"""The BIM Setup command"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
import FreeCAD
|
|
import FreeCADGui
|
|
|
|
translate = FreeCAD.Qt.translate
|
|
QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP
|
|
|
|
|
|
class BIM_Setup:
|
|
|
|
def GetResources(self):
|
|
return {
|
|
"Pixmap": ":icons/preferences-system.svg",
|
|
"MenuText": QT_TRANSLATE_NOOP("BIM_Setup", "BIM Setup..."),
|
|
"ToolTip": QT_TRANSLATE_NOOP(
|
|
"BIM_Setup", "Set some common FreeCAD preferences for BIM workflow"
|
|
),
|
|
}
|
|
|
|
def Activated(self):
|
|
|
|
TARGETVERSION = 0.19
|
|
TECHDRAWDIMFACTOR = (
|
|
0.16 # How many times TechDraw dim arrows are smaller than Draft
|
|
)
|
|
|
|
# load dialog
|
|
from PySide import QtGui
|
|
|
|
self.form = FreeCADGui.PySideUic.loadUi(":/ui/dialogSetup.ui")
|
|
|
|
# center the dialog over FreeCAD window
|
|
mw = FreeCADGui.getMainWindow()
|
|
self.form.move(
|
|
mw.frameGeometry().topLeft()
|
|
+ mw.rect().center()
|
|
- self.form.rect().center()
|
|
)
|
|
|
|
# connect signals / slots
|
|
self.form.comboPresets.currentIndexChanged[int].connect(self.setPreset)
|
|
self.form.labelIfcOpenShell.linkActivated.connect(self.handleLink)
|
|
|
|
# fill default values
|
|
self.setPreset(None)
|
|
|
|
# check missing addons
|
|
self.form.labelMissingWorkbenches.hide()
|
|
self.form.labelIfcOpenShell.hide()
|
|
self.form.labelSnapTip.hide()
|
|
self.form.labelVersion.hide()
|
|
m = []
|
|
try:
|
|
import RebarTools
|
|
except ImportError:
|
|
m.append("Reinforcement")
|
|
# disabled as WebTools can currentyl not be installed because of WebGui dependency
|
|
#try:
|
|
# import BIMServer
|
|
#except ImportError:
|
|
# m.append("WebTools")
|
|
if sys.version_info.major < 3:
|
|
try:
|
|
import CommandsFrame
|
|
except ImportError:
|
|
m.append("Flamingo")
|
|
else:
|
|
try:
|
|
import CFrame
|
|
except ImportError:
|
|
m.append("Dodo")
|
|
try:
|
|
import FastenerBase
|
|
except ImportError:
|
|
m.append("Fasteners")
|
|
try:
|
|
import report
|
|
except ImportError:
|
|
m.append("Reporting")
|
|
try:
|
|
import ifcopenshell
|
|
except ImportError:
|
|
ifcok = False
|
|
else:
|
|
ifcok = True
|
|
libok = False
|
|
librarypath = FreeCAD.ParamGet(
|
|
"User parameter:Plugins/parts_library"
|
|
).GetString("destination", "")
|
|
if librarypath and os.path.exists(librarypath):
|
|
libok = True
|
|
else:
|
|
# check if the library is at the standard addon location
|
|
librarypath = os.path.join(
|
|
FreeCAD.getUserAppDataDir(), "Mod", "parts_library"
|
|
)
|
|
if os.path.exists(librarypath):
|
|
FreeCAD.ParamGet("User parameter:Plugins/parts_library").SetString(
|
|
"destination", librarypath
|
|
)
|
|
libok = True
|
|
if not libok:
|
|
m.append("parts_library")
|
|
if m:
|
|
t = (
|
|
translate(
|
|
"BIM",
|
|
"Some additional workbenches are not installed, that extend BIM functionality:",
|
|
)
|
|
+ " <b>"
|
|
+ ",".join(m)
|
|
+ "</b>. "
|
|
+ translate(
|
|
"BIM", "You can install them from menu Tools -> Addon manager."
|
|
)
|
|
)
|
|
self.form.labelMissingWorkbenches.setText(t)
|
|
self.form.labelMissingWorkbenches.show()
|
|
if not ifcok:
|
|
self.form.labelIfcOpenShell.show()
|
|
if (
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetString(
|
|
"snapModes", "111111111101111"
|
|
)
|
|
== "111111111101111"
|
|
):
|
|
self.form.labelSnapTip.show()
|
|
version = float(str(FreeCAD.Version()[0]) + "." + str(FreeCAD.Version()[1]))
|
|
if version < TARGETVERSION:
|
|
t = self.form.labelVersion.text
|
|
self.form.labelVersion.text = t.replace("%1", str(version)).replace(
|
|
"%2", str(TARGETVERSION)
|
|
)
|
|
self.form.labelVersion.show()
|
|
|
|
# show dialog and exit if cancelled
|
|
FreeCADGui.BIMSetupDialog = (
|
|
True # this is there to be easily detected by the BIM tutorial
|
|
)
|
|
result = self.form.exec_()
|
|
del FreeCADGui.BIMSetupDialog
|
|
if not result:
|
|
return
|
|
|
|
# set preference values
|
|
unit = self.form.settingUnits.currentIndex()
|
|
unit = [0, 4, 1, 3, 7, 5][unit] # less choices in our simplified dialog
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Units").SetInt(
|
|
"UserSchema", unit
|
|
)
|
|
if FreeCAD.ActiveDocument is not None:
|
|
docs_dict = FreeCAD.listDocuments()
|
|
for doc in docs_dict.values():
|
|
doc.UnitSystem = unit
|
|
if len(docs_dict) == 1:
|
|
FreeCAD.Console.PrintWarning(
|
|
translate("BIM", "Unit system updated for active document") + "\n"
|
|
)
|
|
else:
|
|
FreeCAD.Console.PrintWarning(
|
|
translate("BIM", "Unit system updated for all opened documents") + "\n"
|
|
)
|
|
if hasattr(FreeCAD.Units, "setSchema"):
|
|
FreeCAD.Units.setSchema(unit)
|
|
decimals = self.form.settingDecimals.value()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Units").SetInt(
|
|
"Decimals", decimals
|
|
)
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/TechDraw/Dimensions"
|
|
).SetBool("UseGlobalDecimals", True)
|
|
grid = self.form.settingGrid.text()
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Sketcher/General"
|
|
).SetString(
|
|
"GridSize", grid
|
|
) # Also set sketcher grid
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetString(
|
|
"gridSpacing", grid
|
|
)
|
|
squares = self.form.settingSquares.value()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetInt(
|
|
"gridEvery", squares
|
|
)
|
|
wp = self.form.settingWP.currentIndex()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetInt(
|
|
"defaultWP", wp
|
|
)
|
|
tsize = self.form.settingText.text()
|
|
tsize = FreeCAD.Units.Quantity(tsize).Value
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetFloat(
|
|
"textheight", tsize
|
|
)
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/TechDraw/Dimensions"
|
|
).SetFloat(
|
|
"FontSize", tsize
|
|
) # TODO - check if this needs a mult factor?
|
|
font = self.form.settingFont.currentFont().family()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetString(
|
|
"textfont", font
|
|
)
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/TechDraw/Labels"
|
|
).SetString("LabelFont", font)
|
|
linewidth = self.form.settingLinewidth.value()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetInt(
|
|
"DefaultShapeLineWidth", linewidth
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetInt(
|
|
"linewidth", linewidth
|
|
)
|
|
# TODO - TechDraw default line styles
|
|
dimstyle = self.form.settingDimstyle.currentIndex()
|
|
ddimstyle = [0, 2, 3, 4][dimstyle] # less choices in our simplified dialog
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetInt(
|
|
"dimsymbol", ddimstyle
|
|
)
|
|
tdimstyle = [3, 0, 2, 2][dimstyle] # TechDraw has different order than Draft
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/TechDraw/Dimensions"
|
|
).SetInt("dimsymbol", tdimstyle)
|
|
asize = self.form.settingArrowsize.text()
|
|
asize = FreeCAD.Units.Quantity(asize).Value
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetFloat(
|
|
"arrowsize", asize
|
|
)
|
|
FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/TechDraw/Dimensions"
|
|
).SetFloat("ArrowSize", asize * TECHDRAWDIMFACTOR)
|
|
author = self.form.settingAuthor.text()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Document").SetString(
|
|
"prefAuthor", author
|
|
)
|
|
lic = self.form.settingLicense.currentIndex()
|
|
lic = [0, 1, 2, 4, 5][lic] # less choices in our simplified dialog
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Document").SetInt(
|
|
"prefLicenseType", lic
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Document").SetString(
|
|
"prefLicenseUrl", ""
|
|
) # TODO - set correct license URL
|
|
newdoc = self.form.settingNewdocument.isChecked()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Document").SetBool(
|
|
"CreateNewDoc", newdoc
|
|
)
|
|
bkp = self.form.settingBackupfiles.value()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Document").SetInt(
|
|
"CountBackupFiles", bkp
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"BackgroundColor2", self.form.colorButtonTop.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"BackgroundColor3", self.form.colorButtonBottom.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"DefaultShapeColor", self.form.colorButtonFaces.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetUnsigned(
|
|
"color", self.form.colorButtonFaces.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"DefaultShapeLineColor",
|
|
self.form.colorButtonLines.property("color").rgb() << 8,
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").SetUnsigned(
|
|
"ColorHelpers", self.form.colorButtonHelpers.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetUnsigned(
|
|
"constructioncolor",
|
|
self.form.colorButtonConstruction.property("color").rgb() << 8,
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"ConstructionColor",
|
|
self.form.colorButtonConstruction.property("color").rgb() << 8,
|
|
)
|
|
height = self.form.settingCameraHeight.value()
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetInt(
|
|
"defaultCameraHeight", height
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetUnsigned(
|
|
"DefaultTextColor", self.form.colorButtonText.property("color").rgb() << 8
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").SetUnsigned(
|
|
"BackgroundColor", self.form.colorButtonSimple.property("color").rgb() << 8
|
|
)
|
|
|
|
# set the working plane
|
|
if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(
|
|
FreeCADGui, "draftToolBar"
|
|
):
|
|
if wp == 1:
|
|
FreeCAD.DraftWorkingPlane.alignToPointAndAxis(
|
|
FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 0
|
|
)
|
|
FreeCADGui.draftToolBar.wplabel.setText("Top(XY)")
|
|
elif wp == 2:
|
|
FreeCAD.DraftWorkingPlane.alignToPointAndAxis(
|
|
FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 1, 0), 0
|
|
)
|
|
FreeCADGui.draftToolBar.wplabel.setText("Front(XZ)")
|
|
elif wp == 3:
|
|
FreeCAD.DraftWorkingPlane.alignToPointAndAxis(
|
|
FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(1, 0, 0), 0
|
|
)
|
|
FreeCADGui.draftToolBar.wplabel.setText("Side(YZ)")
|
|
else:
|
|
FreeCADGui.draftToolBar.wplabel.setText("Auto")
|
|
|
|
# set Draft toolbar
|
|
if hasattr(FreeCADGui, "draftToolBar"):
|
|
if hasattr(FreeCADGui.draftToolBar, "setStyleButton"):
|
|
FreeCADGui.draftToolBar.setStyleButton()
|
|
else:
|
|
# pre-v0.19
|
|
FreeCADGui.draftToolBar.widthButton.setValue(linewidth)
|
|
FreeCADGui.draftToolBar.fontsizeButton.setValue(tsize)
|
|
|
|
# set the grid
|
|
if hasattr(FreeCADGui, "Snapper"):
|
|
FreeCADGui.Snapper.setGrid()
|
|
|
|
# set the status bar widgets
|
|
mw = FreeCADGui.getMainWindow()
|
|
if mw:
|
|
st = mw.statusBar()
|
|
statuswidget = st.findChild(QtGui.QToolBar, "BIMStatusWidget")
|
|
if statuswidget:
|
|
if hasattr(statuswidget, "unitLabel"):
|
|
statuswidget.unitLabel.setText(
|
|
statuswidget.unitsList[self.form.settingUnits.currentIndex()]
|
|
)
|
|
# change the unit of the nudge button
|
|
nudgeactions = statuswidget.nudge.menu().actions()
|
|
if unit in [2, 3, 5, 7]:
|
|
nudgelabels = statuswidget.nudgeLabelsI
|
|
else:
|
|
nudgelabels = statuswidget.nudgeLabelsM
|
|
for i in range(len(nudgelabels)):
|
|
nudgeactions[i].setText(nudgelabels[i])
|
|
try:
|
|
t = FreeCAD.Units.Quantity(
|
|
statuswidget.nudge.text().replace("&", "")
|
|
).UserString
|
|
except:
|
|
pass # auto mode
|
|
else:
|
|
statuswidget.nudge.setText(t)
|
|
|
|
# Set different default values
|
|
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").GetBool(
|
|
"FirstTime", True
|
|
):
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetString(
|
|
"svgDashedLine", "3,1"
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetString(
|
|
"svgDashdotLine", "3,1,0.2,1"
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetString(
|
|
"svgDottedLine", "0.5,1"
|
|
)
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetFloat(
|
|
"HatchPatternSize", 0.025
|
|
)
|
|
|
|
# finish
|
|
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").SetBool(
|
|
"FirstTime", False
|
|
)
|
|
|
|
def setPreset(self, preset=None):
|
|
from PySide import QtGui
|
|
|
|
unit = None
|
|
decimals = None
|
|
grid = None
|
|
squares = None
|
|
wp = None
|
|
tsize = None
|
|
font = None
|
|
linewidth = None
|
|
dimstyle = None
|
|
asize = None
|
|
author = None
|
|
lic = None
|
|
bimdefault = None
|
|
newdoc = None
|
|
bkp = None
|
|
colTop = None
|
|
colBottom = None
|
|
colFace = None
|
|
colLine = None
|
|
colHelp = None
|
|
colConst = None
|
|
height = None
|
|
colSimple = None
|
|
colText = None
|
|
|
|
if preset == 0:
|
|
# the "Choose..." item from the presets box. Do nothing
|
|
return
|
|
|
|
elif preset == 1:
|
|
# centimeters
|
|
unit = 1
|
|
decimals = 2
|
|
grid = "10cm"
|
|
squares = 10
|
|
tsize = "20cm"
|
|
linewidth = 1
|
|
dimstyle = 0
|
|
asize = "4cm"
|
|
bkp = 2
|
|
bimdefault = 2
|
|
newdoc = False
|
|
height = 4500
|
|
|
|
elif preset == 2:
|
|
# meters
|
|
unit = 2
|
|
decimals = 2
|
|
grid = "0.1m"
|
|
squares = 10
|
|
tsize = "0.2m"
|
|
linewidth = 1
|
|
dimstyle = 0
|
|
asize = "0.04m"
|
|
bkp = 2
|
|
bimdefault = 2
|
|
newdoc = False
|
|
height = 4500
|
|
|
|
elif preset == 3:
|
|
# US
|
|
unit = 5
|
|
decimals = 2
|
|
grid = "1in"
|
|
squares = 12
|
|
tsize = "8in"
|
|
linewidth = 1
|
|
dimstyle = 3
|
|
asize = "2in"
|
|
bkp = 2
|
|
bimdefault = 2
|
|
newdoc = False
|
|
height = 4500
|
|
|
|
elif preset is None:
|
|
# get values from settings
|
|
unit = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Units").GetInt(
|
|
"UserSchema", 0
|
|
)
|
|
unit = [0, 2, 3, 3, 1, 5, 0, 4, 0, 2][
|
|
unit
|
|
] # less choices in our simplified dialog
|
|
decimals = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Units"
|
|
).GetInt("Decimals", 2)
|
|
grid = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetString("gridSpacing", "1 cm")
|
|
grid = FreeCAD.Units.Quantity(grid).UserString
|
|
squares = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetInt("gridEvery", 10)
|
|
wp = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetInt("defaultWP", 1)
|
|
tsize = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetFloat("textheight", 10)
|
|
tsize = FreeCAD.Units.Quantity(tsize, FreeCAD.Units.Length).UserString
|
|
font = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetString("textfont", "Sans")
|
|
linewidth = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetInt("DefaultShapeLineWidth", 2)
|
|
dimstyle = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetInt("dimsymbol", 0)
|
|
dimstyle = [0, 0, 1, 2, 3][
|
|
dimstyle
|
|
] # less choices in our simplified dialog
|
|
asize = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetFloat("arrowsize", 5)
|
|
asize = FreeCAD.Units.Quantity(asize, FreeCAD.Units.Length).UserString
|
|
author = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Document"
|
|
).GetString("prefAuthor", "")
|
|
lic = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Document"
|
|
).GetInt("prefLicenseType", 0)
|
|
lic = [0,
|
|
1, 2, 1, 3, 4, 1,
|
|
1, 2, 1, 3, 4, 1,
|
|
0, 0, 0, 0, 0, 0][
|
|
lic
|
|
] # less choices in our simplified dialog
|
|
newdoc = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Document"
|
|
).GetBool("CreateNewDoc", False)
|
|
bkp = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Document"
|
|
).GetInt("CountBackupFiles", 2)
|
|
colTop = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetUnsigned("BackgroundColor2", 775244287)
|
|
colBottom = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetUnsigned("BackgroundColor3", 1905041919)
|
|
colFace = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetUnsigned("DefaultShapeColor", 4294967295)
|
|
colLine = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetUnsigned("DefaultShapeLineColor", 255)
|
|
colHelp = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Arch"
|
|
).GetUnsigned("ColorHelpers", 674321151)
|
|
colConst = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetUnsigned("constructioncolor", 746455039)
|
|
height = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetInt("defaultCameraHeight", 5)
|
|
colSimple = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/View"
|
|
).GetUnsigned("BackgroundColor", 4294967295)
|
|
colText = FreeCAD.ParamGet(
|
|
"User parameter:BaseApp/Preferences/Mod/Draft"
|
|
).GetUnsigned("DefaultTextColor", 255)
|
|
|
|
if unit != None:
|
|
self.form.settingUnits.setCurrentIndex(unit)
|
|
if decimals != None:
|
|
self.form.settingDecimals.setValue(decimals)
|
|
if grid != None:
|
|
self.form.settingGrid.setText(grid)
|
|
if squares != None:
|
|
self.form.settingSquares.setValue(squares)
|
|
if wp != None:
|
|
self.form.settingWP.setCurrentIndex(wp)
|
|
if tsize != None:
|
|
self.form.settingText.setText(tsize)
|
|
if font != None:
|
|
self.form.settingFont.setCurrentFont(QtGui.QFont(font))
|
|
if linewidth != None:
|
|
self.form.settingLinewidth.setValue(linewidth)
|
|
if dimstyle != None:
|
|
self.form.settingDimstyle.setCurrentIndex(dimstyle)
|
|
if asize != None:
|
|
self.form.settingArrowsize.setText(asize)
|
|
if author != None:
|
|
self.form.settingAuthor.setText(author)
|
|
if lic != None:
|
|
self.form.settingLicense.setCurrentIndex(lic)
|
|
if newdoc != None:
|
|
self.form.settingNewdocument.setChecked(newdoc)
|
|
if bkp != None:
|
|
self.form.settingBackupfiles.setValue(bkp)
|
|
if colTop != None:
|
|
self.form.colorButtonTop.setProperty("color", self.getPrefColor(colTop))
|
|
if colBottom != None:
|
|
self.form.colorButtonBottom.setProperty("color", self.getPrefColor(colBottom))
|
|
if colFace != None:
|
|
self.form.colorButtonFaces.setProperty("color", self.getPrefColor(colFace))
|
|
if colLine != None:
|
|
self.form.colorButtonLines.setProperty("color", self.getPrefColor(colLine))
|
|
if colHelp != None:
|
|
self.form.colorButtonHelpers.setProperty("color", self.getPrefColor(colHelp))
|
|
if colConst != None:
|
|
self.form.colorButtonConstruction.setProperty(
|
|
"color", self.getPrefColor(colConst)
|
|
)
|
|
if colSimple != None:
|
|
self.form.colorButtonSimple.setProperty("color", self.getPrefColor(colSimple))
|
|
if colText != None:
|
|
self.form.colorButtonText.setProperty("color", self.getPrefColor(colText))
|
|
if height:
|
|
self.form.settingCameraHeight.setValue(height)
|
|
# TODO - antialiasing?
|
|
|
|
def handleLink(self, link):
|
|
if hasattr(self, "form"):
|
|
if "#install" in link:
|
|
self.getIfcOpenShell()
|
|
else:
|
|
# print("Opening link:",link)
|
|
from PySide import QtCore, QtGui
|
|
|
|
url = QtCore.QUrl(link)
|
|
QtGui.QDesktopServices.openUrl(url)
|
|
|
|
|
|
def getPrefColor(self,color):
|
|
r = ((color >> 24) & 0xFF) / 255.0
|
|
g = ((color >> 16) & 0xFF) / 255.0
|
|
b = ((color >> 8) & 0xFF) / 255.0
|
|
from PySide import QtGui
|
|
|
|
return QtGui.QColor.fromRgbF(r, g, b)
|
|
|
|
|
|
def getIfcOpenShell(self,force=False):
|
|
"""downloads and installs IfcOpenShell"""
|
|
|
|
# TODO WARNING the IfcOpenBot repo below is not actively kept updated.
|
|
# We need to use PIP
|
|
|
|
ifcok = False
|
|
if not force:
|
|
try:
|
|
import ifcopenshell
|
|
except:
|
|
ifcok = False
|
|
else:
|
|
ifcok = False
|
|
v = [int(i) for i in ifcopenshell.version.split(".")]
|
|
if v[0] < 1:
|
|
if v[1] > 6:
|
|
ifcok = True
|
|
if not ifcok:
|
|
# ifcopenshell not installed
|
|
import json
|
|
import re
|
|
from urllib import request
|
|
import zipfile
|
|
from PySide import QtGui
|
|
|
|
if not FreeCAD.GuiUp:
|
|
reply = QtGui.QMessageBox.Yes
|
|
else:
|
|
reply = QtGui.QMessageBox.question(
|
|
None,
|
|
translate("BIM", "IfcOpenShell not found"),
|
|
translate(
|
|
"BIM",
|
|
"IfcOpenShell is needed to import and export IFC files. It appears to be missing on your system. Would you like to download and install it now? It will be installed in FreeCAD's Macros directory.",
|
|
),
|
|
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
|
|
QtGui.QMessageBox.No,
|
|
)
|
|
if reply == QtGui.QMessageBox.Yes:
|
|
print(
|
|
"Loading list of latest IfcOpenBot builds from https://github.com/IfcOpenBot/IfcOpenShell..."
|
|
)
|
|
url1 = "https://api.github.com/repos/IfcOpenBot/IfcOpenShell/comments?per_page=100"
|
|
u = request.urlopen(url1)
|
|
if u:
|
|
r = u.read()
|
|
u.close()
|
|
d = json.loads(r)
|
|
l = d[-1]["body"]
|
|
links = re.findall(r"http.*?zip", l)
|
|
pyv = (
|
|
"python-"
|
|
+ str(sys.version_info.major)
|
|
+ str(sys.version_info.minor)
|
|
)
|
|
if sys.platform.startswith("linux"):
|
|
plat = "linux"
|
|
elif sys.platform.startswith("win"):
|
|
plat = "win"
|
|
elif sys.platform.startswith("darwin"):
|
|
plat = "macos"
|
|
else:
|
|
FreeCAD.Console.PrintError("Error - unknown platform")
|
|
return
|
|
if sys.maxsize > 2**32:
|
|
plat += "64"
|
|
else:
|
|
plat += "32"
|
|
print("Looking for", plat, pyv)
|
|
for link in links:
|
|
if ("ifcopenshell-" + pyv in link) and (plat in link):
|
|
print("Downloading " + link + "...")
|
|
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")
|
|
fp = p.GetString(
|
|
"MacroPath",
|
|
os.path.join(FreeCAD.getUserAppDataDir(), "Macros"),
|
|
)
|
|
u = request.urlopen(link)
|
|
if u:
|
|
if sys.version_info.major < 3:
|
|
import StringIO as io
|
|
|
|
_stringio = io.StringIO
|
|
else:
|
|
import io
|
|
|
|
_stringio = io.BytesIO
|
|
zfile = _stringio()
|
|
zfile.write(u.read())
|
|
zfile = zipfile.ZipFile(zfile)
|
|
zfile.extractall(fp)
|
|
u.close()
|
|
zfile.close()
|
|
print("Successfully installed IfcOpenShell to", fp)
|
|
break
|
|
else:
|
|
FreeCAD.Console.PrintWarning(
|
|
"Unable to find a build for your version therefore falling back to a pip install"
|
|
)
|
|
try:
|
|
import pip
|
|
except ModuleNotFoundError:
|
|
FreeCAD.Console.PrintError(
|
|
"Please install pip on your system, restart FreeCAD,"
|
|
" change to BIM Wb and use Utils menu > ifcOpenShell update"
|
|
)
|
|
return
|
|
from nativeifc import ifc_openshell
|
|
|
|
FreeCADGui.runCommand('IFC_UpdateIOS',1)
|
|
|
|
FreeCADGui.addCommand("BIM_Setup", BIM_Setup())
|