• PDMS二次开发(二十)——关于1.0.2.0版本升级内容的说明


    1.更新内容介绍

    1. 新增了ATTA材料表;
    2. 新增了ATTA自动调整目录树顺序功能;
    3. 修复了ATTA顺序算法的一处bug,该bug导致少数元件原本处于正确顺序位置却被计算为越过上游元件(例如图2中的TEST3);
    4. 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();
    
    • 1
    • 2
    • 3
    • 4

    3.3 原判断中的bug

    原来的算法中(有兴趣的话可以参看文章六、七),缺少了判断管子流向与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);  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在判断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 = "正确";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    手稿
    在这里插入图片描述

  • 相关阅读:
    初识Dockerfile
    Net相关的各类开源项目
    DAZ To UMA⭐一.DAZ简单使用教程
    特殊类设计(只在堆/栈上创建对象,单例模式),完整版代码+思路
    两个单链表相交的一系列问题
    XTuner InternLM-Chat 个人小助手认知微调实践
    VueX简单又详细的解读,看了就会用
    windows平台编译OpenCV以支持CUDA
    分式理想 & 对偶群 & 对偶空间
    linux下多进程开发详解
  • 原文地址:https://blog.csdn.net/xiangcns/article/details/125438991