Данные ребер из созданной полилинии в Meshlab

Я генерирую полилинии в Meshlab с помощью фильтра «Вычислить плоское сечение». Я бы хотел получить данные, которые используются для соединения одной точки с другой. Meshlab хранит эти данные, так как когда я экспортирую свою полилинию в DXF, края присутствуют, правильно соединенные вместе.

Я представляю себе список, в котором каждое ребро имеет начальную и конечную точку (потенциально идентификатор вершины), как видно из DXF, будет наиболее полезным.

Будем очень признательны за любые рекомендации, помогающие получить эту информацию.

1 ответ

Я должен сообщить плохие новости. В текущий день (октябрь 2021 г.) запрашиваемая вами информация о краях хранится внутри в сетках VCG, но не предоставляется API-интерфейсу python, поэтому вы не можете прочитать ее с помощью pymeshlab. Вы можете прочитать количество ребер только с помощью метода m.edge_number().

Если вам нужно продолжить работу над проектом, у вас есть следующие варианты:

  1. Напишите одну проблему на https://github.com/cnr-isti-vclab/PyMeshLab/issues/, любезно попросив разработчиков предоставить информацию о краях в pymeshlab api. Фактически, я только что это сделал
  2. Если ваши поверхности выпуклые, вы можете перестроить данные ребер, вычислив выпуклую оболочку вершины, или отсортировав вершину по углу вокруг центроида вершины.
  3. Если ваши поверхности сложные, вы все равно можете сохранить сетку в файле 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()
      
Другие вопросы по тегам