Спасибо большое за скриншот! Для числа точек в плотном облаке на панели проект то же самое ограничение (для отображения числа).
вот пример скрипта, который дублирует исходный (активный) блок нужное число раз, создавая сетку из рабочих областей. По умолчанию, сетка 3 х 3, но в качестве аргумента в окне запуска скрипта можно использовать другое натуральное число:
## Splits active chunk into user defined grid of sub-chunks (images are kept but bounding box is split
#argument - grid size
#compatibility PhotoScan Professional 1.0.0
import PhotoScan
import math, sys
doc = PhotoScan.app.document
chunk = doc.activeChunk
def dist(v0, v1):
"""
Calculate distance between two points defined as vectors
"""
distance = (v1 - v0)
return distance.norm() #**2
parts = 3 #parts of the model, 3 by default
if len(sys.argv) > 1:
parts = int(sys.argv[1])
print("Script started...")
region = chunk.region
r_center = region.center
r_rotate = region.rot
r_size = region.size
r_vert = list()
limits = [[+10e+10, -10e+10],[+10e+10, -10e+10],[+10e+10, -10e+10]] #x,y,z
if not chunk.transform:
chunk.transform = PhotoScan.Matrix().diag([1,1,1,1])
m = PhotoScan.Matrix().diag([1,1,1,1])
T = chunk.transform
else:
T = chunk.transform
if chunk.crs:
origin = T * PhotoScan.Vector( [0,0,0,1] )
origin.size = 3
m = chunk.crs.localframe(origin)
else:
m = PhotoScan.Matrix().diag([1,1,1,1])
m = m * T
s = math.sqrt(m[0,0] * m[0,0] + m[0,1] * m[0,1] + m[0,2] * m[0,2]) #scale factor
R = PhotoScan.Matrix( [[m[0,0], m[0,1], m[0,2]], [m[1,0], m[1,1], m[1,2]], [m[2,0], m[2,1], m[2,2]]])
R = R * (1. / s)
for i in range(8): #finding bounding box corners and limits
r_vert.append(PhotoScan.Vector([r_size[0] * ((i & 1) - 0.5), 0.5 * r_size[1] * ((i & 2) - 1), 0.25 * r_size[2] * ((i & 4) - 2)]))
r_vert[i] = r_center + r_rotate.t() * r_vert[i]
r_vert[i].size = 4
r_vert[i].w = 1
v_t = m * r_vert[i]
v_t /= v_t.w
v_t.size = 3
r_vert[i] = v_t
if r_vert[i][0] <= limits[0][0]:
limits[0][0] = r_vert[i][0]
if r_vert[i][0] >= limits[0][1]:
limits[0][1] = r_vert[i][0]
if r_vert[i][1] <= limits[1][0]:
limits[1][0] = r_vert[i][1]
if r_vert[i][1] >= limits[1][1]:
limits[1][1] = r_vert[i][1]
if r_vert[i][2] <= limits[2][0]:
limits[2][0] = r_vert[i][2]
if r_vert[i][2] >= limits[2][1]:
limits[2][1] = r_vert[i][2]
x_size = abs(limits[0][1] - limits[0][0]) / s
y_size = abs(limits[1][1] - limits[1][0]) / s
z_size = abs(limits[2][1] - limits[2][0]) / s
x_scale = x_size / parts
y_scale = y_size / parts
z_scale = z_size
offset = PhotoScan.Vector([min(limits[0]), min(limits[1]), min(limits[2])])
offset.size = 4
offset.w = 1
offset = m.inv() * offset
offset.size = 3
for j in range(1, parts + 1): #creating new chunks and adjusting bounding box
for i in range(1, parts + 1):
new_chunk = chunk.copy()
new_chunk.label = "Chunk "+ str(i)+ "\\" + str(j)
new_chunk.model = None
doc.chunks.add(new_chunk)
new_region = PhotoScan.Region()
new_rot = R.t()
new_center = PhotoScan.Vector([(i - 0.5) * x_scale, (j - 0.5) * y_scale, 0.5 * z_scale])
new_center = offset + new_rot * new_center
new_size = PhotoScan.Vector([x_scale, y_scale, z_scale])
new_region.size = new_size
new_region.center = new_center
new_region.rot = new_rot
new_chunk.region = new_region
print("Script finished...")
PhotoScan.app.update()