OpenCasCade(OCCT) 7.7.0 初探(二) 鼠标事件(C#、C++/CLI)

本文讲述了在图形处理中,如何解决Treeview与显示图纸的View之间的交互问题,特别是当图形存在引用时的坐标变换和处理。作者分享了解决引用图形导致的TopoDS_Shape问题的方法,并介绍了通过定义类MyObjects关联图形数据的实例。

(免费分享心得,共同进步!)

当你调试通了上篇文章的内容,并组建了自己的树也能显示图纸了(忘了点事情要说明,你有可能中招),那么接下来你就该迷惑如何让Treeview和View(指的是显示图纸的视图)互动起来呢。

忘了点事情要说明:当你显示图形时,不知你的图形是否有引用的情况,如果有,那么你就中招了,这个忘记了点事情就说的是你!如果是引用的图形,直接显示TopoDs_Shape会出现另外一组图形如下图:图中,蓝色为最终图形,而红线是什么?奇怪!蓝线是通过引用红线出来的,打个比方我们需要画三条一样的线,那我们只需要在制图软件中画一条线,然后复制就可以了。你看到的三条线分别是三个Handle(AIS_Shape),它们有各自的TopoDS_Shape,但是TopoDS_TShape是同一个。它们的区别请去官方文档自行阅读。

在上篇文章中代码部分的

if (myShapeTool()->IsReference(childLabel))如果是引用,那么获取引用
TDF_Label bShapeLabel;
if (myShapeTool()->GetReferredShape(childLabel, bShapeLabel))

需要对获取的引用进行坐标变换。如下代码:

//先获取父级
TopLoc_Location loc = myShapeTool()->GetLocation(aLabel);

//再获取引用进行坐标变换
TopLoc_Location aloc = loc * myShapeTool()->GetLocation(childLabel);

//将新坐标给图形
TopoDS_Shape aShape = myShapeTool()->GetShape(bShapeLabel);
aShape.Location(aloc, false);

这样就不会有红线的出现了。

恭喜你没中招,我在这个红线的问题上纠结了2天,还好我碰到并解决了这个问题,因为在后期软件设计中的图纸都存在这种引用的情况。

下面说说如何交互吧。其实交互无非就是想办法把琐碎的数据关联起来,如何关联起来呢?键值对还是类,你可以自己琢磨去实现。我是定义了一个类,例如:

public ref class MyObjects
{

public:
	//!编号
	System::String^ Sn;
	//!AIS_Shape
	NCollection_Haft<Handle(AIS_Shape)> AShape;
};

在上篇文章中,遍历图形时为每个图形进行编号,并保存它们的AIS_Shape句柄 ,这样就关联起来了,通过Treeview节点点击的Sn来找到对应的AIS_Shape句柄,将AIS_Shape换个颜色就行了。反之,则是鼠标移动或点击图形找Sn,这是本文要说的内容。

鼠标移动捕获的图形:

Handle(SelectMgr_EntityOwner) anOwner = myAISContext()->DetectedOwner();
Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anObj);
if (anAISShape.IsNull()) return;
TopoDS_Shape aShape = anAISShape->Shape();

鼠标点击捕获的图形:

myAISContext()->SelectDetected();
for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
{
	Handle(SelectMgr_EntityOwner) anOwner = myAISContext()->SelectedOwner();
	Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
	if (Handle(StdSelect_BRepOwner) aBRepOwner = Handle(StdSelect_BRepOwner)::DownCast(anOwner))
	{
		TopoDS_Shape aShape = aBRepOwner->Shape();
    }
}
TopoDS_Shape aShape即是捕获的图形,与类中NCollection_Haft<Handle(AIS_Shape)> AShape进行比较即可,注意要比较TopoDS_Shape,使用IsSame(),示例:myobjects->AShape()->Shape().IsSame(aShape)。这样Treeview和View就可以互动了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霜吹落花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值