Arch: Added new bimserver task panel - issue #2599

This commit is contained in:
Yorik van Havre 2016-06-25 20:23:22 -03:00
parent 1408f0cd0a
commit 9bd9f56b17
9 changed files with 917 additions and 32 deletions

View File

@ -892,13 +892,12 @@ def rebuildArchShape(objects=None):
solid = Part.Solid(solid)
#print "rebuilt solid: isValid is ",solid.isValid()
if solid.isValid():
print "Success"
obj.Base.Shape = solid
success = True
except:
pass
if not success:
print "Failed"
print "Failed to rebuild a valid solid for object ",obj.Name
FreeCAD.ActiveDocument.recompute()

View File

@ -21,7 +21,7 @@
#* *
#***************************************************************************
import FreeCAD,os
import FreeCAD, os, time, tempfile, base64, Draft
from PySide import QtCore, QtGui
if FreeCAD.GuiUp:
@ -36,19 +36,306 @@ __author__ = "Yorik van Havre"
__url__ = "http://www.freecadweb.org"
# BIMSERVER ###########################################################
class _CommandBimserver:
"the Arch Bimserver command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Bimserver',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Bimserver","BIM server"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Bimserver","Opens a browser window and connects to a BIM server instance")}
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Bimserver","Connects and interacts with a BIM server instance")}
def Activated(self):
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
url = p.GetString("BimServerUrl","http://localhost:8082")
FreeCADGui.addModule("WebGui")
FreeCADGui.doCommand("WebGui.openBrowser(\""+url+"\")")
try:
import requests
except:
FreeCAD.Console.PrintError("requests python module not found, aborting.\n")
else:
FreeCADGui.Control.showDialog(_BimServerTaskPanel())
class _BimServerTaskPanel:
'''The TaskPanel for the BimServer command'''
def __init__(self):
self.form = FreeCADGui.PySideUic.loadUi(":/ui/BimServerTaskPanel.ui")
self.form.setWindowIcon(QtGui.QIcon(":/icons/Arch_Bimserver.svg"))
self.form.labelStatus.setText("")
QtCore.QObject.connect(self.form.buttonServer, QtCore.SIGNAL("clicked()"), self.login)
QtCore.QObject.connect(self.form.buttonBrowser, QtCore.SIGNAL("clicked()"), self.browse)
QtCore.QObject.connect(self.form.comboProjects, QtCore.SIGNAL("currentIndexChanged(int)"), self.getRevisions)
QtCore.QObject.connect(self.form.buttonOpen, QtCore.SIGNAL("clicked()"), self.openFile)
QtCore.QObject.connect(self.form.buttonUpload, QtCore.SIGNAL("clicked()"), self.uploadFile)
self.prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
self.Projects = []
self.Revisions = []
self.RootObjects = Draft.getObjectsOfType(FreeCAD.ActiveDocument.Objects,"Site")+Draft.getObjectsOfType(FreeCAD.ActiveDocument.Objects,"Building")
for o in self.RootObjects:
self.form.comboRoot.addItem(o.Label)
self.setLogged(False)
url,token = self.getPrefs()
if url and token:
self.getProjects()
def getStandardButtons(self):
return int(QtGui.QDialogButtonBox.Close)
def accept(self):
FreeCADGui.Selection.removeObserver(self.observer)
FreeCADGui.Control.closeDialog()
def getPrefs(self):
url = self.prefs.GetString("BimServerUrl","http://localhost:8082")
if hasattr(self,"token"):
token = self.token
else:
token = self.prefs.GetString("BimServerToken","")
if token:
self.token = token
return url,token
def setLogged(self,logged):
if logged:
self.form.buttonServer.setText("Connected")
self.form.buttonServer.setIcon(QtGui.QIcon(":/icons/edit_OK.svg"))
self.form.buttonServer.setToolTip("Click to log out")
self.Connected = True
else:
self.form.buttonServer.setText("Not connected")
self.form.buttonServer.setIcon(QtGui.QIcon(":/icons/edit_Cancel.svg"))
self.form.buttonServer.setToolTip("Click to log in")
self.Connected = False
def login(self):
self.setLogged(False)
self.form.labelStatus.setText("")
if self.Connected:
# if the user pressed logout, delete the token
self.prefs.SetString("BimServerToken","")
else:
url,token = self.getPrefs()
loginform = FreeCADGui.PySideUic.loadUi(":/ui/DialogBimServerLogin.ui")
loginform.editUrl.setText(url)
dlg = loginform.exec_()
if dlg:
url = loginform.editUrl.text()
login = loginform.editLogin.text()
passwd = loginform.editPassword.text()
store = loginform.checkStore.isChecked()
import requests
self.form.labelStatus.setText("Logging in...")
url2 = url + "/json"
data = {'request': {'interface': 'AuthInterface', 'method': 'login', 'parameters': {'username': login, 'password': passwd}}}
try:
resp = requests.post(url2,json = data)
except:
FreeCAD.Console.PrintError("Unable to connect to BimServer at "+url+"\n")
self.form.labelStatus.setText("Connection failed.")
return
if resp.ok:
try:
token = resp.json()["response"]["result"]
except:
return
else:
if store:
self.prefs.SetString("BimServerUrl",url)
if token:
self.prefs.SetString("BimServerToken",token)
else:
self.prefs.SetString("BimServerToken","")
if token:
self.token = token
self.getProjects()
self.form.labelStatus.setText("")
def browse(self):
url = self.prefs.GetString("BimServerUrl","http://localhost:8082")+"/apps/bimviews"
if self.prefs.GetBool("BimServerBrowser",False):
FreeCADGui.addModule("WebGui")
FreeCADGui.doCommand("WebGui.openBrowser(\""+url+"\")")
else:
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode))
def getProjects(self):
self.setLogged(False)
self.Projects = []
self.form.labelStatus.setText("")
import requests
url,token = self.getPrefs()
if url and token:
self.form.labelStatus.setText("Getting projects list...")
url += "/json"
data = { "token": token, "request": { "interface": "SettingsInterface", "method": "getServerSettings", "parameters": { } } }
try:
resp = requests.post(url,json = data)
except:
FreeCAD.Console.PrintError("Unable to connect to BimServer at "+url[:-5]+"\n")
self.form.labelStatus.setText("Connection failed.")
return
if resp.ok:
try:
name = resp.json()["response"]["result"]["name"]
except:
pass # unable to get the server name
else:
self.form.labelServerName.setText(name)
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getAllProjects", "parameters": { "onlyTopLevel": "false", "onlyActive": "true" } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
projects = resp.json()["response"]["result"]
except:
FreeCAD.Console.PrintError("Unable to get projects list from BimServer\n")
else:
self.setLogged(True)
self.form.comboProjects.clear()
for p in projects:
self.form.comboProjects.addItem(p["name"])
self.Projects = projects
self.form.comboProjects.setCurrentIndex(0)
self.getRevisions(0)
self.form.labelStatus.setText("")
def getRevisions(self,index):
self.form.labelStatus.setText("")
self.form.listRevisions.clear()
self.Revisions = []
import requests
url,token = self.getPrefs()
if url and token:
url += "/json"
if (index >= 0) and (len(self.Projects) > index):
p = self.Projects[index]
self.form.labelStatus.setText("Getting revisions...")
for rev in p["revisions"]:
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getRevision", "parameters": { "roid": rev } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
name = resp.json()["response"]["result"]["comment"]
date = resp.json()["response"]["result"]["date"]
except:
pass # unable to get the revision
else:
date = time.strftime("%a %d %b %Y %H:%M:%S GMT", time.gmtime(int(date)/1000.0))
self.form.listRevisions.addItem(date+" - "+name)
self.Revisions.append(resp.json()["response"]["result"])
self.form.labelStatus.setText("")
def openFile(self):
self.form.labelStatus.setText("")
if (self.form.listRevisions.currentRow() >= 0) and (len(self.Revisions) > self.form.listRevisions.currentRow()):
rev = self.Revisions[self.form.listRevisions.currentRow()]
import requests
url,token = self.getPrefs()
if url and token:
FreeCAD.Console.PrintMessage("Downloading file from Bimserver...\n")
self.form.labelStatus.setText("Checking available serializers...")
url += "/json"
serializer = None
for s in ["Ifc2x3tc1"]: # Ifc4 seems unreliable ATM, let's stick with good old Ifc2x3...
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getSerializerByName", "parameters": { "serializerName": s } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
srl = resp.json()["response"]["result"]
except:
pass # unable to get this serializer
else:
serializer = srl
break
if not serializer:
FreeCAD.Console.PrintError("Unable to get a valid serializer from the BimServer\n")
return
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), "Save the downloaded IFC file?", None, "IFC files (*.ifc)")
if tf:
tf = tf[0]
self.form.labelStatus.setText("Downloading file...")
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "downloadRevisions", "parameters": { "roids": [rev["oid"]], "serializerOid": serializer["oid"], "sync": "false" } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
downloadid = resp.json()["response"]["result"]
except:
FreeCAD.Console.PrintError("Unable to obtain a valid download for this revision from the BimServer\n")
return
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getDownloadData", "parameters": { "topicId": downloadid } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
downloaddata = resp.json()["response"]["result"]["file"]
except:
FreeCAD.Console.PrintError("Unable to download the data for this revision.\n")
return
else:
FreeCAD.Console.PrintMessage("Opening file...\n")
self.form.labelStatus.setText("Opening file...")
if not tf:
tf = tempfile.mkstemp(suffix=".ifc")[1]
f = open(tf,"wb")
f.write(base64.b64decode(downloaddata))
f.close()
import importIFC
importIFC.open(tf)
self.form.labelStatus.setText("")
def uploadFile(self):
self.form.labelStatus.setText("")
if (self.form.comboProjects.currentIndex() >= 0) and (len(self.Projects) > self.form.comboProjects.currentIndex()) and (self.form.comboRoot.currentIndex() >= 0):
project = self.Projects[self.form.comboProjects.currentIndex()]
import requests
url,token = self.getPrefs()
if url and token:
url += "/json"
deserializer = None
FreeCAD.Console.PrintMessage("Saving file...\n")
self.form.labelStatus.setText("Checking available deserializers...")
import ifcopenshell
schema = ifcopenshell.schema_identifier.lower()
data = { "token": token, "request": { "interface": "PluginInterface", "method": "getAllDeserializers", "parameters": { "onlyEnabled": "true" } } }
resp = requests.post(url,json = data)
if resp.ok:
try:
for d in resp.json()["response"]["result"]:
if schema in d["name"].lower():
deserializer = d
break
except:
pass
if not deserializer:
FreeCAD.Console.PrintError("Unable to get a valid deserializer for the "+schema+" schema\n")
return
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), "Save the IFC file before uploading?", None, "IFC files (*.ifc)")
if tf:
tf = tf[0]
if not tf:
tf = os.path.join(tempfile._get_default_tempdir(),next(tempfile._get_candidate_names())+".ifc")
import importIFC
self.form.labelStatus.setText("Saving file...")
importIFC.export([self.RootObjects[self.form.comboRoot.currentIndex()]],tf)
f = open(tf,"rb")
ifcdata = base64.b64encode(f.read())
f.close()
FreeCAD.Console.PrintMessage("Uploading file to Bimserver...\n")
self.form.labelStatus.setText("Uploading file...")
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "checkin", "parameters": { "poid": project["oid"], "comment": self.form.editComment.text(), "deserializerOid": deserializer["oid"], "fileSize": os.path.getsize(tf), "fileName": os.path.basename(tf), "data": ifcdata, "merge": "false", "sync": "true" } } }
resp = requests.post(url,json = data)
if resp.ok:
if resp.json()["response"]["result"]:
FreeCAD.Console.PrintMessage("File upload successful\n")
self.getRevisions(self.form.comboProjects.currentIndex())
else:
FreeCAD.Console.PrintError("File upload failed\n")
self.form.labelStatus.setText("")
class _CommandGit:
"the Arch Git Commit command definition"
@ -99,6 +386,9 @@ class _CommandGit:
repo.git.commit(m=d.lineEdit.text())
if d.checkBox.isChecked():
repo.git.push()
class _ArchGitDialog(QtGui.QDialog):

