目录
- 1.更新内容介绍
- 2.演示测试效果
- 3.代码说明
-
- 3.1 算法(主方法F)
- 3.2 Reorder命令在.Net开发方法中的用法
- 3.3 原判断中的bug
1.更新内容介绍
- 新增了ATTA材料表;
- 新增了ATTA目录树顺序功能自动调整;
- 修复了ATTA顺序算法的一处bug,该bug导致少数元件原本处于正确的顺序位置,但被计算为越过上游元件(如图2所示TEST3);
- PDMS12.0.sp6增加了ATTA目录树顺序功能自动调整,版本升级为0.9.5.0。
目前ATTA目录树顺序功能自动调整beta收集感兴趣的同学一起测试,发现什么问题可以反馈给我。
2.演示测试效果
专门导出ATTA材料清单 图1:增加了ATTA材料表功能
调整ATTA目录树的顺序功能可以自动检查顺序错误ATTA元件目录树的位置通过reorder命令移动到正确的顺序位置,注意目录树的顺序,而不是移动元件,处理元件模型时,有一个原则是尽量少移动模型。
图2:增加自动调整ATTA目录树顺序功能
ATTA 顺序自动调整功能演示
图3:演示效果视频
3.代码说明
3.1 算法(主方法)F)
//步骤: //1.写一个方法F,判断错误列表,找出所有不正确的顺序ATTA所在的BRANCH //2.遍历这个BRANCH将所有ATTA放进列表A //3.会有问题ATTA放进列表B //4.根据B的错误类型,决定A中哪两个ATTA执行一次reorder命令 //5.完成执行reorder之后,再执行一次check,获得新的A和B //6.将A并继续将B放入迭代F中计算,直到B列表为空
3.2 Reorder命令在.Net开发方法中的用法
组装reorder命令并执行,itce是当前ATTA元件sequ,itnext是下一个ATTA元件的sequ。
///显示命令行 string commandStr = "REORDER " itce " AFTER " itnext; Command comm1 = Command.CreateCommand(commandStr); bool rel = comm1.Run();
3.3 原判断中的bug
在原算法中(如果你感兴趣,可以参考文章6、7),缺乏判断管道流向和base判断向量是否方向一致(管子流向和默认base一致,但并不是每个场景都一样。请参见最后的手稿),因为验证向量V的方向是管道的方向,所以直接判断V和base方向是否一致。 PDMS二次开发(六)——ATTA实现目录树顺序检查功能讲解 PDMS二次开发(七)——ATTA按顺序检查目录树的功能BUG修复
bool dirParallelSCwithVerify = D3SlopeSCOntoBase.Parallel(D3SlopeVerify); //SC平行判断投影向量和验证向量 bool dirParallelSCwithBase = D3SlopeSCOntoBase.Parallel(D3SlopeBase); //SC投影向量与Base平行判断向量 //以上是以前的代码 /*要增加:D3SlopeBase判断这个向量是否需要判断membersInLineSegment所在的branch这段流向是一致的 Naki 2022.6.23 判断方法是判断D3SlopeBase和D3SlopeVerify方向是否一致 */ bool dirParallelVerifywithBase = D3SlopeVerify.Parallel(D3SlopeBase);
在判断orderFlag标记时,添加正确的dirParallelVerifywithBase的判断
p>代码片段:if (dirParallelSCwithBase == true &&
dirParallelSCwithVerify == true) //SC、Base、Verify三个向量方向一致
{
if (LengthSCOntoBase <= LengthBase)
{
orderFlag = "正确";
}
else if (LengthSCOntoBase > LengthBase) //当前元件与下一个元件空间有交集
{
//计算下一个元件的LPOS值作为下一个邻接点坐标
//Position next_lpos = db.Next().GetPosition(DbAttributeInstance.LPOS);
TBrItemPoint nextLPoint = new TBrItemPoint(next_lpos.X, next_lpos.Y, next_lpos.Z);
//计算下一个元件的APOS和当前ATTA的apos距离绝对值
double curr_SpanDistance = DistanceOfTwoPoints(nextPoint, currPoint);
//计算下一个元件的APOS和LPOS距离绝对值
double next_SpanDistance = DistanceOfTwoPoints(nextPoint, nextLPoint);
double DeltaDistance = curr_SpanDistance - next_SpanDistance;
if (DeltaDistance > 0)
{
orderFlag = "错误:越过下游元件";
}
if (DeltaDistance <= 0)
{
orderFlag = "警告:侵入下游元件"; }
}
}
else if (dirParallelSCwithBase == false &&
dirParallelVerifywithBase == false) //当前元件确实在下游
{
orderFlag = "正确";
}
手稿