Данные ребер из созданной полилинии в Meshlab
Я генерирую полилинии в Meshlab с помощью фильтра «Вычислить плоское сечение». Я бы хотел получить данные, которые используются для соединения одной точки с другой. Meshlab хранит эти данные, так как когда я экспортирую свою полилинию в DXF, края присутствуют, правильно соединенные вместе.
Я представляю себе список, в котором каждое ребро имеет начальную и конечную точку (потенциально идентификатор вершины), как видно из DXF, будет наиболее полезным.
Будем очень признательны за любые рекомендации, помогающие получить эту информацию.
1 ответ
Я должен сообщить плохие новости. В текущий день (октябрь 2021 г.) запрашиваемая вами информация о краях хранится внутри в сетках VCG, но не предоставляется API-интерфейсу python, поэтому вы не можете прочитать ее с помощью pymeshlab. Вы можете прочитать количество ребер только с помощью метода m.edge_number().
Если вам нужно продолжить работу над проектом, у вас есть следующие варианты:
- Напишите одну проблему на https://github.com/cnr-isti-vclab/PyMeshLab/issues/, любезно попросив разработчиков предоставить информацию о краях в pymeshlab api. Фактически, я только что это сделал
- Если ваши поверхности выпуклые, вы можете перестроить данные ребер, вычислив выпуклую оболочку вершины, или отсортировав вершину по углу вокруг центроида вершины.
- Если ваши поверхности сложные, вы все равно можете сохранить сетку в файле dxf, а затем проанализировать dxf, чтобы прочитать информацию обратно.
Вариант 3 кажется наиболее простым. Файлы DXF, написанные meshlab, содержат множество разделов.
LINE
8
0
10
40.243473 -> this is coordinate X of point 1
20
-40.981182 -> this is coordinate Y of point 1
30
0.000000 -> this is coordinate Z of point 1
11
40.887867 -> this is coordinate X of point 2
21
-42.090389 -> this is coordinate Y of point 2
31
0.000000 -> this is coordinate Z of point 2
0
поэтому вы можете проанализировать файл dxf с помощью этого фрагмента кода Python
with open("contour.dxf") as f:
line = f.readline().strip()
while line:
if line == "LINE" :
f.readline()
f.readline()
f.readline()
x1 = float(f.readline())
f.readline()
y1 = float(f.readline())
f.readline()
z1 = float(f.readline())
f.readline()
x2 = float(f.readline())
f.readline()
y2 = float(f.readline())
f.readline()
z2 = float(f.readline())
print((x1,y1,z1), "to", (x2,y2,z2))
line = f.readline().strip()