找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2970|回复: 7

[分享] XY坐标标注

[复制链接]

已领礼包: 195个

财富等级: 日进斗金

发表于 2013-8-4 14:54:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  在网上看到不少XY坐标标注插件,lisp为多,objectarx比较少,我用objectarx写了一个放上来,与 大家交流一下。
  1. //根据相对极坐标来确定一个点的位置;
  2. static AcGePoint3d PolarPoint(const AcGePoint3d& pt, double angle, double distance)
  3. {
  4.   ads_point ptForm, ptTo;
  5.   ptForm[X] = pt[X];
  6.   ptForm[Y] = pt[Y];
  7.   ptForm[Z] = pt[Z];
  8.   acutPolar(ptForm, angle, distance, ptTo);
  9.   return asPnt3d(ptTo);
  10. }
  11. //XY坐标标注;
  12. static void zdqMyGroup_test () {
  13.   // Put your command code here
  14.   // 定义点接收用户选择点;
  15.   ads_point adspt1;
  16.   while(acedGetPoint(NULL,ACRX_T("\n选择标注点:"), adspt1)== RTNORM)
  17.   {
  18.    CString tx, ty, ts, txx, tyy, tp;
  19.    tp=ACRX_T("\\P");
  20.    tx=ACRX_T("X=");
  21.    ty=ACRX_T("\\PY=");
  22.    txx.Format(ACRX_T("%.3f"),adspt1[X]);//设置三位小数;
  23.    tyy.Format(ACRX_T("%.3f"),adspt1[Y]);
  24.    ACHAR stx[100], sty[100], strx[100],stry[100],sts[100],stp[100];
  25.    _tcscpy(stp,tp);
  26.    _tcscpy(stx,tx);
  27.    _tcscpy(sty,ty);
  28.    _tcscpy(strx,txx);
  29.    _tcscpy(stry,tyy);
  30.    AcGePoint3d point1, point2, point3;
  31.    //将ads_point转为AcGePoint3d类型
  32.    point1.set(adspt1[0],adspt1[1],0.0);
  33.    point2.set(adspt1[0]+100.0,adspt1[1]+100.0,0.0); //这儿随便写;
  34.    point3.set(adspt1[0]+1000.0,adspt1[1]+100.0,0.0);//这儿随便写;
  35.    //获取模型空间块表记录,为了添加实体
  36.    AcDbBlockTable *pBlockTable;
  37.    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
  38.    AcDbBlockTableRecord *pBlockTableRecord;
  39.    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  40.    pBlockTable->close();
  41.    //新建一个多行文字对象并添加到模型空间;
  42.    AcDbObjectId mtextId, mtextId1;
  43.    AcDbMText *pMtext = new AcDbMText();
  44.    pMtext->setDatabaseDefaults () ;
  45.    pMtext->setContents(_tcscat(_tcscat(stx,strx),_tcscat(sty,stry)));
  46.    pMtext->setLocation (point2);
  47.    pMtext->setTextHeight(500);//设置文字高度;
  48.    if(point1[X]<=point2[X]){pMtext->setAttachment(AcDbMText::kMiddleLeft);}
  49.    if(point1[X]>point2[X]){pMtext->setAttachment(AcDbMText::kMiddleRight);}
  50.    pBlockTableRecord->appendAcDbEntity(mtextId, pMtext);
  51.    double lo=pMtext->actualWidth();
  52.    pMtext->close();
  53.    //新建一个多行文字对象并添加到模型空间;
  54.    AcDbMText *pMtext1 = new AcDbMText();
  55.    pMtext1->setDatabaseDefaults () ;
  56.    pMtext1->setContents(ACRX_T("X=\\PY="));
  57.    pMtext1->setLocation (point2);
  58.    pMtext1->setTextHeight(500);
  59.    pBlockTableRecord->appendAcDbEntity(mtextId1, pMtext1);
  60.    pMtext1->close();
  61.    //新建一个引线对象并添加到模型空间;
  62.    AcDbObjectId leaderId;
  63.    AcDbLeader *pLeader = new AcDbLeader();
  64.    pLeader->appendVertex(point1);
  65.    pLeader->appendVertex(point2);
  66.    pLeader->appendVertex(point3);
  67.    pLeader->setDatabaseDefaults(curDoc()->database());
  68.    pBlockTableRecord->appendAcDbEntity(leaderId, pLeader);
  69.    pBlockTableRecord->close();
  70.    pLeader->close();
  71.    //放置多行文字
  72.    AcDbMText *pText,*pMext;AcDbLeader *pLea;
  73.    AcDbEntity *pEnt,*pEntm,*pEn;
  74.    acedPrompt(_T("\n选择放置点:"));
  75.    AcGePoint3d ptInsertNew(0, 0, 0);
  76.    // 鼠标拖动部分;
  77.    int track = 1, type; //track=1
  78.    struct resbuf result; // 保存鼠标拖动时的动态坐标;
  79.    while (track > 0)
  80.    {
  81.     acedGrRead(track, &type, &result); // 追踪光标移动;
  82.     ptInsertNew[X] = result.resval.rpoint[X];
  83.     ptInsertNew[Y] = result.resval.rpoint[Y];
  84.     // 设置拖动位置为直线的终点坐标;
  85.     acdbOpenObject(pEnt, mtextId, AcDb::kForWrite);
  86.     acdbOpenObject(pEntm, mtextId1, AcDb::kForWrite);
  87.     acdbOpenObject(pEn, leaderId, AcDb::kForWrite);
  88.     if (pEnt->isKindOf(AcDbMText::desc()))
  89.     {
  90.      pMext = AcDbMText::cast(pEntm);
  91.      pText = AcDbMText::cast(pEnt);
  92.      pLea = AcDbLeader::cast(pEn);
  93.      if (pText != NULL)
  94.      {
  95.       _tcscpy(stp,tp);
  96.       _tcscpy(strx,txx);
  97.       _tcscpy(stry,tyy);
  98.       pText->setContents(_tcscat(_tcscat(strx,stp),stry));
  99.       if(point1[X]<=ptInsertNew[X])
  100.       {
  101.        pMext->setLocation(ptInsertNew);
  102.        pMext->setAttachment(AcDbMText::kMiddleLeft);
  103.        pText->setLocation(PolarPoint(ptInsertNew,0,lo));
  104.        pText->setAttachment(AcDbMText::kMiddleRight);
  105.       }
  106.       if(point1[X]>ptInsertNew[X])
  107.       {
  108.        pMext->setLocation(PolarPoint(ptInsertNew,-3.1415926535897932384626433832795,lo));
  109.        pMext->setAttachment(AcDbMText::kMiddleLeft);
  110.        pText->setLocation(ptInsertNew);
  111.        pText->setAttachment(AcDbMText::kMiddleRight);
  112.       }
  113.       pLeader->setVertexAt(0,point1);
  114.       pLeader->setVertexAt(1,ptInsertNew);
  115.       if(point1[X]<=ptInsertNew[X]){pLea->setVertexAt(2, PolarPoint(ptInsertNew,0,lo));}
  116.       if(point1[X]>ptInsertNew[X]){pLea->setVertexAt(2, PolarPoint(ptInsertNew,-3.1415926535897932384626433832795,lo));}
  117.      }
  118.     }
  119.     pEnt->close();pEn->close();pEntm->close();
  120.     if (type == 3) // 如果用户按下了鼠标左键;
  121.     {
  122.      track = 0;
  123.     }
  124.    }
  125.   }
  126. }
  127. //注册命令;
  128. ACED_ARXCOMMAND_ENTRY_AUTO(CtestApp, zdqMyGroup, _test, test, ACRX_CMD_MODAL, NULL)

