【MSCE C ++ 】Name Group 删除元素

NamedGroup::Create(.....)  创建命名组已经成功;

AddMember(......) 添加成员成功;

然后在CE软件上收到删除该命名组中的成员,图形在CE上删除成功;

GetMemberCount(.....) 获取成员数量是删除之后的成员数量;

GetMember( index)  利用取得的成员数量 用 for 循环遍历成员,删除的的那个元素 占了(index) 索引位置,还能遍历出来,最后那个成员因为超出了总数量范围,结果却无法遍历出来。

请问这个问题怎么解决?

Parents
  • 如果您手动删除了命名组中的成员,需要在代码中重新获得该命名组。最好能贴出您的完整代码供我们分析。谢谢!



  • NamedGroupCollectionPtr namedGroupCollection = NamedGroupCollection::Create(*ACTIVEMODEL);

    WPrintfString groupName(L"DrawingFrameSet”);

    NamedGroupPtr pNamedGroup = namedGroupCollection->FindByName(groupName.GetWCharCP());

    if (!pNamedGroup.IsNull() && pNamedGroup.IsValid())
    {
    UInt32 count = 0;
    pNamedGroup->GetMemberCount(&count, nullptr);

    int length = (int)count; // 用来存储命名组总成员数量

    for (int i = 0; i < length; ++i)
    {
    ElementId elementId = pNamedGroup->GetMember(i)->GetElementId(); // 当前索引下元素Id

    WPrintfString strId(L"elementId = %d", elementId);
    }
    }

    老师您好!  我这样遍历命名组的成员,删除的元素占据了前面的位置,打印出来的ID是已经删除的元素的,导致后面的元素又无法遍历出来。

  • 请问符老师有这个 TraverseMembers 函数的使用例子吗?

  • 先构造一个NamedGroupMembers,用来接收命名组成员:

    struct NamedGroupMembers : bvector<ElementRefP>, INamedGroupMemberVisitor
    {
    
        virtual MemberTraverseStatus VisitMember(NamedGroupMemberCP member, NamedGroupCP namedGroup, UInt32 index)
        {
            ElementRefP elemRef = member->GetElementRef();
            push_back(elemRef);
            return MemberTraverseStatus::Continue;
        }
    };

    再调用TraverseMembers遍历命名组成员:

    void testNamegroup()
    {
        NamedGroupMembers refs;
    
        NamedGroupCollectionPtr namedGroupCollection = NamedGroupCollection::Create(*ACTIVEMODEL);
    
        NamedGroupPtr namedGroup = namedGroupCollection->FindByName(L"mynamegroup");
    
        namedGroup->TraverseMembers(&refs, MemberTraverseType::Simple, false, false);
        int refCount = (int)refs.size();
        for (int i = refCount - 1; i >= 0; i--)
        {
            auto elementRef = refs[i];
        }
    }

  • 我这样遍历命名组的成员,删除的元素占据了前面的位置,打印出来的ID是已经删除的元素的,导致后面的元素又无法遍历出来。

    我实际编程测试了一下,无法复现您描述的情况呀。代码几乎是相同的。

    void listNamedGroup(WCharCP unparsed)
    {
    	NamedGroupCollectionPtr pNGC = NamedGroupCollection::Create(*ACTIVEMODEL);
    	NamedGroupPtr pNG = pNGC->FindByName(L"Group1");
    	if (pNG.IsNull() || !pNG.IsValid())
    	{
    		mdlDialog_dmsgsPrint(L"Can't find Group1 namegroup");
    		return;
    	}
    	UInt32 memberCnt = 0;
    	pNG->GetMemberCount(&memberCnt, NULL);
    	for (UInt32 i = 0; i < memberCnt; i++)
    	{
    		WPrintfString wStr(L"member[%d] = %d", i, pNG->GetMember(i)->GetElementId());
    		mdlDialog_dmsgsPrint(wStr);
    	}
    }

    一开始我的Group1命名组中有四个Shape,后来删除了一个。两次打印输出结果如下:

    我是在最新的MSCE-U15下测试的。



  • 符老师您仔细看,您删除的是第3个元素,id 应该是 ”1477“。 结果第二次打印还是把 ”1477“ 打印出来了,"1488" 却没有打印出来。  按照您的图纸第三次应该是是打印 ”1475“ ”1476“ ”1478“,您确定下图纸删除的那个元素ID。

  • 果真如此。看起来还真是一个严重的Bug呀Cold sweat

    ---------------------------------------------------------------------

    我回到MSV8i测试了一下,也是这样的工作方式。不知是否有什么特殊的意图。

    还是改用TraverseMember来获取NamedGroup中的成员比较可靠。



    Answer Verified By: prayer 

Reply Children
No Data