初探OSG+Opencascade在qt上的实践值获取模型颜色并在OSG中显示

20 篇文章 11 订阅

   很久没有正式写过一篇博客,之前因为工作原因,致使个人项目一直停滞,在出差回来后,决定利用晚上的空闲时间重新对之前的知识进行梳理和补充,前版本中实现了如何利用opencascade读取stp模型,并显示装配体树,当时存在一个缺陷在于模型的颜色使用的是默认的颜色,这也是因为在重写OSG求交器时对面颜色使用了固定值,因此暂时对这个细节的完善暂时搁置了,这几天将这个细节完成了,需要注意:

如何获取模型的颜色:这个我觉得可以参考FreeCAD 以及Mayo能很快找到相关代码,我这里简单贴出一段:

//

    std::vector<App::Color> faceColors;
    faceColors.resize(faces.Extent(), color);
    xp.Init(aShape,TopAbs_FACE);
    while (xp.More()) {
        if (aColorTool->GetColor(xp.Current(), XCAFDoc_ColorGen, aColor) ||
            aColorTool->GetColor(xp.Current(), XCAFDoc_ColorSurf, aColor) ||
            aColorTool->GetColor(xp.Current(), XCAFDoc_ColorCurv, aColor)) {
            int index = faces.FindIndex(xp.Current());
            color.r = (float)aColor.Red();
            color.g = (float)aColor.Green();
            color.b = (float)aColor.Blue();
            faceColors[index-1] = color;
            found_face_color = true;
        }
        xp.Next();
    }

其中,xp.Current()  可以是Topds_shape 、Topds_face;l另外,

 aColorTool = XCAFDoc_DocumentTool::ColorTool(pDoc->Main()); 而pDoc的获取如下:

Handle(XCAFApp_Application) anApp = XCAFApp_Application::GetApplication();
    Handle(TDocStd_Document) doc;
    anApp->NewDocument("MDTV-XCAF", doc);

reader.Transfer(doc);

至于redder 则为STEPCAFControl_Reader 

///

如此就能获取shape 或者face的颜色了,只要获取颜色就能传给osg了,这里附一段完整的读取stp模型颜色代码例子:

///

  STEPCAFControl_Reader reader;
    reader.SetColorMode(true);
    reader.SetNameMode(true);
    IFSelect_ReturnStatus status= reader.ReadFile(aFilePath.ToCString());
    Handle(XCAFApp_Application) anApp=XCAFApp_Application::GetApplication();
    Handle(TDocStd_Document) doc;
    anApp->NewDocument("MDTV-XCAF",doc);
    bool yes = reader.Transfer(doc);
    TDF_Label mainLabel=doc->Main();
    Handle(TDataStd_Name) rootName;
    Handle(TDF_Attribute) rootAtt;
    Handle(XCAFDoc_ShapeTool) rootNode=XCAFDoc_DocumentTool::ShapeTool(mainLabel);
    Handle(XCAFDoc_ColorTool) rootColorTool=XCAFDoc_DocumentTool::ColorTool(mainLabel);

    TDF_LabelSequence tdfLabels;
    rootNode->GetShapes(tdfLabels);   //获取装配体和组件对应名称
    int Roots=tdfLabels.Length();
    for(int i=1;i<=Roots;i++)
    {
        TDF_Label label=tdfLabels.Value(i);
//        Quantity_Color coll(Quantity_NOC_RED );
//        rootColorTool->SetColor ( label, coll, XCAFDoc_ColorGen );
        bool colorcolor = rootColorTool->IsSet(label,XCAFDoc_ColorGen);
         bool colorcolor1 = rootColorTool->IsSet(label,XCAFDoc_ColorSurf);
          bool colorcolor2 = rootColorTool->IsSet(label,XCAFDoc_ColorCurv);
        Quantity_Color col;
        rootColorTool->GetColor(label, XCAFDoc_ColorSurf,col);
        TopoDS_Shape rootShape=XCAFDoc_ShapeTool::GetShape(label);
        string str;
        if(label.FindAttribute(TDataStd_Name::GetID(),rootName))
        {
            string temp="";
            TCollection_ExtendedString ID = rootName->Get();
            //str = OCC::Utils::ExtendedString2String(ID);
        }
    }

//

在OSG中的显示效果如下:

 欢迎大家批评指正!!

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值