opencascade如何保存选中的面到本地
环境:occ 7.6
需求场景:用户点击了一个TopoDS_Shape,还选中了其中一个面,这时候他点了保存。用户下次打开模型文件时,我们的viewer窗口要恢复上次的选中状态。
核心问题:如何把用户选中的面保存,并下次复原?
首先,保存的时候,把用户选中的面的中心点A,给存到本地文件,或数据库里。
下次打开的时候,读取这个中心点
遍历已保存的TopoDS_Shape的所有拓扑面,计算它们的中心点,跟点A距离最近的,就是用户上次选择的面了。
//获取面的中心点
bool getFaceCenterNormal(const TopoDS_Face &face, gp_Pnt &aCenterPoint)
{if (face.IsNull()){return Standard_False;}BRepAdaptor_Surface aSurface(face);//获取曲面最大最小UV值Standard_Real aUmin = aSurface.FirstUParameter();Standard_Real aUmax = aSurface.LastUParameter();Standard_Real aVmin = aSurface.FirstVParameter();Standard_Real aVmax = aSurface.LastVParameter();//曲面中心点UV值Standard_Real aMidU = (aUmax + aUmin) / 2;Standard_Real aMidV = (aVmax + aVmin) / 2;aSurface.D0(aMidU, aMidV, aCenterPoint);//面中心点坐标和此点切线向量return Standard_True;
}//myShape :用户最后点击的物体
//centerPointFromDataBase :从数据库读到的中心点,记录用户最后点击的面
TopoDS_Face LoadFace(TopoDS_Shape myShape,gp_Pnt centerPointFromDataBase){TopoDS_Face targetFace;double minDist = std::numeric_limits<double>::max();for (Ex.Init(myShape, TopAbs_FACE); Ex.More(); Ex.Next()){TopoDS_Face currentFace = TopoDS::Face(Ex.Current());gp_Pnt centerPoint;getFaceCenterNormal(currentFace, centerPoint);double dist = centerPoint.Distance(centerPointFromDataBase);if (dist < minDist){targetFace = currentFace;minDist = dist;}}return targetFace;
}