|
发表于 2003-5-15 09:48:00
|
显示全部楼层
至少intersectWith()函数是用于返回交点的,我猜想你的问题可能出在该函数的使用方法上。
先回答你的explode()函数问题。
首先,函数调用方式。假设要explode的对象声明为:
AcDbEntity *pEnt; //AcDbEntity也可以是其任何派生类
explode()函数调用:
AcDbVoidPtrArray *pArr; //先声明一个数组,用于存放返回实体
pEnt->explode(pArr);
这样指针pArr指向的内存地址的内容就是explode后的各实体。至于如何使用它,请你先看看ARX帮助中的AcDbVoidPtrArray模板类,有问题再发帖。
从以上看到,调用explode()函数后,ARX仅仅返回一个数组,要实现ACAD的explode功能,应该做这三个工作:
1、调用explode()函数;
2、删除原对象;
3、遍历返回数组,将各个实体添加到AcDb数据库中。
再说说interWith()函数。
通常,在2D环境下使用该函数用这个版本:
virtual Acad:ErrorStatus AcDbEntity::intersectWith(
const AcDbEntity* ent,AcDb::intersect intType,
AcGePoint3dArray &points,....) const;
在后面还有两个参数,用于自定义类的交点计算。没有自定义实体类时,可忽略。
AcDbEntity *pEnt1,*pEnt2;
AcGePoint3dArray *pts;
pEnt2->intersectWith(pEnt2,kOnBothOperands,pts);
这样调用intersectWith()函数,在pts指针指向的地址中返回指针pEnt1指向的实体与pEnt2指向的实体的交点。中间那个参数表示不返回虚交点。关于这个参数的使用,我好象发过帖子,你可以在本站搜搜看。
你说的要获取所有与某条直线相交的实体,可以这样:
1、获取该直线的指针
2、遍历当前图形数据库,针对各个实体,调用其intersectWith()函数。或者也可以调用上一步的直线对象的intersectWith()函数,只是该函数的第一参数改变。
3、检查返回的AcGePoint3dArray数组,若为空,遍历到的实体与直线不相交,否则,相交。 |
|