明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3112|回复: 7

请教各位大神,如何用intersectWith函数,求一条直线与所有实体的交点。

[复制链接]
发表于 2015-8-16 10:01:47 | 显示全部楼层 |阅读模式
这是小弟代码,新手很多不懂!
我想画一个矩形,然后求出这个矩形与所有实体的交点,求出交点个数。
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();
}
}

发表于 2015-8-16 11:15:41 | 显示全部楼层
印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧
 楼主| 发表于 2015-8-16 14:41:32 | 显示全部楼层
llsheng_73 发表于 2015-8-16 11:15
印象中只能用这条直线与别的对象一个个分别求。。。vla方法本人很少用,但道理应该是一样的吧

一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种方法不行!
发表于 2015-8-16 15:13:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-8-16 15:14 编辑
荆樵_435 发表于 2015-8-16 14:41
一个对象一个对象的求是可以的!但是我现在想让它跟所有的实体都求一下,看看有没有交点!
是不是我的这种 ...


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

循环的话,要怎么样做啊?
发表于 2015-8-16 18:28:49 | 显示全部楼层
IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法
发表于 2015-8-17 08:53:45 | 显示全部楼层
用acedssget “F” 模式获得选择集,然后用acedSSNameX 来获取交点即可!详细用法可查阅acedssget和acedSSNameX函数帮助说明!
发表于 2019-11-13 14:08:20 | 显示全部楼层
Real_King 发表于 2015-8-16 18:28
IW有时或出错,最好用try{getpamarat}catch{}验证过滤下结果,.NET第二版也给出了替代算法

您好,您提到的那个代替算法大概在哪个章节提到过啊?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:38 , Processed in 0.166428 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表