找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1615|回复: 5

[每日一码] ARX 选择集过滤使用例子

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-10-27 13:25:00 | 显示全部楼层 |阅读模式

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

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

×
static AcDbObjectId LoadEntity(AcDbEntity* entity)  
{  
        AcDbBlockTable* pBlockTable;  
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);  


        AcDbBlockTableRecord* pBlockTableRecord;  
        pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);  




        AcDbObjectId Id;  
        pBlockTableRecord->appendAcDbEntity(Id,entity);  
        pBlockTable->close();  


        pBlockTableRecord->close();  
        entity->close();  
        return Id;  
}  


////是否是自由模式,返回样本实体所在的层(非自由选择模式)  
static bool IsFreeMode(CString& strLayer)  
{  
        ////样本  
        ads_name sName;  
        ads_point sPt;  


        acedInitGet(RSG_NONULL,_T("F"));  
        int ret = acedEntSel(_T("\n选择样本曲线[自由选择(F)]<回车自由选择>:"),sName,sPt);  
        bool isFree = false;////是否自由选择  

        acutPrintf(_T("ret is %d\n"),ret);  


        ////只要没选实体,都是自由模式  
        if(ret == RTKWORD || ret == RTERROR)  
        {  
                /*CString kword ; 
                acedGetInput(kword.GetBuffer(1)); 
                kword.ReleaseBuffer(); 
                if(kword.CompareNoCase(_T("F")) == 0) 
                { 
                isFree = true; 
                }*/  
                isFree = true;  
        }  
        else if(ret == RTNORM)  
        {  
                isFree = false;  
                AcDbObjectId entId;  
                if(Acad::eOk != acdbGetObjectId(entId,sName))  
                {  
                        acutPrintf(_T("\n获取样本实体ID失败"));  
                        return isFree;  
                }  


                AcDbEntity* pEnt;  
                if(Acad::eOk != acdbOpenObject(pEnt,entId,AcDb::OpenMode::kForRead))  
                {  
                        acutPrintf(_T("\n打开样本实体失败"));  
                        return isFree;  
                }  

                ////获取层名称  
                strLayer = pEnt->layer();  


                pEnt->close();  
        }  
        return isFree;  
}  


