admin 发表于 2024-3-14 20:52:09

[每日一码] ARX常用代码总结

////将图形加载显示到CAD===================
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 void AddOrdinate(AcGePoint3d ptStart,AcGePoint3d ptEnd,
                                                CString text)
{
      AcDbOrdinateDimension* pDim = new   
                AcDbOrdinateDimension(true,ptStart,ptEnd,text);
      LoadEntity(pDim);
}

////画线====================
static void TESTlineCmd()
{
      //acutPrintf(采用T("\nHello"));

      ads采用point inputStart;
      ads采用point inputEnd;

      AcGePoint3d ptStart;
      AcGePoint3d ptEnd;
      ////用户输入要画的坐标
      if(acedGetPoint(NULL,采用T("start point"),inputStart) != RTNORM){
                return;
      }
      ptStart = inputStart;
      ptStart = inputStart;
      ptStart = inputStart;
      if(acedGetPoint(NULL,采用T("end point"),inputEnd) != RTNORM){
                return;
      }
      ptEnd = inputEnd;
      ptEnd = inputEnd;
      ptEnd = inputEnd;
      AcDbLine* pLine = new AcDbLine(ptStart,ptEnd);
      pLine->setColorIndex(2);
      LoadEntity(pLine);
      AddOrdinate(ptStart,ptEnd,采用T("hi"));
      //AfxMessageBox(采用T("命令画了一条线"));
}

////画圆形==========================
static void TESTcirclecmd(){
      ////垂直平面法向量
      AcGeVector3d vec(0,0,1);
      ////圆心
      AcGePoint3d ptCenter(100,100,100);
      AcDbCircle* pCircle = new AcDbCircle(ptCenter,vec,1000);
      LoadEntity(pCircle);
}

////画圆弧================================
static void TESTarccmd(){
      AcGeVector3d vec(0,0,1);
      AcGePoint3d ptCenter(500,500,500);
      AcDbArc* pArc = new AcDbArc(ptCenter,vec,700,0,90);
      LoadEntity(pArc);
}

////画多线段============================
static void TESTpolycmd(){
      ////构造多点数组
      AcGePoint2dArray points;
      AcGePoint2d pt1(1000, 1000);
      AcGePoint2d pt2(2000, 1800);
      AcGePoint2d pt3(500, 2000);
      AcGePoint2d pt4(3000, 5000);
      points.append(pt1);
      points.append(pt2);
      points.append(pt3);
      points.append(pt4);
      ////绘制多点线段
      AcDbPolyline* pl = new AcDbPolyline(points.length());
      for(int i = 0;i < points.length();i ++){

                pl->addVertexAt(i,points.at(i),0,0.5,0.5);
      }
      LoadEntity(pl);
}

////绘制POLY3d线段====================
static void TESTpoly3dcmd(){
      ////构造多点数组
      AcGePoint3dArray points;
      AcGePoint3d pt1(10, 10,10);
      AcGePoint3d pt2(20, 10,20);
      AcGePoint3d pt3(20, 20,30);
      points.append(pt1);
      points.append(pt2);
      points.append(pt3);
      ////绘制多点线段
      AcDb3dPolyline* pl = new AcDb3dPolyline(AcDb::Poly3dType::k3dSimplePoly,points);
      LoadEntity(pl);
}

////绘制椭圆=========================
static void TESTellipsecmd(){
      ////椭圆焦点
      /* AcGePoint2d p1(400,400);
      AcGePoint2d p2(800,400);*/

      ////中心点
      AcGePoint3d ptCenter(600,400,0);
      AcGeVector3d vecNormal(0,0,1);
      ////长轴
      AcGeVector3d majorAxis(1000,0,0);
      ////通过曲率确定短轴长度
      double ratio = 0.6;
      AcDbEllipse* ae = new AcDbEllipse(/*AcGePoint3d::kOrigin*/ptCenter,vecNormal,majorAxis,
                ratio);
      LoadEntity(ae);
}

////创建样条曲线================
static void TESTsplinecmd(){
      AcGePoint3d p1(0,0,0),p2(200,600,0),p3(1200,1600,0),
                p4(2000,2000,0);
      AcGePoint3dArray points;
      points.append(p1);
      points.append(p2);
      points.append(p3);
      points.append(p4);

      AcDbSpline* as = new AcDbSpline(points);
      LoadEntity(as);
}

////创建面域(把用直线创建的闭合图形,生成一个图形的对象)
static void TESTregioncmd(){
      ads采用name ss;
      ////提示用户选择对象
      int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);
      AcDbObjectIdArray ids;

      if(rt == RTNORM){
                long len;
                ////获得对象个数
                acedSSLength(ss,&len);
                for(int i = 0;i < len;i ++){
                        ////先从对象中得到名字
                        ads采用name ent;
                        acedSSName(ss,i,ent);

                        ////再从名字中取出ID
                        AcDbObjectId objId;
                        acdbGetObjectId(objId,ent);
                        ids.append(objId);
                }

      }
      acedSSFree(ss);
      ////得到objId数组之后,开始画区域
      CreateRegion(ids);
}

