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