我如何在 OpenCascade 中获取实际的地形数据?
How I could get the actual toposhape data in OpenCascade?
全部
有来自 CAD (SW) 的 STEP 格式文件,并且能够通过 Python OCC 绑定读取它:
importer = aocxchange.step.StepImporter(fname)
shapes = importer.shapes
shape = shapes[0]
# promote up
if (shape.ShapeType() == OCC.TopAbs.TopAbs_SOLID):
sol = OCC.TopoDS.topods.Solid(shape)
我可以展示它、戳它、检查标志等
t = OCC.BRepCheck.BRepCheck_Analyzer(sol)
print(t.IsValid())
print(sol.Checked())
print(sol.Closed())
print(sol.Convex())
print(sol.Free())
print(sol.Infinite())
到目前为止一切顺利。它真的看起来像沿着一些复杂路径弯曲的小管子。
问题:如何从现有的中提取几何特征?我真的需要管参数和它遵循的路径。 Python and/or C++ 中的任何好例子都很棒
在 OpenCASCADE 中,拓扑和几何是分开的。因此,通常您的第一个联系人将是拓扑实体(即:TopoDS_Wire 或 TopoDS_Edge),它们可以允许您访问几何图形(take a look here 了解更多详细信息)。
在你的例子中,在阅读 STEP 文件后你得到了 TopoDS_Shape。这是最高级别的拓扑实体,很可能由一个或多个子形状组成。
假设您的形状是由 bspline 曲线形成的(看起来是!),您可以探索该形状,寻找 TopoDS_Edge 个对象(它们是映射到几何曲线的拓扑实体):
TopExp_Explorer myEdgeExplorer(shape, TopAbs_EDGE);
while (myEdgeExplorer.More())
{
double u0, u1;
auto edge = TopoDS::Edge(myEdgeExplorer.Current());
auto curve = BRep_Tool::Curve(edge, u0, u1);
// now you have access to the curve ...
// to get a point lying on it, check
// the method curve->Value(u);
myEdgeExplorer.Next();
}
全部
有来自 CAD (SW) 的 STEP 格式文件,并且能够通过 Python OCC 绑定读取它:
importer = aocxchange.step.StepImporter(fname)
shapes = importer.shapes
shape = shapes[0]
# promote up
if (shape.ShapeType() == OCC.TopAbs.TopAbs_SOLID):
sol = OCC.TopoDS.topods.Solid(shape)
我可以展示它、戳它、检查标志等
t = OCC.BRepCheck.BRepCheck_Analyzer(sol)
print(t.IsValid())
print(sol.Checked())
print(sol.Closed())
print(sol.Convex())
print(sol.Free())
print(sol.Infinite())
到目前为止一切顺利。它真的看起来像沿着一些复杂路径弯曲的小管子。
问题:如何从现有的中提取几何特征?我真的需要管参数和它遵循的路径。 Python and/or C++ 中的任何好例子都很棒
在 OpenCASCADE 中,拓扑和几何是分开的。因此,通常您的第一个联系人将是拓扑实体(即:TopoDS_Wire 或 TopoDS_Edge),它们可以允许您访问几何图形(take a look here 了解更多详细信息)。
在你的例子中,在阅读 STEP 文件后你得到了 TopoDS_Shape。这是最高级别的拓扑实体,很可能由一个或多个子形状组成。
假设您的形状是由 bspline 曲线形成的(看起来是!),您可以探索该形状,寻找 TopoDS_Edge 个对象(它们是映射到几何曲线的拓扑实体):
TopExp_Explorer myEdgeExplorer(shape, TopAbs_EDGE);
while (myEdgeExplorer.More())
{
double u0, u1;
auto edge = TopoDS::Edge(myEdgeExplorer.Current());
auto curve = BRep_Tool::Curve(edge, u0, u1);
// now you have access to the curve ...
// to get a point lying on it, check
// the method curve->Value(u);
myEdgeExplorer.Next();
}