荆樵_435 发表于 2015-8-16 10:01:47

请教各位大神,如何用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();
}
}

llsheng_73 发表于 2015-8-16 11:15:41

印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧

荆樵_435 发表于 2015-8-16 14:41:32

llsheng_73 发表于 2015-8-16 11:15 static/image/common/back.gif
印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧

一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种方法不行!

llsheng_73 发表于 2015-8-16 15:13:43

本帖最后由 llsheng_73 于 2015-8-16 15:14 编辑

荆樵_435 发表于 2015-8-16 14:41 http://bbs.mjtd.com/static/image/common/back.gif
一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种 ...

  一次性通过这个方法求出一个对象与多个对象的交点,理论上是行不通的。
  当然如果非要这样,也许也可变通一下,把那些对象全部转成一个块,然后只需要求直线与该块的交点。但这样做的一个问题是:做块所花的代价及后续恢复(当然可以直接删除,这点不考虑也行)和直接循环求交点能否在时间上以及代码方面占优?

荆樵_435 发表于 2015-8-16 15:48:08

llsheng_73 发表于 2015-8-16 15:13 static/image/common/back.gif
  一次性通过这个方法求出一个对象与多个对象的交点,理论上是行不通的。
  当然如果非要这样,也 ...

循环的话,要怎么样做啊?

Real_King 发表于 2015-8-16 18:28:49

IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法

Gu_xl 发表于 2015-8-17 08:53:45

用acedssget “F” 模式获得选择集,然后用acedSSNameX 来获取交点即可!详细用法可查阅acedssget和acedSSNameX函数帮助说明!

bubeilaoren 发表于 2019-11-13 14:08:20

Real_King 发表于 2015-8-16 18:28
IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法

您好,您提到的那个代替算法大概在哪个章节提到过啊?谢谢
页: [1]
查看完整版本: 请教各位大神,如何用intersectWith函数,求一条直线与所有实体的交点。