很不幸的,今天被老大训导了,但也因为学到不少东西:
AcGePoint3d (AcGePoint2d )转换 ads_point 用:asDblArray函数。
ads_point 转换AcGePoint2d 用asPnt2d(const double &pnt) 或aspnt3d
acdbUcs2Wcs(ptAds, asDblArray(m_ptStart) ,false), 是表示在CAD中的转换成常用坐标系WCS 进行转换
使用AcDbPolyline类时,必须用到的函数有:
m_pEntity->setNormal(AcGeVector3d::kZAxis);
m_pEntity->setElevation(0.0);
转换成实体所在平面的点:
先定义平面:AcGePlane plane(AcGePoint3d::kOrigin + m_pEntity->normal() * m_pEntity->elevation(), m_pEntity->normal());
AcGePoint2d pt1(m_ptStart.convert2d(plane)), pt2(m_ptEnd.convert2d(plane));
AcGeVector2d vt1(pt2 - pt1);
vt1.normalize();
AcGeVector2d vt2(vt1);
vt2.rotateBy(PI / 2.0);
向量vt1 与 向量vt2 互相垂直
用向量求点更简单(示例):
AcGePoint2d ptMid((pt1.x + pt2.x) / 2.0, (pt1.y + pt2.y) / 2.0); AcGePoint2d p1(pt1 - vt1 * DbLen); AcGePoint2d p2(ptMid - vt1 * FuHaoLen / 2); AcGePoint2d p3(p2 + vt2 * FuHaoWid); AcGePoint2d p5(ptMid + vt1 * FuHaoLen / 2); AcGePoint2d p4(p5 - vt2 * FuHaoWid); AcGePoint2d p6(pt2 + vt1 * DbLen);
还有一点是:变量第一个字母用小写,函数用大写
AcEdJIg的入门用法:
定义一个新类,从AcEdJig中继函
重载AcEdJig三个函数 (必须重载):
AcEdJig::sampler(), which acquires a geometric value (an angle, a distance, or a point),得到一个角度,距离,或点 AcEdJig::update(), which analyzes the geometric value and stores it or updates the entity,更新实体数据 AcEdJig::entity(), which returns a pointer to the entity to be regenerated
sampler 函数示例:这里面尽量不要计算更新的数据
AcEdJig::DragStatus sampler () { //- Setup the user input controls for each sample setUserInputControls ((AcEdJig::UserInputControls) (kNoZeroResponseAccepted| kNoNegativeResponseAccepted | kAccept3dCoordinates)) ; //setSpecialCursorType (kCrosshair) ; AcGePoint3d pt; AcEdJig::DragStatus status = acquirePoint(pt); if (AcEdJig::kNormal != status) return status; if (m_ptEnd.distanceTo(pt) < 0.000000001) return AcEdJig::kNoChange; m_ptEnd = pt; return AcEdJig::kNormal; }
update函数:计算更新的数据
entity ()返回最终的实体指针;
再定义一个实现函数 。
AcAxDocLock docLock(acdbHostApplicationServices()->workingDatabase()->blockTableId());
setDispPrompt(_T("/n请输入直线的终点:")); AcEdJig::DragStatus statusDrag = drag(); if (AcEdJig::kNormal == statusDrag) { AcDbObjectId id = append(); m_pEntity->close(); }
其中drag 回调的是sampler (),update函数。
注意,应养成一个习惯,在做判断语句时,应该常量应前,变量在后,这样,不至于少使比较符而出错。
如: if (AcEdJig::kNormal == statusDrag)