- UID
- 5043
- 积分
- 1347
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-5-13
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
AcDbSpatialFilter 类设计用来做这个的,在AutoCAD重新生成图形(REGEN)的时候,通过 spatial filter 来决定要处理哪些对象。
下面代码是个简单的演示,注意:命令需要用 ACRX_CMD_NOINTERNALLOCK 选项 定义。
[it618postdisplay>0]
ACED_ARXCOMMAND_ENTRY_AUTO(CMyTestApp,
MyTestApp,
_MyClip, MyClip,
ACRX_CMD_TRANSPARENT |
ACRX_CMD_NOINTERNALLOCK,
NULL)
[/it618postdisplay]
 - static void MyTestApp_MyClip()
- {
- ads_point pt1,pt2;
- ads_name ent;
- if (acedEntSel(_T("Select xref:"),ent,pt1)!=RTNORM)
- return;
- AcDbObjectId idXref;
- if (acdbGetObjectId(idXref,ent)!=Acad::eOk)
- return;
- AcDbObjectPointer<AcDbBlockReference> pRef(idXref,AcDb::kForRead);
- if (pRef.openStatus()!=Acad::eOk)
- {
- acutPrintf(_T("Not an xref!\n"));
- return;
- }
- AcGePoint2dArray pts;
- if (acedGetPoint(NULL,_T("First point:"),pt1)!=RTNORM)
- return;
- //the ECS of the vertices must be defined in the
- //coordinate system of the _block_ so let's calculate
- //transform all points to that coordinate system
- AcGeMatrix3d mat(pRef->blockTransform());
- mat.invert();
- AcGePoint3d pt3d(asPnt3d(pt1));
- pt3d.transformBy(mat);
- pts.append(AcGePoint2d(pt3d.x,pt3d.y));
- while (acedGetPoint(pt1,_T("Next point:"),pt2)==RTNORM)
- {
- acedGrDraw(pt1,pt2,1,1);
- pt3d = asPnt3d(pt2);
- pt3d.transformBy(mat);
- pts.append(AcGePoint2d(pt3d.x,pt3d.y));
- memcpy(pt1,pt2,sizeof(ads_point));
- }
- acedRedraw(NULL,0);
- AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
- AcGeVector3d normal;
- double elev;
- if (pDb->tilemode())
- {
- normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());
- elev = pDb->elevation();
- }
- else
- {
- normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());
- elev = pDb->pelevation();
- }
- normal.normalize();
- Acad::ErrorStatus es = pRef.object()->upgradeOpen();
- if (es !=Acad::eOk)
- return;
- //create the filter
- AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;
- if (pFilter->setDefinition(pts,normal,elev,
- ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH,true)!=Acad::eOk)
- {
- delete pFilter;
- return;
- }
- //add it to the extension dictionary of the block reference
- //the AcDbIndexFilterManger class provides convenient utility functions
- if (AcDbIndexFilterManager::addFilter(pRef.object(),pFilter)!=Acad::eOk)
- delete pFilter;
- else
- {
- acutPrintf(_T("Filter has been succesfully added!\n"));
- pFilter->close();
- }
- }
|
|