diff --git a/src/Mod/Arch/ArchServer.py b/src/Mod/Arch/ArchServer.py
index 1f465a095..1797879fb 100644
--- a/src/Mod/Arch/ArchServer.py
+++ b/src/Mod/Arch/ArchServer.py
@@ -54,7 +54,7 @@ class _CommandBimserver:
try:
import requests
except:
- FreeCAD.Console.PrintError("requests python module not found, aborting.\n")
+ FreeCAD.Console.PrintError(translate("Arch","requests python module not found, aborting. Please install python-requests\n"))
else:
FreeCADGui.Control.showDialog(_BimServerTaskPanel())
@@ -87,7 +87,6 @@ class _BimServerTaskPanel:
return int(QtGui.QDialogButtonBox.Close)
def accept(self):
- FreeCADGui.Selection.removeObserver(self.observer)
FreeCADGui.Control.closeDialog()
def getPrefs(self):
@@ -135,8 +134,8 @@ class _BimServerTaskPanel:
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.")
+ FreeCAD.Console.PrintError(translate("Arch","Unable to connect to BimServer at")+" "+url+"\n")
+ self.form.labelStatus.setText(translate("Arch","Connection failed."))
return
if resp.ok:
try:
@@ -170,14 +169,14 @@ class _BimServerTaskPanel:
import requests
url,token = self.getPrefs()
if url and token:
- self.form.labelStatus.setText("Getting projects list...")
+ self.form.labelStatus.setText(translate("Arch","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.")
+ FreeCAD.Console.PrintError(translate("Arch","Unable to connect to BimServer at")+" "+url[:-5]+"\n")
+ self.form.labelStatus.setText(translate("Arch","Connection failed."))
return
if resp.ok:
try:
@@ -192,7 +191,7 @@ class _BimServerTaskPanel:
try:
projects = resp.json()["response"]["result"]
except:
- FreeCAD.Console.PrintError("Unable to get projects list from BimServer\n")
+ FreeCAD.Console.PrintError(translate("Arch","Unable to get projects list from BimServer\n"))
else:
self.setLogged(True)
self.form.comboProjects.clear()
@@ -213,7 +212,7 @@ class _BimServerTaskPanel:
url += "/json"
if (index >= 0) and (len(self.Projects) > index):
p = self.Projects[index]
- self.form.labelStatus.setText("Getting revisions...")
+ self.form.labelStatus.setText(translate("Arch","Getting revisions..."))
for rev in p["revisions"]:
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getRevision", "parameters": { "roid": rev } } }
resp = requests.post(url,json = data)
@@ -236,8 +235,8 @@ class _BimServerTaskPanel:
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...")
+ FreeCAD.Console.PrintMessage(translate("Arch","Downloading file from Bimserver...\n"))
+ self.form.labelStatus.setText(translate("Arch","Checking available serializers..."))
url += "/json"
serializer = None
for s in ["Ifc2x3tc1"]: # Ifc4 seems unreliable ATM, let's stick with good old Ifc2x3...
@@ -252,19 +251,19 @@ class _BimServerTaskPanel:
serializer = srl
break
if not serializer:
- FreeCAD.Console.PrintError("Unable to get a valid serializer from the BimServer\n")
+ FreeCAD.Console.PrintError(translate("Arch","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...")
+ self.form.labelStatus.setText(translate("Arch","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")
+ FreeCAD.Console.PrintError(translate("Arch","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)
@@ -272,11 +271,11 @@ class _BimServerTaskPanel:
try:
downloaddata = resp.json()["response"]["result"]["file"]
except:
- FreeCAD.Console.PrintError("Unable to download the data for this revision.\n")
+ FreeCAD.Console.PrintError(translate("Arch","Unable to download the data for this revision.\n"))
return
else:
- FreeCAD.Console.PrintMessage("Opening file...\n")
- self.form.labelStatus.setText("Opening file...")
+ FreeCAD.Console.PrintMessage(translate("Arch","Opening file...\n"))
+ self.form.labelStatus.setText(translate("Arch","Opening file..."))
if not tf:
tf = tempfile.mkstemp(suffix=".ifc")[1]
f = open(tf,"wb")
@@ -295,8 +294,8 @@ class _BimServerTaskPanel:
if url and token:
url += "/json"
deserializer = None
- FreeCAD.Console.PrintMessage("Saving file...\n")
- self.form.labelStatus.setText("Checking available deserializers...")
+ FreeCAD.Console.PrintMessage(translate("Arch","Saving file...\n"))
+ self.form.labelStatus.setText(translate("Arch","Checking available deserializers..."))
import ifcopenshell
schema = ifcopenshell.schema_identifier.lower()
data = { "token": token, "request": { "interface": "PluginInterface", "method": "getAllDeserializers", "parameters": { "onlyEnabled": "true" } } }
@@ -310,143 +309,170 @@ class _BimServerTaskPanel:
except:
pass
if not deserializer:
- FreeCAD.Console.PrintError("Unable to get a valid deserializer for the "+schema+" schema\n")
+ FreeCAD.Console.PrintError(translate("Arch","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)")
+ tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), translate("Arch","Save the IFC file before uploading?"), None, translate("Arch","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...")
+ self.form.labelStatus.setText(translate("Arch","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...")
+ FreeCAD.Console.PrintMessage(translate("Arch","Uploading file to Bimserver...\n"))
+ self.form.labelStatus.setText(translate("Arch","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")
+ FreeCAD.Console.PrintMessage(translate("Arch","File upload successful\n"))
self.getRevisions(self.form.comboProjects.currentIndex())
else:
- FreeCAD.Console.PrintError("File upload failed\n")
+ FreeCAD.Console.PrintError(translate("Arch","File upload failed\n"))
self.form.labelStatus.setText("")
+# GIT ###########################################################
+
+
+
class _CommandGit:
"the Arch Git Commit command definition"
def GetResources(self):
return {'Pixmap' : 'Git',
- 'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Commit with Git"),
- 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Commits the current document")}
+ 'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Git"),
+ 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Manages the current document with Git")}
def Activated(self):
f = FreeCAD.ActiveDocument.FileName
if not f:
- FreeCAD.Console.PrintError(translate("Arch","This document is not saved. Please save it first"))
+ FreeCAD.Console.PrintError(translate("Arch","This document is not saved. Please save it first.\n"))
return
try:
import git
except:
- FreeCAD.Console.PrintError(translate("Arch","The Python Git module was not found. Please install the python-git package."))
+ FreeCAD.Console.PrintError(translate("Arch","The Python Git module was not found. Please install the python-git package.\n"))
return
try:
repo = git.Repo(os.path.dirname(f))
except:
- FreeCAD.Console.PrintError(translate("Arch","This document doesn't appear to be part of a Git repository."))
+ FreeCAD.Console.PrintError(translate("Arch","This document doesn't appear to be part of a Git repository.\n"))
return
- pushOK = True
- if not repo.remotes:
- FreeCAD.Console.PrintWarning(translate("Arch","Warning: no remote repositories. Unable to push"))
- pushOK = False
- modified_files = repo.git.diff("--name-only").split()
- untracked_files = repo.git.ls_files("--other","--exclude-standard").split()
- if not os.path.basename(f) in modified_files:
- if not os.path.basename(f) in untracked_files:
- FreeCAD.Console.PrintError(translate("Arch","The Git repository cannot handle this document."))
- return
+ else:
+ FreeCADGui.Control.showDialog(_GitTaskPanel(repo))
+
+
+class _GitTaskPanel:
+
+ '''The TaskPanel for the Git command'''
+
+ def __init__(self,repo):
+ self.form = FreeCADGui.PySideUic.loadUi(":/ui/GitTaskPanel.ui")
+ self.form.setWindowIcon(QtGui.QIcon(":/icons/Git.svg"))
+ self.form.labelStatus.setText("")
+ QtCore.QObject.connect(self.form.buttonRefresh, QtCore.SIGNAL("clicked()"), self.getFiles)
+ QtCore.QObject.connect(self.form.buttonLog, QtCore.SIGNAL("clicked()"), self.getLog)
+ QtCore.QObject.connect(self.form.buttonSelectAll, QtCore.SIGNAL("clicked()"), self.form.listFiles.selectAll)
+ QtCore.QObject.connect(self.form.buttonDiff, QtCore.SIGNAL("clicked()"), self.getDiff)
+ QtCore.QObject.connect(self.form.buttonCommit, QtCore.SIGNAL("clicked()"), self.commit)
+ QtCore.QObject.connect(self.form.buttonPush, QtCore.SIGNAL("clicked()"), self.push)
+ QtCore.QObject.connect(self.form.buttonPull, QtCore.SIGNAL("clicked()"), self.pull)
+ self.repo = repo
+ self.getRemotes()
+ self.getFiles()
+
+ def getStandardButtons(self):
+ return int(QtGui.QDialogButtonBox.Close)
+
+ def accept(self):
+ FreeCADGui.Control.closeDialog()
+
+ def getFiles(self):
+ self.form.labelStatus.setText("")
+ self.form.listFiles.clear()
+ self.modified = self.repo.git.diff("--name-only").split()
+ self.untracked = self.repo.git.ls_files("--other","--exclude-standard").split()
+ for f in self.modified:
+ self.form.listFiles.addItem(f)
+ for f in self.untracked:
+ self.form.listFiles.addItem(f+" *")
+ self.form.labelStatus.setText(translate("Arch","Branch")+": "+self.repo.active_branch.name)
+
+ def getLog(self):
+ textform = FreeCADGui.PySideUic.loadUi(":/ui/DialogDisplayText.ui")
+ textform.setWindowTitle("Git log")
+ textform.browserText.setPlainText(self.repo.git.log())
+ textform.exec_()
+
+ def getDiff(self):
+ if (self.form.listFiles.currentRow() >= 0):
+ f = (self.modified+self.untracked)[self.form.listFiles.currentRow()]
+ textform = FreeCADGui.PySideUic.loadUi(":/ui/DialogDisplayText.ui")
+ textform.setWindowTitle("Diff: "+f)
+ textform.browserText.setPlainText(self.repo.git.diff(f))
+ textform.exec_()
- d = _ArchGitDialog()
- if not pushOK:
- d.checkBox.setChecked(False)
- d.checkBox.setEnabled(False)
- d.label.setText(str(len(modified_files)+len(untracked_files))+" modified file(s)")
- d.lineEdit.setText("Changed " + os.path.basename(f))
- r = d.exec_()
- if r:
- if d.radioButton_2.isChecked():
- for o in modified_files + untracked_files:
- repo.git.add(o)
- else:
- repo.git.add(os.path.basename(f))
- repo.git.commit(m=d.lineEdit.text())
- if d.checkBox.isChecked():
- repo.git.push()
-
-
-
-
-
-class _ArchGitDialog(QtGui.QDialog):
- def __init__(self):
- QtGui.QDialog.__init__(self)
- self.setObjectName("ArchGitOptions")
- self.resize(370, 200)
- self.verticalLayout = QtGui.QVBoxLayout(self)
- self.verticalLayout.setObjectName("verticalLayout")
- self.groupBox = QtGui.QGroupBox(self)
- self.groupBox.setObjectName("groupBox")
- self.vl3 = QtGui.QVBoxLayout(self.groupBox)
- self.vl3.setObjectName("vl3")
- self.label = QtGui.QLabel(self.groupBox)
- self.label.setObjectName("label")
- self.vl3.addWidget(self.label)
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.vl3.addLayout(self.horizontalLayout)
- self.horizontalLayout.setObjectName("horizontalLayout")
- self.radioButton_2 = QtGui.QRadioButton(self.groupBox)
- self.radioButton_2.setChecked(True)
- self.radioButton_2.setObjectName("radioButton_2")
- self.horizontalLayout.addWidget(self.radioButton_2)
- self.radioButton = QtGui.QRadioButton(self.groupBox)
- self.radioButton.setObjectName("radioButton")
- self.horizontalLayout.addWidget(self.radioButton)
- self.verticalLayout.addWidget(self.groupBox)
- self.groupBox_2 = QtGui.QGroupBox(self)
- self.groupBox_2.setObjectName("groupBox_2")
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2)
- self.verticalLayout_2.setObjectName("horizontalLayout_2")
- self.lineEdit = QtGui.QLineEdit(self.groupBox_2)
- self.lineEdit.setObjectName("lineEdit")
- self.verticalLayout_2.addWidget(self.lineEdit)
- self.checkBox = QtGui.QCheckBox(self.groupBox_2)
- self.checkBox.setChecked(True)
- self.checkBox.setObjectName("checkBox")
- self.verticalLayout_2.addWidget(self.checkBox)
- self.verticalLayout.addWidget(self.groupBox_2)
- self.buttonBox = QtGui.QDialogButtonBox(self)
- self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
- self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
- self.buttonBox.setObjectName("buttonBox")
- self.verticalLayout.addWidget(self.buttonBox)
-
- self.retranslateUi()
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
- QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
- QtCore.QMetaObject.connectSlotsByName(self)
-
- def retranslateUi(self):
- self.setWindowTitle(QtGui.QApplication.translate("ArchGitOptions", "Git Options", None, QtGui.QApplication.UnicodeUTF8))
- self.groupBox.setTitle(QtGui.QApplication.translate("ArchGitOptions", "What to commit", None, QtGui.QApplication.UnicodeUTF8))
- self.radioButton_2.setText(QtGui.QApplication.translate("ArchGitOptions", "All files in folder", None, QtGui.QApplication.UnicodeUTF8))
- self.radioButton.setText(QtGui.QApplication.translate("ArchGitOptions", "Only this .FcStd file", None, QtGui.QApplication.UnicodeUTF8))
- self.groupBox_2.setTitle(QtGui.QApplication.translate("ArchGitOptions", "Commit message", None, QtGui.QApplication.UnicodeUTF8))
- self.lineEdit.setText(QtGui.QApplication.translate("ArchGitOptions", "commit", None, QtGui.QApplication.UnicodeUTF8))
- self.checkBox.setText(QtGui.QApplication.translate("ArchGitOptions", "Push to default remote repository", None, QtGui.QApplication.UnicodeUTF8))
+ def getRemotes(self):
+ self.form.listRepos.clear()
+ if self.repo.remotes:
+ for r in self.repo.remotes:
+ self.form.listRepos.addItem(r.name+": "+r.url)
+ else:
+ FreeCAD.Console.PrintWarning(translate("Arch","Warning: no remote repositories.\n"))
+
+ def commit(self):
+ if not self.form.listFiles.selectedItems():
+ FreeCAD.Console.PrintError(translate("Arch","Please select file(s) to commit.\n"))
+ self.form.labelStatus.setText(translate("Arch","No file selected"))
+ return
+ if not self.form.editMessage.text():
+ FreeCAD.Console.PrintError(translate("Arch","Please write a commit message.\n"))
+ self.form.labelStatus.setText(translate("Arch","No commit message"))
+ return
+ for it in self.form.listFiles.selectedItems():
+ f = it.text()
+ if f[-2:] == " *":
+ f = f[:-2]
+ self.repo.git.add(f)
+ s = self.repo.git.commit(m=self.form.editMessage.text())
+ FreeCAD.Console.PrintMessage(translate("Arch","Successfully committed %i files.\n") % len(self.form.listFiles.selectedItems()))
+ self.form.labelStatus.setText(translate("Arch","Files committed."))
+ if s:
+ FreeCAD.Console.PrintMessage(s+"\n")
+ self.getFiles()
+
+ def push(self):
+ if len(self.form.listRepos.selectedItems()) != 1:
+ FreeCAD.Console.PrintError(translate("Arch","Please select a repo to push to.\n"))
+ self.form.labelStatus.setText(translate("Arch","No repo selected"))
+ return
+ self.form.labelStatus.setText(translate("Arch","Pushing files..."))
+ r = self.form.listRepos.selectedItems()[0].text().split(":")[0]
+ s = self.repo.git.push(r)
+ FreeCAD.Console.PrintMessage(translate("Arch","Successfully pushed to")+" "+r+"\n")
+ self.form.labelStatus.setText(translate("Arch","Files pushed."))
+ if s:
+ FreeCAD.Console.PrintMessage(s+"\n")
+ self.getFiles()
+
+ def pull(self):
+ if len(self.form.listRepos.selectedItems()) != 1:
+ FreeCAD.Console.PrintError(translate("Arch","Please select a repo to pull from.\n"))
+ self.form.labelStatus.setText(translate("Arch","No repo selected"))
+ return
+ self.form.labelStatus.setText(translate("Arch","Pulling files..."))
+ r = self.form.listRepos.selectedItems()[0].text().split(":")[0]
+ s = self.repo.git.pull(r)
+ FreeCAD.Console.PrintMessage(translate("Arch","Successfully pulled from")+" "+r+"\n")
+ self.form.labelStatus.setText(translate("Arch","Files pulled."))
+ if s:
+ FreeCAD.Console.PrintMessage(s+"\n")
+ if os.path.basename(FreeCAD.ActiveDocument.FileName) in s:
+ FreeCAD.Console.PrintWarning(translate("Arch","Warning: the current document file has been changed by this pull. Please save your document to keep your changes.\n"))
diff --git a/src/Mod/Arch/ArchStructure.py b/src/Mod/Arch/ArchStructure.py
index a551f1014..d3eb6b7fb 100644
--- a/src/Mod/Arch/ArchStructure.py
+++ b/src/Mod/Arch/ArchStructure.py
@@ -505,8 +505,9 @@ class _ViewProviderStructure(ArchComponent.ViewProviderComponent):
def getIcon(self):
import Arch_rc
if hasattr(self,"Object"):
- if self.Object.CloneOf:
- return ":/icons/Arch_Structure_Clone.svg"
+ if hasattr(self.Object,"CloneOf"):
+ if self.Object.CloneOf:
+ return ":/icons/Arch_Structure_Clone.svg"
return ":/icons/Arch_Structure_Tree.svg"
def updateData(self,obj,prop):
diff --git a/src/Mod/Arch/Resources/Arch.qrc b/src/Mod/Arch/Resources/Arch.qrc
index ff7e4f1fe..f8ea1d051 100644
--- a/src/Mod/Arch/Resources/Arch.qrc
+++ b/src/Mod/Arch/Resources/Arch.qrc
@@ -80,6 +80,7 @@
ui/BimServerTaskPanel.ui
ui/GitTaskPanel.ui
ui/DialogBimServerLogin.ui
+ ui/DialogDisplayText.ui
translations/Arch_af.qm
translations/Arch_de.qm
translations/Arch_fi.qm
diff --git a/src/Mod/Arch/Resources/ui/DialogDisplayText.ui b/src/Mod/Arch/Resources/ui/DialogDisplayText.ui
new file mode 100644
index 000000000..fbfde8cb4
--- /dev/null
+++ b/src/Mod/Arch/Resources/ui/DialogDisplayText.ui
@@ -0,0 +1,67 @@
+
+
+ Dialog
+
+
+
+ 0
+ 0
+ 372
+ 286
+
+
+
+ Dialog
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Close
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ Dialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ Dialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/src/Mod/Arch/Resources/ui/GitTaskPanel.ui b/src/Mod/Arch/Resources/ui/GitTaskPanel.ui
index 833504530..8781adc2f 100644
--- a/src/Mod/Arch/Resources/ui/GitTaskPanel.ui
+++ b/src/Mod/Arch/Resources/ui/GitTaskPanel.ui
@@ -6,12 +6,12 @@
0
0
- 228
- 494
+ 255
+ 516
- Form
+ Git
-
@@ -21,53 +21,9 @@
-
-
-
-
-
-
-
-
- 255
- 0
- 0
-
-
-
-
-
-
-
-
- 255
- 0
- 0
-
-
-
-
-
-
-
-
- 103
- 103
- 103
-
-
-
-
-
-
+
- Warning
-
-
-
- -
-
-
- List of files to be committed:
+
@@ -103,7 +59,18 @@
-
-
+
+
+ List of files to be committed:
+
+
+
+ -
+
+
+ QAbstractItemView::MultiSelection
+
+
-
@@ -120,6 +87,13 @@
+ -
+
+
+ Diff
+
+
+
-