找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1216|回复: 8

[ARX程序]:求:取得指定层上所有圆的圆心坐标更佳办法!!

[复制链接]
发表于 2004-6-28 17:19:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
//===========遍历指定层上的所有圆,并取得圆心坐标==========
void getCircCenter()
{

AcGePoint3dArray  arrCenter; //存放圆心坐标的数组变量

AcDbDatabase *pDb;
pDb = acdbHostApplicationServices->workingDatabase();  //取得当前数据库指针

        AcDbBlockTable *pBlockTable;
        pDb->getSymbolTable(pBlockTable, AcDb::kForRead);//获得块表指针
       
        AcDbBlockTableRecord *pBlockTableRecord;
        pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForRead); //打开块表记录为可读
        pBlockTable->close();
       
        AcDbBlockTableRecordIterator *pIterator;
        pBlockTableRecord->newIterator( pIterator);//新建块表记录遍历器
       
        for( ; !pIterator->done(); pIterator->step())                //遍历开始
        {
               
                AcDbEntity *pEnt;
                AcDbCircle *pCirc;
               
                pIterator->getEntity(pEnt,AcDb::kForRead);
               
                char *tmp;
                int k;
               
                tmp = pEnt->layer();
                k= stricmp(tmp, LayerName); // you ought to use stricmp(), instead of strcmp()
                acutDelString(tmp); // to see also at last, pls
                       
                if(k==0 && pEnt->isKindOf( AcDbCircle::desc())) //过滤为指定层并是圆的实体
                {
                        pCirc = AcDbCircle::cast(pEnt);
                        if((pCirc->radius()) == Radius)
                        {
                                arrCenter.append(pCirc->center());        //追加圆心到AcGePoint3dArray指针变量
                        }
                }
                pEnt->close();
                pCirc->close();
        }
       
        delete pIterator;
}

由于这个程序要遍历块表记录的全部实体,实不为明智之举,如果碰到数据库非常庞大的, 速度一定很慢,还有可能死掉!!

不知有没有直接遍历指定层上所有块表记录的方法呢???
而躲开遍历数据库全部块表记录咯!!!

望大虾们指点指点...
如果没有, 本程序那里应该更优化一下呢???请指正!修改!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-6-28 19:27:57 | 显示全部楼层

Re: [ARX程序]:求:取得指定层上所有圆的圆心坐标更佳办法!!

最初由 Corilla 发布
[B]//===========遍历指定层上的所有圆,并取得圆心坐标==========
void getCircCenter()
{

AcGePoint3dArray  nCircCenter; //存放圆心坐标的数组变量

AcDbDatabase *pDb;
pDb = acdbHostApplicationServices-... [/B]


1、首先,纠正个概念,遍历整个数据库,很快的,是否慢看你遍历同时要做什么操作,象求圆心这样的查询的,不费时间的。

2、如果你需要指定层,可以先用acedSSGet 获得指定层上的实体,得到后,遍历这个选择集就可以了。其实,acedSSGet 的操作和你自己写的遍历是一样的,它也要遍历数据库,判断,除非是获得屏幕内显示的实体,ssget要比我们自己写的遍历代码快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-28 20:05:16 | 显示全部楼层
XDSoft 管理员说的一番让我受益非浅,我后来也亲自问人家要了一个好大的数据库试了一下,确是很快,没有感觉出什么延时!

我是一个新手,acedSSGet现我还不会用,让我去进修一下,再把程序改过来!

如下我改动了一下的代码,我把后半段改为:
//把两指针变量提出到循环外面,避免多次声明和关闭,由于我对其内部运作并不是很明白,不过我已经证实,程序可以通过!!!
如果int n = arrCenter.length(),这一改应已经少了差不多是4(n-1)次的操作了, 算是一点优化吧!

AcDbEntity *pEnt;
AcDbCircle *pCirc;

for( ; !pIterator->done(); pIterator->step()) //遍历开始
{

pIterator->getEntity(pEnt,AcDb::kForRead);

if( !strcmp(pEnt->Layer(), LayerName) && pEnt->isKindOf( AcDbCircle::desc())) //过滤为指定层并是圆的实体
{
pCirc = AcDbCircle::cast(pEnt);
if((pCirc->radius()) == Radius)
{
arrCenter.append(pCirc->center()); //追加圆心到AcGePoint3dArray指针变量
}
}

}
pEnt->close();
pCirc->close();

delete pIterator;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-29 13:59:31 | 显示全部楼层
acedSSGet的內部機制我不知道,但經驗告訴我,他比邊歷數據庫要快很多.
我認為邊歷數據庫很多時間化在打開關閉實體上了,而acedSSGet通過過濾機制應該不需要,
個人感覺.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-29 18:03:07 | 显示全部楼层
楼上的前辈你好,我想向你请教一下问题:
前提输入了一个圆的半径(如400)

我想用鼠标框选出一个矩形,在这个矩形内的所有的半径为400的圆实体都被过滤出来,

用你说的这个acedSSGet()函数,应该怎么做呢???
你能不能写出这个操作的那些关键代码贴上来咯?

因为我并不清楚这个acedSSGet()是怎么用的, 里面有很多可选参数咯!!!

先谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-2 17:31:08 | 显示全部楼层
最省事的办法是先用ads_ssget获取指定层上的带有指定特性的实体选择集,然后直接遍历次选择集并提取中心点即可。其中,那些过滤条件可在ads_ssget的第三个参数中直接设置。具体使用示例就不说了,见ARX帮助,有详细实例.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-4 00:25:10 | 显示全部楼层
to Corilla  ( 5楼楼主):
----------------------------------------------------------------------
ads_point   pt1;    // first corner
ads_point   pt2 ;   // second corner
ads_name  ss;     // selection set result---you wanted
struct resbuf   *filter;  //抱歉! 漏了 '*', 已更正[/COLOR]

........// get pt1, pt2
filter = acutBuildList(RTDXF0, "CIRCLE", -4, "="[/COLOR],  40, 400.0, 0);
acedSSGet("W"[/COLOR], pt1, pt2, filter, ss);   // "W" for Window selecting,  "C" for Cross selecting[/COLOR]
acutRelRb(filter);

......
acedSSFree(ss);  // at last, you must have to call this function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-7-5 11:24:10 | 显示全部楼层
在这里再次感谢各位楼主及ishou前辈对小弟的帮助,同时我也在别人的一个帖上看了你对小弟建议,
我一定会努力去学一下C语言的!
你的良言,是我的动力!

在这里我不有一点不是很明:
strcmp()  和 stricmp() 这两个函数到底有什么样的区别呢???
由于我的英文水平实在是差劲, 看了VC的帮助也没有看出什么所以然,只知大概是字符串的比较,唉,还望前辈讲解一下呢.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-5 22:54:05 | 显示全部楼层
strcmp和lstrcmp为区分字母大小写的字符串比较函数
strcmpi和lstrcmpi为不区分字母大小写的字符串比较函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 22:10 , Processed in 0.194732 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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