////绘制面域
static AcDbObjectIdArrayCreateRegion(AcDbObjectIdArray ids){
      AcDbObjectIdArray regionIds;
      AcDbVoidPtrArray curves;
      AcDbVoidPtrArray regions;
      AcDbEntity* pEnt;
      AcDbRegion* pRegion;

      for(int i = 0;i < ids.length();i ++){

                acdbOpenAcDbEntity(pEnt,ids.at(i),AcDb::kForRead);

                if(pEnt->isKindOf(AcDbCurve::desc())){

                        curves.append(static采用cast<void*>(pEnt));
                }
      }

      Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves,regions);
      if(es == Acad::eOk){

                for(int i = 0;i < regions.length();i ++){

                        pRegion = static采用cast<AcDbRegion*>(regions);
                        pRegion->setDatabaseDefaults();
                        AcDbObjectId regionId = LoadEntity(pRegion);
                        regionIds.append(regionId);
                }
                CString tipStr ;
                tipStr.Format(采用T("\n已成功创建面域:%d个"),regions.length());

                acutPrintf(tipStr);
      }
      else{
                for(int i = 0;i < regions.length();i ++){

                        delete (AcRxObject*)regions;
                }
      }
      for(int i = 0;i < ids.length();i ++){

                pEnt = static采用cast<AcDbEntity*>(curves);
                pEnt->close();
      }
      return regionIds;
}

//绘制文字===================
static void TESTtextcmd(){

      AcGePoint3d ptInsert(0,400,0);

      AcDbMText* pMText = new AcDbMText();

      ////设置多行文字特性

      pMText->setContents(采用T("hello!!"));
      pMText->setLocation(ptInsert);
      pMText->setTextHeight(1000);
      pMText->setWidth(1000);
      pMText->setAttachment(AcDbMText::kBottomLeft);

      LoadEntity(pMText);
}



////创建填充======================
static void TESThatchcmd(){

      ////提示用户选择填充边界
      ads采用name ss;
      int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);
      AcDbObjectIdArray objIds;
      if(rt == RTNORM){
                long len;
                acedSSLength(ss,&len);
                for(int i = 0;i < len;i ++){
                        ads采用name ent;
                        acedSSName(ss,i,ent);
                        AcDbObjectId objId;
                        acdbGetObjectId(objId,ent);
                        objIds.append(objId);
                }
      }
      acedSSFree(ss);
      ////选择完毕,绘制填充
      Acad::ErrorStatus es;
      AcDbHatch* pHatch = new AcDbHatch();
      ////选择填充平面
      AcGeVector3d normal(0,0,1);
      pHatch->setNormal(normal);
      pHatch->setElevation(0);

      ////设置关联性
      pHatch->setAssociative(true);

      ////设置填充图案
      pHatch->setPattern(AcDbHatch::kPreDefined,采用T(/*"SOLID"*/"ANSI31"));

      ////设置填充角度
      pHatch->setPatternAngle(45);
      ////设置填充边界

      es=pHatch->appendLoop(AcDbHatch::kExternal,objIds);

      ////显示填充对象

      es=pHatch->evaluateHatch();
      LoadEntity(pHatch);
}



//获得一层的所有对象,变色===============
static void TESTgetlayerobjcmd(){
      AcDbLayerTable *pLayerTbl;
      acdbHostApplicationServices()->workingDatabase()->getSymbolTable(
                pLayerTbl,AcDb::kForRead);
      if(!pLayerTbl->has(采用T("测试"))){
                acutPrintf(采用T("\n当前图形未包含'测试'图层"));
                pLayerTbl->close();
                return;
      }
      AcDbObjectId layerId;
      pLayerTbl->getAt(采用T("测试"),layerId);
      pLayerTbl->close();

      ////获得当前数据库的块表
      AcDbBlockTable* pBlkTbl;
      acdbHostApplicationServices()->workingDatabase()->getBlockTable(
                pBlkTbl,AcDb::kForRead);
      ////获得模型空间的块表记录
      AcDbBlockTableRecord* pBlkTblRcd;
      pBlkTbl->getAt(ACDB采用MODEL采用SPACE,pBlkTblRcd,AcDb::kForRead);
      pBlkTbl->close();

      ////创建块表记录遍历器
      AcDbBlockTableRecordIterator* pIter;
      pBlkTblRcd->newIterator(pIter);
      AcDbEntity* pEnt;
      for(pIter->start();!pIter->done();pIter->step()){

                pIter->getEntity(pEnt,AcDb::kForWrite);
                if(pEnt->layerId() == layerId){

                        /*AcDbLine* pLine = AcDbLine::cast(pEnt);
                        if(pLine != NULL){*/

                        pEnt->setColorIndex(1);
                        //}
                }
                pEnt->close();
      }
      delete pIter;
      pBlkTblRcd->close();
}   
页: [1]
查看完整版本: [每日一码] ARX常用代码总结