admin 发表于 2024-3-14 20:07:41

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

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);
}
页: [1]
查看完整版本: [每日一码] ARX 选择集过滤使用例子