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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值