请教各位大神,如何用intersectWith函数,求一条直线与所有实体的交点。
这是小弟代码,新手很多不懂!我想画一个矩形,然后求出这个矩形与所有实体的交点,求出交点个数。
void cj1()//矩形与选择集
{
ads_point pt2,pt3;
acedGetPoint(NULL,_T("请输入第一个点"),pt2);
acedGetCorner(pt2,_T("请输入第二个点"),pt3);//获得第二个角点
AcGePoint3d pt4 = asPnt3d(pt2);
AcGePoint3d pt5 = asPnt3d(pt3);
AcGePoint3d pt6,pt7;
pt6.x=pt5.x;
pt7.x=pt4.x;
pt6.y=pt4.y;
pt7.y=pt5.y;
AcGePoint3dArray points;
points.append(pt4);
points.append(pt6);
points.append(pt5);
points.append(pt7);
points.append(pt4);
AcDbObjectId entId1=CreateEnt::Create3dPolyline(points);
ads_name ent1;
acdbGetObjectId(entId1, ent1);
AcDbEntity *pEnt1 = NULL;
acdbOpenObject(pEnt1, entId1, AcDb::kForWrite);
ads_name ss;
AcDbObjectIdArray objIds;
acedSSGet(_T("A"),NULL,NULL,NULL,ss);
long Length=0;
acedSSLength(ss,&Length);
if (Length==0)
{
return ;
}
ads_name ent;
AcDbEntity* pEnt = NULL;
AcDbObjectId objId;
for(int i=0;i<Length;i++)
{
AcDbCurve* pLinePre = NULL;
acedSSName(ss, 0, ent);
acdbGetObjectId(objId, ent);
objIds.append(objId);
pLinePre = AcDbCurve::cast(pEnt);
if(Acad::eOk == acdbOpenObject(pLinePre, objId, AcDb::kForWrite))
{
AcGePoint3dArray ptArr;
pEnt1->intersectWith(pLinePre,AcDb::kOnBothOperands,ptArr);
pEnt->close();
}
int num=points.length();
acedSSFree(ss);
acutPrintf(L"\n交点数量为%d",num);
pEnt1->close();
}
}
印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧 llsheng_73 发表于 2015-8-16 11:15 static/image/common/back.gif
印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧
一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种方法不行! 本帖最后由 llsheng_73 于 2015-8-16 15:14 编辑
荆樵_435 发表于 2015-8-16 14:41 http://bbs.mjtd.com/static/image/common/back.gif
一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种 ...
一次性通过这个方法求出一个对象与多个对象的交点,理论上是行不通的。
当然如果非要这样,也许也可变通一下,把那些对象全部转成一个块,然后只需要求直线与该块的交点。但这样做的一个问题是:做块所花的代价及后续恢复(当然可以直接删除,这点不考虑也行)和直接循环求交点能否在时间上以及代码方面占优? llsheng_73 发表于 2015-8-16 15:13 static/image/common/back.gif
一次性通过这个方法求出一个对象与多个对象的交点,理论上是行不通的。
当然如果非要这样,也 ...
循环的话,要怎么样做啊? IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法 用acedssget “F” 模式获得选择集,然后用acedSSNameX 来获取交点即可!详细用法可查阅acedssget和acedSSNameX函数帮助说明! Real_King 发表于 2015-8-16 18:28
IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法
您好,您提到的那个代替算法大概在哪个章节提到过啊?谢谢
页:
[1]