简单模拟多段线绘制Pline命令过程的撤销功能
生活随笔
收集整理的這篇文章主要介紹了
简单模拟多段线绘制Pline命令过程的撤销功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單模擬多段線繪制Pline命令過程的撤銷功能
這是關于多段線pline命令中的撤銷功能的簡單代碼
代碼使用了事務管理器來執行增加對象和撤銷處理.
代碼
/// <summary>
/// 簡單模擬多段線繪制過程的撤銷功能.
/// code by edata 2020-3-11
/// </summary>
/// <remarks>簡單模擬多段線繪制過程的_u撤銷功能.僅考慮了UCS問題</remarks>
//設置坐標系轉換緩沖區鏈表
resbuf ucs,wcs;
ucs.restype=RTSHORT;
ucs.resval.rint=1;
wcs.restype=RTSHORT;
wcs.resval.rint=0;
ads_point pt;
ads_point ptWcs;
if (RTNORM != acedGetPoint(NULL,_T("
選擇起點: "),pt))
{
return;
}
acedTrans(pt,&ucs,&wcs,0,ptWcs);
AcGePoint3d p1=asPnt3d(ptWcs);
AcGePoint3d ptStart=p1;
AcDbPolyline *pPoly=NULL;
//開啟事務管理器
AcTransaction *pTrans =actrTransactionManager->startTransaction();
while (true)
{
CString strPrompt=_T("
選擇下一個點[(U)撤銷]: ");
CString strKword=_T("Undo _ u");
if (pPoly!=NULL)
{
int nCount =pPoly->numVerts();
if (nCount>1)
{
strPrompt=_T("
選擇下一個點[(U)撤銷/(C)閉合]: ");
strKword=_T("Undo Close _ u c");
}
}
//設置使用Undo關鍵字,該值允許使用ctrl+z撤銷
acedInitGet(NULL,strKword);
int nRet=acedGetPoint(pt,strPrompt,pt);
if (RTKWORD == nRet)
{
ACHAR szKword[132];
if (RTNORM != acedGetInput(szKword))
{
continue;
}
if (_tcscmp(szKword,_T("u")) == 0)
{
if (pPoly != NULL)
{
int nCount = pPoly->numVerts();
if (nCount>0)
{
//此處使用removeVertexAt不能移除僅剩的一個點,后面對1個點的線取消事務
Acad::ErrorStatus es= pPoly->removeVertexAt(nCount-1);
//重新生成
pPoly->draw();
if (nCount>1)
{
pPoly->getEndPoint(p1);
pt[X] = p1.x;
pt[Y] = p1.y;
pt[Z] = p1.z;
acedTrans(pt,&wcs,&ucs,0,pt);
}
else
{
p1=ptStart;
pt[X] = p1.x;
pt[Y] = p1.y;
pt[Z] = p1.z;
acedTrans(pt,&wcs,&ucs,0,pt);
}
}
}
}
else if (_tcscmp(szKword,_T("c")) == 0)
{
if (pPoly!=NULL)
{
int nCount =pPoly->numVerts();
if (nCount>1)
{
pPoly->setClosed(true);
break;
}
}
}
continue;
}
else if (RTNORM != nRet)
{
break;
}
acedTrans(pt,&ucs,&wcs,0,ptWcs);
AcGePoint3d p2=asPnt3d(ptWcs);
//處理多段線圖形
if (pPoly == NULL)
{
pPoly = new AcDbPolyline();
pPoly->addVertexAt(0,AcGePoint2d(p1.x,p1.y));
pPoly->addVertexAt(1,AcGePoint2d(p2.x,p2.y));
//添加到當前數據庫當前空間
AddEntToCurSpace(pPoly);
//添加對象到事務處理
actrTransactionManager->addNewlyCreatedDBRObject(pPoly);
//顯示圖形
pPoly->draw();
}
else
{
int nCount = pPoly->numVerts();
pPoly->addVertexAt(nCount,AcGePoint2d(p2.x,p2.y));
//顯示圖形
pPoly->draw();
}
p1=p2;
}
if (pPoly == NULL)
{
//未創建多段線,終止事務
actrTransactionManager->abortTransaction();
return;
}
else
{
int nCount = pPoly->numVerts();
if (nCount == 1)
{
//僅有一個點,終止事務
actrTransactionManager->abortTransaction();
return;
}
}
//事務結束
actrTransactionManager->endTransaction();
AddEntToCurSpace 添加實體對象到當前數據庫當前空間
代碼
static Acad::ErrorStatus AddEntToCurSpace(AcDbEntity *pEnt)
{
AcDbObjectId objId=AcDbObjectId::kNull;
return AddEntToCurSpace(pEnt,objId);
}
static Acad::ErrorStatus AddEntToCurSpace(AcDbEntity *pEnt,AcDbObjectId &objId)
{
if (pEnt == NULL)
{
return Acad::eNullEntityPointer;
}
AcDbBlockTableRecordPointer pBlkRcd(acdbHostApplicationServices()->workingDatabase()->currentSpaceId(),AcDb::kForWrite);
if (Acad::eOk != pBlkRcd.openStatus())
{
return pBlkRcd.openStatus();
}
return pBlkRcd->appendAcDbEntity(objId,pEnt);
}
結束語:使用事務管理器的時候,事務中的對象不能使用close()關閉對象了;
總結
以上是生活随笔為你收集整理的简单模拟多段线绘制Pline命令过程的撤销功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python批量 png转ico
- 下一篇: 在线cron生成器