首先在acrxEntryPoint.cpp中注册一个命令:
- IMPLEMENT_ARX_ENTRYPOINT(CARX_CreatePolylineApp)
- ACED_ARXCOMMAND_ENTRY_AUTO(CARX_CreatePolylineApp, HH, AddPoly, AddPoly, ACRX_CMD_TRANSPARENT, NULL)
该命令的具体实现如下:
- static void HHAddPoly(void)
- {
- int nColorIndex = 0; // 颜色索引值
- ads_real width = 0; // 多段线的线宽
- int nIndex = 2; // 当前输入点的次数
- ads_point ptStart; // 起点
- ads_point ptPrevious;// 前一个参考点
- ads_point ptCurrent; //当前拾取的点
- AcDbObjectId polyId; //多段线ID
-
- // 提示用户输入起点
- if (RTNORM != acedGetPoint(NULL, _T("\n输入第一点:"), ptStart))
- {
- return ;
- }
-
- // 输入第二点
- acedInitGet(NULL, _T("W C B F"));
- int rc = acedGetPoint(ptStart,_T("\n输入下一点 [宽度(W)/颜色(C)/闭合(B)]<完成(F)>:"), ptCurrent);
- while (RTNORM == rc || RTKWORD == rc)
- {
- if (RTKWORD == rc) // 如果用户输入了关键字
- {
- ACHAR keyWord[20];// 关键字
- //获取输入的关键字
- if (RTNORM != acedGetInput(keyWord))
- {
- return;
- }
-
- if (0 == _tcscmp(keyWord, _T("W")))
- {
- width = CAuxiliary::GetWidth();
- AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
- if (NULL == pPoly)
- {
- return;
- }
- pPoly->setConstantWidth(width);
- pPoly->close();
- }
- else if (0 == _tcscmp(keyWord, _T("C")))
- {
- nColorIndex = CAuxiliary::GetColorIndex();
- AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
- if (NULL == pPoly)
- {
- return;
- }
- pPoly->setColorIndex(nColorIndex);
- pPoly->close();
-
- }
- else if (0 == _tcscmp(keyWord, _T("B")))
- {
- if (nIndex < 3)
- {
- acutPrintf(_T("\n输入点个数不足,不能执行闭合操作"));
- return;
- }
-
- AcDbPolyline *pPoly = CAuxiliary::GetPolyLine(polyId);
- if (NULL == pPoly)
- {
- return;
- }
- pPoly->setClosed(Adesk::kTrue);
- pPoly->close();
- return;
- }
- else if (0 == _tcscmp(keyWord, _T("F")))
- {
- return;
- }
- else
- {
- acutPrintf(_T("\n无效的关键字."));
- }
- }
- else if (RTNORM == rc) // 用户输入了点
- {
- acutPrintf(_T("\n输入点的坐标是(%.2f, %.2f, %.2f)"), ptCurrent[X], ptCurrent[Y], ptCurrent[Z]);
-
- if (2 == nIndex)
- {
- // 创建多段线
- polyId = CAuxiliary::CreatePolyline(ptStart, ptCurrent, width, nColorIndex);
- }
- else if (nIndex > 2)
- {
- //修改多段线
- CAuxiliary::AddPolyline(polyId, ptCurrent,nIndex, width, nColorIndex);
- }
-
- ++nIndex;
- acdbPointSet(ptCurrent, ptPrevious);//acdbPointSet宏: ads_point 变量值的复制
- }
-
- // 提示用户输入新的节点
- acedInitGet(NULL, _T("W C B F"));
- rc = acedGetPoint(ptPrevious, _T("\n输入下一点 [宽度(W)/颜色(C)/闭合(B)]<完成(F)>:"), ptCurrent);
- }
- }
其中调用了一些函数,新建一个类CAuxiliary,具体实现如下:
- ***********************Auxiliary.h********************
-
-
- #pragma once
-
- class CAuxiliary
- {
- public:
- CAuxiliary(void);
- ~CAuxiliary(void);
-
- //图形数据库
- static bool PostToModelSpace(AcDbEntity* pEnt, AcDbObjectId &entId);
-
- //通过ID获取对象
- static AcDbPolyline * GetPolyLine(AcDbObjectId polyId);
-
- //创建仅包含一条直线的多段线
- static AcDbObjectId CreatePolyline(ads_point ptStart, ads_point ptEnd, double width, int nColorIndex);
-
- //添加一条直线到多段线
- static void AddPolyline(AcDbObjectId polyId, ads_point ptCurrent,int nIndex, double width, int nColorIndex);
-
- //获取用户输入的线宽
- static ads_real GetWidth();
-
- //提示用户输入颜色索引值
- static int GetColorIndex();
- };
- ***********************Auxiliary.cpp********************
-
-
- #include "StdAfx.h"
- #include "Auxiliary.h"
- #include <atlstr.h>
- #include <tchar.h>
-
- CAuxiliary::CAuxiliary(void)
- {
- }
-
- CAuxiliary::~CAuxiliary(void)
- {
- }
-
- bool CAuxiliary::PostToModelSpace(AcDbEntity* pEnt, AcDbObjectId &entId)
- {
- if (NULL == pEnt)
- {
- return false;
- }
- // 获得指向块表的指针
- AcDbBlockTable *pBlockTable = NULL;
- //workingDatabase()能够获得一个指向当前活动的图形数据库的指针,
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
- if (NULL == pBlockTable)
- {
- return false;
- }
-
- // 获得指向特定的块表记录(模型空间)的指针
- AcDbBlockTableRecord *pBlockTableRecord = NULL;
- pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
- if (NULL == pBlockTableRecord)
- {
- return false;
- }
-
- // 将AcDbLine类的对象添加到块表记录中
- pBlockTableRecord->appendAcDbEntity(entId, pEnt);
-
- // 关闭图形数据库的各种对象
- pBlockTable->close();
- pBlockTableRecord->close();
- pEnt->close();
-
- return true;
- }
-
- AcDbPolyline * CAuxiliary::GetPolyLine(AcDbObjectId polyId)
- {
- AcDbPolyline * pPoly(NULL);
- if (Acad::eOk != acdbOpenObject(pPoly, polyId, AcDb::kForWrite))
- {
- return NULL;
- }
- return pPoly;
- }
-
- AcDbObjectId CAuxiliary::CreatePolyline(ads_point ptStart, ads_point ptCurrent, double width,int nColorIndex)
- {
- AcDbPolyline *pPoly = new AcDbPolyline;
-
- AcGePoint2d ptInsert = asPnt2d(ptStart);
- AcGePoint2d ptInsert1 = asPnt2d(ptCurrent);
-
- pPoly->addVertexAt(0, ptInsert, nColorIndex, width, width);
- pPoly->addVertexAt(1, ptInsert1, nColorIndex, width, width);
-
- AcDbObjectId polyId;
- if (!CAuxiliary::PostToModelSpace(pPoly, polyId))
- {
- acutPrintf(_T("\n加入图形数据库失败"));
- return NULL;
- }
- return polyId;
- }
-
- void CAuxiliary::AddPolyline(AcDbObjectId polyId, ads_point ptCurrent,int nIndex, double width, int nColorIndex)
- {
- AcDbPolyline *pPoly = GetPolyLine(polyId);
- if (NULL == pPoly)
- {
- return;
- }
- AcGePoint2d ptInsert = asPnt2d(ptCurrent);
- pPoly->addVertexAt(nIndex - 1, ptInsert, nColorIndex, width, width);
- pPoly->close();
- }
- ads_real CAuxiliary::GetWidth()
- {
- ads_real width = 0;
- if (RTNORM == acedGetReal(_T("\n输入线宽:"), &width))
- {
- return width;
- }
- else
- {
- return 0;
- }
- }
-
- int CAuxiliary::GetColorIndex()
- {
- int nColorIndex = 0;
- if (RTNORM != acedGetInt(_T("\n输入颜色索引值(0~256):"), &nColorIndex))
- {
- return 0;
- }
-
- // 处理颜色索引值无效的情况
- while (nColorIndex < 0 || nColorIndex > 256)
- {
- acedPrompt(_T("\n输入了无效的颜色索引."));
- if (RTNORM != acedGetInt(_T("\n输入颜色索引值(0~256):"), &nColorIndex))
- {
- return 0;
- }
- }
-
- return nColorIndex;
- }
-