环境: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;
}