如何使OpenCASCADE读取STEP文件的曲面参数域与三维形状匹配?
背景
我正在使用OpenCASCADE读取STEP文件中的曲线与曲面几何信息,示例代码如下:
bool HighOrder::FileIO_3D::read_step(std::string & stepFile) { STEPControl_Controller::Init(); STEPControl_Reader reader; Standard_Integer status = reader.ReadFile(stepFile.c_str()); if (status != IFSelect_RetDone) { return false; } reader.TransferRoots(); //int n = reader.NbShapes(); //cout << n << endl; int idx = 0; //TopoDS_Shape shapes = reader.OneShape(); TopoDS_Shape shapes = reader.Shape(1); TopExp_Explorer explorer/*(shapes, TopAbs_FACE)*/; // read surfaces for (explorer.Init(shapes, TopAbs_FACE); explorer.More(); explorer.Next()) { TopoDS_Shape shape = explorer.Current(); TopoDS_Face face = TopoDS::Face(shape); TopLoc_Location location; Handle_Geom_Surface surface = BRep_Tool::Surface(face, location); GeomAdaptor_Surface adapter(surface); } // read curves for (explorer.Init(shapes, TopAbs_EDGE); explorer.More(); explorer.Next()) { TopoDS_Shape shape = explorer.Current(); TopoDS_Edge edge = TopoDS::Edge(shape); TopLoc_Location location; double para1, para2; Handle_Geom_Curve curve = BRep_Tool::Curve(edge, para1, para2); if (curve.IsNull()) continue; GeomAdaptor_Curve adapter0(curve, para1, para2); bool flag = true; gp_Pnt node0, node1; for (int i = 0; i < curves.size(); ++i) { GeomAdaptor_Curve adapter1(curves[i]->h()); double para1_ = curves[i]->para().first, para2_ = curves[i]->para().second; int intervals_num = 10; double step0 = (para2 - para1) / intervals_num; double step1 = (para2_ - para1_) / intervals_num; bool isEqual = true; for (int i = 0; i <= intervals_num; ++i) { adapter0.D0(para1 + i * step0, node0); adapter1.D0(para1_ + i * step1, node1); if (!node0.IsEqual(node1, 1e-10)) { isEqual = false; break; } } if (isEqual) { flag = false; break; } } if (flag) { //Curve *c = new Curve(curve, std::make_pair(para1, para2)); curves.push_back(new Curve(curve, { para1, para2 })); } } cout << "Curves' num: " << curves.size() << endl; return true; }
暂不考虑曲线信息,我目前需要通过二维参数坐标uv获取对应曲面上的三维物理坐标xyz。
但我发现部分曲面的二维参数域与曲面的三维形状不匹配
例如,带状曲面的参数域范围为正方形。以下是相关示例(我将网格点投影到对应的参数坐标):
绿色代表参数坐标,红色代表物理坐标
形状匹配的情况
- 参数坐标(绿色)与物理坐标(红色)轮廓完全对应
- 网格点投影后,参数域形状与三维曲面轮廓一致
形状不匹配的情况
- 参数域为正方形,而三维曲面是带状形态
- 网格点投影后,参数域形状与三维曲面轮廓明显不符
问题
请问如何控制或修改曲面的参数域范围,使其与三维形状保持一致?
感谢您提供的任何帮助或建议!
内容的提问来源于stack exchange,提问作者OlW
相关产品推荐
相关产品推荐

