找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个弧长动态尺寸

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-3-16 09:01:15 | 显示全部楼层 |阅读模式
  1. #pragma once
  2. class CArcTestJig: public AcEdJig
  3. {
  4. public:
  5.         CArcTestJig();
  6.         virtual ~CArcTestJig();
  7.         //- dynamic dimension data setup
  8.         virtual AcDbDimDataPtrArray* dimData (const double dimScale) override;
  9.         //- dynamic dimension data update
  10.         virtual Acad::ErrorStatus setDimValue(const AcDbDimData* dimData,        const double dimValue) override;
  11.         virtual Adesk::Boolean update() override;
  12.         virtual DragStatus sampler() override;
  13.         virtual AcDbEntity* entity() const override         { return m采用pArc;  }
  14.         AcEdJig::DragStatus start();
  15. protected:
  16.         void  releaseDimData();
  17.         void  updateDimData();
  18.         void  setEndAngleTo(AcGePoint3d pntEnd);
  19. protected:
  20. #define ARCDIM采用OFFSET  20.0
  21.         enum stage
  22.         {
  23.                 center = 1,
  24.                 startpnt,
  25.                 endpnt
  26.         };
  27.         stage        m采用Stage;
  28.         AcGePoint3d  m采用PntPrev;
  29.         AcDbArc*     m采用pArc;
  30.         AcDbDimDataPtrArray* m采用pDimData;
  31.         double     采用采用PI;
  32. };
  33. void CreateArc();
  34. #include "StdAfx.h"
  35. #include "ArcTestJig.h"
  36. //
  37. CArcTestJig::CArcTestJig(): m采用Stage(center), m采用pDimData(NULL), 采用采用PI(atan (1.)*4)
  38. {
  39.         m采用pArc = new AcDbArc(AcGePoint3d::kOrigin, AcGeVector3d::kZAxis, 100., 0., 采用采用PI/2);
  40. }
  41. CArcTestJig::~CArcTestJig()
  42. {
  43.         releaseDimData();
  44. };
  45. void CArcTestJig::releaseDimData()
  46. {
  47.         if(m采用pDimData == NULL)
  48.                 return;
  49.         for(int ii = 0; ii < m采用pDimData->length(); ii++)
  50.                 delete m采用pDimData->at(ii);
  51.         delete m采用pDimData;
  52.         m采用pDimData = NULL;
  53. }
  54. void  CArcTestJig::updateDimData()
  55. {
  56.         if(m采用pDimData == NULL || m采用pArc == NULL)
  57.                 return;
  58.         if(m采用pDimData->length() < 2)
  59.                 return;
  60.         double  dRadius = m采用pArc->radius();
  61.         AcGePoint3d  pntCenter = m采用pArc->center();
  62.         AcGePoint3d  pntStart;
  63.         m采用pArc->getStartPoint(pntStart);
  64.         double dStart;
  65.         m采用pArc->getStartParam(dStart);
  66.         AcGePoint3d  pntEnd;
  67.         m采用pArc->getEndPoint(pntEnd);
  68.         double dEnd;
  69.         m采用pArc->getEndParam(dEnd);
  70.         AcDbArcDimension* pArcDim = AcDbArcDimension::cast(m采用pDimData->at(0)->dimension());
  71.         if(pArcDim)
  72.         {
  73.                 pArcDim->setArcSymbolType(2); // no symbol
  74.                 pArcDim->setCenterPoint(pntCenter);
  75.                 pArcDim->setXLine1Point(pntStart);
  76.                 pArcDim->setXLine2Point(pntEnd);
  77.                 pArcDim->setArcStartParam(dStart);
  78.                 pArcDim->setArcEndParam(dEnd);
  79.                 AcGeVector3d vStart = (pntStart - pntCenter).normalize();
  80.                 AcGeVector3d vEnd = (pntEnd - pntCenter).normalize();
  81.                 AcGeVector3d vMid = vStart + vEnd;
  82.                 vMid.normalize();
  83.                 if(vStart.angleTo(vEnd, m采用pArc->normal()) > 采用采用PI)
  84.                         vMid.negate();
  85.                 pArcDim->setArcPoint(pntCenter + (dRadius + ARCDIM采用OFFSET)*vMid );
  86.                 pArcDim->setHasLeader(false);
  87.         }
  88.         AcDbAlignedDimension* pChordDim = AcDbAlignedDimension::cast(m采用pDimData->at(1)->dimension());
  89.         if(pChordDim)
  90.         {
  91.                 pChordDim->setXLine1Point(pntStart);
  92.                 pChordDim->setXLine2Point(pntEnd);
  93.                 AcGeVector3d vDir = (pntEnd - pntStart).normalize();
  94.                 pChordDim->setDimLinePoint(pntStart + ARCDIM采用OFFSET*vDir.perpVector());
  95.         }
  96. }
  97. AcDbDimDataPtrArray* CArcTestJig::dimData (const double dimScale)
  98. {
  99.         if(m采用Stage != endpnt)
  100.                 return NULL;
  101.         releaseDimData();
  102.         m采用pDimData = new AcDbDimDataPtrArray();
  103.         AcDbDimData* pNewData(NULL);
  104.         // Arc Dimension
  105.         AcDbArcDimension* pArcDim = new AcDbArcDimension();
  106.         pArcDim->setDatabaseDefaults();
  107.         pArcDim->setNormal(m采用pArc->normal());
  108.         pArcDim->setElevation(0.0);
  109.         pArcDim->setHorizontalRotation(0.0);
  110.         pArcDim->setDimscale(dimScale);
  111.         pArcDim->setDimtad(1);
  112. //        pArcDim->setDynamicDimension(true);
  113.         pNewData = new AcDbDimData(pArcDim);
  114.         pNewData->setDimHideIfValueIsZero(false);
  115.         pNewData->setDimEditable(true);
  116.         pNewData->setDimFocal(true);
  117.         m采用pDimData->append(pNewData);
  118.         // Chord Dimension
  119.         AcDbAlignedDimension* pChordDim = new AcDbAlignedDimension();
  120.         pChordDim->setDatabaseDefaults();
  121.         pChordDim->setNormal(m采用pArc->normal());
  122.         pChordDim->setElevation(0.0);
  123.         pChordDim->setHorizontalRotation(0.0);
  124.         pChordDim->setDimtad(1);
  125.         pChordDim->setDynamicDimension(true);
  126.         pNewData = new AcDbDimData(pChordDim);
  127.         pNewData->setDimHideIfValueIsZero(false);
  128.         pNewData->setDimEditable(true);
  129.         pNewData->setDimFocal(false);
  130.         m采用pDimData->append(pNewData);
  131.         // set dimension location
  132.         updateDimData();
  133.         return m采用pDimData;
  134. }
  135. Acad::ErrorStatus CArcTestJig::setDimValue(const AcDbDimData* dimData,        const double dimValue)
  136. {
  137.         AcDbDimension* pDim = dimData->dimension();
  138.         AcDbArcDimension* pArcDim = AcDbArcDimension::cast(pDim);
  139.         if(pArcDim)
  140.         {
  141.                 AcGePoint3d pntNewEnd;
  142.                 Acad::ErrorStatus es = m采用pArc->getPointAtDist(dimValue, pntNewEnd);
  143.                 if(Acad::eOk != es)
  144.                         return es;
  145.                 setEndAngleTo(pntNewEnd);
  146.                 return Acad::eOk;
  147.         }
  148.         else
  149.         {
  150.                 AcDbAlignedDimension* pChordDim =  AcDbAlignedDimension::cast(pDim);
  151.                 if(pChordDim)
  152.                 {
  153.                         double dRadius = m采用pArc->radius();
  154.                         if(dimValue > dRadius*2)
  155.                                 return Acad::eNotApplicable;
  156.                         double dAngDlt = asin(dimValue/(dRadius*2));
  157.                         double dNewEnd = m采用pArc->startAngle() + dAngDlt*2;
  158.                         m采用pArc->setEndAngle(dNewEnd);
  159.                         return Acad::eOk;
  160.                 }
  161.         }
  162.         return  Acad::eInvalidInput;
  163. }
  164. void  CArcTestJig::setEndAngleTo(AcGePoint3d pntEnd)
  165. {
  166.         AcGeVector3d vEnd = (pntEnd - m采用pArc->center()).normalize();
  167.         double dNewEnd = vEnd.angleTo(AcGeVector3d::kXAxis, m采用pArc->normal().negate());
  168. //         if(dNewEnd > 采用采用PI)
  169. //                 dNewEnd -= 采用采用PI*2;
  170.         m采用pArc->setEndAngle(dNewEnd);
  171. }
  172. Adesk::Boolean CArcTestJig::update()
  173. {
  174.         if(m采用pArc == NULL)
  175.                 return false;
  176.         switch(m采用Stage)
  177.         {
  178.                 case center:
  179.                         m采用pArc->setCenter(m采用PntPrev);
  180.                         break;
  181.                 case startpnt:
  182.                         {
  183.                                 AcGeVector3d vStart = m采用PntPrev - m采用pArc->center();
  184.                                 double dRadius = vStart.length();
  185.                                 vStart.normalize();
  186.                                 double dStart = vStart.angleTo(AcGeVector3d::kXAxis, m采用pArc->normal().negate());
  187.                                 if(dStart > 采用采用PI)
  188.                                         dStart -= 采用采用PI*2;
  189.                                 m采用pArc->setRadius(dRadius);
  190.                                 m采用pArc->setStartAngle(dStart);
  191.                                 m采用pArc->setEndAngle(dStart + 采用采用PI/2);
  192.                         }
  193.                         break;
  194.                 case endpnt:
  195.                         setEndAngleTo(m采用PntPrev);
  196.                         break;
  197.                 default:
  198.                         return false;
  199.         }
  200.         updateDimData();
  201.         return true;
  202. }
  203. AcEdJig::DragStatus CArcTestJig::sampler()
  204. {
  205.         setUserInputControls((UserInputControls)        (        AcEdJig::kAccept3dCoordinates        | AcEdJig::kNullResponseAccepted));
  206.         DragStatus sts;
  207.         AcGePoint3d pntTemp;
  208.         if(m采用Stage == startpnt)
  209.                 sts = acquirePoint(pntTemp, m采用pArc->center());
  210.         else
  211.                 sts = acquirePoint(pntTemp);
  212.         if(sts == AcEdJig::kNormal)
  213.         {
  214.                 if(pntTemp.isEqualTo(m采用PntPrev))
  215.                         sts = kNoChange;
  216.                 m采用PntPrev = pntTemp;
  217.         }
  218.         return sts;
  219. }
  220. AcEdJig::DragStatus  CArcTestJig::start()
  221. {
  222.         CString sPrompt;
  223.         m采用Stage = center;
  224.         sPrompt = 采用T("\nCenter of arc: ");
  225.         setDispPrompt(sPrompt);
  226.         AcEdJig::DragStatus sts = drag();
  227.         if(sts != kNormal)
  228.                 return sts;
  229.         m采用Stage = startpnt;
  230.         sPrompt = 采用T("\nStart point of arc: ");
  231.         setDispPrompt(sPrompt);
  232.         m采用pArc->getStartPoint(m采用PntPrev);
  233.         sts = drag();
  234.         if(sts != kNormal)
  235.                 return sts;
  236.         m采用Stage = endpnt;
  237.         sPrompt = 采用T("\nEnd point of arc: ");
  238.         setDispPrompt(sPrompt);
  239.         m采用pArc->getEndPoint(m采用PntPrev);
  240.         sts = drag();
  241.         if(sts == kNormal)
  242.         {
  243.                 AcDbObjectId idArc = append();
  244.         }
  245.         return sts;
  246. }
  247. void CreateArc()
  248. {
  249.         CArcTestJig arcJig;
  250.         arcJig.start();
  251. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-1 18:26 , Processed in 0.136467 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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