这段代码生成的标注不是一个整体,由两个多行文字和一个引线组成,虽然在绘制过程可以整体拖动预览,一旦生成就不能整体拖动,这是一个缺憾!

评分

参与人数 2D豆 +15 收起 理由
QiaoCheng + 5 刚学就有这水平,不错
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-8-4 15:42:26 | 显示全部楼层
支持,{:soso_e179:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10189个

财富等级: 富甲天下

发表于 2013-8-4 15:44:03 | 显示全部楼层
辛苦楼主,感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-4 16:23:05 | 显示全部楼层
生成后,你可以通过修改引线的点坐标和其他实体的拉伸点坐标用JIG拖动。

点评

objectarx刚刚才学,做成可以整体拖动,估计得做成块或自定义实体,再用jig拖动,没有思路,对我太难了!  详情 回复 发表于 2013-8-4 20:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 195个

财富等级: 日进斗金

 楼主| 发表于 2013-8-4 20:51:12 | 显示全部楼层
XDSoft 发表于 2013-8-4 16:23
生成后,你可以通过修改引线的点坐标和其他实体的拉伸点坐标用JIG拖动。

objectarx刚刚才学,做成可以整体拖动,估计得做成块或自定义实体,再用jig拖动,没有思路,对我太难了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-4 20:56:18 来自手机 | 显示全部楼层

不能说一通百通,autocad这点事,把一个做通了也就差不多了,支持下:)来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 81个

财富等级: 招财进宝

发表于 2014-4-20 20:05:22 | 显示全部楼层
你可以将X,Y文字做成块,在将标注点与块的插入点用多段线连接啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2016-12-1 20:04:41 | 显示全部楼层
非常感谢,正需要这代码,改改就能用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 03:30 , Processed in 0.189384 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表