(免费分享心得,共同进步!)
当你调试通了上篇文章的内容,并组建了自己的树也能显示图纸了(忘了点事情要说明,你有可能中招),那么接下来你就该迷惑如何让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就可以互动了。
本文讲述了在图形处理中,如何解决Treeview与显示图纸的View之间的交互问题,特别是当图形存在引用时的坐标变换和处理。作者分享了解决引用图形导致的TopoDS_Shape问题的方法,并介绍了通过定义类MyObjects关联图形数据的实例。
967

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