static void GetAreaLen(double& sumLen,double& sumArea,long& lineNum,const int& mode)  
{  
        CString strMode ;  


        bool isFree = false;  
        CString strLayer;  
        isFree = IsFreeMode(strLayer);  


        ads_name ssName;  
        resbuf* strFilter = NULL;  
        ////根据选择的模式构造过滤器字符串  
        if(isFree)  
        {  
                acutPrintf(_T("\n您选择了自由模式\n"));  
                strFilter = acutBuildList(-4,_T("<or"),  
                        RTDXF0,_T("LINE"),//直线  
                        RTDXF0,_T("ARC"),//圆弧  
                        RTDXF0,_T("LWPOLYLINE"),//轻量多段线  
                        RTDXF0,_T("POLYLINE"),//二维多段线  
                        RTDXF0,_T("SPLINE"),//样条曲线  
                        RTDXF0,_T("CIRCLE"),////圆  
                        RTDXF0,_T("ELLIPSE"),////圆  
                        -4,_T("or>"),RTNONE);  
        }  
        ////加上样本曲线所在的层进行过滤  
        else  
        {  
                acutPrintf(_T("\n您选择了样本模式"));  
                acutPrintf(_T("\n根据图层%s进行过滤。"),strLayer);  


                strFilter = acutBuildList(-4,_T("<and"),  
                        -4,_T("<or"),  
                        RTDXF0,_T("LINE"),//直线  
                        RTDXF0,_T("ARC"),//圆弧  
                        RTDXF0,_T("LWPOLYLINE"),//轻量多段线  
                        RTDXF0,_T("POLYLINE"),//二维多段线  
                        RTDXF0,_T("SPLINE"),//样条曲线  
                        RTDXF0,_T("CIRCLE"),////圆  
                        RTDXF0,_T("ELLIPSE"),////圆  
                        -4,_T("or>"),  
                        8,strLayer,////样本所在的层名称  
                        -4,_T("and>"),  
                        RTNONE);  
        }  

        if(mode == 1)////计算长度  
        {  
                acutPrintf(_T("\n选择要计算长度的曲线:"));  
        }  
        else  
        {  
                acutPrintf(_T("\n选择要计算面积的曲线:"));  
        }  


        ////根据过滤条件选择实体  
        if(acedSSGet(NULL,NULL,NULL,strFilter,ssName) != RTNORM)  
        {  
                acutPrintf(_T("\n未找到符合条件的实体"));  
                return;  
        }  


        long len;  
        acedSSLength(ssName,&len);  
        lineNum = len;////赋值实体数量  


        AcDbEntity* pEnt = NULL;  
        AcDbCurve*  pCur = NULL;  

        ads_name en;////每个实体名称  


        double param = 0.0;  
        double dist = 0.0;//长度  
        double area = 0.0;//面积  


        for(int i = 0;i < len; i++)  
        {  

                if(acedSSName(ssName,i,en) != RTNORM)  
                {  
                        acutPrintf(_T("\n获取第%d个实体名称出错"),i);  
                        acutRelRb(strFilter);  
                        acedSSFree(ssName);  
                        return;  
                }  
                AcDbObjectId enId;  
                if(Acad::eOk != acdbGetObjectId(enId,en))  
                {  
                        acutPrintf(_T("\n获取第%d个实体ID出错"),i);  
                        acutRelRb(strFilter);  
                        acedSSFree(ssName);  
                        return;  
                }  
                if(Acad::eOk != acdbOpenObject(pEnt,enId,AcDb::OpenMode::kForRead))  
                {  
                        acutPrintf(_T("\n获取第%d个实体ID出错"),i);  
                        acutRelRb(strFilter);  
                        acedSSFree(ssName);  
                        return;  
                }  
                if(!pEnt->isKindOf(AcDbCurve::desc()))  
                {  
                        acutPrintf(_T("\n发现了不是曲线类型的实体,程序退出"));  
                        pEnt->close();  
                        acutRelRb(strFilter);  
                        acedSSFree(ssName);  
                        return;  
                }  


                pCur = (AcDbCurve*)pEnt;  

                pCur->getEndParam(param);  
                pCur->getDistAtParam(param,dist);  


                pCur->getArea(area);  


                sumLen += dist;  
                sumArea += area;  


                acutPrintf(_T("\n第%d个曲线的长度是%.2f,面积是%.2f"),i,dist,area);  
                pCur->close();  
        }  


        acutRelRb(strFilter);  
        acedSSFree(ssName);  
}  


static void TESTsumarea()  
{  


        double len = 0.0;  
        double area = 0.0;  
        long lineN = 0;  
        GetAreaLen(len,area,lineN,0);  
        acutPrintf(_T("\n共选择:%ld个曲线,总面积:%.2f。"),lineN,area);  
}  


static void TESTsumlen()  
{  


        double len = 0.0;  
        double area = 0.0;  
        long lineN = 0;  
        GetAreaLen(len,area,lineN,0);  
        acutPrintf(_T("\n共选择:%ld个曲线,总长度:%.2f。"),lineN,len);  
}

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

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-11-3 22:56:43 | 显示全部楼层
还是写成lisp的过滤表比较方便,传给arx,

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-11-3 22:59:51 | 显示全部楼层

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-11-5 22:24:48 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-11-5 22:34:37 | 显示全部楼层

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

使用道具 举报

已领礼包: 2477个

财富等级: 金玉满堂

发表于 2016-11-6 13:36:45 | 显示全部楼层
学习!!!!!!!!!!!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:57 , Processed in 0.314239 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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