明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2179|回复: 7

谁能帮我!如何求得与一条线相交的实体?

[复制链接]
发表于 2003-5-14 17:29 | 显示全部楼层 |阅读模式
如何求得与一条线相交的实体?
为何通过实体对象的explode()函数不能实现explode命令?
为何通过实体对象的intersectwith()函数不能得到交点?
发表于 2003-5-15 09:48 | 显示全部楼层

你这样的提问方式不好

至少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数组,若为空,遍历到的实体与直线不相交,否则,相交。
 楼主| 发表于 2003-5-15 20:33 | 显示全部楼层

多谢版主!AcDbEntity ->erase()只能给数据库对象标记删除标志

多谢版主!
AcDbEntity ->erase()只能给数据库对象标记删除标志
AcDbObject ->erased()才删除数据库对象,
我如何把两者结合起来或如何才能真正删除数据库对象?
还有一问需大侠帮忙,怎样才能通过自创的控件调用自己注册的CAD命令
如 OnClick(){调用CAD命令}
 楼主| 发表于 2003-5-15 20:46 | 显示全部楼层

选择集是否把不显示的数据库物体也加入选择集

选择集是否把不显示的数据库物体也加入选择集
如果需要把不显示的数据库对象不加入选择集,该如何做
我用acedSSGet(NULL,pt,NULL,...)选择过一点的所有直线
pt是一条直线的端点,我是通过选择此直线得到端点,再用此端点出求过一点的所有直线,结果只得到了我原来所选的那条线
请问是何原因?
发表于 2003-5-20 16:06 | 显示全部楼层

erase()函数的问题及其它

本帖最后由 leeyeafu 于 2003-5-20 16:06:14 编辑

我不知道你想要删除数据库本身还是数据库内的某个对象。以下针对删除数据库内的对象进行讨论。
是的,AcDbEntity ->erase()只能给数据库对象标记删除标志。甚至对象都不会从内存中删除。这是为了删除后的UNDO操作方便而设计的操作。不过当数据库保存为DXF或者DWG文件时,这些的删除标志的对象不被保存,当你再次打开图形时,这些对象将不复存在。
AcDbObject::erased()函数在ARX中只是一个虚函数,你若使用了从AcDbObject类派生新类,你可以重载该函数。否则该函数仅仅只是返回一个正常值,并不做任何事。换句话说,调用AcDbObject::erased()函数不仅不会将对象从数据库中删除,实际上,它什么也不干。当然,在你的派生类中,可以重载该函数,使它做任何工作,包括从数据库中清除对象。
控件中调用ACAD命令的方法如下:
由于ObjectARX应用程序与AutoCAD及其它程序使用共享的MFC库,在MFC应用程序对话框命令句柄调用AutoCAD API函数或执行AutoCAD命令时,应该在调用前将资源设置为AutoCAD,调用返回后再恢复应用程序资源。Objectarx\utils\mfcextras\afxmfcdll.cpp文件中声明了一个C++类CTemporaryResourceOverride,使用该类可以使资源管理变得简单。在该类的一个对象实例建立时,可将系统资源设置为对象的应用资源,而对象的析构函数自动将资源设置回系统资源。假设CMyDialog从CDialog类中派生,其“OK”按钮的代码可以类似以下代码:
void CMyDialog::OnOK()
{
  HINSTANCE hInstNew;
  HInstNew=acedGetAcadResourceInstance(); //获取AutoCAD的资源句柄
  CTemporaryResourceOverride *TempResource; //定义一个临时资源对象
  TempResource=new CTemporaryResourceOverride(hInstNew); /*为TempResource对象分配内存并初始化*/
  ……  //在这添加代码,调用AutoCAD API函数或执行AutoCAD命令
  Delete TempResouce; //删除TempResource对象,调用其析构函数
  CDialog::OnOK();   //调用默认的CDialog::OnOK()函数
}
下面问题的回答:
acedSSGet(NULL,pt,NULL,...)只能将一个对象加入到选择集中。
 楼主| 发表于 2003-5-22 10:24 | 显示全部楼层

谢谢版主leeyeafu,多谢您的帮助!

谢谢版主leeyeafu,多谢您的帮助!您能给我一个删除数据库中实体的例子
那就太好了!
 楼主| 发表于 2003-6-2 20:34 | 显示全部楼层

谢过版主leeyeafu

谢过版主leeyeafu 您所写的CTemporaryResourceOverride *TempResource不知要加什么头文件,因为报定义出错
发表于 2003-6-3 08:10 | 显示全部楼层

ObjectArx\samples\curvetext\curvetext_ui\resourcehelper.h有这个类的定义

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 19:57 , Processed in 0.172938 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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