View File

@ -97,7 +97,8 @@ class _Site(ArchFloor._Floor):
obj.addProperty("App::PropertyString","PostalCode","Arch","The postal or zip code of this site")
obj.addProperty("App::PropertyString","City","Arch","The city of this site")
obj.addProperty("App::PropertyString","Country","Arch","The country of this site")
obj.addProperty("App::PropertyString","Coordinates","Arch","The geographic coordinates of this site")
obj.addProperty("App::PropertyFloat","Latitude","Arch","The latitude of this site")
obj.addProperty("App::PropertyFloat","Longitude","Arch","The latitude of this site")
obj.addProperty("App::PropertyString","Url","Arch","An url that shows this site in a mapping website")
self.Type = "Site"
obj.setEditorMode('Height',2)

View File

@ -77,6 +77,9 @@
<file>ui/ParametersPanel.svg</file>
<file>ui/ParametersSlab.svg</file>
<file>ui/ParametersIbeam.svg</file>
<file>ui/BimServerTaskPanel.ui</file>
<file>ui/GitTaskPanel.ui</file>
<file>ui/DialogBimServerLogin.ui</file>
<file>translations/Arch_af.qm</file>
<file>translations/Arch_de.qm</file>
<file>translations/Arch_fi.qm</file>

View File

@ -0,0 +1,218 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BimServer</class>
<widget class="QDialog" name="BimServer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>232</width>
<height>486</height>
</rect>
</property>
<property name="windowTitle">
<string>BimServer</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupServer">
<property name="title">
<string>Server</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="labelServerName">
<property name="toolTip">
<string>The name of the BimServer you are currently connecting to. Change settings in Arch Preferences</string>
</property>
<property name="text">
<string>Bim Server</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonServer">
<property name="text">
<string>Connect</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="labelStatus">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Idle</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonBrowser">
<property name="text">
<string>Open in browser</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Project</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboProjects">
<property name="toolTip">
<string>The list of projects present on the Bim Server</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupDownload">
<property name="title">
<string>Download</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Available revisions:</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listRevisions">
<property name="modelColumn">
<number>0</number>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonOpen">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Upload</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Root object:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboRoot"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Comment</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editComment"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonUpload">
<property name="text">
<string>Upload</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>274</width>
<height>179</height>
</rect>
</property>
<property name="windowTitle">
<string>BimServer Login</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Bim server URL:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editUrl"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Login (email):</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editLogin"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editPassword"/>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkStore">
<property name="text">
<string>Keep me logged across FreeCAD sessions</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,229 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>228</width>
<height>494</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupStatus">
<property name="title">
<string>Status</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="labelWarning">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>103</red>
<green>103</green>
<blue>103</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string>Warning</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>List of files to be committed:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonLog">
<property name="text">
<string>Log</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonRefresh">
<property name="text">
<string>Refresh</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="listFiles"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonSelectAll">
<property name="text">
<string>Select all</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupCommit">
<property name="title">
<string>Commit</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Commit message</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editMessage"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonCommit">
<property name="text">
<string>Commit</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Remote repositories</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QListWidget" name="listRepos"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonPull">
<property name="text">
<string>Pull</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonPush">
<property name="text">
<string>Push</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>460</width>
<height>537</height>
<height>602</height>
</rect>
</property>
<property name="windowTitle">
@ -399,6 +399,26 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="Gui::PrefCheckBox" name="checkBox_3">
<property name="toolTip">
<string>if this is checked, the &quot;open BimServer in browser&quot; button will open the Bim Server interface in an external browser instead of the FreeCAD web workbench</string>
</property>
<property name="text">
<string>Open in external browser</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>BimServerBrowser</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>

