找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 130|回复: 0

高程点移位

[复制链接]

1

主题

0

回帖

37

积分

管理员

积分
37
发表于 2024-5-2 22:34:53 | 显示全部楼层 |阅读模式
  1. acDocManager->lockDocument(acDocManager->curDocument());
  2. int iosmode = 0;
  3. CDwgDatabaseUtil::GetVar(采用T("osmode"), iosmode); // 获取捕捉状态值
  4. CDwgDatabaseUtil::setVar(采用T("osmode"), 0);  // 设置捕获关
  5. CDwgDatabaseUtil::setVar(采用T("cmdecho"), 0); // 关闭回显
  6. acedCommand(RTSTR, 采用T("undo"), RTSTR, 采用T("be"), RTNONE);
  7. bool result = true;
  8. AcGePoint3dArray ptArray;
  9. ads采用name ss;
  10. // 建立缓冲区链表
  11. AcDbObjectIdArray entIds;
  12. struct resbuf *rb, *retRb;
  13. CString myXdata = 采用T("202101");
  14. rb = acutBuildList(RTDXF0, 采用T("INSERT"), 2, 采用T("gc200"), RTNONE);
  15. if (CCassUtil::PromptSelectEnts(采用T("X"), myXdata, rb, entIds))
  16. {
  17.     long length = entIds.length();
  18.     for (int i = 0; i < length; i++)
  19.     {
  20.         AcDbEntity *pEnt = NULL;
  21.         if (acdbOpenObject(pEnt, entIds[i], AcDb::kForWrite) == Acad::eOk)
  22.         {
  23.             CString layerName = pEnt->layer(); //图层名
  24.             AcGePoint2d zxPt, ysPt; // 文本的左下角点、右上角点
  25.             AcDbBlockReference *pBlk = AcDbBlockReference::cast(pEnt);
  26.             AcGePoint3d pt3d = pBlk->position();
  27.             double ptz = pt3d.z;
  28.             AcDbObjectIterator *pAttrIter = pBlk->attributeIterator();
  29.             AcDbAttribute *pAttr = NULL;
  30.             AcDbObjectId attrObjId = NULL;
  31.             CString strHeight;
  32.             AcGePoint3d AlimPt, textPt;
  33.             attrObjId = pAttrIter->objectId();
  34.             acdbOpenObject(pAttr, attrObjId, AcDb::kForWrite);
  35.             strHeight = pAttr->textString();
  36.             double hh = pAttr->height(); // 文字高度
  37.             double ww = pAttr->widthFactor(); // 宽度比例系数
  38.             double ll = CTextUtil::getTextLength(strHeight, hh, ww); // 文字长度
  39.             AlimPt = pAttr->alignmentPoint(); // 对齐点
  40.             textPt = pAttr->position(); // 文本的位置点(左下角点)
  41.             AcGePoint3d yPt1 = CGePointUtil::PolarPoint(textPt, 0.0, ll); // 向右
  42.             AcGePoint3d yPt2 = CGePointUtil::PolarPoint(yPt1, CMathUtil::PI() * 0.5, hh); // 向上
  43.             zxPt = CConvertUtil::ToPoint2d(textPt); // 文本的位置点(左下角点)
  44.             ysPt = CConvertUtil::ToPoint2d(yPt2);   // 文本的位置点(右上角点)
  45.             CViewUtil::Set(textPt, yPt2, 3);
  46.             retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  47.             int rt = acedSSGet(采用T("C"), asDblArray(zxPt), asDblArray(ysPt), retRb, ss);
  48.             if (rt != RTNORM)
  49.             {
  50.                 pAttr->close();
  51.                 delete pAttrIter;
  52.                 pBlk->close();
  53.                 pEnt->close();
  54.                 acutRelRb(retRb);
  55.                 acedSSFree(ss);
  56.                 result = false;
  57.                 continue;
  58.             }
  59.             else
  60.             {
  61.                 acutRelRb(retRb);
  62.                 acedSSFree(ss);
  63.                 result = true;
  64.             }
  65.             AcGePoint2d ydPt1, ydPt2, xdPt1, xdPt2, xdPt3, xdPt4, xdPt5, xdPt6, xdPt7, xdPt8;
  66.             if (result)
  67.             {
  68.                 // 设定向下移动限制
  69.                 double xzLen = hh;
  70.                 double yLen = 0;
  71.                 while (yLen < xzLen)
  72.                 {
  73.                     yLen = yLen + hh * 0.25;
  74.                     ydPt1 = CGePointUtil::PolarPoint(zxPt, CMathUtil::PI() * 1.5, yLen);
  75.                     ydPt2 = CGePointUtil::PolarPoint(ysPt, CMathUtil::PI() * 1.5, yLen);
  76.                     retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  77.                     int rt = acedSSGet(采用T("C"), asDblArray(ydPt1), asDblArray(ydPt2), retRb, ss);
  78.                     if (rt != RTNORM)
  79.                     {
  80.                         // 文本的位置点
  81.                         AcGePoint3d setPosPt(ydPt1.x, ydPt1.y, ptz);
  82.                         AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
  83.                         pAttr->setHorizontalMode(AcDb::kTextLeft);   // 左对齐
  84.                         pAttr->setVerticalMode(AcDb::kTextVertMid);  // 左中
  85.                         pAttr->setPosition(setPosPt);
  86.                         pAttr->setAlignmentPoint(setAliPt);
  87.                         acutRelRb(retRb);
  88.                         acedSSFree(ss);
  89.                         result = false;
  90.                         break;
  91.                     }
  92.                     else
  93.                     {
  94.                         acutRelRb(retRb);
  95.                         acedSSFree(ss);
  96.                         result = true;
  97.                     }
  98.                 }
  99.             }
  100.             if (result)
  101.             {
  102.                 // 设定向左移动限制
  103.                 double yzLen = hh * 4;
  104.                 double yLen = 0;
  105.                 while (yLen < yzLen)
  106.                 {
  107.                     yLen = yLen + hh * 0.25;
  108.                     xdPt1 = CGePointUtil::PolarPoint(ydPt1, CMathUtil::PI(), yLen);
  109.                     xdPt2 = CGePointUtil::PolarPoint(ydPt2, CMathUtil::PI(), yLen);
  110.                     retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  111.                     int rt = acedSSGet(采用T("C"), asDblArray(xdPt1), asDblArray(xdPt2), retRb, ss);
  112.                     if (rt != RTNORM)
  113.                     {
  114.                         AcGePoint3d setPosPt(xdPt1.x, xdPt1.y, ptz);
  115.                         AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
  116.                         pAttr->setHorizontalMode(AcDb::kTextLeft);   // 左对齐
  117.                         pAttr->setVerticalMode(AcDb::kTextVertMid);  // 左中
  118.                         pAttr->setPosition(setPosPt);
  119.                         pAttr->setAlignmentPoint(setAliPt);
  120.                         acutRelRb(retRb);
  121.                         acedSSFree(ss);
  122.                         result = false;
  123.                         break;
  124.                     }
  125.                     else
  126.                     {
  127.                         acutRelRb(retRb);
  128.                         acedSSFree(ss);
  129.                         result = true;
  130.                     }
  131.                 }
  132.             }
  133.             if (result)
  134.             {
  135.                 // 设定向上移动限制
  136.                 double yzLen = hh * 2;
  137.                 double yLen = 0;
  138.                 while (yLen < yzLen)
  139.                 {
  140.                     yLen = yLen + hh * 0.25;
  141.                     xdPt3 = CGePointUtil::PolarPoint(xdPt1, CMathUtil::PI() * 0.5, yLen);
  142.                     xdPt4 = CGePointUtil::PolarPoint(xdPt2, CMathUtil::PI() * 0.5, yLen);
  143.                     retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  144.                     int rt = acedSSGet(采用T("C"), asDblArray(xdPt3), asDblArray(xdPt4), retRb, ss);
  145.                     if (rt != RTNORM)
  146.                     {
  147.                         AcGePoint3d setPosPt(xdPt3.x, xdPt3.y, ptz);
  148.                         AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
  149.                         pAttr->setHorizontalMode(AcDb::kTextLeft);
  150.                         pAttr->setVerticalMode(AcDb::kTextVertMid);
  151.                         pAttr->setPosition(setPosPt);
  152.                         pAttr->setAlignmentPoint(setAliPt);
  153.                         acutRelRb(retRb);
  154.                         acedSSFree(ss);
  155.                         result = false;
  156.                         break;
  157.                     }
  158.                     else
  159.                     {
  160.                         acutRelRb(retRb);
  161.                         acedSSFree(ss);
  162.                         result = true;
  163.                     }
  164.                 }
  165.             }
  166.             if (result)
  167.             {
  168.                 // 设定向右移动限制
  169.                 double yzLen = hh * 4;
  170.                 double yLen = 0;
  171.                 while (yLen < yzLen)
  172.                 {
  173.                     yLen = yLen + hh * 0.25;
  174.                     xdPt5 = CGePointUtil::PolarPoint(xdPt3, 0.0, yLen);
  175.                     xdPt6 = CGePointUtil::PolarPoint(xdPt4, 0.0, yLen);
  176.                     retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  177.                     int rt = acedSSGet(采用T("C"), asDblArray(xdPt5), asDblArray(xdPt6), retRb, ss);
  178.                     if (rt != RTNORM)
  179.                     {
  180.                         AcGePoint3d setPosPt(xdPt5.x, xdPt5.y, ptz);
  181.                         AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
  182.                         pAttr->setHorizontalMode(AcDb::kTextLeft);
  183.                         pAttr->setVerticalMode(AcDb::kTextVertMid);
  184.                         pAttr->setPosition(setPosPt);
  185.                         pAttr->setAlignmentPoint(setAliPt);
  186.                         acutRelRb(retRb);
  187.                         acedSSFree(ss);
  188.                         result = false;
  189.                         break;
  190.                     }
  191.                     else
  192.                     {
  193.                         acutRelRb(retRb);
  194.                         acedSSFree(ss);
  195.                         result = true;
  196.                     }
  197.                 }
  198.             }
  199.             if (result)
  200.             {
  201.                 // 设定向下移动限制
  202.                 double yzLen = hh;
  203.                 double yLen = 0;
  204.                 while (yLen < yzLen)
  205.                 {
  206.                     yLen = yLen + hh * 0.25;
  207.                     xdPt7 = CGePointUtil::PolarPoint(xdPt5, CMathUtil::PI() * 1.5, yLen);
  208.                     xdPt8 = CGePointUtil::PolarPoint(xdPt6, CMathUtil::PI() * 1.5, yLen);
  209.                     retRb = acutBuildList(-4, 采用T("<NOT"), 2, 采用T("GC200"), -4, 采用T("NOT>"), RTNONE);
  210.                     int rt = acedSSGet(采用T("C"), asDblArray(xdPt7), asDblArray(xdPt8), retRb, ss);
  211.                     if (rt != RTNORM)
  212.                     {
  213.                         AcGePoint3d setPosPt(xdPt7.x, xdPt7.y, ptz);
  214.                         AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
  215.                         pAttr->setHorizontalMode(AcDb::kTextLeft);
  216.                         pAttr->setVerticalMode(AcDb::kTextVertMid);
  217.                         pAttr->setPosition(setPosPt);
  218.                         pAttr->setAlignmentPoint(setAliPt);
  219.                         acutRelRb(retRb);
  220.                         acedSSFree(ss);
  221.                         result = false;
  222.                         break;
  223.                     }
  224.                     else
  225.                     {
  226.                         acutRelRb(retRb);
  227.                         acedSSFree(ss);
  228.                         result = true;
  229.                     }
  230.                 }
  231.                 if (result)
  232.                 {
  233.                     ptArray.append(pt3d);
  234.                 }
  235.             }
  236.             pAttr->close();
  237.             delete pAttrIter;
  238.             pBlk->close();
  239.             pEnt->close();
  240.         }
  241.     }
  242.     acutRelRb(rb);
  243.     if (ptArray.length() > 0)
  244.     {
  245.         CLayerUtil::Add(采用T("检查"), 1);
  246.         int i = 0;
  247.         for (i; i < ptArray.length(); i++)
  248.         {
  249.             AcGeVector3d vec(0, 0, 1);
  250.             AcDbCircle *pCircle = new AcDbCircle(ptArray[i], vec, 2.0);
  251.             pCircle->setLayer(采用T("检查"));
  252.             CDwgDatabaseUtil::PostToModelSpace(pCircle);
  253.         }
  254.         acutPrintf(采用T("\n高程点处理完毕,有: %d 个未处理。已画圆为标记请检查!"), i);
  255.     }
  256. }
  257. else
  258. {
  259.     AfxMessageBox(采用T("只限定CASS的合成高程点!"));
  260.     acutRelRb(rb);
  261. }
  262. CDwgDatabaseUtil::setVar(采用T("osmode"), iosmode); // 还原捕捉状态值
  263. acDocManager->unlockDocument(acDocManager->curDocument());
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-4 13:15 , Processed in 0.118906 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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