目前ATTA自动调整目录树顺序功能,是beta版,征集有兴趣的同学一起来测试一下,发现什么问题可以反馈给我。
专门导出ATTA材料清单
图1:增加了ATTA材料表功能
调整ATTA目录树顺序功能可以自动将顺序检查有错误的ATTA元件的目录树位置通过reorder命令移动到正确顺序位置,注意这里移动的是目录树顺序,不是移动元件,进行元件模型处理的时候有一个原则是尽量少移动模型。
图2:增加了自动调整ATTA目录树顺序功能
ATTA 自动调整顺序功能演示
图3:演示效果视频
//步骤:
//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列表为空
组装reorder命令并执行,itce是当前ATTA元件sequ,itnext是下一个ATTA元件的sequ。
//命令行显示
string commandStr = "REORDER " + itce + " AFTER " + itnext;
Command comm1 = Command.CreateCommand(commandStr);
bool rel = comm1.Run();
原来的算法中(有兴趣的话可以参看文章六、七),缺少了判断管子流向与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的判断
代码片段:
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 = "正确";
}
手稿