Merge pull request #9 from specklesystems/2.18

2.18
This commit is contained in:
KatKatKateryna
2024-02-06 03:20:48 +08:00
committed by GitHub
34 changed files with 275 additions and 146 deletions
+5 -1
View File
@@ -3,7 +3,11 @@ import inspect
from typing import List, Optional, Tuple, Union, Any
import webbrowser
from speckle.utils.panel_logging import logToUser
try:
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from specklepy.core.api.credentials import get_local_accounts
+28 -13
View File
@@ -9,19 +9,34 @@ import webbrowser
from specklepy.logging import metrics
from specklepy.core.api.credentials import Account
from specklepy_qt_ui.qt_ui.global_resources import (
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
BACKGR_COLOR_GREY,
BACKGR_COLOR_TRANSPARENT,
BACKGR_COLOR_HIGHLIGHT,
NEW_GREY,
NEW_GREY_HIGHLIGHT,
BACKGR_ERROR_COLOR,
BACKGR_ERROR_COLOR_LIGHT,
)
from specklepy_qt_ui.qt_ui.widget_dependencies_upgrade import DependenciesUpgradeDialog
from specklepy_qt_ui.qt_ui.widget_report import ReportDialog
try:
from specklepy_qt_ui.qt_ui.utils.global_resources import (
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
BACKGR_COLOR_GREY,
BACKGR_COLOR_TRANSPARENT,
BACKGR_COLOR_HIGHLIGHT,
NEW_GREY,
NEW_GREY_HIGHLIGHT,
BACKGR_ERROR_COLOR,
BACKGR_ERROR_COLOR_LIGHT,
)
from specklepy_qt_ui.qt_ui.widget_dependencies_upgrade import DependenciesUpgradeDialog
from specklepy_qt_ui.qt_ui.widget_report import ReportDialog
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.utils.global_resources import (
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
BACKGR_COLOR_GREY,
BACKGR_COLOR_TRANSPARENT,
BACKGR_COLOR_HIGHLIGHT,
NEW_GREY,
NEW_GREY_HIGHLIGHT,
BACKGR_ERROR_COLOR,
BACKGR_ERROR_COLOR_LIGHT,
)
from speckle.specklepy_qt_ui.qt_ui.widget_dependencies_upgrade import DependenciesUpgradeDialog
from speckle.specklepy_qt_ui.qt_ui.widget_report import ReportDialog
class LogWidget(QWidget):
+65 -31
View File
@@ -4,37 +4,71 @@ from copy import copy
import inspect
import os
from specklepy_qt_ui.qt_ui.widget_transforms import MappingSendDialog
from specklepy_qt_ui.qt_ui.LogWidget import LogWidget
from specklepy_qt_ui.qt_ui.logger import logToUser
from specklepy_qt_ui.qt_ui.utils import constructCommitURL
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.global_resources import (
COLOR_HIGHLIGHT,
SPECKLE_COLOR,
SPECKLE_COLOR_LIGHT,
ICON_OPEN_WEB,
ICON_REPORT,
ICON_LOGO,
ICON_SEARCH,
ICON_DELETE,
ICON_DELETE_BLUE,
ICON_SEND,
ICON_RECEIVE,
ICON_SEND_BLACK,
ICON_RECEIVE_BLACK,
ICON_SEND_BLUE,
ICON_RECEIVE_BLUE,
COLOR,
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
ICON_XXL,
ICON_RASTER,
ICON_POLYGON,
ICON_LINE,
ICON_POINT,
ICON_GENERIC,
)
try:
from specklepy_qt_ui.qt_ui.widget_transforms import MappingSendDialog
from specklepy_qt_ui.qt_ui.LogWidget import LogWidget
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
from specklepy_qt_ui.qt_ui.utils.utils import constructCommitURL
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.utils.global_resources import (
COLOR_HIGHLIGHT,
SPECKLE_COLOR,
SPECKLE_COLOR_LIGHT,
ICON_OPEN_WEB,
ICON_REPORT,
ICON_LOGO,
ICON_SEARCH,
ICON_DELETE,
ICON_DELETE_BLUE,
ICON_SEND,
ICON_RECEIVE,
ICON_SEND_BLACK,
ICON_RECEIVE_BLACK,
ICON_SEND_BLUE,
ICON_RECEIVE_BLUE,
COLOR,
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
ICON_XXL,
ICON_RASTER,
ICON_POLYGON,
ICON_LINE,
ICON_POINT,
ICON_GENERIC,
)
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.widget_transforms import MappingSendDialog
from speckle.specklepy_qt_ui.qt_ui.LogWidget import LogWidget
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from speckle.specklepy_qt_ui.qt_ui.utils.utils import constructCommitURL
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from speckle.specklepy_qt_ui.qt_ui.utils.global_resources import (
COLOR_HIGHLIGHT,
SPECKLE_COLOR,
SPECKLE_COLOR_LIGHT,
ICON_OPEN_WEB,
ICON_REPORT,
ICON_LOGO,
ICON_SEARCH,
ICON_DELETE,
ICON_DELETE_BLUE,
ICON_SEND,
ICON_RECEIVE,
ICON_SEND_BLACK,
ICON_RECEIVE_BLACK,
ICON_SEND_BLUE,
ICON_RECEIVE_BLUE,
COLOR,
BACKGR_COLOR,
BACKGR_COLOR_LIGHT,
ICON_XXL,
ICON_RASTER,
ICON_POLYGON,
ICON_LINE,
ICON_POINT,
ICON_GENERIC,
)
from specklepy.logging.exceptions import SpeckleException, GraphQLException
from specklepy.logging import metrics
+14 -4
View File
@@ -50,14 +50,24 @@ except:
# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer
from specklepy_qt_ui.qt_ui.global_resources import (
try:
from specklepy_qt_ui.qt_ui.global_resources import (
COLOR_HIGHLIGHT,
SPECKLE_COLOR, SPECKLE_COLOR_LIGHT,
ICON_LOGO, ICON_SEARCH, ICON_DELETE, ICON_DELETE_BLUE,
ICON_SEND, ICON_RECEIVE, ICON_SEND_BLACK, ICON_RECEIVE_BLACK,
ICON_SEND_BLUE, ICON_RECEIVE_BLUE,
COLOR, BACKGR_COLOR, BACKGR_COLOR_LIGHT,
)
)
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.global_resources import (
COLOR_HIGHLIGHT,
SPECKLE_COLOR, SPECKLE_COLOR_LIGHT,
ICON_LOGO, ICON_SEARCH, ICON_DELETE, ICON_DELETE_BLUE,
ICON_SEND, ICON_RECEIVE, ICON_SEND_BLACK, ICON_RECEIVE_BLACK,
ICON_SEND_BLUE, ICON_RECEIVE_BLUE,
COLOR, BACKGR_COLOR, BACKGR_COLOR_LIGHT,
)
ui_class = uic.loadUiType(
os.path.join(os.path.dirname(__file__), os.path.join("ui", "mainWindow.ui") )
@@ -416,7 +426,7 @@ class SpeckleGISDialog(QMainWindow):
try:
from speckle.ui.project_vars import set_project_layer_selection
except:
from speckle_toolbox.esri.toolboxes.speckle.ui.project_vars import set_project_layer_selection
from speckle_toolbox.esri.toolboxes.speckle.speckle.ui.project_vars import set_project_layer_selection
try:
self.layersWidget.clear()
@@ -518,7 +528,7 @@ class SpeckleGISDialog(QMainWindow):
try:
from speckle.ui.project_vars import set_project_streams
except:
from speckle_toolbox.esri.toolboxes.speckle.ui.project_vars import set_project_streams
from speckle_toolbox.esri.toolboxes.speckle.speckle.ui.project_vars import set_project_streams
try:
if not self: return
View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 345 B

After

Width:  |  Height:  |  Size: 345 B

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

+4 -1
View File
@@ -1,4 +1,7 @@
from specklepy_qt_ui.qt_ui.utils import splitTextIntoLines
try:
from specklepy_qt_ui.qt_ui.utils.utils import splitTextIntoLines
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.utils.utils import splitTextIntoLines
def logToUser(
+8 -4
View File
@@ -2,9 +2,14 @@ import inspect
import os
from typing import List, Union
import urllib.parse
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.logger import logToUser
try:
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
from specklepy_qt_ui.qt_ui.utils.utils import constructCommitURLfromServerCommit
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from speckle.specklepy_qt_ui.qt_ui.utils.utils import constructCommitURLfromServerCommit
from PyQt5 import QtWidgets, uic, QtCore
from PyQt5.QtCore import pyqtSignal
@@ -16,7 +21,6 @@ from specklepy.core.api.credentials import get_local_accounts # , StreamWrapper
from specklepy.core.api.wrapper import StreamWrapper
from specklepy.logging import metrics
from specklepy_qt_ui.qt_ui.utils import constructCommitURLfromServerCommit
# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer
FORM_CLASS, _ = uic.loadUiType(
+5 -1
View File
@@ -1,7 +1,11 @@
import inspect
import os
from typing import List, Tuple, Union
from specklepy_qt_ui.qt_ui.logger import logToUser
try:
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from PyQt5 import QtWidgets, uic, QtCore
from PyQt5.QtCore import pyqtSignal
+5 -1
View File
@@ -1,7 +1,11 @@
import inspect
import os
from typing import List, Tuple, Union
from specklepy_qt_ui.qt_ui.logger import logToUser
try:
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from PyQt5 import QtWidgets, uic, QtCore
from PyQt5.QtCore import pyqtSignal
+64 -44
View File
@@ -1,80 +1,90 @@
import inspect
import os
from typing import List, Tuple, Union
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.logger import logToUser
try:
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.utils.logger import logToUser
from specklepy_qt_ui.qt_ui.utils.global_resources import COLOR
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from speckle.specklepy_qt_ui.qt_ui.utils.logger import logToUser
from speckle.specklepy_qt_ui.qt_ui.utils.global_resources import COLOR
from PyQt5 import QtWidgets, uic, QtCore
from PyQt5.QtWidgets import QCheckBox, QListWidgetItem, QHBoxLayout, QWidget
from PyQt5.QtWidgets import QCheckBox, QListWidgetItem, QHBoxLayout, QWidget
from PyQt5.QtCore import pyqtSignal
from specklepy.core.api.client import SpeckleClient
from specklepy_qt_ui.qt_ui.global_resources import COLOR
# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer
FORM_CLASS, _ = uic.loadUiType(
os.path.join(os.path.join(os.path.dirname(__file__), "ui", "custom_crs.ui") )
os.path.join(os.path.join(os.path.dirname(__file__), "ui", "custom_crs.ui"))
)
class CustomCRSDialog(QtWidgets.QWidget, FORM_CLASS):
class CustomCRSDialog(QtWidgets.QWidget, FORM_CLASS):
name_field: QtWidgets.QLineEdit = None
description_field: QtWidgets.QLineEdit = None
dialog_button_box: QtWidgets.QDialogButtonBox = None
saveSurveyPoint: QtWidgets.QPushButton = None
speckle_client: Union[SpeckleClient, None] = None
dataStorage: DataStorage = None
dataStorage: DataStorage = None
#Events
#handleCRSCreate = pyqtSignal(str,str)
# Events
# handleCRSCreate = pyqtSignal(str,str)
def __init__(self, parent=None):
super(CustomCRSDialog,self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
super(CustomCRSDialog, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
self.setupUi(self)
self.setWindowTitle("Set project center on Send/Receive")
#self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Close).clicked.connect(self.onCancelClicked)
self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Cancel).setText("More Info")
self.setWindowTitle("Set project center on Send/Receive")
# self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Close).clicked.connect(self.onCancelClicked)
self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Cancel).setText(
"More Info"
)
self.modeDropdown.currentIndexChanged.connect(self.onModeChanged)
def onModeChanged(self):
try:
if not self: return
if not self:
return
index = self.modeDropdown.currentIndex()
if index == 1: # custom crs
if index == 1: # custom crs
self.surveyPointLat.show()
self.surveyPointLon.show()
self.degreeSignX.show()
self.degreeSignY.show()
self.label_survey.show()
self.offsetX.hide()
self.offsetY.hide()
self.label_offsets.hide()
self.offsetXDegreeSign.hide()
self.offsetYDegreeSign.hide()
self.description.setText("Use this option when you don't have to use a specific CRS.\
self.description.setText(
"Use this option when you don't have to use a specific CRS.\
\n\nThis will change your Project CRS to a new custom CRS.\
\n\nHint: right-click on the canvas -> Copy Coordinate -> EPSG:4326. ")
\n\nHint: right-click on the canvas -> Copy Coordinate -> EPSG:4326. "
)
elif index == 0: # offsets
elif index == 0: # offsets
self.surveyPointLat.hide()
self.surveyPointLon.hide()
self.degreeSignX.hide()
self.degreeSignY.hide()
self.label_survey.hide()
self.offsetX.show()
self.offsetY.show()
self.label_offsets.show()
#if self.dataStorage.currentOriginalUnits == 'degrees':
# if self.dataStorage.currentOriginalUnits == 'degrees':
self.offsetXDegreeSign.show()
self.offsetYDegreeSign.show()
units = self.dataStorage.currentOriginalUnits
if units == 'degrees':
if units == "degrees":
self.offsetXDegreeSign.setText("°")
self.offsetYDegreeSign.setText("°")
elif units is not None:
@@ -83,49 +93,56 @@ class CustomCRSDialog(QtWidgets.QWidget, FORM_CLASS):
else:
self.offsetXDegreeSign.hide()
self.offsetYDegreeSign.hide()
text = f"Use this option when your project requires a use of a specific CRS. \
\n\nThis will only affect Speckle data properties, not your Project CRS.\
\n\nHint: your current project CRS is '{self.dataStorage.currentCRS.authid()}' and using units '{self.dataStorage.currentOriginalUnits}'."
if units == 'degrees':
if units == "degrees":
text += "\nThis CRS is not recommended if data was sent or needs to be \
\nreceived in a non-GIS application."
self.description.setText(text)
self.populateSurveyPoint()
self.populateOffsets()
self.populateRotation()
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3])
logToUser(e, level=2, func=inspect.stack()[0][3])
return
def populateModeDropdown(self):
if not self: return
if not self:
return
try:
self.modeDropdown.clear()
self.modeDropdown.addItems(
["Add offsets / rotation to the current Project CRS", "Create custom CRS"]
[
"Add offsets / rotation to the current Project CRS",
"Create custom CRS",
]
)
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3], plugin=self)
logToUser(e, level=2, func=inspect.stack()[0][3], plugin=self)
return
def populateSurveyPoint(self):
if not self:
return
try:
self.surveyPointLat.clear()
self.surveyPointLon.clear()
if self.dataStorage.custom_lat is not None and self.dataStorage.custom_lon is not None:
if (
self.dataStorage.custom_lat is not None
and self.dataStorage.custom_lon is not None
):
self.surveyPointLat.setText(str(self.dataStorage.custom_lat))
self.surveyPointLon.setText(str(self.dataStorage.custom_lon))
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3], plugin=self)
logToUser(e, level=2, func=inspect.stack()[0][3], plugin=self)
return
def populateRotation(self):
if not self:
return
@@ -134,19 +151,22 @@ class CustomCRSDialog(QtWidgets.QWidget, FORM_CLASS):
if self.dataStorage.crs_rotation is not None:
self.rotation.setText(str(self.dataStorage.crs_rotation))
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3], plugin=self)
logToUser(e, level=2, func=inspect.stack()[0][3], plugin=self)
return
def populateOffsets(self):
try:
self.offsetX.clear()
self.offsetY.clear()
if self.dataStorage.crs_offset_x is not None and self.dataStorage.crs_offset_y is not None:
if (
self.dataStorage.crs_offset_x is not None
and self.dataStorage.crs_offset_y is not None
):
self.offsetX.setText(str(self.dataStorage.crs_offset_x))
self.offsetY.setText(str(self.dataStorage.crs_offset_y))
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3], plugin=self)
logToUser(e, level=2, func=inspect.stack()[0][3], plugin=self)
return
def onOkClicked(self):
@@ -154,5 +174,5 @@ class CustomCRSDialog(QtWidgets.QWidget, FORM_CLASS):
try:
self.close()
except Exception as e:
logToUser(e, level = 2, func = inspect.stack()[0][3])
logToUser(e, level=2, func=inspect.stack()[0][3])
return
+5 -1
View File
@@ -3,7 +3,11 @@ import urllib3
import requests
import requests_toolbelt
from specklepy.logging import metrics
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
try:
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from PyQt5 import QtWidgets, uic, QtCore
+67 -44
View File
@@ -1,70 +1,79 @@
import inspect
import os
from typing import List, Tuple, Union
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
#from specklepy_qt_ui.qt_ui.logger import logToUser
try:
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from specklepy_qt_ui.qt_ui.utils.global_resources import COLOR
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from speckle.specklepy_qt_ui.qt_ui.utils.global_resources import COLOR
# from specklepy_qt_ui.qt_ui.utils.logger import logToUser
from PyQt5 import QtWidgets, uic, QtCore
from PyQt5.QtWidgets import QCheckBox, QListWidgetItem, QHBoxLayout, QWidget
from PyQt5.QtWidgets import QCheckBox, QListWidgetItem, QHBoxLayout, QWidget
from PyQt5.QtCore import pyqtSignal
from specklepy.core.api.client import SpeckleClient
from specklepy_qt_ui.qt_ui.global_resources import COLOR
# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer
FORM_CLASS, _ = uic.loadUiType(
os.path.join(os.path.join(os.path.dirname(__file__), "ui", "report.ui") )
os.path.join(os.path.join(os.path.dirname(__file__), "ui", "report.ui"))
)
class ReportDialog(QtWidgets.QWidget, FORM_CLASS):
class ReportDialog(QtWidgets.QWidget, FORM_CLASS):
report_label: QtWidgets.QLabel = None
report_text: QtWidgets.QTextEdit = None
dataStorage: DataStorage = None
def __init__(self, parent=None):
super(ReportDialog,self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
super(ReportDialog, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
self.setupUi(self)
self.runAllSetup()
def runAllSetup(self):
self.setWindowTitle("Report (Speckle)")
self.setWindowTitle("Report (Speckle)")
self.setMinimumWidth(500)
self.setMinimumHeight(600)
self.report_label.setWordWrap(True)
self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self.onOkClicked)
self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(
self.onOkClicked
)
return
#self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Cancel).setText("More Info")
# self.dialog_button_box.button(QtWidgets.QDialogButtonBox.Cancel).setText("More Info")
def assembleReport(self):
try:
if self.dataStorage is None: return
if self.dataStorage is None:
return
reportList = self.dataStorage.latestActionReport
if reportList is None: return
if reportList is None:
return
operation = ""
total_layers = 0
total_objects = 0
text = ""
sending = True
# details
# details
last_report = ""
last_report += "Details:" + "\n"
for item in reportList:
line = ""
try: # if sending
try: # if sending
line += f'{item["feature_id"]}: {item["obj_type"]}'
operation = f"Sent at {self.dataStorage.latestActionTime}"
except: # if receiving
except: # if receiving
sending = False
line += f'{item["speckle_id"]}: {item["obj_type"]}'
operation = f"Received at {self.dataStorage.latestActionTime}"
# edit based on the type
# edit based on the type
if "Layer" in item["obj_type"]:
total_layers += 1
if item["errors"] != "":
@@ -75,61 +84,75 @@ class ReportDialog(QtWidgets.QWidget, FORM_CLASS):
if item["errors"] != "":
line += f', errors: {item["errors"]}'
line = "" + line[1:]
else: total_objects += 1
else:
total_objects += 1
line = "__ " + line
last_report += line + "\n"
text += f"Operation: {operation}\n"
text += f"Total: {total_layers} layer{'' if str(total_layers).endswith('1') else 's'}, {total_objects} feature{'' if str(total_objects).endswith('1') else 's'}\n\n"
if sending is False:
if sending is False:
try:
text += f"Host application: {self.dataStorage.latestHostApp}\n\n"
except: pass
except:
pass
# layers and transformations (if applicable)
text += "Layers and transformations (if applicable):" + "\n"
for i, layer in enumerate(self.dataStorage.latestActionLayers):
#print(self.dataStorage.latestActionLayers)
name = layer #if isinstance(layer, str) else layer.name()
try:
# print(self.dataStorage.latestActionLayers)
name = layer # if isinstance(layer, str) else layer.name()
try:
transformExists = 0
for item in self.dataStorage.savedTransforms:
layer_name = item.split(" -> ")[0].split(" (\'")[0]
layer_name = item.split(" -> ")[0].split(" ('")[0]
transform_name = item.split(" -> ")[1]
if layer_name == name:
text += f"{i+1}. {layer_name} -> '{transform_name}'" + "\n"
text += (
f"{i+1}. {layer_name} -> '{transform_name}'" + "\n"
)
transformExists += 1
break
if transformExists==0:
break
if transformExists == 0:
text += f"{i+1}. {name} \n"
except Exception as e: print(e)
text += "\n"
except Exception as e:
print(e)
text += "\n"
# add info about the offsets
text += "Project CRS: " + self.dataStorage.project.crs().authid() + "\n"
units = self.dataStorage.latestActionUnits
text += "Project CRS units: " + units + f"{' (not supported, treated as Meters)' if 'degrees' in units else ''}" + "\n"
text += "Project CRS WKT: \n" + self.dataStorage.project.crs().toWkt() + "\n\n"
text += f"CRS offsets: x={self.dataStorage.crs_offset_x}, y={self.dataStorage.crs_offset_y}" + "\n"
text += f"CRS rotation: {self.dataStorage.crs_rotation}°" + "\n\n"
text += (
"Project CRS units: "
+ units
+ f"{' (not supported, treated as Meters)' if 'degrees' in units else ''}"
+ "\n"
)
text += (
"Project CRS WKT: \n" + self.dataStorage.project.crs().toWkt() + "\n\n"
)
text += (
f"CRS offsets: x={self.dataStorage.crs_offset_x}, y={self.dataStorage.crs_offset_y}"
+ "\n"
)
text += f"CRS rotation: {self.dataStorage.crs_rotation}°" + "\n\n"
text += last_report
return operation, total_layers, total_objects, text
return operation, total_layers, total_objects, text
except Exception as e:
print(e)
return
return
def applyReport(self):
def applyReport(self):
result = self.assembleReport()
if result is None:
print("no report generated")
return
return
operation, total_layers, total_objects, report = result
#self.report_label.setText(f"Operation: {operation}\nTotal: {total_layers} layer{'' if str(total_layers).endswith('1') else 's'}, {total_objects} feature{'' if str(total_objects).endswith('1') else 's'}")
# self.report_label.setText(f"Operation: {operation}\nTotal: {total_layers} layer{'' if str(total_layers).endswith('1') else 's'}, {total_objects} feature{'' if str(total_objects).endswith('1') else 's'}")
self.report_text.setText(report)
def onOkClicked(self):
self.close()
+5 -1
View File
@@ -1,6 +1,10 @@
import os
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
try:
from specklepy_qt_ui.qt_ui.DataStorage import DataStorage
except ModuleNotFoundError:
from speckle.specklepy_qt_ui.qt_ui.DataStorage import DataStorage
from PyQt5 import QtWidgets, uic, QtCore