很久没有正式写过一篇博客,之前因为工作原因,致使个人项目一直停滞,在出差回来后,决定利用晚上的空闲时间重新对之前的知识进行梳理和补充,前版本中实现了如何利用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中的显示效果如下:
欢迎大家批评指正!!