设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 217|回复: 0

Object Arx 过滤器使用例子,计算选择的曲线面积和周长

[复制链接]
  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

    发表于 2021-1-26 19:08 | 显示全部楼层 |阅读模式
    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);
    }
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

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

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