设置自定义高亮时,一个小错误导致高亮或选择的面不完整(Opencascade)

设置自定义高亮的坑(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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值