当前位置:   article > 正文

Creo 二次开发-尺寸位置排序算法_creo二次开发 招聘

creo二次开发 招聘

在对工程图中所有尺寸进行自动球标标注时,对尺寸位置的排序是一个很关键的问题。基本思路:

  • 按视图位置从左到右、从上到下排序
  • 以当前视图中心为原点建立极坐标系,按逆时针排序
  • 对于相邻尺寸位置顺序进行优化
  1. 按视图位置排序
    这里面存在一个问题:当视图为局部显示的时候,视图中心并非实际显示的中心,这时候会出现一些异常,例如:当 AB 两个视图在图纸上是上下对齐,A 在上 B 在下,按正常排序 A 中尺寸序号应该在 B 中尺寸序号的前面,如果这时候其中一个使用了局部视图,导致视图中心 A 在 B 的右侧,这样 B 中尺寸序号就会排在 A 中尺寸序号的前面。
    这个异常影响不会太大,而且单个试图内序号排序都是正常的。
bool SortByView(const DimensionStruct &td1, const DimensionStruct &td2)
{
    DimensionStruct d1, d2;
    d1 = td1;
    d2 = td2;
    float vcx1, vcx2, vcy1, vcy2;
    vcx1 = d1.GetViewCenter()->get(0);
    vcx2 = d2.GetViewCenter()->get(0);
    vcy1 = d1.GetViewCenter()->get(1);
    vcy2 = d2.GetViewCenter()->get(1);
    if (vcx1 > vcx2)
    {
        return false; //视图中心:d1在d2的右侧
    }
    else if (IsEqual(vcx1, vcx2) && (vcy1 < vcy2))
    {
        return false; //视图中心:d1在d2的下方
    }
    return true;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 建立极坐标
    定义 DimensionStruct 类,在创建类的实例的时候,分别计算球标的位置,以及球标与视图中心连线的距离和角度
class DimensionStruct
{
private:
    pfcDimension2D_ptr dimension;
    pfcPoint3D_ptr location;
    pfcPoint3D_ptr symloc;
    double angle;
    double distance;
    pfcPoint3D_ptr viewcenter;
    xstring viewname;
    pfcView2D_ptr view2d;

public:
    int Create(pfcDimension2D_ptr dim);
    pfcDimension2D_ptr GetDimension();
    pfcPoint3D_ptr GetViewCenter();
    pfcPoint3D_ptr GetSymLoc();
    xstring GetViewName();
    double GetAngle();
    double GetDistance();
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  1. 按角度排序
    当尺寸列表按视图排序之后,同一视图尺寸在列表中的位置是连续的,这时候只需要找出各个视图的尺寸列表片段,进行局部排序即可。
    在 for 循环中通常 vector 判断边界的写法是用 it!=dims.end(),在这里 vector 会莫名其妙的越界,而越界还不会触发异常,直接导致程序崩溃。所以这里都是用 it < dims.end()作为判定条件,更加保险,但是不知道是不是存在其它隐患。
    p-it>1这一判定条件是避免 vector 只有一个元素时进行排序。这一点使用 vector进行测试的时候是没有异常的,这里有时候就会出问题。
vector<DimensionStruct>::iterator it = dims.begin();
while (it < dims.end())
{
    vector<DimensionStruct>::iterator p = it + 1;
    while (p < dims.end())
    {
        if (p->GetViewName() == it->GetViewName())
            p++;
        else
            break;
    }
    if (p - it > 1)
        sort(it, p, SortByAngle);
    it = p;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. 相邻尺寸位置优化
    当列表严格按角度进行排序后会出现一个问题,两个尺寸角度相近但是到中心的距离差别较大,这时候虽然两个尺寸距离很远但是序号确实相近的,这不利于后期查看尺寸序号。
    因此,对排序后列表按角度分组,然后按到中心距离进行排序。初始分组宽度为 5°,搜索结束时将范围在扩大 5°,查看下一个尺寸是否在这一范围,如果在则继续搜索,如果不在则退出。对搜索到的尺寸片段按到中心距离,由内到外进行排序。
    上述方法依然会存在一些极端情况,如边界线正好从两个相邻尺寸之间穿过。动态扩展边界可以在一定程度上降低这种概率。
    对尺寸片段进行局部排序后,在判断该片段的头尾到前一尺寸的距离,如果尾部距离较近,则将片段逆序。这里在判断时要注意处理第一个尺寸 dims.begin(),它没有前一尺寸,会越界。
vector<DimensionStruct>::iterator it2 = dims.begin();
while (it2 != dims.end())
{
    vector<DimensionStruct>::iterator p = it2 + 1;
    double AngleBond = 5;
    double BondRadio = 5;
    while (p < dims.end())
    {
        //动态扩展边界,降低相邻尺寸序号相差较大的概率
        if (p->GetViewName() == it2->GetViewName() && p->GetAngle() - it2->GetAngle() < AngleBond)
        {
            p++;
        }
        else if (p->GetViewName() == it2->GetViewName() && p->GetAngle() - it2->GetAngle() < (AngleBond + BondRadio))
        {
            AngleBond += BondRadio;
        }
        else
            break;
    }
    if (p - it2 > 1)
    {
        sort(it2, p, SortByDistance);
        //dims.begin没有前一节点,后面计算距离越界
        if (it2 != dims.begin())
        {
            double d1, d2;
            //计算当前片段起点和终点与片段前一点距离,如果终点距离较近,则将片段逆序
            d1 = Cal_Distance(it2->GetSymLoc(), (it2 - 1)->GetSymLoc());
            d2 = Cal_Distance((p - 1)->GetSymLoc(), (it2 - 1)->GetSymLoc());
            if (d2 < d1)
            {
                reverse(it2, p);
            }
        }
    }
    it2 = p;
}
  • 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
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/340196
推荐阅读
相关标签
  

闽ICP备14008679号