天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 121|回复: 0

ARX 选择集过滤使用例子

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
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);  
}

 

 

 

 

ARX 选择集过滤使用例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:46 , Processed in 0.133906 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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