首先在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 onceclass 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; }