Получение (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, который немного менее непрозрачен?

1 ответ

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

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

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

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

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

face = aResShape.Face();

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

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

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

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

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

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

Другие вопросы по тегам