设置自定义高亮的坑(Opencascade)
自定义的高亮和选择的面不完整,呈破碎状
在我开发的项目中,我对OCC自己默认的高亮样式并不满意,就想着改变AIS_InteractiveObject的默认样式,当我使用下述代码
if (aisShape.IsNull()) return;
Handle(Prs3d_Drawer) DynamicHilight_Drawer = new Prs3d_Drawer();
/*Handle(Prs3d_ShadingAspect) aPlaneAspect = new Prs3d_ShadingAspect();
Handle(Graphic3d_AspectFillArea3d) test = new Graphic3d_AspectFillArea3d();
test->SetFaceCulling(Graphic3d_TypeOfBackfacingModel_DoubleSided);
aPlaneAspect->SetAspect(test);*/
//DynamicHilight_Drawer->SetShadingAspect(aPlaneAspect);
DynamicHilight_Drawer->SetupOwnDefaults();
DynamicHilight_Drawer->SetColor(Quantity_NOC_KHAKI);
DynamicHilight_Drawer->WireAspect()->SetWidth(8.); // 设置鼠标放置时,wire的宽度
DynamicHilight_Drawer->SetMethod(Aspect_TypeOfHighlightMethod::Aspect_TOHM_COLOR);
DynamicHilight_Drawer->SetDisplayMode(1);
DynamicHilight_Drawer->SetTransparency(0.6f);
aisShape->SetDynamicHilightAttributes(DynamicHilight_Drawer);
Handle(Prs3d_Drawer) HilightDrawer = new Prs3d_Drawer();
HilightDrawer->SetupOwnDefaults();
HilightDrawer->WireAspect()->SetWidth(8.);=
HilightDrawer->SetColor(Quantity_NOC_RED1);
HilightDrawer->SetDisplayMode(1);
aisShape->SetHilightAttributes(HilightDrawer);
修改其样式后,高亮的面简直一坨稀碎,无法忍受,有些面完整,有些面就是破碎状态。

纠错过程
我在DrawHarness里面导入了同一个模型,并调整vdisplay(官方提供的一个命令)中模型的选择模式,发现官方给的选面状态非常好,每一个面高亮出来都是完整的:

然后花了不少时间去检查,即查了我与官方读取文件的差异,也查了我和官方生成AIS_Shape的差异,都没有什么太大差别,然后思考了以下是不是高亮的地方有问题,结果注释掉原本的代码后发现选中的面很完整,没有任何问题,WTF?!
从OCC上下文中获取高亮和选择样式,可以避免此问题
看了一会代码,归根到底是上一个人写这个代码的时候,用了下面的语句:
Handle(Prs3d_ShadingAspect) aPlaneAspect = new Prs3d_ShadingAspect();
DynamicHilight_Drawer->SetupOwnDefaults();
就是这个SetupOwnDefaults(),导致自己声明的高亮样式和官方提供的有差别,所以如果想轻微的修改默认的高亮样式,需要从OCC自己的AIS_InteractiveContext上下文中获取已经帮我们做好的高亮和选择对象drawer,再在drawer上设置自己想改的参数就行了。
所以,正确的写法应该是:
Handle(Prs3d_Drawer) drawer = GetKernelContext()->HighlightStyle();
drawer->SetDisplayMode(1);
//... somthing else you want to change.
aisShape->SetHilightAttributes(drawer);
1483

被折叠的 条评论
为什么被折叠?



