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

  • 按视图位置从左到右、从上到下排序
  • 以当前视图中心为原点建立极坐标系,按逆时针排序
  • 对于相邻尺寸位置顺序进行优化
  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. 建立极坐标
    定义 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. 按角度排序
    当尺寸列表按视图排序之后,同一视图尺寸在列表中的位置是连续的,这时候只需要找出各个视图的尺寸列表片段,进行局部排序即可。
    在 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++;elsebreak;}if (p - it > 1)sort(it, p, SortByAngle);it = p;
}
  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;}elsebreak;}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;
}

Creo 二次开发-尺寸位置排序算法相关推荐

  1. Creo 二次开发-自动标注球标

    基本思路 检索所有模型尺寸 按照位置对尺寸进行排序 检索球标模型 遍历尺寸,根据尺寸类型和占位宽度计算球标和尺寸的相对位置 创建顺序球标 程序实现 检索尺寸前先判断当前环境是否为绘图环境,如果不是则直 ...

  2. creo二次开发python_使用C#/.net语言进行ProE/Creo二次开发

    随便哪个版本的Visual studio 设置系统环境变量 通常这个环境变量在安装ProE的时候如果选择安装VBAPI就会自动设置 注意32位和64位操作系统路径是不同的.我的是64位操作系统. 然后 ...

  3. Creo二次开发异步模式配置

    异步模式是Creo二次开发的另外一种形式,被广泛应用于一些外部调用中.其配置过程如下: (1)      创建MFC程序(对话框程序都可以了) (2)      配置工程常规选项 (3)      配 ...

  4. ProE二次开发 Creo二次开发 MCADEx Tools 免费工具QQ群 156242985

    ProE二次开发 Creo二次开发 MCADEx Tools 免费工具QQ群 156242985 转载于:https://www.cnblogs.com/esdtech/p/4199884.html

  5. I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序

    选择排序 步骤一.选取一组数据中起始位置(下标)上的数据,和其后的各个位置(下标)上数据进行比较:如果起始位置(下标)上的数据大(升序)或小(降序),就将两个位置上的数据进行交换:这样完成一轮比较之后 ...

  6. creo 二次开发 protookit 官方make file 案例试运行

    刚开始学习creo的二次开发, 用的是creo 7.0.0, vs 版本是2017 protookit的安装是在安装creo的时候选装的. VS一定要去微软官网去下载社区版,免费的,不要在乱七八糟的下 ...

  7. 山东大学软件学院大二下数据结构课程设计---排序算法的性能分析

    文章目录 一.题目 二.界面图 主界面 比较和移动次数饼图 比较不同表长的对话框 验证稳定性的对话框 课设录屏 三.题目分析 四.基本思路 五.项目结构 1.开发环境 2.结构介绍 3.关键点及难点 ...

  8. Creo二次开发的第一个案例及报错处理(Creo6.0+ VS2017)

    1.版本确认 在进行环境配置前,务必要确认Creo的版本及其对应的VS版本(C++版本)要求,这个可以百度查询 根据我安装的Creo版本来看,其他版本没有测试过 Creo3.0对应VS2015 Cre ...

  9. 推荐系统遇上深度学习(二十)-贝叶斯个性化排序算法原理及实战

    排序推荐算法大体上可以分为三类,第一类排序算法类别是点对方法(Pointwise Approach),这类算法将排序问题被转化为分类.回归之类的问题,并使用现有分类.回归等方法进行实现.第二类排序算法 ...

最新文章

  1. 【 Notes 】INS Preliminary Introduction
  2. Wannafly挑战赛21 E 未来城市规划
  3. 开发了个 Flipper 调试工具的 Flutter 版本 SDK,让 Flutter 应用调试起来更容易
  4. ABAP业务涉及到的相关数据库表 .
  5. nagios服务配置
  6. python3.7怎么安装turtle_python3绘图程序教学:载入和查询Turtle模组(一)
  7. esri-leaflet入门教程(2)-地图的HelloWorld
  8. 时间序列分析工具箱——tibbletime
  9. 当动态T-SQL语句遇到除零的问题
  10. byte数组转为string 去掉转义符_三道简单的 String 面试题干趴下了 n 多大牛!
  11. python导出pdf_是程序员,就用python导出pdf
  12. java反射面试_总结Java反射面试题(附答案)
  13. 是德科技N9020A 频谱分析仪技术资料说明
  14. python制作模型排放清单_四川省人为源大气污染物排放清单及特征
  15. 吴恩达新课快来了!万字博客回顾机器学习算法起源
  16. 苹果快捷键怎么调出来_iPad常用快捷键
  17. OpenGL-坐标系统,进入3D世界(深度测试)
  18. MVP架构开发的鼠绘漫画客户端
  19. [转载]SDL 用法,第 5 部分:Pirates Ho! 中界面设计的原则 - 简易性、一致性和引人入胜
  20. 计算机网络位置网盘怎么登陆,百度网盘使用小技巧,超全超详细!新手必备

热门文章

  1. android getduration 毫秒,,VideoView中getDuration()和getCurrentPosition()獲取錯誤的問題
  2. 2022.04精灵宝可梦国内在线观看渠道整理
  3. 【图像压缩】基于分形编码图像压缩matlab源码
  4. Android Log 机制
  5. 网络信息安全攻防实验室 第三关
  6. pandas生意参谋数据处理
  7. YUV和libyuv相关了解
  8. 周记计算机岗位任务及完成情况,计算机实习周记
  9. 全面剖析雅虎助手以及网络实名的流氓行径(6)
  10. 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】