日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

简单模拟多段线绘制Pline命令过程的撤销功能

發布時間:2024/2/2 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 简单模拟多段线绘制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命令过程的撤销功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。