View File

@ -397,21 +397,22 @@ def insert(filename,docname,skip=[],only=[],root=None):
for o in r.RelatedObjects:
mattable[o.id()] = r.RelatingMaterial.id()
for r in ifcfile.by_type("IfcStyledItem"):
if r.Styles[0].is_a("IfcPresentationStyleAssignment"):
if r.Styles[0].Styles[0].is_a("IfcSurfaceStyle"):
if r.Styles[0].Styles[0].Styles[0].is_a("IfcSurfaceStyleRendering"):
if r.Styles[0].Styles[0].Styles[0].SurfaceColour:
c = r.Styles[0].Styles[0].Styles[0].SurfaceColour
if r.Item:
for p in ifcfile.by_type("IfcProduct"):
if p.Representation:
for it in p.Representation.Representations:
if it.Items:
if it.Items[0].id() == r.Item.id():
colors[p.id()] = (c.Red,c.Green,c.Blue)
elif it.Items[0].is_a("IfcBooleanResult"):
if (it.Items[0].FirstOperand.id() == r.Item.id()):
if r.Styles:
if r.Styles[0].is_a("IfcPresentationStyleAssignment"):
if r.Styles[0].Styles[0].is_a("IfcSurfaceStyle"):
if r.Styles[0].Styles[0].Styles[0].is_a("IfcSurfaceStyleRendering"):
if r.Styles[0].Styles[0].Styles[0].SurfaceColour:
c = r.Styles[0].Styles[0].Styles[0].SurfaceColour
if r.Item:
for p in ifcfile.by_type("IfcProduct"):
if p.Representation:
for it in p.Representation.Representations:
if it.Items:
if it.Items[0].id() == r.Item.id():
colors[p.id()] = (c.Red,c.Green,c.Blue)
elif it.Items[0].is_a("IfcBooleanResult"):
if (it.Items[0].FirstOperand.id() == r.Item.id()):
colors[p.id()] = (c.Red,c.Green,c.Blue)
else:
for m in ifcfile.by_type("IfcMaterialDefinitionRepresentation"):
for it in m.Representations:
@ -568,13 +569,24 @@ def insert(filename,docname,skip=[],only=[],root=None):
obj = getattr(Arch,"make"+freecadtype)(name=name)
obj.CloneOf = clone
if shape:
v = shape.Solids[0].CenterOfMass.sub(clone.Shape.Solids[0].CenterOfMass)
r = getRotation(product)
if not r.isNull():
v = v.add(clone.Shape.Solids[0].CenterOfMass)
v = v.add(r.multVec(clone.Shape.Solids[0].CenterOfMass.negative()))
obj.Placement.Rotation = r
obj.Placement.move(v)
if shape.Solids:
s1 = shape.Solids[0]
else:
s1 = shape
if clone.Shape.Solids:
s2 = clone.Shape.Solids[0]
else:
s1 = clone.Shape
if hasattr(s1,"CenterOfMass") and hasattr(s2,"CenterOfMass"):
v = s1.CenterOfMass.sub(s2.CenterOfMass)
r = getRotation(product)
if not r.isNull():
v = v.add(s2.CenterOfMass)
v = v.add(r.multVec(s2.CenterOfMass.negative()))
obj.Placement.Rotation = r
obj.Placement.move(v)
else:
print "failed to compute placement ",
else:
obj = getattr(Arch,"make"+freecadtype)(baseobj=baseobj,name=name)
if store: