有时候需要绘制临时图像,这些图像不能被选中等属性
static AcArray<AcDbEntity*> _markers; static AcArray<int> viewportNumbers; static void ClearTransientGraphics() { AcGiTransientManager* pTransientManager = acgiGetTransientManager(); int numOfMarkers = _markers.length(); if (numOfMarkers > 0) { for (int index = 0; index < numOfMarkers; index++) { AcDbEntity *pMarker = _markers.at(index); pTransientManager->eraseTransient(pMarker, viewportNumbers); delete pMarker; } _markers.removeAll(); } } static void CreateTransientGraphics(void) { Acad::ErrorStatus es; AcDbDatabase *pDb =acdbHostApplicationServices()->workingDatabase(); ads_point pickPnt; ads_name ent_name; int ret = acedEntSel(ACRX_T("\n Select a polyline\n"),ent_name,pickPnt); if(ret != RTNORM) return; AcDbObjectId plOid; es = acdbGetObjectId(plOid, ent_name); if (es != Acad::eOk) return; ads_point adsTestPoint; ret = acedGetPoint(NULL,ACRX_T("\n Select an internal point\n"),adsTestPoint); if(ret != RTNORM) return; AcGePoint3d testPoint = asPnt3d(adsTestPoint); ads_real rayAngle = 0.0; ret = acedGetAngle(asDblArray(testPoint),ACRX_T("Specify ray direction"),&rayAngle); if(ret != RTNORM) return; AcGePoint3d tempPoint = testPoint + AcGeVector3d::kXAxis; tempPoint = tempPoint.rotateBy(rayAngle,AcGeVector3d::kZAxis,testPoint); AcGeVector3d rayDir = tempPoint - testPoint; ClearTransientGraphics(); AcDbTransactionManager* pTM = pDb->transactionManager(); AcTransaction *pTransaction = pTM->startTransaction(); AcDbObject *pCurveObj = NULL; es = pTransaction->getObject(pCurveObj,plOid,AcDb::kForRead); AcDbCurve *pCurve = AcDbCurve::cast(pCurveObj); AcGiTransientManager* pTransientManager = acgiGetTransientManager(); viewportNumbers.removeAll(); struct resbuf res; acedGetVar(_T("CVPORT"), &res); viewportNumbers.append(res.resval.rint); if(pCurve != NULL) { for (int cnt = 0; cnt < 2; cnt++) { if (cnt == 1) rayDir = rayDir.negate(); AcDbRay ray; ray.setBasePoint(testPoint); ray.setUnitDir(rayDir); AcGePoint3dArray IntersectionPoints; es = pCurve->intersectWith(&ray,AcDb::kOnBothOperands,IntersectionPoints); if(es == Acad::eOk) { int numberOfInters = 0; numberOfInters = IntersectionPoints.length(); for(int i=0; i < numberOfInters; ++i) { AcGePoint3d pt = IntersectionPoints[i]; AcDbCircle *marker = new AcDbCircle(pt,AcGeVector3d::kZAxis,0.2); AcCmColor color; color.setColor(2); marker->setColor(color); _markers.append(marker); pTransientManager->addTransient(marker,kAcGiDirectShortTerm,0,viewportNumbers); acutPrintf(ACRX_T("\n Point : %lf %lf"),pt.x,pt.y); } } } } pTM->endTransaction(); }
文章评论