119 lines
3.1 KiB
Python
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()
|
|
|
|
|