NamedGroup::Create(.....) 创建命名组已经成功;
AddMember(......) 添加成员成功;
然后在CE软件上收到删除该命名组中的成员,图形在CE上删除成功;
GetMemberCount(.....) 获取成员数量是删除之后的成员数量;
GetMember( index) 利用取得的成员数量 用 for 循环遍历成员,删除的的那个元素 占了(index) 索引位置,还能遍历出来,最后那个成员因为超出了总数量范围,结果却无法遍历出来。
请问这个问题怎么解决?
如果您手动删除了命名组中的成员,需要在代码中重新获得该命名组。最好能贴出您的完整代码供我们分析。谢谢!
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]; } }
prayer said:我这样遍历命名组的成员,删除的元素占据了前面的位置,打印出来的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呀
---------------------------------------------------------------------
我回到MSV8i测试了一下,也是这样的工作方式。不知是否有什么特殊的意图。
还是改用TraverseMember来获取NamedGroup中的成员比较可靠。
Answer Verified By: prayer