Получение значений (t, c, k) из поверхностей OpenCascade

Я создал библиотеку для создания и использования поверхностей b-сплайна в Python, используя параллельные экземпляры scipy.interpolate.RectBivariateSpline() для хранения узловых векторов, сетки контрольных точек (X, Y, Z) и градусов в u и v ((t, c , k) кортеж, по которому выполняется оценка поверхности). Я также написал анализатор STEP для чтения данных поверхности, экспортированных из пакетов САПР; Я беру значения (t, c, k) из b_spline_surface_with_knots сущностей в файле и вставляю их в свои собственные объекты. Поверхностная библиотека у меня работает довольно хорошо, но анализатор STEP - это боль, и он дает сбой по разным причинам почти каждый раз, когда я его использую. Итак, я пробовал использовать «настоящий» STEP-парсер, например:

from OCC.STEPControl import STEPControl_Reader
from OCC.IFSelect import IFSelect_RetDone, IFSelect_ItemsByEntity

step_reader = STEPControl_Reader()
status = step_reader.ReadFile('c:/LPT/nomdata/lpt3.stp')

if status == IFSelect_RetDone:  # check status
    failsonly = False
    step_reader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity)
    step_reader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity)

    ok = step_reader.TransferRoot(1)
    _nbs = step_reader.NbShapes()
    aResShape = step_reader.Shape(1)
else:
    print("Error: can't read file.")
    sys.exit(0)

Теперь у меня есть этот объект aResShape, но никакие попытки выловить его в IPython (или поиск в Google) не покажут, как получить значения (t, c, k), которые определяют поверхность.

Может кто-нибудь указать мне метод, который выявит эти значения? Или, возможно, есть другой STEP-синтаксический анализатор на основе Python, который немного менее непрозрачен?


person subnivean    schedule 04.03.2015    source источник


Ответы (1)


Вопрос немного устарел, но на случай, если кто-то еще столкнется с подобной проблемой ...

Результатом step_reader.Shape () является TopoDS_Shape, который представляет собой топологический объект, который можно разделить на следующие топологии компонентов:

  • Вершина - форма нульмерного размера, соответствующая точке геометрии;
  • Край - форма, соответствующая кривой и ограниченная вершиной на каждом конце;
  • Проволока - последовательность ребер, соединенных вершинами;
  • Грань - часть плоскости (в 2D-геометрии) или поверхности (в 3D-геометрии), ограниченная замкнутой проволокой;
  • Оболочка - набор граней, соединенных некоторыми ребрами их проволочных границ;
  • Solid - часть трехмерного пространства, ограниченная оболочкой;
  • Составное твердое тело - это совокупность твердых тел.

Как правило, вы можете запросить его с помощью метода TopoDS_Shape :: ShapeType (), чтобы узнать, что это за форма (вершина? Край ?, ...).

Если модель образована одной поверхностью b-сплайна, тогда форма должна быть TopoDS_Face, которую вы можете получить, вызвав:

face = aResShape.Face();

Когда у вас есть TopoDS_Face, вы можете получить базовую геометрию (Geom_Surface) следующим образом:

surface = BRepAdaptor_Surface(face).Surface().BSpline();

Теперь, когда у вас есть доступ к базовой геометрии, вы можете вызвать методы этого объекта, и они предоставят вам необходимую информацию.

Они задокументированы здесь:

Документация OpenCASCADE может показаться запутанной, но я думаю, вам может быть интересна эта тема:

Надеюсь, это поможет.

person Fernando    schedule 18.07.2017