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

119 lines
3.1 KiB
Python

# Class for Copy Region UI
import os
import pydoc
import shutil
import sys
import time
from configparser import ConfigParser
from datetime import datetime
from os import path
import Metashape
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from AutoFTG.autoftg_batch import *
from AutoFTG.autoftg_settingschunk import *
from AutoFTG.autoftg_settingsmain import *
from AutoFTG.qtresources_rc2 import *
class CopyBoundingBoxDlg(QtWidgets.QDialog):
def __init__(self, parent):
QtWidgets.QDialog.__init__(self, parent)
self.setWindowTitle("Copy Region (Bounding Box)")
appIcon = QIcon()
appIcon.addFile(u":/icons/AutoFTG-appicon.png", QSize(), QIcon.Normal, QIcon.Off)
self.setWindowIcon(appIcon)
self.labelFrom = QtWidgets.QLabel("From")
self.labelTo = QtWidgets.QLabel("To")
self.fromChunk = QtWidgets.QComboBox()
for chunk in Metashape.app.document.chunks:
self.fromChunk.addItem(chunk.label)
self.toChunks = QtWidgets.QListWidget()
self.toChunks.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
for chunk in Metashape.app.document.chunks:
self.toChunks.addItem(chunk.label)
self.btnOk = QtWidgets.QPushButton("Copy")
self.btnOk.setFixedSize(120, 36)
self.btnOk.setToolTip("Copy region from one chunk to multiple chunks.:")
self.btnQuit = QtWidgets.QPushButton("Cancel")
self.btnQuit.setFixedSize(80, 36)
layout = QtWidgets.QGridLayout() # creating layout
layout.setColumnMinimumWidth(0, 80) # minimum column width
layout.setColumnMinimumWidth(1, 180) # minimum column width
layout.addWidget(self.labelFrom, 0, 0)
layout.addWidget(self.fromChunk, 0, 1)
layout.addWidget(self.labelTo, 1, 0)
layout.addWidget(self.toChunks, 1, 1, 20, 2)
layout.addWidget(self.btnQuit, 30, 0)
layout.addWidget(self.btnOk, 30, 1)
self.setLayout(layout)
QtCore.QObject.connect(self.btnOk, QtCore.SIGNAL("clicked()"), self.copyBoundingBox)
QtCore.QObject.connect(self.btnQuit, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("reject()"))
self.exec()
def copyBoundingBox(self):
print("Copy region bounding box...")
doc = Metashape.app.document
fromChunk = doc.chunks[self.fromChunk.currentIndex()]
toChunks = []
for i in range(self.toChunks.count()):
if self.toChunks.item(i).isSelected():
toChunks.append(doc.chunks[i])
print("Copy region from/to: '" + fromChunk.label + "' to " + str(len(toChunks)))
T0 = fromChunk.transform.matrix
region = fromChunk.region
R0 = region.rot
C0 = region.center
s0 = region.size
for chunk in toChunks:
if chunk == fromChunk:
continue
T = chunk.transform.matrix.inv() * T0
R = Metashape.Matrix([[T[0, 0], T[0, 1], T[0, 2]],
[T[1, 0], T[1, 1], T[1, 2]],
[T[2, 0], T[2, 1], T[2, 2]]])
scale = R.row(0).norm()
R = R * (1 / scale)
new_region = Metashape.Region()
new_region.rot = R * R0
c = T.mulp(C0)
new_region.center = c
new_region.size = s0 * scale / 1.
chunk.region = new_region
print("Process complete!\n\nFrom: " + fromChunk.label + " / To: " + str(len(toChunks)) + "\n")
self.reject()