Получение (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 может показаться запутанной, но я думаю, что вас может заинтересовать эта тема:
Надеюсь, поможет.