1
Python and Java API / Re: Remove selection
« on: July 06, 2015, 09:44:00 AM »
Could you tell me how I can get vertex coordinates of bounding box?
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
#building dense cloud, mesh and merging the result back is optional
import PhotoScan
from PySide import QtGui, QtCore
class SplitDlg(QtGui.QDialog):
# Okno dialogowe
def __init__(self, parent):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle("Split in chunks")
self.gridX = 2
self.gridY = 2
self.gridZ = 2
self.gridWidth = 270
self.gridHeight = 270
self.gridDepth = 270
self.scale_box = 10
self.spinX_label = QtGui.QLabel("X")
self.spinX = QtGui.QSpinBox()
self.spinX.setMinimum(2)
self.spinX.setMaximum(20)
self.spinX.setFixedSize(75, 25)
self.spinY_label = QtGui.QLabel("Y")
self.spinY = QtGui.QSpinBox()
self.spinY.setMinimum(2)
self.spinY.setMaximum(20)
self.spinY.setFixedSize(75, 25)
self.spinZ_label = QtGui.QLabel("Z")
self.spinZ = QtGui.QSpinBox()
self.spinZ.setMinimum(2)
self.spinZ.setMaximum(20)
self.spinZ.setFixedSize(75, 25)
self.scale_box_Label1 = QtGui.QLabel("Scale box by")
self.scale_box_Label2 = QtGui.QLabel("%")
self.scale_box = QtGui.QSpinBox()
self.scale_box.setMinimum(1)
self.scale_box.setMaximum(100)
self.scale_box.setFixedSize(75, 25)
self.chkMesh = QtGui.QCheckBox("Build Mesh")
self.chkMesh.setFixedSize(130,50)
self.chkMesh.setToolTip("Generates mesh for each cell in grid")
self.chkDense = QtGui.QCheckBox("Build Dense Cloud")
self.chkDense.setFixedSize(130,50)
self.chkDense.setWhatsThis("Builds dense cloud for each cell in grid")
self.chkMerge = QtGui.QCheckBox("Merge Back")
self.chkMerge.setFixedSize(90,50)
self.chkMerge.setToolTip("Merges back the processing products formed in the indiv")
self.btnQuit = QtGui.QPushButton("Quit")
self.btnQuit.setFixedSize(75,50)
self.btnP1 = QtGui.QPushButton("Split")
self.btnP1.setFixedSize(75,50)
self.grid = QtGui.QLabel(" ")
self.grid.resize(self.gridWidth, self.gridHeight)
tempPixmap = QtGui.QPixmap(self.gridWidth, self.gridHeight)
tempImage = tempPixmap.toImage()
"""for y in range(self.gridHeight):
for x in range(self.gridWidth):
if not (x and y) or (x == self.gridWidth - 1) or (y == self.gridHeight - 1):
tempImage.setPixel(x, y, QtGui.qRgb(0, 0, 0))
elif (x == self.gridWidth / 2) or (y == self.gridHeight / 2):
tempImage.setPixel(x, y, QtGui.qRgb(0, 0, 0))
else:
tempImage.setPixel(x, y, QtGui.qRgb(255, 255, 255))"""
#tempPixmap = tempPixmap.fromImage(tempImage)
#self.grid.setPixmap(tempPixmap)
#self.grid.show()
layout = QtGui.QGridLayout() #creating layout
layout.addWidget(self.spinX_label, 0, 1)
layout.addWidget(self.spinX, 1, 1)
layout.addWidget(self.spinY_label, 0, 2)
layout.addWidget(self.spinY, 1, 2)
layout.addWidget(self.spinZ_label, 0, 3)
layout.addWidget(self.spinZ, 1, 3)
layout.addWidget(self.scale_box, 2, 2)
layout.addWidget(self.scale_box_Label1, 2, 1)
layout.addWidget(self.scale_box_Label2, 2, 3)
layout.addWidget(self.btnP1, 4, 2) #split button
layout.addWidget(self.btnQuit, 4, 3) #quit button
#layout.addWidget(self.grid, 6, 1, 3, 3) #grid
self.setLayout(layout)
proc_split = lambda : self.splitChunks()
"""self.spinX.valueChanged.connect(self.updateGrid)
self.spinY.valueChanged.connect(self.updateGrid)
self.spinZ.valueChanged.connect(self.updateGrid)"""
QtCore.QObject.connect(self.btnP1, QtCore.SIGNAL("clicked()"), proc_split)
QtCore.QObject.connect(self.btnQuit, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("reject()"))
self.exec()
def updateGrid(self):
"""
Rysowanie nowej siatki
"""
self.gridX = self.spinX.value()
self.gridY = self.spinY.value()
self.gridZ = self.spinZ.value()
tempPixmap = QtGui.QPixmap(self.gridWidth, self.gridHeight)
tempImage = tempPixmap.toImage()
tempImage.fill(QtGui.qRgb(240, 240, 240))
for y in range(int(self.gridHeight / self.gridY) * self.gridY):
for x in range(int(self.gridWidth / self.gridX) * self.gridX):
if not (x and y) or (x == self.gridWidth - 1) or (y == self.gridHeight - 1):
tempImage.setPixel(x, y, QtGui.qRgb(0, 0, 0))
elif y > int(self.gridHeight / self.gridY) * self.gridY:
tempImage.setPixel(x, y, QtGui.qRgb(240, 240, 240))
elif x > int(self.gridWidth / self.gridX) * self.gridX:
tempImage.setPixel(x, y, QtGui.qRgb(240, 240, 240))
else:
tempImage.setPixel(x, y, QtGui.qRgb(255, 255, 255))
for y in range(0, int(self.gridHeight / self.gridY + 1) * self.gridY, int(self.gridHeight / self.gridY)):
for x in range(int(self.gridWidth / self.gridX) * self.gridX):
tempImage.setPixel(x, y, QtGui.qRgb(0, 0, 0))
for x in range(0, int(self.gridWidth / self.gridX + 1) * self.gridX, int(self.gridWidth / self.gridX)):
for y in range(int(self.gridHeight / self.gridY) * self.gridY):
tempImage.setPixel(x, y, QtGui.qRgb(0, 0, 0))
tempPixmap = tempPixmap.fromImage(tempImage)
self.grid.setPixmap(tempPixmap)
self.grid.show()
return True
def splitChunks(self):
self.gridX = self.spinX.value()
self.gridY = self.spinY.value()
partsX = self.gridX
partsY = self.gridY
partsZ = self.gridZ
print("Script started")
buildMesh = self.chkMesh.isChecked()
buildDense = self.chkDense.isChecked()
mergeBack = self.chkMerge.isChecked()
doc = PhotoScan.app.document
chunk = doc.chunk
region = chunk.region
r_center = region.center
r_rotate = region.rot
r_size = region.size
x_scale = r_size.x / partsX
y_scale = r_size.y / partsY
z_scale = r_size.z / partsZ
offset = r_center - r_rotate * r_size /2
scale_box = self.scale_box.value() / 100
d = 0
#doc.save()
for k in range(1, partsZ + 1):
for j in range(1, partsY + 1):
for i in range(1, partsX + 1):
new_chunk = chunk.copy()
new_chunk.label = "Chunk "+ str(i)+ "\\" + str(j) + "\\" + str(k)
new_chunk.model = None
doc.addChunk(new_chunk)
new_region = PhotoScan.Region()
new_rot = r_rotate
new_center = PhotoScan.Vector([(i - 0.5) * x_scale, (j - 0.5) * y_scale, (k - 0.5) * z_scale])
new_center = offset + new_rot * new_center
new_size = PhotoScan.Vector([x_scale + x_scale * scale_box, y_scale + y_scale * scale_box, z_scale + z_scale * scale_box])
new_region.size = new_size
new_region.center = new_center
new_region.rot = new_rot
new_chunk.region = new_region
PhotoScan.app.update()
""""doc.save("Chunk {} na {}.psz".format(i, j))
doc.remove(doc.chunks[1:-1])
doc.remove(doc.chunks[1])"""
d=d+1
doc = PhotoScan.app.document
doc2 = PhotoScan.Document()
doc2.addChunk(doc.chunks[d].copy())
doc2.save("Chunk {} na {} na {}.psz".format(i, j, k))
doc.remove(doc.chunks[1:-1])
doc.remove(doc.chunks[1])
doc.save()
if mergeBack:
for i in range(1, len(doc.chunks)):
chunk = doc.chunks[i]
chunk.remove(chunk.cameras)
doc.chunks[0].model = None
doc.mergeChunks(doc.chunks, merge_dense_clouds = True, merge_models = True, merge_markers = True)
doc.remove(doc.chunks[1:-1])
print("Script finished")
return True
def main():
global doc
doc = PhotoScan.app.document
app = QtGui.QApplication.instance()
parent = app.activeWindow()
dlg = SplitDlg(parent)
PhotoScan.app.addMenuItem("Custom/Split chunks 3D", main)