天气与日历 切换到窄版

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

ARX实例代码 -- 重建填充的边界

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    //-----------------------------------------------------------------------------
    // This is command 'RESTOREHATCHBOUNDARY, by Bill Zhang [2003-2-20], DevTech, Autodesk
    void BzhRestoreHatchBoundary()
    {
    // TODO: Implement the command
    // create a resbuf which is filled with filter conditions.
      struct resbuf *filter = acutBuildList(RTDXF0, _T("HATCH"), RTNONE);
      ads_name ss;
      // ask users to select hatch entities.
      int res = acedSSGet(NULL, NULL, NULL, filter, ss);
      // release filter resbuf.
      acutRelRb (filter);
      if( res != RTNORM )
      {
       acutPrintf(_T("\nNo hatch entities selected!"));
       return;
      }


      long length=0l;
      acedSSLength (ss, &length);
      for(long indexSS=0l; indexSS<length; indexSS++)
      {
    ads_name eName;
    res = acedSSName(ss, indexSS, eName);
        if( res != RTNORM )
      continue;


    AcDbObjectId id;
    acdbGetObjectId(id, eName );
    AcDbHatch*pHatch=NULL;  
    acdbOpenObject(pHatch, id, AcDb::kForRead );
    if( pHatch == NULL )
            continue;


    // For each loop, draw the boundary.
    int nLoops = pHatch->numLoops();
    for( int i=0;i<nLoops; i++ )
    {
      long loopType;
      if( pHatch->loopTypeAt( i ) & AcDbHatch::kPolyline )
      {        
       AcGePoint2dArray vertices;
       AcGeDoubleArray bulges;
       pHatch->getLoopAt( i, loopType, vertices, bulges );   
       int nVertices = vertices.length();
       AcDbPolyline *pPoly = new AcDbPolyline(nVertices);
       for( int vx=0;vx<nVertices;vx++ )
       {
        double bulge = bulges.length() < nVertices ? 0.0: bulges[vx];
        pPoly->addVertexAt( vx, vertices[vx], bulge );
       }  
       // append it to the current space of AutoCAD database
       pPoly->setColorIndex(1);
       addAEntToTheCurrentSpaceAndClose(pPoly);
      }     
      else
      {        
       AcGePoint2dArray vertices;
       AcGeDoubleArray bulges;
       AcGeVoidPointerArray edgePtrs;
       AcGeIntArray edgeTypes;
       pHatch->getLoopAt(i, loopType,edgePtrs, edgeTypes );
       for(int j=0; j<edgePtrs.length(); j++)
       {
        switch (edgeTypes[j]){
        case AcDbHatch::kLine:
         {
          AcGeLineSeg3d *pGeLine3d = (AcGeLineSeg3d*)edgePtrs[j];
          AcGePoint3d geP1, geP2;
          geP1 = pGeLine3d->startPoint();
          geP2 = pGeLine3d->endPoint();
          AcDbLine *pLine = new AcDbLine(geP1, geP2);
          pLine->setColorIndex(1);
          addAEntToTheCurrentSpaceAndClose(pLine);
         }
         break;
        case AcDbHatch::kCirArc:
         {
          AcGePoint3d geCenter;
          double dRadius, dStartAng, dEndAng;
          AcGeCircArc3d *pGeArc = (AcGeCircArc3d*)edgePtrs[j];
          geCenter = pGeArc->center();
          dRadius = pGeArc->radius();
          dStartAng = pGeArc->startAng();
          dEndAng = pGeArc->endAng();
          double dAngDiff;
          dAngDiff = fabs( dEndAng - dStartAng - atan(double(1))*8 );
          if( dAngDiff > 1e-5 ) // It's an ARC.
          {
           AcDbArc *pArc = new AcDbArc(geCenter, dRadius, dStartAng, dEndAng);
           pArc->setColorIndex(1);
           addAEntToTheCurrentSpaceAndClose(pArc);
          }
          else // It's a circle.
          {
           AcGeVector3d geNorm = pGeArc->normal();
           AcDbCircle *pCir = new AcDbCircle(geCenter, geNorm, dRadius);
           pCir->setColorIndex(1);
           addAEntToTheCurrentSpaceAndClose(pCir);
          }
         }
         break;
        case AcDbHatch::kEllArc:
         {
          AcGePoint3d geCenter;
          AcGeVector3d geNorm,dMajorAxis, dMinorAxis;
          double dMajorRadius, dMinorRadius;
          double dStartAng, dEndAng;
          AcGeEllipArc3d *pGeEllip = (AcGeEllipArc3d*)edgePtrs[j];
          geCenter = pGeEllip->center();
          dStartAng = pGeEllip->startAng();
          dEndAng = pGeEllip->endAng();
          geNorm = pGeEllip->normal();
          dMajorAxis = pGeEllip->majorAxis();
          dMinorAxis = pGeEllip->minorAxis();
          dMajorRadius = pGeEllip->majorRadius();
          dMinorRadius = pGeEllip->minorRadius();
          AcDbEllipse *pEllip = new AcDbEllipse();
          // Note: radiusRatio = dMinorRadius/dMajorRadius (must be within [0, 1])
          pEllip->set(geCenter,geNorm,dMajorAxis*dMajorRadius,dMinorRadius/dMajorRadius);
          pEllip->setStartParam(dStartAng);
          pEllip->setEndParam(dEndAng);
          if( pEllip->isNull() == Adesk::kTrue)
          {
           acutPrintf(_T("\nFailed to create an ellipse."));
           break;
          }
          else
          {
           pEllip->setColorIndex(1);
           addAEntToTheCurrentSpaceAndClose(pEllip);
          }
         }
         break;
        case AcDbHatch::kSpline:
         {
          Adesk::Boolean bIsFixSpline;
          AcGePoint3dArray fitPoints;
          AcGeTol fitTol;
          Adesk::Boolean bTangent**ist;
          AcGeVector3d startTangent, endTangent;
          int deg;
          AcGeNurbCurve3d  *pGeSpline=(AcGeNurbCurve3d *)edgePtrs[j];
          assert(pGeSpline);
          deg = pGeSpline->degree();
          bIsFixSpline = pGeSpline->getFitData(fitPoints,
                   fitTol,
                   bTangent**ist,
                   startTangent,
                   endTangent);
          if( bIsFixSpline == Adesk::kTrue )
          {
           AcDbSpline *pSpline=new AcDbSpline();
           pSpline->setFitData(fitPoints,
                deg,
                fitTol.equalVector(),
                startTangent,
                endTangent);
           if( pSpline->isNull() == Adesk::kTrue)
           {
            acutPrintf(_T("\nFailed to create a spline."));
            break;
           }
           else
           {
            pSpline->setColorIndex(1);
            addAEntToTheCurrentSpaceAndClose(pSpline);
           }
          }
          else
          {
           Adesk::Boolean rational,closed,periodic;
           AcGePoint3dArray gePoints;
           AcGeDoubleArray geWeights;
           AcGePoint3d gePoint;
           AcGeKnotVector geKnots;
           AcGeDoubleArray dKnots;


           rational = pGeSpline->isRational();
           closed = pGeSpline->isClosed();
           periodic = Adesk::kFalse;
           for(int k=0; k<pGeSpline->numControlPoints(); k++)
           {
            gePoints.append(pGeSpline->controlPointAt(k));
           }
           for(int k=0; k<pGeSpline->numWeights(); k++)
           {
            geWeights.append(pGeSpline->weightAt(k));
           }
           geKnots = pGeSpline->knots();      
           for(int k=0; k<geKnots.length(); k++)
           {
            dKnots.append(geKnots[k]);
           }


           AcDbSpline *pSpline=new AcDbSpline(deg,
               rational,
               closed,
               periodic,
               gePoints,
               dKnots,
               geWeights);
           if( pSpline->isNull() == Adesk::kTrue)
           {
            acutPrintf(_T("\nFailed to create a spline."));
            break;
           }
           else
           {
            pSpline->setColorIndex(1);
            addAEntToTheCurrentSpaceAndClose(pSpline);
           }
          }
         }
         break;
        default:
         break;
        }
       }
      }
    }
    pHatch->close();
    }


      // free up the selection set
      acedSSFree (ss);
    }

     

     

     

     

    ARX实例代码 -- 重建填充的边界
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-7-1 05:54 , Processed in 0.059978 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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