AutoFTG-Scripts_Metashape-Pro/AutoFTG/autoftg_batch.py
2023-08-04 19:35:27 +02:00

2012 lines
86 KiB
Python

# AutoFTG - Scripts for Agisoft Metashape Pro
#
# Dialog: Batch Chunk Creator - Main Window
# ----------------------------------------------------------------
import os
import shutil
import sys
import time
import datetime
import subprocess
import csv
from configparser import ConfigParser
from datetime import datetime
from os import path
#import Metashape
import Metashape
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
import AutoFTG.autoftg_main as autoftg_main
from AutoFTG.autoftg_batch_setmesh import *
from AutoFTG.autoftg_batch_setalign import *
from AutoFTG.autoftg_batch_setpointc import *
from AutoFTG.qtresources_rc2 import *
# create definition for replacing comma with space character
FILEBROWSER_PATH = os.path.join(os.getenv('WINDIR'), 'explorer.exe')
chunkSet = ""
logArchive = []
class Ui_DialogBatchChunk(QtWidgets.QDialog):
def __init__(self, parent):
QtWidgets.QDialog.__init__(self, parent)
self.sel_items = []
self.itemDef = autoftg_main.projCfg.get("PROJECT SETTINGS", "default_chunk_def")
self.itemDefFolder = autoftg_main.menuCfg.get(self.itemDef, "work_folder")
self.itemDefFolderName = self.itemDefFolder.split(os.sep)[-1]
self.setObjectName(u"DialogBatchChunk")
self.resize(920, 725)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
self.setSizePolicy(sizePolicy)
self.setMinimumSize(QSize(920, 750))
self.setMaximumSize(QSize(920, 750))
self.setWindowTitle(u"Batch Chunk Creator")
appIcon = QIcon()
appIcon.addFile(u":/icons/AutoFTG-appicon.png", QSize(), QIcon.Normal, QIcon.Off)
self.setWindowIcon(appIcon)
self.verticalLayoutWidget = QWidget(self)
self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
self.verticalLayoutWidget.setGeometry(QRect(0, 0, 921, 751))
self.verticalLayout_2 = QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout_2.setSpacing(6)
self.verticalLayout_2.setContentsMargins(10, 10, 10, 10)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.setSizeConstraint(QLayout.SetDefaultConstraint)
self.verticalLayout_2.setContentsMargins(10, 5, 10, 5)
self.horizontalLayout_9 = QHBoxLayout()
self.horizontalLayout_9.setSpacing(5)
self.horizontalLayout_9.setObjectName(u"horizontalLayout_9")
self.horizontalLayout_9.setSizeConstraint(QLayout.SetDefaultConstraint)
self.label_15 = QLabel(self.verticalLayoutWidget)
self.label_15.setObjectName(u"label_15")
sizePolicy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_15.sizePolicy().hasHeightForWidth())
self.label_15.setSizePolicy(sizePolicy)
self.label_15.setMaximumSize(QSize(32, 32))
self.label_15.setPixmap(QPixmap(u":/icons/icons8-apps-tab-50.png"))
self.label_15.setScaledContents(True)
self.horizontalLayout_9.addWidget(self.label_15)
self.label_3 = QLabel(self.verticalLayoutWidget)
self.label_3.setObjectName(u"label_3")
sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
self.label_3.setSizePolicy(sizePolicy1)
self.label_3.setMaximumSize(QSize(16777215, 30))
font1 = QFont()
font1.setFamily(u"Segoe UI")
font1.setPointSize(16)
font1.setBold(False)
font1.setItalic(False)
font1.setUnderline(False)
font1.setWeight(50)
self.label_3.setFont(font1)
self.label_3.setText(u"Batch Chunk Creator")
self.horizontalLayout_9.addWidget(self.label_3)
self.verticalLayout_2.addLayout(self.horizontalLayout_9)
self.line_4 = QFrame(self.verticalLayoutWidget)
self.line_4.setObjectName(u"line_4")
self.line_4.setFrameShadow(QFrame.Plain)
self.line_4.setFrameShape(QFrame.HLine)
self.verticalLayout_2.addWidget(self.line_4)
self.gridLayout = QGridLayout()
self.gridLayout.setSpacing(5)
self.gridLayout.setObjectName(u"gridLayout")
self.treeWidget = QTreeWidget(self.verticalLayoutWidget)
font2 = QFont()
font2.setBold(True)
font2.setWeight(75)
icon1 = QIcon()
icon1.addFile(u":/icons/icons8-camera-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(1, "")
icon2 = QIcon()
icon2.addFile(u":/icons/icons8-map-pin-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(2, "")
icon3 = QIcon()
icon3.addFile(u":/icons/icons8-sd-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(3, "")
icon4 = QIcon()
icon4.addFile(u":/icons/icons8-bursts-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(4, "")
icon5 = QIcon()
icon5.addFile(u":/icons/icons8-mesh-48.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(5, "")
icon6 = QIcon()
icon6.addFile(u":/icons/icons8-cloud-development-48.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(6, "")
iconProcess = QIcon()
iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.headerItem().setText(7, "")
__qtreewidgetitem = QTreeWidgetItem()
__qtreewidgetitem.setIcon(7, iconProcess);
__qtreewidgetitem.setIcon(6, icon6);
__qtreewidgetitem.setIcon(5, icon5);
__qtreewidgetitem.setIcon(4, icon4);
__qtreewidgetitem.setTextAlignment(3, Qt.AlignLeading|Qt.AlignVCenter);
__qtreewidgetitem.setIcon(3, icon3);
__qtreewidgetitem.setTextAlignment(2, Qt.AlignLeading|Qt.AlignVCenter);
__qtreewidgetitem.setIcon(2, icon2);
__qtreewidgetitem.setTextAlignment(1, Qt.AlignLeading|Qt.AlignVCenter);
__qtreewidgetitem.setIcon(1, icon1);
__qtreewidgetitem.setText(0, u"Folders");
__qtreewidgetitem.setTextAlignment(0, Qt.AlignLeading|Qt.AlignVCenter);
__qtreewidgetitem.setFont(0, font2);
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(6, u"Point Cloud");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(5, u"Mesh Model");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(4, u"Aligned");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(3, u"Import");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(2, u"Points");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(1, u"Images");
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(tooltip)
__qtreewidgetitem.setToolTip(0, u"Folders");
#endif // QT_CONFIG(tooltip)
self.treeWidget.setHeaderItem(__qtreewidgetitem)
icon7 = QIcon()
icon7.addFile(u":/icons/icons8-folder-tree-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon8 = QIcon()
icon8.addFile(u":/icons/icons8-folder-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon9 = QIcon()
icon9.addFile(u":/icons/icons8-add-camera-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon10 = QIcon()
icon10.addFile(u":/icons/icons8-location-off-48.png", QSize(), QIcon.Normal, QIcon.Off)
icon11 = QIcon()
icon11.addFile(u":/icons/icons8-done-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon12 = QIcon()
icon12.addFile(u":/icons/icons8-no-camera-96.png", QSize(), QIcon.Normal, QIcon.Off)
icon13 = QIcon()
icon13.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Normal, QIcon.Off)
font3 = QFont()
font3.setFamily(u"Segoe UI")
icon14 = QIcon()
icon14.addFile(u":/icons/icons8-check-file-50.png", QSize(), QIcon.Normal, QIcon.Off)
brush = QBrush(QColor(255, 254, 222, 255))
brush.setStyle(Qt.SolidPattern)
icon15 = QIcon()
icon15.addFile(u":/icons/icons8-my-location-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon16 = QIcon()
icon16.addFile(u":/icons/icons8-microsoft-todo-2019-48.png", QSize(), QIcon.Normal, QIcon.Off)
self.treeWidget.setObjectName(u"treeWidget")
sizePolicy2 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Expanding)
sizePolicy2.setHorizontalStretch(0)
sizePolicy2.setVerticalStretch(0)
sizePolicy2.setHeightForWidth(self.treeWidget.sizePolicy().hasHeightForWidth())
self.treeWidget.setSizePolicy(sizePolicy2)
self.treeWidget.setMinimumSize(QSize(580, 520))
self.treeWidget.setMaximumSize(QSize(16777215, 520))
self.treeWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.treeWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.treeWidget.setAutoScrollMargin(20)
self.treeWidget.setTabKeyNavigation(True)
self.treeWidget.setProperty("showDropIndicator", False)
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.treeWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
self.treeWidget.setIconSize(QSize(20, 20))
self.treeWidget.setUniformRowHeights(True)
self.treeWidget.setSortingEnabled(True)
self.treeWidget.setAllColumnsShowFocus(True)
self.treeWidget.header().setVisible(True)
self.treeWidget.header().setDefaultSectionSize(39)
self.treeWidget.header().setStretchLastSection(True)
self.gridLayout.addWidget(self.treeWidget, 2, 0, 1, 1)
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setSpacing(5)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.horizontalLayout_2.setSizeConstraint(QLayout.SetDefaultConstraint)
self.label_2 = QLabel(self.verticalLayoutWidget)
self.label_2.setObjectName(u"label_2")
sizePolicy3 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
sizePolicy3.setHorizontalStretch(0)
sizePolicy3.setVerticalStretch(0)
sizePolicy3.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy3)
self.label_2.setMinimumSize(QSize(0, 24))
self.label_2.setMaximumSize(QSize(16777215, 24))
font4 = QFont()
font4.setFamily(u"Segoe UI")
font4.setPointSize(12)
font4.setBold(True)
font4.setWeight(75)
self.label_2.setFont(font4)
self.label_2.setText(u"Data Folders")
self.label_2.setIndent(5)
self.horizontalLayout_2.addWidget(self.label_2)
self.checkBox_4 = QCheckBox(self.verticalLayoutWidget)
self.checkBox_4.setObjectName(u"checkBox_4")
sizePolicy4 = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
sizePolicy4.setHorizontalStretch(0)
sizePolicy4.setVerticalStretch(0)
sizePolicy4.setHeightForWidth(self.checkBox_4.sizePolicy().hasHeightForWidth())
self.checkBox_4.setSizePolicy(sizePolicy4)
self.checkBox_4.setMinimumSize(QSize(0, 24))
self.checkBox_4.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(statustip)
self.checkBox_4.setStatusTip(u"Disable to set custom location for data. Enable to use project default data location settings.")
#endif // QT_CONFIG(statustip)
self.checkBox_4.setText(u"Use Project Data Location")
icon17 = QIcon()
icon17.addFile(u":/icons/icons8-copy-to-folder-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.checkBox_4.setIcon(icon17)
self.checkBox_4.setIconSize(QSize(20, 20))
self.checkBox_4.setChecked(True)
self.horizontalLayout_2.addWidget(self.checkBox_4)
self.gridLayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1)
self.horizontalLayout_4 = QHBoxLayout()
self.horizontalLayout_4.setSpacing(5)
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
self.pushButton_3 = QPushButton(self.verticalLayoutWidget)
self.pushButton_3.setObjectName(u"pushButton_3")
self.pushButton_3.setEnabled(False)
sizePolicy5 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
sizePolicy5.setHorizontalStretch(0)
sizePolicy5.setVerticalStretch(0)
sizePolicy5.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth())
self.pushButton_3.setSizePolicy(sizePolicy5)
self.pushButton_3.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.pushButton_3.setToolTip(u"Press [Ctrl+P] to start processing")
#endif // QT_CONFIG(tooltip)
#if QT_CONFIG(statustip)
self.pushButton_3.setStatusTip(u"Process selected folders, and create new chunks...")
#endif // QT_CONFIG(statustip)
self.pushButton_3.setText(u"Ready")
icon18 = QIcon()
icon18.addFile(u":/icons/icons8-submit-progress-96.png", QSize(), QIcon.Normal, QIcon.Off)
icon18.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Disabled, QIcon.Off)
self.pushButton_3.setIcon(icon18)
self.pushButton_3.setIconSize(QSize(24, 24))
#if QT_CONFIG(shortcut)
self.pushButton_3.setShortcut(u"P")
#endif // QT_CONFIG(shortcut)
self.pushButton_3.setChecked(False)
self.horizontalLayout_4.addWidget(self.pushButton_3)
self.pushButton_2 = QPushButton(self.verticalLayoutWidget)
self.pushButton_2.setObjectName(u"pushButton_2")
sizePolicy4.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
self.pushButton_2.setSizePolicy(sizePolicy4)
self.pushButton_2.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(statustip)
self.pushButton_2.setStatusTip(u"Exit chunk creator...")
#endif // QT_CONFIG(statustip)
self.pushButton_2.setText(u"Close")
icon19 = QIcon()
icon19.addFile(u":/icons/icons8-close-window-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_2.setIcon(icon19)
self.pushButton_2.setIconSize(QSize(24, 24))
#if QT_CONFIG(shortcut)
self.pushButton_2.setShortcut(u"X")
#endif // QT_CONFIG(shortcut)
self.horizontalLayout_4.addWidget(self.pushButton_2)
self.gridLayout.addLayout(self.horizontalLayout_4, 4, 2, 1, 1)
self.horizontalLayout_17 = QHBoxLayout()
self.horizontalLayout_17.setSpacing(5)
self.horizontalLayout_17.setObjectName(u"horizontalLayout_17")
self.label_8 = QLabel(self.verticalLayoutWidget)
self.label_8.setObjectName(u"label_8")
sizePolicy6 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
sizePolicy6.setHorizontalStretch(0)
sizePolicy6.setVerticalStretch(0)
sizePolicy6.setHeightForWidth(self.label_8.sizePolicy().hasHeightForWidth())
self.label_8.setSizePolicy(sizePolicy6)
self.label_8.setMaximumSize(QSize(16777215, 20))
font5 = QFont()
font5.setFamily(u"Segoe UI")
font5.setPointSize(10)
font5.setBold(False)
font5.setWeight(50)
self.label_8.setFont(font5)
self.label_8.setFrameShape(QFrame.StyledPanel)
self.label_8.setText(u"<html><head/><body><p>Ready. Select folder(s) to process...</p></body></html>")
self.label_8.setIndent(10)
self.horizontalLayout_17.addWidget(self.label_8)
self.pushButton_10 = QPushButton(self.verticalLayoutWidget)
self.pushButton_10.setObjectName(u"pushButton_10")
self.pushButton_10.setEnabled(False)
#if QT_CONFIG(tooltip)
self.pushButton_10.setToolTip(u"Open selected item in File Explorer")
#endif // QT_CONFIG(tooltip)
self.pushButton_10.setText(u"")
icon20 = QIcon()
icon20.addFile(u":/icons/icons8-file-explorer-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_10.setIcon(icon20)
self.pushButton_10.setIconSize(QSize(20, 20))
self.pushButton_10.setAutoDefault(False)
self.pushButton_10.setFlat(False)
self.horizontalLayout_17.addWidget(self.pushButton_10)
self.gridLayout.addLayout(self.horizontalLayout_17, 3, 0, 1, 1)
self.line = QFrame(self.verticalLayoutWidget)
self.line.setObjectName(u"line")
self.line.setFrameShadow(QFrame.Plain)
self.line.setFrameShape(QFrame.VLine)
self.gridLayout.addWidget(self.line, 0, 1, 5, 1)
self.progressBar = QProgressBar(self.verticalLayoutWidget)
self.progressBar.setObjectName(u"progressBar")
self.progressBar.setEnabled(False)
sizePolicy3.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth())
self.progressBar.setSizePolicy(sizePolicy3)
font6 = QFont()
font6.setFamily(u"Segoe UI")
font6.setPointSize(10)
self.progressBar.setFont(font6)
self.progressBar.setMinimum(0)
self.progressBar.setMaximum(10)
self.progressBar.setValue(0)
self.progressBar.setAlignment(Qt.AlignCenter)
self.progressBar.setTextVisible(True)
self.progressBar.setOrientation(Qt.Horizontal)
self.progressBar.setTextDirection(QProgressBar.TopToBottom)
self.progressBar.setFormat(u"Completed %v of %m")
self.gridLayout.addWidget(self.progressBar, 4, 0, 1, 1)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setSpacing(5)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.lineEdit = QLineEdit(self.verticalLayoutWidget)
self.lineEdit.setObjectName(u"lineEdit")
self.lineEdit.setEnabled(False)
sizePolicy3.setHeightForWidth(self.lineEdit.sizePolicy().hasHeightForWidth())
self.lineEdit.setSizePolicy(sizePolicy3)
self.lineEdit.setMaximumSize(QSize(16777215, 24))
self.lineEdit.setFont(font6)
#if QT_CONFIG(statustip)
self.lineEdit.setStatusTip(u"Path to main folder with data sub-folders...")
#endif // QT_CONFIG(statustip)
#if QT_CONFIG(whatsthis)
self.lineEdit.setWhatsThis(u"Path to main folder with data sub-folders...")
#endif // QT_CONFIG(whatsthis)
self.lineEdit.setPlaceholderText(u"Data location...")
self.horizontalLayout.addWidget(self.lineEdit)
self.pushButton = QPushButton(self.verticalLayoutWidget)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setEnabled(False)
sizePolicy4.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
self.pushButton.setSizePolicy(sizePolicy4)
self.pushButton.setMinimumSize(QSize(0, 30))
self.pushButton.setMaximumSize(QSize(16777215, 30))
self.pushButton.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(statustip)
self.pushButton.setStatusTip(u"Data location (root folder with sub-folders containing data)")
#endif // QT_CONFIG(statustip)
self.pushButton.setText(u"Browse")
icon21 = QIcon()
icon21.addFile(u":/icons/icons8-browse-folder-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton.setIcon(icon21)
self.pushButton.setIconSize(QSize(20, 20))
self.horizontalLayout.addWidget(self.pushButton)
self.pushButton_4 = QPushButton(self.verticalLayoutWidget)
self.pushButton_4.setObjectName(u"pushButton_4")
sizePolicy4.setHeightForWidth(self.pushButton_4.sizePolicy().hasHeightForWidth())
self.pushButton_4.setSizePolicy(sizePolicy4)
self.pushButton_4.setMinimumSize(QSize(0, 30))
self.pushButton_4.setMaximumSize(QSize(16777215, 30))
self.pushButton_4.setCursor(QCursor(Qt.PointingHandCursor))
self.pushButton_4.setText(u"Refresh")
icon22 = QIcon()
icon22.addFile(u":/icons/icons8-available-updates-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_4.setIcon(icon22)
self.pushButton_4.setIconSize(QSize(20, 20))
self.horizontalLayout.addWidget(self.pushButton_4)
self.gridLayout.addLayout(self.horizontalLayout, 1, 0, 1, 1)
self.label_16 = QLabel(self.verticalLayoutWidget)
self.label_16.setObjectName(u"label_16")
sizePolicy1.setHeightForWidth(self.label_16.sizePolicy().hasHeightForWidth())
self.label_16.setSizePolicy(sizePolicy1)
self.label_16.setMaximumSize(QSize(16777215, 20))
self.label_16.setFont(font6)
self.label_16.setFrameShape(QFrame.StyledPanel)
self.label_16.setText(u"<html><head/><body><p>Selected: <span style=\" font-weight:600;\">0</span></p></body></html>")
self.label_16.setIndent(10)
self.gridLayout.addWidget(self.label_16, 3, 2, 1, 1)
self.tabWidget = QTabWidget(self.verticalLayoutWidget)
self.tabWidget.setObjectName(u"tabWidget")
sizePolicy2.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
self.tabWidget.setSizePolicy(sizePolicy2)
self.tabWidget.setMinimumSize(QSize(300, 0))
self.tabWidget.setMaximumSize(QSize(300, 16777215))
self.tabWidget.setIconSize(QSize(20, 20))
self.tabWidget.setDocumentMode(True)
self.tab = QWidget()
self.tab.setObjectName(u"tab")
self.layoutWidget = QWidget(self.tab)
self.layoutWidget.setObjectName(u"layoutWidget")
self.layoutWidget.setGeometry(QRect(0, 10, 301, 561))
self.gridLayout_3 = QGridLayout(self.layoutWidget)
self.gridLayout_3.setSpacing(5)
self.gridLayout_3.setContentsMargins(10, 10, 10, 10)
self.gridLayout_3.setObjectName(u"gridLayout_3")
self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_8 = QHBoxLayout()
self.horizontalLayout_8.setSpacing(5)
self.horizontalLayout_8.setObjectName(u"horizontalLayout_8")
self.cbChunkSettings = QComboBox(self.layoutWidget)
icon23 = QIcon()
icon23.addFile(u":/icons/icons8-add-tab-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon24 = QIcon()
icon24.addFile(u":/icons/kalota_m.png", QSize(), QIcon.Normal, QIcon.Off)
icon25 = QIcon()
icon25.addFile(u":/icons/stopnca_o.png", QSize(), QIcon.Normal, QIcon.Off)
icon26 = QIcon()
icon26.addFile(u":/icons/stopnca_s.png", QSize(), QIcon.Normal, QIcon.Off)
for section in autoftg_main.chunk_sections:
menu_icon = autoftg_main.menuCfg.get(section, "menu_icon")
menu_icon_path = u":/icons/" + autoftg_main.icoCfg.get("ICONS", menu_icon)
setticon = QIcon()
setticon.addFile(menu_icon_path, QSize(), QIcon.Normal, QIcon.Off)
self.cbChunkSettings.addItem(setticon, section)
self.cbChunkSettings.setCurrentText(self.itemDef)
self.cbChunkSettings.setObjectName(u"cbChunkSettings")
sizePolicy7 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)
sizePolicy7.setHorizontalStretch(0)
sizePolicy7.setVerticalStretch(0)
sizePolicy7.setHeightForWidth(self.cbChunkSettings.sizePolicy().hasHeightForWidth())
self.cbChunkSettings.setSizePolicy(sizePolicy7)
self.cbChunkSettings.setMinimumSize(QSize(200, 0))
self.cbChunkSettings.setFont(font6)
self.cbChunkSettings.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(statustip)
self.cbChunkSettings.setStatusTip(u"Choose settings used for chunk creation...")
#endif // QT_CONFIG(statustip)
self.cbChunkSettings.setIconSize(QSize(20, 20))
self.horizontalLayout_8.addWidget(self.cbChunkSettings)
self.btnDefChunk = QPushButton(self.layoutWidget)
self.btnDefChunk.setObjectName(u"btnDefChunk")
self.btnDefChunk.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.btnDefChunk.setToolTip(u"Set as default")
#endif // QT_CONFIG(tooltip)
self.btnDefChunk.setText(u"")
icon27 = QIcon()
icon27.addFile(u":/icons/icons8-christmas-star-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.btnDefChunk.setIcon(icon27)
self.btnDefChunk.setIconSize(QSize(20, 20))
self.btnDefChunk.setAutoDefault(False)
self.btnDefChunk.setFlat(True)
self.horizontalLayout_8.addWidget(self.btnDefChunk)
self.gridLayout_3.addLayout(self.horizontalLayout_8, 6, 0, 1, 1)
self.line_3 = QFrame(self.layoutWidget)
self.line_3.setObjectName(u"line_3")
self.line_3.setFrameShadow(QFrame.Plain)
self.line_3.setFrameShape(QFrame.HLine)
self.gridLayout_3.addWidget(self.line_3, 15, 0, 1, 1)
self.label_5 = QLabel(self.layoutWidget)
self.label_5.setObjectName(u"label_5")
sizePolicy5.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth())
self.label_5.setSizePolicy(sizePolicy5)
self.label_5.setMinimumSize(QSize(0, 26))
self.label_5.setMaximumSize(QSize(16777215, 26))
font7 = QFont()
font7.setFamily(u"Segoe UI")
font7.setPointSize(11)
font7.setBold(True)
font7.setWeight(75)
self.label_5.setFont(font7)
self.label_5.setText(u"Markers")
self.label_5.setIndent(5)
self.gridLayout_3.addWidget(self.label_5, 21, 0, 1, 1)
self.horizontalLayout_13 = QHBoxLayout()
self.horizontalLayout_13.setSpacing(5)
self.horizontalLayout_13.setObjectName(u"horizontalLayout_13")
self.horizontalLayout_13.setContentsMargins(5, -1, -1, -1)
self.checkBox_mesh = QCheckBox(self.layoutWidget)
self.checkBox_mesh.setObjectName(u"checkBox_mesh")
self.checkBox_mesh.setEnabled(True)
sizePolicy5.setHeightForWidth(self.checkBox_mesh.sizePolicy().hasHeightForWidth())
self.checkBox_mesh.setSizePolicy(sizePolicy5)
self.checkBox_mesh.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_mesh.setToolTip(u"<html><head/><body><p>Enable to run 'Build Mesh/Build Textures' processing for selected items.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_mesh.setText(u"Build Mesh && Textures")
self.checkBox_mesh.setIcon(icon5)
self.checkBox_mesh.setIconSize(QSize(18, 18))
self.checkBox_mesh.setCheckable(True)
self.checkBox_mesh.setChecked(False)
self.checkBox_mesh.setTristate(False)
self.horizontalLayout_13.addWidget(self.checkBox_mesh)
self.pushButton_setMesh = QPushButton(self.layoutWidget)
self.pushButton_setMesh.setObjectName(u"pushButton_setMesh")
self.pushButton_setMesh.setEnabled(True)
sizePolicy4.setHeightForWidth(self.pushButton_setMesh.sizePolicy().hasHeightForWidth())
self.pushButton_setMesh.setSizePolicy(sizePolicy4)
self.pushButton_setMesh.setCursor(QCursor(Qt.PointingHandCursor))
icon28 = QIcon()
icon28.addFile(u":/icons/icons8-adjust-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_setMesh.setIcon(icon28)
self.pushButton_setMesh.setFlat(True)
self.horizontalLayout_13.addWidget(self.pushButton_setMesh)
self.gridLayout_3.addLayout(self.horizontalLayout_13, 32, 0, 1, 1)
self.horizontalLayout_15 = QHBoxLayout()
self.horizontalLayout_15.setSpacing(5)
self.horizontalLayout_15.setObjectName(u"horizontalLayout_15")
self.horizontalLayout_15.setContentsMargins(5, -1, -1, -1)
self.checkBox_export = QCheckBox(self.layoutWidget)
self.checkBox_export.setObjectName(u"checkBox_export")
self.checkBox_export.setEnabled(True)
sizePolicy5.setHeightForWidth(self.checkBox_export.sizePolicy().hasHeightForWidth())
self.checkBox_export.setSizePolicy(sizePolicy5)
self.checkBox_export.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_export.setToolTip(u"<html><head/><body><p>Enable to export data for selected items after build is complete.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_export.setText(u"Export Data")
icon29 = QIcon()
icon29.addFile(u":/icons/icons8-share-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.checkBox_export.setIcon(icon29)
self.checkBox_export.setIconSize(QSize(18, 18))
self.checkBox_export.setCheckable(True)
self.checkBox_export.setChecked(False)
self.checkBox_export.setTristate(False)
self.horizontalLayout_15.addWidget(self.checkBox_export)
self.pushButton_setExport = QPushButton(self.layoutWidget)
self.pushButton_setExport.setObjectName(u"pushButton_setExport")
self.pushButton_setExport.setEnabled(False)
sizePolicy4.setHeightForWidth(self.pushButton_setExport.sizePolicy().hasHeightForWidth())
self.pushButton_setExport.setSizePolicy(sizePolicy4)
self.pushButton_setExport.setCursor(QCursor(Qt.PointingHandCursor))
icon30 = QIcon()
icon30.addFile(u":/icons/icons8-true-false-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_setExport.setIcon(icon30)
self.pushButton_setExport.setFlat(True)
self.horizontalLayout_15.addWidget(self.pushButton_setExport)
self.gridLayout_3.addLayout(self.horizontalLayout_15, 35, 0, 1, 1)
self.line_6 = QFrame(self.layoutWidget)
self.line_6.setObjectName(u"line_6")
self.line_6.setFrameShape(QFrame.HLine)
self.line_6.setFrameShadow(QFrame.Sunken)
self.gridLayout_3.addWidget(self.line_6, 30, 0, 1, 1)
self.horizontalLayout_20 = QHBoxLayout()
self.horizontalLayout_20.setSpacing(5)
self.horizontalLayout_20.setObjectName(u"horizontalLayout_20")
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout_20.addItem(self.horizontalSpacer)
self.pushButton_resetSet = QPushButton(self.layoutWidget)
self.pushButton_resetSet.setObjectName(u"pushButton_resetSet")
sizePolicy4.setHeightForWidth(self.pushButton_resetSet.sizePolicy().hasHeightForWidth())
self.pushButton_resetSet.setSizePolicy(sizePolicy4)
#if QT_CONFIG(tooltip)
self.pushButton_resetSet.setToolTip(u"Reset settings to definition values.")
#endif // QT_CONFIG(tooltip)
self.pushButton_resetSet.setText(u"Reset")
icon31 = QIcon()
icon31.addFile(u":/icons/icons8-rotate-48.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_resetSet.setIcon(icon31)
self.pushButton_resetSet.setIconSize(QSize(20, 20))
self.pushButton_resetSet.setFlat(True)
self.horizontalLayout_20.addWidget(self.pushButton_resetSet)
self.pushButton_saveSet = QPushButton(self.layoutWidget)
self.pushButton_saveSet.setObjectName(u"pushButton_saveSet")
sizePolicy4.setHeightForWidth(self.pushButton_saveSet.sizePolicy().hasHeightForWidth())
self.pushButton_saveSet.setSizePolicy(sizePolicy4)
#if QT_CONFIG(tooltip)
self.pushButton_saveSet.setToolTip(u"Save current settings to selected definition.")
#endif // QT_CONFIG(tooltip)
self.pushButton_saveSet.setText(u"Save")
icon32 = QIcon()
icon32.addFile(u":/icons/icons8-save-all-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_saveSet.setIcon(icon32)
self.pushButton_saveSet.setIconSize(QSize(20, 20))
self.pushButton_saveSet.setAutoDefault(False)
self.pushButton_saveSet.setFlat(True)
self.horizontalLayout_20.addWidget(self.pushButton_saveSet)
self.gridLayout_3.addLayout(self.horizontalLayout_20, 38, 0, 1, 1)
self.horizontalLayout_11 = QHBoxLayout()
self.horizontalLayout_11.setSpacing(5)
self.horizontalLayout_11.setObjectName(u"horizontalLayout_11")
self.horizontalLayout_11.setContentsMargins(5, -1, -1, -1)
self.checkBox_align = QCheckBox(self.layoutWidget)
self.checkBox_align.setObjectName(u"checkBox_align")
self.checkBox_align.setEnabled(True)
sizePolicy5.setHeightForWidth(self.checkBox_align.sizePolicy().hasHeightForWidth())
self.checkBox_align.setSizePolicy(sizePolicy5)
self.checkBox_align.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_align.setToolTip(u"<html><head/><body><p>Enable to run 'Align Photos' process for selected items.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_align.setText(u"Align Photos")
self.checkBox_align.setIcon(icon4)
self.checkBox_align.setIconSize(QSize(18, 18))
self.checkBox_align.setCheckable(True)
self.checkBox_align.setChecked(False)
self.checkBox_align.setTristate(False)
self.horizontalLayout_11.addWidget(self.checkBox_align)
self.pushButton_setAlign = QPushButton(self.layoutWidget)
self.pushButton_setAlign.setObjectName(u"pushButton_setAlign")
self.pushButton_setAlign.setEnabled(True)
sizePolicy4.setHeightForWidth(self.pushButton_setAlign.sizePolicy().hasHeightForWidth())
self.pushButton_setAlign.setSizePolicy(sizePolicy4)
self.pushButton_setAlign.setCursor(QCursor(Qt.PointingHandCursor))
self.pushButton_setAlign.setIcon(icon28)
self.pushButton_setAlign.setFlat(True)
self.horizontalLayout_11.addWidget(self.pushButton_setAlign)
self.gridLayout_3.addLayout(self.horizontalLayout_11, 31, 0, 1, 1)
self.horizontalLayout_10 = QHBoxLayout()
self.horizontalLayout_10.setSpacing(5)
self.horizontalLayout_10.setObjectName(u"horizontalLayout_10")
self.label_18 = QLabel(self.layoutWidget)
self.label_18.setObjectName(u"label_18")
font8 = QFont()
font8.setFamily(u"Segoe UI")
font8.setPointSize(9)
font8.setBold(False)
font8.setWeight(50)
self.label_18.setFont(font8)
self.label_18.setText(u"Name Format:")
self.label_18.setIndent(5)
self.horizontalLayout_10.addWidget(self.label_18)
self.label_19 = QLabel(self.layoutWidget)
self.label_19.setObjectName(u"label_19")
sizePolicy6.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth())
self.label_19.setSizePolicy(sizePolicy6)
self.label_19.setMinimumSize(QSize(0, 20))
self.label_19.setMaximumSize(QSize(16777215, 20))
font9 = QFont()
font9.setFamily(u"Segoe UI")
font9.setPointSize(8)
self.label_19.setFont(font9)
self.label_19.setFrameShape(QFrame.NoFrame)
self.label_19.setText(u"")
self.horizontalLayout_10.addWidget(self.label_19)
self.gridLayout_3.addLayout(self.horizontalLayout_10, 9, 0, 1, 1)
self.horizontalLayout_21 = QHBoxLayout()
self.horizontalLayout_21.setSpacing(5)
self.horizontalLayout_21.setObjectName(u"horizontalLayout_21")
self.horizontalLayout_21.setContentsMargins(5, -1, -1, -1)
self.checkBox = QCheckBox(self.layoutWidget)
self.checkBox.setObjectName(u"checkBox")
sizePolicy1.setHeightForWidth(self.checkBox.sizePolicy().hasHeightForWidth())
self.checkBox.setSizePolicy(sizePolicy1)
self.checkBox.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox.setToolTip(u"<html><head/><body><p><span style=\" font-weight:600;\">Enabled:</span> Marker coordinates will be imported after target detection. <span style=\" font-weight:600;\">*</span></p><p><span style=\" font-weight:600;\">Disabled:</span> Coordinates are not imported. User must manually import coordinates.</p><p><span style=\" font-weight:600;\">*</span> Automatic importing of marker coordinates only works if point file name is the same as it's parent folder name, and contains a header with metadata. Point coordinates should start at row #7.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox.setText(u"Import Marker Coordinates")
icon33 = QIcon()
icon33.addFile(u":/icons/icons8-map-marker-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.checkBox.setIcon(icon33)
self.checkBox.setIconSize(QSize(18, 18))
self.checkBox.setChecked(True)
self.horizontalLayout_21.addWidget(self.checkBox)
self.gridLayout_3.addLayout(self.horizontalLayout_21, 26, 0, 1, 1)
self.horizontalLayout_16 = QHBoxLayout()
self.horizontalLayout_16.setSpacing(5)
self.horizontalLayout_16.setObjectName(u"horizontalLayout_16")
self.horizontalLayout_16.setContentsMargins(5, -1, -1, -1)
self.checkBox_pcloud = QCheckBox(self.layoutWidget)
self.checkBox_pcloud.setObjectName(u"checkBox_pcloud")
self.checkBox_pcloud.setEnabled(True)
sizePolicy5.setHeightForWidth(self.checkBox_pcloud.sizePolicy().hasHeightForWidth())
self.checkBox_pcloud.setSizePolicy(sizePolicy5)
self.checkBox_pcloud.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_pcloud.setToolTip(u"<html><head/><body><p>Enable to run 'Build Point Cloud' processing for selected items.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_pcloud.setText(u"Build Point Cloud")
self.checkBox_pcloud.setIcon(icon6)
self.checkBox_pcloud.setIconSize(QSize(18, 18))
self.checkBox_pcloud.setCheckable(True)
self.checkBox_pcloud.setChecked(False)
self.checkBox_pcloud.setTristate(False)
self.horizontalLayout_16.addWidget(self.checkBox_pcloud)
self.pushButton_setPCloud = QPushButton(self.layoutWidget)
self.pushButton_setPCloud.setObjectName(u"pushButton_setPCloud")
self.pushButton_setPCloud.setEnabled(True)
sizePolicy4.setHeightForWidth(self.pushButton_setPCloud.sizePolicy().hasHeightForWidth())
self.pushButton_setPCloud.setSizePolicy(sizePolicy4)
self.pushButton_setPCloud.setCursor(QCursor(Qt.PointingHandCursor))
self.pushButton_setPCloud.setIcon(icon28)
self.pushButton_setPCloud.setFlat(True)
self.horizontalLayout_16.addWidget(self.pushButton_setPCloud)
self.gridLayout_3.addLayout(self.horizontalLayout_16, 34, 0, 1, 1)
self.horizontalLayout_3 = QHBoxLayout()
self.horizontalLayout_3.setSpacing(5)
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.label_10 = QLabel(self.layoutWidget)
self.label_10.setObjectName(u"label_10")
self.label_10.setFont(font8)
self.label_10.setText(u"Suffix:")
self.label_10.setIndent(5)
self.horizontalLayout_3.addWidget(self.label_10)
self.label_7 = QLabel(self.layoutWidget)
self.label_7.setObjectName(u"label_7")
sizePolicy6.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth())
self.label_7.setSizePolicy(sizePolicy6)
self.label_7.setMinimumSize(QSize(0, 20))
self.label_7.setMaximumSize(QSize(16777215, 20))
self.label_7.setFont(font9)
self.label_7.setFrameShape(QFrame.NoFrame)
self.label_7.setText(u"")
self.horizontalLayout_3.addWidget(self.label_7)
self.gridLayout_3.addLayout(self.horizontalLayout_3, 8, 0, 1, 1)
self.horizontalLayout_14 = QHBoxLayout()
self.horizontalLayout_14.setSpacing(5)
self.horizontalLayout_14.setObjectName(u"horizontalLayout_14")
self.horizontalLayout_14.setContentsMargins(5, -1, -1, -1)
self.checkBox_3 = QCheckBox(self.layoutWidget)
self.checkBox_3.setObjectName(u"checkBox_3")
sizePolicy5.setHeightForWidth(self.checkBox_3.sizePolicy().hasHeightForWidth())
self.checkBox_3.setSizePolicy(sizePolicy5)
self.checkBox_3.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_3.setToolTip(u"<html><head/><body><p><span style=\" font-weight:600;\">Checked:</span> Enable new chunk creation and data import.</p><p><span style=\" font-weight:600;\">Not Checked:</span> Disable new chunk creation. Used when processing existing chunks.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_3.setText(u"Auto Import Processing")
icon34 = QIcon()
icon34.addFile(u":/icons/icons8-in-progress-96.png", QSize(), QIcon.Normal, QIcon.Off)
self.checkBox_3.setIcon(icon34)
self.checkBox_3.setIconSize(QSize(18, 18))
self.checkBox_3.setCheckable(True)
self.checkBox_3.setChecked(True)
self.horizontalLayout_14.addWidget(self.checkBox_3)
self.gridLayout_3.addLayout(self.horizontalLayout_14, 29, 0, 1, 1)
self.horizontalLayout_19 = QHBoxLayout()
self.horizontalLayout_19.setSpacing(5)
self.horizontalLayout_19.setObjectName(u"horizontalLayout_19")
self.label_20 = QLabel(self.layoutWidget)
self.label_20.setObjectName(u"label_20")
sizePolicy3.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth())
self.label_20.setSizePolicy(sizePolicy3)
self.label_20.setMinimumSize(QSize(0, 20))
self.label_20.setMaximumSize(QSize(16777215, 20))
font10 = QFont()
font10.setFamily(u"Segoe UI")
font10.setPointSize(9)
font10.setBold(True)
font10.setWeight(75)
self.label_20.setFont(font10)
self.label_20.setText(u"Data Export Location:")
self.label_20.setIndent(5)
self.horizontalLayout_19.addWidget(self.label_20)
self.pushButton_5 = QPushButton(self.layoutWidget)
self.pushButton_5.setObjectName(u"pushButton_5")
sizePolicy4.setHeightForWidth(self.pushButton_5.sizePolicy().hasHeightForWidth())
self.pushButton_5.setSizePolicy(sizePolicy4)
#if QT_CONFIG(tooltip)
self.pushButton_5.setToolTip(u"<html><head/><body><p>Change data export location.</p><p>* Temporary only, will not be saved.<br/> To change default location go to 'Chunk Definition Settings'.</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.pushButton_5.setText(u"")
icon35 = QIcon()
icon35.addFile(u":/icons/icons8-opened-folder-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_5.setIcon(icon35)
self.pushButton_5.setIconSize(QSize(20, 20))
self.pushButton_5.setAutoDefault(False)
self.pushButton_5.setFlat(True)
self.horizontalLayout_19.addWidget(self.pushButton_5)
self.gridLayout_3.addLayout(self.horizontalLayout_19, 11, 0, 1, 1)
self.label_17 = QLabel(self.layoutWidget)
self.label_17.setObjectName(u"label_17")
sizePolicy5.setHeightForWidth(self.label_17.sizePolicy().hasHeightForWidth())
self.label_17.setSizePolicy(sizePolicy5)
self.label_17.setMinimumSize(QSize(0, 26))
self.label_17.setMaximumSize(QSize(16777215, 26))
self.label_17.setFont(font7)
self.label_17.setText(u"Processing")
self.label_17.setIndent(5)
self.gridLayout_3.addWidget(self.label_17, 28, 0, 1, 1)
self.label_expFolder = QLabel(self.layoutWidget)
self.label_expFolder.setObjectName(u"label_expFolder")
sizePolicy6.setHeightForWidth(self.label_expFolder.sizePolicy().hasHeightForWidth())
self.label_expFolder.setSizePolicy(sizePolicy6)
self.label_expFolder.setMinimumSize(QSize(0, 36))
self.label_expFolder.setMaximumSize(QSize(16777215, 36))
self.label_expFolder.setFont(font9)
self.label_expFolder.setFrameShape(QFrame.NoFrame)
self.label_expFolder.setText(u"C:UsersborisAppDataLocalAgisoftMetashape ProscriptsAutoFTG")
self.label_expFolder.setWordWrap(True)
self.label_expFolder.setIndent(5)
self.gridLayout_3.addWidget(self.label_expFolder, 12, 0, 1, 1)
self.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setSpacing(5)
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.label_11 = QLabel(self.layoutWidget)
self.label_11.setObjectName(u"label_11")
self.label_11.setFont(font8)
self.label_11.setText(u"Prefix:")
self.label_11.setIndent(5)
self.horizontalLayout_5.addWidget(self.label_11)
self.label_6 = QLabel(self.layoutWidget)
self.label_6.setObjectName(u"label_6")
sizePolicy6.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth())
self.label_6.setSizePolicy(sizePolicy6)
self.label_6.setMinimumSize(QSize(0, 20))
self.label_6.setMaximumSize(QSize(16777215, 20))
self.label_6.setFont(font9)
self.label_6.setFrameShape(QFrame.NoFrame)
self.label_6.setText(u"")
self.horizontalLayout_5.addWidget(self.label_6)
self.gridLayout_3.addLayout(self.horizontalLayout_5, 7, 0, 1, 1)
self.horizontalLayout_18 = QHBoxLayout()
self.horizontalLayout_18.setSpacing(5)
self.horizontalLayout_18.setObjectName(u"horizontalLayout_18")
self.horizontalLayout_18.setContentsMargins(5, -1, -1, -1)
self.checkBox_2 = QCheckBox(self.layoutWidget)
self.checkBox_2.setObjectName(u"checkBox_2")
sizePolicy1.setHeightForWidth(self.checkBox_2.sizePolicy().hasHeightForWidth())
self.checkBox_2.setSizePolicy(sizePolicy1)
self.checkBox_2.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.checkBox_2.setToolTip(u"<html><head/><body><p>Enable automatic target detection when new chunk is created...</p></body></html>")
#endif // QT_CONFIG(tooltip)
self.checkBox_2.setText(u"Automatic Target Detection")
self.checkBox_2.setIcon(icon15)
self.checkBox_2.setIconSize(QSize(18, 18))
self.checkBox_2.setChecked(True)
self.horizontalLayout_18.addWidget(self.checkBox_2)
self.gridLayout_3.addLayout(self.horizontalLayout_18, 23, 0, 1, 1)
self.line_2 = QFrame(self.layoutWidget)
self.line_2.setObjectName(u"line_2")
self.line_2.setFrameShadow(QFrame.Plain)
self.line_2.setFrameShape(QFrame.HLine)
self.gridLayout_3.addWidget(self.line_2, 27, 0, 1, 1)
self.line_7 = QFrame(self.layoutWidget)
self.line_7.setObjectName(u"line_7")
self.line_7.setFrameShape(QFrame.HLine)
self.line_7.setFrameShadow(QFrame.Sunken)
self.gridLayout_3.addWidget(self.line_7, 10, 0, 1, 1)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.gridLayout_3.addItem(self.verticalSpacer, 39, 0, 1, 1)
icon36 = QIcon()
icon36.addFile(u":/icons/icons8-project-setup-50-2.png", QSize(), QIcon.Normal, QIcon.Off)
self.tabWidget.addTab(self.tab, icon36, "")
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), u"Chunk Settings")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.verticalLayoutWidget_2 = QWidget(self.tab_2)
self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2")
self.verticalLayoutWidget_2.setGeometry(QRect(0, 10, 301, 161))
self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout.setSpacing(5)
self.verticalLayout.setContentsMargins(10, 10, 10, 10)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_12 = QHBoxLayout()
self.horizontalLayout_12.setSpacing(5)
self.horizontalLayout_12.setObjectName(u"horizontalLayout_12")
self.comboBox_2 = QComboBox(self.verticalLayoutWidget_2)
icon37 = QIcon()
icon37.addFile(u":/icons/icons8-full-page-view-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon38 = QIcon()
icon38.addFile(u":/icons/icons8-video-wall-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon39 = QIcon()
icon39.addFile(u":/icons/icons8-live-photos-96.png", QSize(), QIcon.Normal, QIcon.Off)
icon40 = QIcon()
icon40.addFile(u":/icons/icons8-aperture-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon41 = QIcon()
icon41.addFile(u":/icons/icons8-video-stabilization-50.png", QSize(), QIcon.Normal, QIcon.Off)
icon42 = QIcon()
icon42.addFile(u":/icons/icons8-quadcopter-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon = QIcon()
cicon.addFile(u":/icons/icons8-full-page-view-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon1 = QIcon()
cicon1.addFile(u":/icons/icons8-panorama-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon2 = QIcon()
cicon2.addFile(u":/icons/icons8-aperture-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon3 = QIcon()
cicon3.addFile(u":/icons/icons8-video-stabilization-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon4 = QIcon()
cicon4.addFile(u":/icons/icons8-touchscreen-48.png", QSize(), QIcon.Normal, QIcon.Off)
cicon5 = QIcon()
cicon5.addFile(u":/icons/icons8-quadcopter-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicon5a = QIcon()
cicon5a.addFile(u":/icons/icons8-ios-application-placeholder-50.png", QSize(), QIcon.Normal, QIcon.Off)
cicoTripod = QIcon()
cicoTripod.addFile(u":/icons/icons8-camera-on-tripod-96.png", QSize(), QIcon.Normal, QIcon.Off)
for cam in autoftg_main.cam_list:
icon_type = autoftg_main.camCfg.get(cam, "Type")
icon_subtype = autoftg_main.camCfg.get(cam, "SubType")
if icon_subtype == "SmartPhone":
self.comboBox_2.addItem(cicon4, cam)
elif icon_subtype == "Drone":
self.comboBox_2.addItem(cicon5, cam)
elif icon_subtype == "Special":
self.comboBox_2.addItem(cicoTripod, cam)
else:
if icon_type == "Fisheye":
self.comboBox_2.addItem(cicon1, cam)
elif icon_type == "Spherical":
self.comboBox_2.addItem(cicon3, cam)
elif icon_type == "Cylindrical":
self.comboBox_2.addItem(cicon2, cam)
elif icon_type == "RPC":
self.comboBox_2.addItem(cicon5a, cam)
else:
self.comboBox_2.addItem(cicon, cam)
self.comboBox_2.setCurrentText(autoftg_main.selected_camera)
self.comboBox_2.setObjectName(u"comboBox_2")
sizePolicy8 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Maximum)
sizePolicy8.setHorizontalStretch(0)
sizePolicy8.setVerticalStretch(0)
sizePolicy8.setHeightForWidth(self.comboBox_2.sizePolicy().hasHeightForWidth())
self.comboBox_2.setSizePolicy(sizePolicy8)
self.comboBox_2.setMinimumSize(QSize(200, 0))
self.comboBox_2.setFont(font6)
self.comboBox_2.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(statustip)
self.comboBox_2.setStatusTip(u"Choose camera settings to be applied when creating new chunk...")
#endif // QT_CONFIG(statustip)
self.comboBox_2.setIconSize(QSize(20, 20))
self.horizontalLayout_12.addWidget(self.comboBox_2)
self.btnDefCam = QPushButton(self.verticalLayoutWidget_2)
self.btnDefCam.setObjectName(u"btnDefCam")
self.btnDefCam.setCursor(QCursor(Qt.PointingHandCursor))
#if QT_CONFIG(tooltip)
self.btnDefCam.setToolTip(u"Set as default")
#endif // QT_CONFIG(tooltip)
self.btnDefCam.setText(u"")
self.btnDefCam.setIcon(icon27)
self.btnDefCam.setIconSize(QSize(20, 20))
self.btnDefCam.setAutoDefault(False)
self.btnDefCam.setFlat(True)
self.horizontalLayout_12.addWidget(self.btnDefCam)
self.verticalLayout.addLayout(self.horizontalLayout_12)
self.horizontalLayout_6 = QHBoxLayout()
self.horizontalLayout_6.setSpacing(5)
self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
self.label_9 = QLabel(self.verticalLayoutWidget_2)
self.label_9.setObjectName(u"label_9")
self.label_9.setFont(font8)
self.label_9.setFrameShape(QFrame.NoFrame)
self.label_9.setText(u"Type:")
self.label_9.setIndent(5)
self.horizontalLayout_6.addWidget(self.label_9)
self.label_12 = QLabel(self.verticalLayoutWidget_2)
self.label_12.setObjectName(u"label_12")
sizePolicy6.setHeightForWidth(self.label_12.sizePolicy().hasHeightForWidth())
self.label_12.setSizePolicy(sizePolicy6)
self.label_12.setMinimumSize(QSize(0, 20))
self.label_12.setMaximumSize(QSize(16777215, 20))
self.label_12.setFont(font9)
self.label_12.setFrameShape(QFrame.NoFrame)
self.label_12.setText(u"")
self.horizontalLayout_6.addWidget(self.label_12)
self.verticalLayout.addLayout(self.horizontalLayout_6)
self.horizontalLayout_7 = QHBoxLayout()
self.horizontalLayout_7.setSpacing(5)
self.horizontalLayout_7.setObjectName(u"horizontalLayout_7")
self.label_13 = QLabel(self.verticalLayoutWidget_2)
self.label_13.setObjectName(u"label_13")
self.label_13.setFont(font8)
self.label_13.setText(u"SubType:")
self.label_13.setIndent(5)
self.horizontalLayout_7.addWidget(self.label_13)
self.label_14 = QLabel(self.verticalLayoutWidget_2)
self.label_14.setObjectName(u"label_14")
sizePolicy6.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth())
self.label_14.setSizePolicy(sizePolicy6)
self.label_14.setMinimumSize(QSize(0, 20))
self.label_14.setMaximumSize(QSize(16777215, 20))
self.label_14.setFont(font9)
self.label_14.setFrameShape(QFrame.NoFrame)
self.label_14.setText(u"")
self.horizontalLayout_7.addWidget(self.label_14)
self.verticalLayout.addLayout(self.horizontalLayout_7)
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.verticalLayout.addItem(self.verticalSpacer_2)
icon43 = QIcon()
icon43.addFile(u":/icons/icons8-slr-small-lens-96.png", QSize(), QIcon.Normal, QIcon.Off)
self.tabWidget.addTab(self.tab_2, icon43, "")
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), u"Camera Settings")
self.gridLayout.addWidget(self.tabWidget, 0, 2, 3, 1)
self.verticalLayout_2.addLayout(self.gridLayout)
self.checkBox_mesh.setEnabled(True)
self.checkBox_export.setEnabled(True)
self.checkBox_pcloud.setEnabled(True)
defChk = self.cbChunkSettings.currentText()
self.label_6.setText(autoftg_main.menuCfg.get(defChk, "chunk_name_prefix"))
self.label_7.setText(autoftg_main.menuCfg.get(defChk, "chunk_name_suffix"))
defCam = self.comboBox_2.currentText()
self.label_12.setText(autoftg_main.camCfg.get(defCam, "type"))
self.label_14.setText(autoftg_main.camCfg.get(defCam, "subtype"))
self.checkBox_4.toggled.connect(self.pushButton.setDisabled)
self.checkBox_4.toggled.connect(self.lineEdit.setDisabled)
self.checkBox_2.toggled.connect(self.checkBox.toggle)
self.cbChunkSettings.currentTextChanged.connect(self.setCurrentSettings)
self.cbChunkSettings.currentTextChanged.connect(self.updateFolders)
self.comboBox_2.currentTextChanged.connect(self.setCurrentCamera)
self.pushButton_2.clicked.connect(self.quitChunkBatch)
self.pushButton_3.clicked.connect(self.progressBar.reset)
self.pushButton_3.clicked.connect(self.processBatch)
self.pushButton_4.clicked.connect(self.updateFolders)
self.pushButton.clicked.connect(self.browseFolder)
self.treeWidget.itemSelectionChanged.connect(self.updateSelected)
self.btnDefChunk.clicked.connect(self.setDefaultChunk)
self.btnDefCam.clicked.connect(self.setDefaultCam)
self.pushButton_10.clicked.connect(self.openFileExplorer)
self.pushButton_setAlign.clicked.connect(self.diaSettingsAlign)
self.pushButton_setMesh.setEnabled(True)
self.pushButton_setMesh.clicked.connect(self.diaSettingsMesh)
self.pushButton_setPCloud.clicked.connect(self.diaSettingsPoint)
# self.pushButton_setExport.clicked.connect()
self.pushButton_saveSet.clicked.connect(self.saveCurrentSettings)
self.pushButton_resetSet.clicked.connect(self.resetCurrentSettings)
self.tabWidget.setCurrentIndex(0)
projDoc = Metashape.app.document
self.projDocFile = str(projDoc).replace("<Document '", "").replace("'>", "")
self.logFilenamePath = self.projDocFile.replace(".psx", ".csv") # Datoteka z nastavitvami projekta
self.setCurrentSettings()
self.setCurrentCamera()
self.updateFolders()
self.exec_()
def logReadArchive(self):
global logArchive
logFilenameExists = os.path.isfile(self.logFilenamePath)
if logFilenameExists == False:
with open(self.logFilenamePath, mode='w', newline='') as csvlog_file:
ms_header = ['Date', 'Time', 'Chunk Name', 'Key', 'Photos', 'Point File', 'Camera', 'Align', 'Mesh', 'Point Cloud', 'Data Path', 'Export Folder', 'Model File', 'P.Cloud File']
logInit = csv.DictWriter(csvlog_file, fieldnames = ms_header, dialect = 'excel')
logInit.writeheader()
with open(self.logFilenamePath, mode='r') as csvlog_file:
logArchive = csv.reader(csvlog_file, dialect='excel')
for row in logArchive:
print(row[2] + " (" + row[7] + ", " + row[8] + ", " + row[9] + ")")
def logWriteArchive(self, data):
logFilenameExists = os.path.isfile(self.logFilenamePath)
if logFilenameExists == False:
with open(self.logFilenamePath, mode='w', newline='') as csvlog_file:
ms_header = ['Date', 'Time', 'Chunk Name', 'Key', 'Photos', 'Point File', 'Camera', 'Align', 'Mesh', 'Point Cloud', 'Data Path', 'Export Folder', 'Model File', 'P.Cloud File']
logInit = csv.DictWriter(csvlog_file, fieldnames = ms_header, dialect = 'excel')
logInit.writeheader()
else:
print(str(data))
with open(self.logFilenamePath, mode='a', newline='') as csvlog_file:
logWrite = csv.writer(csvlog_file, dialect='excel')
logWrite.writerow(data)
def selectChunkFormat(self, chunkDef):
chunkNameFormat = autoftg_main.menuCfg.get(chunkDef, "chunk_name_format")
if chunkNameFormat == "metashape":
self.label_19.setText(u"Metashape Default (Chunk 1, Chunk 2,...)")
elif chunkNameFormat == "data":
self.label_19.setText(u"Data Folder Name")
elif chunkNameFormat == "point":
self.label_19.setText(u"Point File Metadata")
elif chunkNameFormat == "creation":
self.label_19.setText(u"Creation date-time")
elif chunkNameFormat == "image":
self.label_19.setText(u"Image date-time")
elif chunkNameFormat == "custom":
self.label_19.setText(u"Custom date-time")
def setCurrentSettings(self):
global chunkSet
chunkSet = self.cbChunkSettings.currentText()
autoftg_main.menuCfg.read(autoftg_main.menuCfgFilePath)
if chunkSet != "" or chunkSet != None:
self.lineEdit.clear()
self.pushButton.setEnabled(True)
self.lineEdit.setEnabled(True)
self.lineEdit.setText(str(autoftg_main.menuCfg.get(chunkSet, "work_folder")))
self.label_6.setText(autoftg_main.menuCfg.get(chunkSet, "chunk_name_prefix"))
self.label_7.setText(autoftg_main.menuCfg.get(chunkSet, "chunk_name_suffix"))
self.selectChunkFormat(chunkSet)
self.label_expFolder.setText(str(autoftg_main.menuCfg.get(chunkSet, "export_folder")))
self.checkBox_4.setChecked(True)
self.checkBox_2.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "target_detection"))
self.checkBox.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "import_markers"))
self.checkBox_3.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "auto_process"))
self.checkBox_align.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "align_photos"))
self.checkBox_mesh.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "mesh_build"))
self.checkBox_pcloud.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "pointcloud_build"))
self.checkBox_export.setChecked(autoftg_main.menuCfg.getboolean(chunkSet, "export_data"))
self.mesh_type = (autoftg_main.menuCfg.get(chunkSet, "mesh_type"))
self.mesh_face_count = (autoftg_main.menuCfg.get(chunkSet, "mesh_face_count"))
self.mesh_face_count_custom = (autoftg_main.menuCfg.getint(chunkSet, "mesh_face_count_custom"))
self.mesh_depthmaps = (autoftg_main.menuCfg.get(chunkSet, "mesh_depthmaps"))
self.mesh_depthfilter = (autoftg_main.menuCfg.get(chunkSet, "mesh_depthfilter"))
self.mesh_interpolation = (autoftg_main.menuCfg.getboolean(chunkSet, "mesh_interpolation"))
self.mesh_vertex_color = (autoftg_main.menuCfg.getboolean(chunkSet, "mesh_vertex_color"))
self.mesh_vertex_confidence = (autoftg_main.menuCfg.getboolean(chunkSet, "mesh_vertex_confidence"))
self.texture_build = (autoftg_main.menuCfg.getboolean(chunkSet, "texture_build"))
self.texture_size = (autoftg_main.menuCfg.get(chunkSet, "texture_size"))
self.texture_levels = (autoftg_main.menuCfg.get(chunkSet, "texture_levels"))
self.texture_fill = (autoftg_main.menuCfg.getboolean(chunkSet, "texture_fill"))
self.texture_ghosting = (autoftg_main.menuCfg.getboolean(chunkSet, "texture_ghosting"))
self.label_8.setText(u"<html><head/><body><p>Chunk definition settings loaded...</p></body></html>")
def setCurrentCamera(self):
chunkCam = self.comboBox_2.currentText()
self.label_12.setText(autoftg_main.camCfg.get(chunkCam, "type"))
self.label_14.setText(autoftg_main.camCfg.get(chunkCam, "subtype"))
def updateFolders(self):
self.setCurrentSettings()
self.logReadArchive()
iconReload = QIcon()
iconReload.addFile(u":/icons/icons8-update-left-rotation-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconLoading = QIcon()
iconLoading.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Normal, QIcon.Off)
font6 = QFont()
font6.setBold(True)
font6.setWeight(75)
iconFolderTree = QIcon()
iconFolderTree.addFile(u":/icons/icons8-folder-tree-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconFolder = QIcon()
iconFolder.addFile(u":/icons/icons8-folder-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconDone = QIcon()
iconDone.addFile(u":/icons/icons8-done-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconDoneFile = QIcon()
iconDoneFile.addFile(u":/icons/icons8-check-file-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconNoCam = QIcon()
iconNoCam.addFile(u":/icons/icons8-no-camera-96.png", QSize(), QIcon.Normal, QIcon.Off)
font7 = QFont()
font7.setFamily(u"Segoe UI")
iconClose = QIcon()
iconClose.addFile(u":/icons/icons8-close-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconAddCam = QIcon()
iconAddCam.addFile(u":/icons/icons8-add-camera-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconStart = QIcon()
iconStart.addFile(u":/icons/icons8-synchronize-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconProcess = QIcon()
iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Normal, QIcon.Off)
iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Disabled, QIcon.Off)
iconError = QIcon()
iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Normal, QIcon.Off)
iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Disabled, QIcon.Off)
iconOk = QIcon()
iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Disabled, QIcon.Off)
iconLocOff = QIcon()
iconLocOff.addFile(u":/icons/icons8-location-off-48.png", QSize(), QIcon.Normal, QIcon.Off)
iconToDo = QIcon()
iconToDo.addFile(u":/icons/icons8-microsoft-todo-2019-48.png", QSize(), QIcon.Normal, QIcon.Off)
iconProgDone = QIcon()
iconProgDone.addFile(u":/icons/icons8-in-progress-96.png", QSize(), QIcon.Normal, QIcon.Off)
iconReadyProc = QIcon()
iconReadyProc.addFile(u":/icons/icons8-submit-progress-96.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_4.setIcon(iconLoading)
self.treeWidget.clear()
itemCurFolder = str(self.lineEdit.text()).split("/")[-1]
open_folder = self.lineEdit.text() + "\\"
qtreewidgetitem_top = QTreeWidgetItem(self.treeWidget)
qtreewidgetitem_top.setText(0, itemCurFolder)
qtreewidgetitem_top.setFont(0, font6)
qtreewidgetitem_top.setIcon(0, iconFolderTree)
qtreewidgetitem_top.setExpanded(True)
folder_list = []
folder_list = next(os.walk(open_folder))[1];
# chunks_list = Metashape.app.document.chunks
# chunks_list.replace("<Chunk '", "").replace("'>'", "")
for folder in folder_list:
__qtreewidgetitem1 = QTreeWidgetItem(qtreewidgetitem_top);
image_folder = str(open_folder).replace("\\", "/") + "/" + folder
photos_count = len(autoftg_main.find_files(image_folder, [".jpg", ".jpeg", ".png", ".tif", ".tiff"]));
folder_chunk = self.label_6.text() + folder + self.label_7.text()
with open(self.logFilenamePath, mode='r') as csvlog_file:
logArchive = csv.reader(csvlog_file, dialect='excel')
for row in logArchive:
print(row[2] + " (" + row[7] + ", " + row[8] + ", " + row[9] + ")")
if row[2] == folder_chunk:
__qtreewidgetitem1.setIcon(3, iconDone);
if row[9] == 'PC':
__qtreewidgetitem1.setIcon(6, iconDone);
if row[8] == 'M' or row[8] == 'M+T':
__qtreewidgetitem1.setIcon(5, iconDone);
if row[7] == 'A':
__qtreewidgetitem1.setIcon(4, iconDone);
__qtreewidgetitem1.setText(7, str(row[2]))
points_file = image_folder + "/" + folder + ".txt"
points_file_exists = os.path.isfile(points_file);
if points_file_exists == True:
__qtreewidgetitem1.setIcon(2, iconDoneFile);
__qtreewidgetitem1.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled);
__qtreewidgetitem1.setText(2, u"OK");
else:
__qtreewidgetitem1.setIcon(2, iconClose);
__qtreewidgetitem1.setText(2, u"N/A");
__qtreewidgetitem1.setFlags(Qt.ItemIsEnabled);
if photos_count > 0:
__qtreewidgetitem1.setText(1, str(photos_count));
__qtreewidgetitem1.setIcon(1, iconAddCam);
__qtreewidgetitem1.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled);
else:
__qtreewidgetitem1.setText(1, "N/A");
__qtreewidgetitem1.setIcon(1, iconNoCam);
__qtreewidgetitem1.setFlags(Qt.ItemIsEnabled);
__qtreewidgetitem1.setText(0, folder);
__qtreewidgetitem1.setIcon(0, iconFolder);
__qtreewidgetitem1.setSizeHint(0, QSize(165, 0))
self.pushButton_3.setIcon(iconStart)
self.pushButton_3.setText(u"Ready")
self.pushButton_3.setDisabled(True)
self.label_8.setText(u"<html><head/><body><p>Folder contents reloaded...</p></body></html>")
self.progressBar.setMinimum(1)
self.progressBar.setMaximum(1)
self.progressBar.setValue(0)
self.progressBar.setTextVisible(False)
self.progressBar.setDisabled(True)
self.treeWidget.resizeColumnToContents(0)
self.treeWidget.resizeColumnToContents(1)
self.treeWidget.resizeColumnToContents(2)
self.treeWidget.resizeColumnToContents(3)
self.treeWidget.resizeColumnToContents(4)
self.treeWidget.resizeColumnToContents(5)
self.treeWidget.resizeColumnToContents(6)
self.treeWidget.resizeColumnToContents(7)
self.treeWidget.sortItems(0, Qt.AscendingOrder)
self.treeWidget.scrollToBottom()
self.pushButton_4.setIcon(iconReload)
def setDefaultChunk(self):
current_chunkdef = self.cbChunkSettings.currentText()
autoftg_main.projCfg.set("PROJECT SETTINGS", "default_chunk_def", current_chunkdef)
with open(autoftg_main.projCfgFilePath, 'w') as configfile:
autoftg_main.projCfg.write(configfile)
self.label_8.setText(u"<html><head/><body><p>Default definition set to: " + current_chunkdef + "</p></body></html>")
def setDefaultCam(self):
current_cam = self.comboBox_2.currentText()
autoftg_main.projCfg.set("PROJECT SETTINGS", "default_camera", current_cam)
with open(autoftg_main.projCfgFilePath, 'w') as configfile:
autoftg_main.projCfg.write(configfile)
self.label_8.setText(u"<html><head/><body><p>Default camera set to: " + current_cam + "</p></body></html>")
def saveCurrentSettings(self):
autoftg_main.menuCfg.set(self.cbChunkSettings.currentText(), "auto_process", str(self.checkBox_3.isChecked()))
autoftg_main.menuCfg.set(self.cbChunkSettings.currentText(), "align_photos", str(self.checkBox_align.isChecked()))
autoftg_main.menuCfg.set(self.cbChunkSettings.currentText(), "mesh_build", str(self.checkBox_mesh.isChecked()))
autoftg_main.menuCfg.set(self.cbChunkSettings.currentText(), "pointcloud_build", str(self.checkBox_pcloud.isChecked()))
autoftg_main.menuCfg.set(self.cbChunkSettings.currentText(), "export_data", str(self.checkBox_export.isChecked()))
with open(autoftg_main.menuCfgFilePath, 'w') as configfile:
autoftg_main.menuCfg.write(configfile)
print("Settings saved...\nChunk def.: " + self.cbChunkSettings.currentText())
def resetCurrentSettings(self):
self.checkBox_3.setChecked(autoftg_main.menuCfg.getboolean(self.cbChunkSettings.currentText(), "auto_process"))
self.checkBox_align.setChecked(autoftg_main.menuCfg.getboolean(self.cbChunkSettings.currentText(), "align_photos"))
self.checkBox_mesh.setChecked(autoftg_main.menuCfg.getboolean(self.cbChunkSettings.currentText(), "mesh_build"))
self.checkBox_pcloud.setChecked(autoftg_main.menuCfg.getboolean(self.cbChunkSettings.currentText(), "pointcloud_build"))
self.checkBox_export.setChecked(autoftg_main.menuCfg.getboolean(self.cbChunkSettings.currentText(), "export_data"))
print("Settings reset...")
def browseFolder(self):
defFolder = Metashape.app.getExistingDirectory("Data folder")
self.lineEdit.setText(defFolder)
self.updateFolders()
def updateSelected(self):
iconStart = QIcon()
iconStart.addFile(u":/icons/icons8-synchronize-50.png", QSize(), QIcon.Normal, QIcon.Off)
self.pushButton_3.setIcon(iconStart)
self.pushButton_3.setEnabled(True)
sel_items = self.treeWidget.selectedItems()
sel_count = len(sel_items)
if sel_count > 0:
self.pushButton_3.setEnabled(True)
self.pushButton_3.setText(u"Process")
self.pushButton_10.setEnabled(True)
self.label_16.setText(u"<html><head/><body><p>Selected: <span style=\" font-weight:600;\">" + str(sel_count) + "</span></p></body></html>")
else:
self.pushButton_3.setDisabled(True)
self.pushButton_3.setText(u"Ready")
self.pushButton_10.setDisabled(True)
self.label_16.setText(u"<html><head/><body><p><b>Select items to process...</b</p></body></html>")
def openFileExplorer(self):
selected_path = self.lineEdit.text() + "\\" + self.treeWidget.currentItem().text(0)
# explorer would choke on forward slashes
path = os.path.normpath(selected_path)
if os.path.isdir(path):
subprocess.run([FILEBROWSER_PATH, path])
else:
print("Nothing selected?!?")
def loadingTime(self, string):
for i in string:
print(i, end="")
# adding two second of time delay
time.sleep(0.5)
# Process selected folders automatically (no user interaction)
def processBatchAuto(self):
timeProcStart = datetime.now()
self.sel_items = self.treeWidget.selectedItems()
sel_count = len(self.sel_items)
item_menu = self.cbChunkSettings.currentText()
item_pre = autoftg_main.menuCfg.get(item_menu, "chunk_name_prefix")
item_suf = autoftg_main.menuCfg.get(item_menu, "chunk_name_suffix")
item_cam = self.comboBox_2.currentText()
output_folder = autoftg_main.menuCfg.get(item_menu, "export_folder").replace("\\", "/")
iconStart = QIcon()
iconStart.addFile(u":/icons/icons8-synchronize-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconProcess = QIcon()
iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Normal, QIcon.Off)
iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Disabled, QIcon.Off)
iconError = QIcon()
iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Normal, QIcon.Off)
iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Disabled, QIcon.Off)
iconOk = QIcon()
iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Disabled, QIcon.Off)
iconDone = QIcon()
iconDone.addFile(u":/icons/icons8-done-50.png", QSize(), QIcon.Normal, QIcon.Off)
iconToDo = QIcon()
iconToDo.addFile(u":/icons/icons8-microsoft-todo-2019-48.png", QSize(), QIcon.Normal, QIcon.Off)
iconProgDone = QIcon()
iconProgDone.addFile(u":/icons/icons8-in-progress-96.png", QSize(), QIcon.Normal, QIcon.Off)
if sel_count > 0:
i_cnt = 0
self.progressBar.setEnabled(True)
self.progressBar.setMinimum(i_cnt)
self.progressBar.setMaximum(sel_count)
self.progressBar.setValue(i_cnt)
self.progressBar.setTextVisible(True)
self.progressBar.setAlignment(Qt.AlignCenter)
self.pushButton_3.setEnabled(False)
self.pushButton_3.setIcon(iconProcess)
self.pushButton_3.setText(u"Processing...")
num = 6
for item in self.sel_items:
timeItemStart = datetime.now()
i_cnt = i_cnt + 1
self.progressBar.setFormat(u"Completed %v of %m")
self.pushButton_3.setEnabled(False)
self.pushButton_3.setIcon(iconProcess)
self.pushButton_3.setText(u"Processing...")
updItem = QTreeWidgetItem
updItem.setIcon(item, 3, iconProcess)
updItem.setText(item, 7, u"Processing...")
self.treeWidget.resizeColumnToContents(3)
doc = Metashape.app.document
netpath = Metashape.app.document.path
netroot = self.lineEdit.text()
image_folder = str(netroot).replace("\\", "/") + "/" + item.text(0)
photos = autoftg_main.find_files(image_folder, [".jpg", ".jpeg", ".png", ".tif", ".tiff"])
chunk = doc.addChunk()
chunk_key = str(chunk.key)
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Data Import...")
chunk.addPhotos(photos)
self.loadingTime('*****')
chunk_name = item_pre + item.text(0) + item_suf
chunk.label = chunk_name
doc.chunk = chunk
doc.save(netpath)
Metashape.app.update()
self.loadingTime('***')
autoftg_main.readCameraSettings(item_cam)
autoftg_main.useCameraSettings()
if self.checkBox_2.isChecked() == True:
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Processing Markers...")
chunk.detectMarkers(target_type=Metashape.CircularTarget12bit, tolerance=98)
doc.save(netpath)
Metashape.app.update()
if self.checkBox.isChecked() == True:
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Coordinates Import...")
points_file = image_folder + "/" + item.text(0) + ".txt"
points_file_exists = os.path.isfile(points_file)
if points_file_exists == True:
chunk.importReference(points_file, format=Metashape.ReferenceFormatCSV, columns='nxyz', delimiter=',', skip_rows=6, create_markers=True)
chunk.updateTransform()
ms_pntfile = item.text(0) + ".txt"
else:
ms_pntfile = "None"
updItem.setIcon(item, 3, iconProgDone)
doc.save(netpath)
Metashape.app.update()
align_done = ""
# Metashape.ReferencePreselectionMode.[ReferencePreselectionSource, ReferencePreselectionEstimated, ReferencePreselectionSequential]
if self.checkBox_align.isChecked() == True:
updItem.setIcon(item, 4, iconProcess)
align_quality_text = autoftg_main.menuCfg.get(chunkSet, "align_quality")
if align_quality_text == "Highest":
align_quality = 0
elif align_quality_text == "High":
align_quality = 1
elif align_quality_text == "Medium":
align_quality = 2
elif align_quality_text == "Low":
align_quality = 3
elif align_quality_text == "Lowest":
align_quality = 4
else:
align_quality = 0
align_gen_presel = autoftg_main.menuCfg.getboolean(chunkSet, "align_gen_presel")
align_ref_presel = autoftg_main.menuCfg.getboolean(chunkSet, "align_ref_presel")
align_ref_presel_mode_text = autoftg_main.menuCfg.get(chunkSet, "align_ref_presel_mode")
if align_ref_presel_mode_text == "Source":
align_ref_presel_mode = Metashape.ReferencePreselectionMode.ReferencePreselectionSource
elif align_ref_presel_mode_text == "Estimated":
align_ref_presel_mode = Metashape.ReferencePreselectionMode.ReferencePreselectionEstimated
elif align_ref_presel_mode_text == "Sequential":
align_ref_presel_mode = Metashape.ReferencePreselectionMode.ReferencePreselectionSequential
else:
align_ref_presel_mode = Metashape.ReferencePreselectionMode.ReferencePreselectionSource
align_ref_presel_mode = Metashape.ReferencePreselectionMode.ReferencePreselectionSource
align_key_limit = autoftg_main.menuCfg.getint(chunkSet, "align_key_limit")
align_tie_limit = autoftg_main.menuCfg.getint(chunkSet, "align_tie_limit")
align_filter_mask = autoftg_main.menuCfg.getboolean(chunkSet, "align_filter_mask")
align_mask_tiepoint = autoftg_main.menuCfg.getboolean(chunkSet, "align_mask_tiepoint")
align_filter_stationary = autoftg_main.menuCfg.getboolean(chunkSet, "align_filter_stationary")
align_keep_keypoints = autoftg_main.menuCfg.getboolean(chunkSet, "align_keep_keypoints")
align_guided_matching = autoftg_main.menuCfg.getboolean(chunkSet, "align_guided_matching")
align_reset_current = autoftg_main.menuCfg.getboolean(chunkSet, "align_reset_current")
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Align Photos...")
chunk.matchPhotos(downscale=align_quality, keypoint_limit=align_key_limit, tiepoint_limit=align_tie_limit, generic_preselection=align_gen_presel, reference_preselection=align_ref_presel, reference_preselection_mode=align_ref_presel_mode, filter_mask=align_filter_mask, mask_tiepoints=align_mask_tiepoint, filter_stationary_points=align_filter_stationary, keep_keypoints=align_keep_keypoints, guided_matching=align_guided_matching, reset_matches=align_reset_current, subdivide_task=True)
doc.save(netpath)
chunk.alignCameras(subdivide_task = True)
doc.save(netpath)
align_done = "A"
updItem.setIcon(item, 4, iconProgDone)
Metashape.app.update()
mesh_done = ''
if self.checkBox_mesh.isChecked() == True:
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Building Model...")
updItem.setIcon(item, 5, iconProcess)
if self.mesh_depthmaps == "Ultra High":
depth_quality = 0
elif self.mesh_depthmaps == "High":
depth_quality = 2
elif self.mesh_depthmaps == "Medium":
depth_quality = 4
elif self.mesh_depthmaps == "Low":
depth_quality = 8
elif self.mesh_depthmaps == "Lowest":
depth_quality = 16
else:
depth_quality = 4
if self.mesh_depthfilter == "Aggressive":
filter_mode = Metashape.AggressiveFiltering
elif self.mesh_depthfilter == "Moderate":
filter_mode = Metashape.ModerateFiltering
elif self.mesh_depthfilter == "Mild":
filter_mode = Metashape.MildFiltering
else:
filter_mode = Metashape.NoFiltering
chunk.buildDepthMaps(downscale=depth_quality, filter_mode=filter_mode)
doc.save(netpath)
if self.mesh_interpolation == True:
mesh_int = Metashape.Interpolation.EnabledInterpolation
else:
mesh_int = Metashape.Interpolation.DisabledInterpolation
mesh_facecount = ""
mesh_facecount_custom = 0
if self.mesh_face_count == "High":
mesh_facecount = Metashape.FaceCount.HighFaceCount
elif self.mesh_face_count == "Medium":
mesh_facecount = Metashape.FaceCount.MediumFaceCount
elif self.mesh_face_count == "Low":
mesh_facecount = Metashape.FaceCount.LowFaceCount
elif self.mesh_face_count == "Custom":
mesh_facecount = Metashape.FaceCount.CustomFaceCount
mesh_facecount_custom = int(self.mesh_face_count_custom)
if self.mesh_type == "Arbitrary":
mesh_type = Metashape.SurfaceType.Arbitrary
else:
mesh_type = Metashape.SurfaceType.HeightField
chunk.buildModel(surface_type=mesh_type, interpolation=mesh_int, face_count=mesh_facecount, face_count_custom=mesh_facecount_custom, source_data=Metashape.DepthMapsData, vertex_colors =self.mesh_vertex_color, vertex_confidence=self.mesh_vertex_confidence, subdivide_task=True)
mesh_buildModel = 'M'
doc.save(netpath)
model_buildTex = ''
if self.texture_build == True:
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Building Texture...")
chunk.buildUV(page_count = self.texture_levels, texture_size = int(self.texture_size))
doc.save(netpath)
chunk.buildTexture(texture_size = int(self.texture_size), fill_holes = self.texture_fill, ghosting_filter = self.texture_ghosting)
model_buildTex = '+T'
doc.save(netpath)
mesh_done = mesh_buildModel + model_buildTex
updItem.setIcon(item, 5, iconProgDone)
Metashape.app.update()
ptcloud_done = ""
if self.checkBox_pcloud.isChecked() == True:
updItem.setIcon(item, 6, iconProcess)
source_data = Metashape.DataSource.DepthMapsData
point_colors = True
point_confidence = False
keep_depth = True
uniform_sampling = False
points_spacing = 0.02
subdivide_task = True
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Building Point Cloud...")
chunk.buildPointCloud(source_data=source_data, point_color=point_colors, point_confidence=point_confidence, keep_depth=keep_depth, uniform_sampling=uniform_sampling, points_spacing=points_spacing, subdivide_task=subdivide_task)
doc.save(netpath)
ptcloud_done = 'PC'
updItem.setIcon(item, 6, iconProgDone)
Metashape.app.update()
chunk_emodel = ""
chunk_eptc = ""
if self.checkBox_export.isChecked() == True:
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> - Exporting Data...")
if chunk.model:
chunk.exportModel(path=output_folder + "/" + chunk_name + ".obj", binary=True, precision=4, texture_format=Metashape.ImageFormat.ImageFormatJPEG, save_texture=True, save_uv=True, save_normals=True, save_colors=True, save_confidence=False, save_cameras=True, save_markers=True, save_udim=False, save_alpha=False, embed_texture=False, strip_extensions=False, colors_rgb_8bit=True, comment=chunk_name, save_comment=True)
chunk_emodel = chunk_name + ".obj"
Metashape.app.update()
if chunk.point_cloud:
chunk.exportPointCloud(path=output_folder + "/" + chunk_name + ".laz", source_data=Metashape.PointCloudData, save_point_color=True, save_point_normal=True, save_point_confidence=True)
chunk_eptc = chunk_name + ".laz"
Metashape.app.update()
timeItemEnd = datetime.now()
timeItemDelta = (timeItemEnd - timeItemStart)
timeItemText = str(timeItemDelta).split('.')[0]
dt_string = timeItemEnd.strftime("%d.%m.%Y")
tm_string = timeItemEnd.strftime("%H:%M:%S")
ms_data = [dt_string, tm_string, chunk_name, chunk_key, str(len(photos)), ms_pntfile, item_cam, align_done, mesh_done, ptcloud_done, image_folder, output_folder, chunk_emodel, chunk_eptc]
self.logWriteArchive(ms_data)
updItem.setIcon(item, 3, iconDone)
updItem.setText(item, 7, timeItemText)
self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + " (" + chunk_key + ")</b> done in " + timeItemText)
self.treeWidget.setItemSelected(item, False)
self.progressBar.setValue(i_cnt)
Metashape.app.update()
doc.save(netpath)
self.loadingTime('**')
timeProcEnd = datetime.now()
timeProcDelta = timeProcEnd - timeProcStart
timeProcText = str(timeProcDelta).split('.')[0]
self.progressBar.setFormat(u"Completed %v of %m chunk(s) in " + timeProcText)
if i_cnt < sel_count:
updItem.setIcon(item, 3, iconError)
self.pushButton_3.setIcon(iconError)
self.pushButton_3.setText(u"Error!")
self.label_8.setText(u"<html><head/><body><p><b>Processing error!</b> / Imported " + str(i_cnt) + " of " + str(sel_count) + " / Could not import <b>" + str(item.text(0)) + "</b></p></body></html>")
else:
self.pushButton_3.setIcon(iconOk)
self.pushButton_3.setText(u"Finished")
self.label_8.setText(u"<html><head/><body><p><b>Processing done!</b> / Imported <b>" + str(i_cnt) + "</b> chunks in <b>" + str(timeProcText) + "</b>.</p></body></html>")
Metashape.app.update()
doc.save(netpath)
# Process selected folders manually (user must confirm chunk name, camera settings, marker detection, and show point file)
# def processBatchManual(self):
# self.sel_items = self.treeWidget.selectedItems()
# sel_count = len(self.sel_items)
# item_menu = self.cbChunkSettings.currentText()
# item_pre = autoftg_main.menuCfg.get(item_menu, "chunk_name_prefix")
# item_suf = autoftg_main.menuCfg.get(item_menu, "chunk_name_suffix")
# item_cam = self.comboBox_2.currentText()
# output_folder = autoftg_main.menuCfg.get(item_menu, "export_folder").replace("\\", "/")
#
# iconStart = QIcon()
# iconStart.addFile(u":/icons/icons8-synchronize-50.png", QSize(), QIcon.Normal, QIcon.Off)
# iconProcess = QIcon()
# iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Normal, QIcon.Off)
# iconProcess.addFile(u":/icons/icons8-loading-96.png", QSize(), QIcon.Disabled, QIcon.Off)
# iconError = QIcon()
# iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Normal, QIcon.Off)
# iconError.addFile(u":/icons/icons8-error-48.png", QSize(), QIcon.Disabled, QIcon.Off)
# iconOk = QIcon()
# iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Normal, QIcon.Off)
# iconOk.addFile(u":/icons/icons8-ok-50.png", QSize(), QIcon.Disabled, QIcon.Off)
# iconDone = QIcon()
# iconDone.addFile(u":/icons/icons8-done-50.png", QSize(), QIcon.Normal, QIcon.Off)
# iconToDo = QIcon()
# iconToDo.addFile(u":/icons/icons8-microsoft-todo-2019-48.png", QSize(), QIcon.Normal, QIcon.Off)
##
# if sel_count > 0:
# i_cnt = 0
# self.progressBar.setEnabled(True)
# self.progressBar.setMinimum(i_cnt)
# self.progressBar.setMaximum(sel_count)
# self.progressBar.setValue(i_cnt)
# self.pushButton_3.setDisabled(True)
# self.pushButton_3.setIcon(iconProcess)
# self.pushButton_3.setText(u"Processing...")
#
# for item in self.sel_items:
# i_cnt = i_cnt + 1
# self.progressBar.setFormat(u"Completed %v/%m")
# self.label_8.setText(u"Processing folder " + str(i_cnt) + " of " + str(sel_count) + " | Current: <b>" + str(item.text(0)) + "</b>")
# updItem = QTreeWidgetItem
# doc = Metashape.app.document
# netpath = Metashape.app.document.path
# netroot = self.lineEdit.text()
# image_folder = str(netroot).replace("\\", "/") + "/" + item.text(0)
# photos = autoftg_main.find_files(image_folder, [".jpg", ".jpeg", ".png", ".tif", ".tiff"])
# chunk = doc.addChunk()
# chunk.addPhotos(photos)
# chunk_name = item_pre + item.text(0) + item_suf
# chunk.label = Metashape.app.getString("Chunk Name", chunk_name)
# chunk.label = chunk_name
# doc.chunk = chunk
# doc.save(netpath)
# autoftg_main.readCameraSettings(item_cam)
# autoftg_main.useCameraSettings()
# if self.checkBox_2.isChecked() == True:
# chunk.detectMarkers(target_type=Metashape.CircularTarget12bit, tolerance=98)
# Metashape.app.update()
#
# if self.checkBox.isChecked() == True:
# points_file = image_folder + "/" + item.text(0) + ".txt"
# points_file_exists = os.path.isfile(points_file)
# if points_file_exists == True:
# chunk.importReference(points_file, format=Metashape.ReferenceFormatCSV, columns='nxyz', delimiter=',', skip_rows=6, create_markers=True)
# chunk.updateTransform()
# ms_pntfile = item.text(0) + ".txt"
# else:
# ms_pntfile = "None"
#
# Metashape.app.update()
# doc.save(netpath)
# updItem.setIcon(item, 3, iconDone)
#
#
# align_done = ""
# if self.checkBox_align.isChecked() == True:
# chunk.matchPhotos(downscale = 0, keypoint_limit = 40000, tiepoint_limit = 10000, generic_preselection = False, reference_preselection = False)
# doc.save(netpath)
# chunk.alignCameras(subdivide_task = True)
# doc.save(netpath)
# align_done = item.text(0) + "_aligned"
# updItem.setIcon(item, 4, iconToDo)
# Metashape.app.update()
#
#
# mesh_done = ""
# if self.checkBox_mesh.isChecked() == True:
# chunk.buildDepthMaps(downscale = 2, filter_mode = Metashape.MildFiltering)
# doc.save(netpath)
# chunk.buildModel(source_data = Metashape.DepthMapsData)
# doc.save(netpath)
# chunk.buildUV(page_count = 1, texture_size = 4096)
# doc.save(netpath)
# chunk.buildTexture(texture_size=4096, fill_holes=True, ghosting_filter=True)
# doc.save(netpath)
# mesh_done = item.text(0) + "_mesh"
# updItem.setIcon(item, 5, iconToDo)
# Metashape.app.update()
#
#
# ptcloud_done = ""
# if self.checkBox_export.isChecked() == True:
# chunk.buildPointCloud()
# doc.save(netpath)
# ptcloud_done = item.text(0) + "_pointcloud"
# updItem.setIcon(item, 6, iconToDo)
# Metashape.app.update()
#
#
# chunk_emodel = ""
# chunk_eptc = ""
# export_done = ""
# if self.checkBox_pcloud.isChecked() == True:
# if chunk.model:
# chunk.exportModel(path=output_folder + "/" + chunk_name + ".obj", binary=True, precision=4, texture_format='ImageFormatJPEG', save_texture=True, save_uv=True, save_normals=True, save_colors=True, save_confidence=False, save_cameras=True, save_markers=True, save_udim=False, save_alpha=False, embed_texture=False, strip_extensions=False, colors_rgb_8bit=True, comment=chunk_name, save_comment=True)
# chunk_emodel = "(M)"
# Metashape.app.update()
#
# if chunk.point_cloud:
# chunk.exportPointCloud(output_folder + "/" + chunk_name + ".laz", source_data = Metashape.PointCloudData, save_point_color=True, save_point_normal=True, save_point_confidence=True)
# chunk_eptc = "(PC)"
# Metashape.app.update()
#
# export_done = chunk_emodel + chunk_eptc + "," + output_folder
#
#
# now = datetime.now()
# dt_string = now.strftime("%d.%m.%Y")
# tm_string = now.strftime("%H:%M")
# ms_data = list(dt_string, tm_string, chunk_name, str(len(photos)), ms_pntfile, item_cam, image_folder, align_done, mesh_done, ptcloud_done, export_done)
# self.logWriteArchive(ms_data)
#
# self.treeWidget.setItemSelected(item, False)
# self.progressBar.setValue(i_cnt)
# Metashape.app.update()
# doc.save(netpath)
#
#
# if i_cnt < sel_count:
# self.pushButton_3.setIcon(iconError)
# self.pushButton_3.setText(u"Error!")
# self.label_8.setText(u"<html><head/><body><p><b>Processing error!</b> / Imported " + str(i_cnt) + " of " + str(sel_count) + " / Could not import <b>" + str(item.text(0)) + "</b></p></body></html>")
# else:
# self.pushButton_3.setIcon(iconOk)
# self.pushButton_3.setText(u"Finished")
# self.label_8.setText(u"<html><head/><body><p><b>Processing Finished!</b> / Imported " + str(i_cnt) + " of " + str(sel_count) + "</p></body></html>")
#
#
# Metashape.app.update()
# doc.save(netpath)
def processBatch(self):
if self.checkBox_3.isChecked() == True:
self.processBatchAuto()
else:
# self.processBatchManual()
Metashape.app.messageBox("Feature in development. Coming soon.")
def quitChunkBatch(self):
self.reject()
def diaSettingsMesh(self):
app_inst = QtWidgets.QApplication.instance()
parent = app_inst.activeWindow()
setMeshDia = Ui_DialogSettingsMesh(parent)
self.setCurrentSettings()
def diaSettingsAlign(self):
app_inst = QtWidgets.QApplication.instance()
parent = app_inst.activeWindow()
setAlignDia = Ui_DialogAlignPhotos(parent)
self.setCurrentSettings()
def diaSettingsPoint(self):
app_inst = QtWidgets.QApplication.instance()
parent = app_inst.activeWindow()
setPointDia = Ui_DialogPCloudSet(parent)
self.setCurrentSettings()