创建多段线
1、创建一个工具类CTool。
Tool.h:
static ads_real GetWidth(); static int GetColorIndex();
Tool.cpp
ads_real CTool::GetWidth() { ads_real width = 0; if(acedGetReal(_T("\n输入线宽:"), &width)==RTNORM) { return width; } else { return 0; } } int CTool::GetColorIndex() { int colorIndex = 0; if(acedGetInt(_T("输入颜色索引值(0~256):"), &colorIndex) != RTNORM) { return 0; } while(colorIndex < 0 || colorIndex >256) { acedPrompt(_T("输入了错误的颜色索引值!")); if(acedGetInt(_T("输入颜色索引值(0~256)"), &colorIndex) != RTNORM) { return 0; } } return colorIndex; }
2、添加命令AddPoly
实现代码如下:
static void qxzyAddPolyDynamicCommands_AddPoly(void) { // Add your code for command qxzyAddPolyDynamicCommands._AddPoly here int colorIndex = 0; ads_real width = 0; int index = 2; ads_point ptStart; if(acedGetPoint(NULL, _T("\n输入第一点:"), ptStart) != RTNORM) return; ads_point ptPrevious,ptCurrent; acdbPointSet(ptStart, ptPrevious); AcDbObjectId polyId; acedInitGet(NULL, _T("W C O")); int rc = acedGetPoint(ptPrevious, _T("\n输入下一点[宽度(W)/颜色(C)]<完成(O)>"), ptCurrent); while(rc == RTNORM || rc == RTKWORD) { if(rc == RTKWORD) { ACHAR kword[20]; if(acedGetInput(kword)!=RTNORM) return; if(strcmp((LPSTR)(LPCTSTR)kword,"W")==0) { width = CTool::GetWidth(); } else if(strcmp((LPSTR)(LPCTSTR)kword,"C")==0) { colorIndex = CTool::GetColorIndex(); } else if(strcmp((LPSTR)(LPCTSTR)kword, "O")==0) { return; } else { acutPrintf(_T("\n无效的关键字")); } } else if(rc == RTNORM) { if(index == 2) { AcDbPolyline *pPoly= new AcDbPolyline(2); AcGePoint2d ptGe1,ptGe2; ptGe1[X]=ptPrevious[X]; ptGe1[Y]=ptPrevious[Y]; ptGe2[X]=ptCurrent[X]; ptGe2[Y]=ptCurrent[Y]; pPoly->addVertexAt(0, ptGe1); pPoly->addVertexAt(1, ptGe2); pPoly->setConstantWidth(width); pPoly->setColorIndex(colorIndex); AcDbBlockTable *pBlkTbl; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlkTbl, AcDb::kForRead); AcDbBlockTableRecord *pBlkTblRcd; pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite); pBlkTblRcd->appendAcDbEntity(polyId, pPoly); pBlkTblRcd->close(); pBlkTbl->close(); pPoly->close(); } else if(index>2) { AcDbPolyline *pPoly; acdbOpenObject(pPoly, polyId, AcDb::kForWrite); AcGePoint2d ptGe; ptGe[X]=ptCurrent[X]; ptGe[Y]=ptCurrent[Y]; pPoly->addVertexAt(index-1,ptGe); pPoly->setConstantWidth(width); pPoly->setColorIndex(colorIndex); pPoly->close(); } index++; acdbPointSet(ptCurrent,ptPrevious); } acedInitGet(NULL, _T("W C O")); rc = acedGetPoint(ptPrevious, _T("\n输入下一点[宽度(W)/颜色(C)]<完成(O)>"), ptCurrent); } }