天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 272|回复: 0

一个弧长动态尺寸

[复制链接]
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    115

    主题

    11

    回帖

    1393

    积分

    管理员

    积分
    1393
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    一个弧长动态尺寸
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-5 06:10 , Processed in 0.128138 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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