找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 150|回复: 0

deepCloneEntity

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-2 11:15:12 | 显示全部楼层 |阅读模式
  1. static  void deepCloneEntity ( AcDbObjectIdArray sourceObjectList, AcDbObjectIdArray& descObjectList )
  2. {
  3.         //----不清空输出数组的元素,仅仅将克隆得到的实体追加输出
  4.         //        if ( descObjectList.length() > 0 )
  5.         //        {
  6.         //清空目的对象数组
  7.         // descObjectList.removeSubArray(0,descObjectList.length()-1);
  8.         //        }
  9.         //----获取模型空间的对象ID
  10.         AcDbBlockTable *pBlockTable = NULL;
  11.         if ( acdbCurDwg()->getBlockTable ( pBlockTable, AcDb::kForRead ) != Acad::eOk )
  12.                 return ;
  13.         AcDbObjectId  modelSpaceId;
  14.         pBlockTable->getAt ( ACDB采用MODEL采用SPACE, modelSpaceId );
  15.         pBlockTable->close();
  16.         //----克隆实体
  17.         //----不能使用单个克隆的方案,否则sourceObjectList内实体间的引用关系得不到相应克隆
  18.         AcDbIdMapping idMap;
  19.         if ( acdbCurDwg()->deepCloneObjects ( sourceObjectList, modelSpaceId, idMap ) != Acad::eOk )
  20.                 return ;
  21.         //----对新生成的对象参考输入顺序排序
  22.         AcDbIdMappingIter iter ( idMap );
  23.         AcDbIdPair idPair;
  24.         AcDbObjectId id;
  25.         for ( int i = 0; i < sourceObjectList.length(); i++ )
  26.         {
  27.                 id = sourceObjectList.at ( i );
  28.                 for ( iter.start(); !iter.done(); iter.next() )
  29.                 {
  30.                         iter.getMap ( idPair );
  31.                         if ( id == idPair.key() )
  32.                         {
  33.                                 if ( idPair.isCloned() )
  34.                                         descObjectList.append ( idPair.value() );
  35.                                 break;
  36.                         }
  37.                 }
  38.         }
  39. }
  40.         //transformByMatrix(entityArray,newUCS.inverse());
  41. static void transformByMatrix(AcDbObjectIdArray& entityArray,AcGeMatrix3d matrixTran,short flag=1)
  42. {
  43.         AcDbObjectIdArray newObjectArray;
  44.         if(flag)
  45.         {
  46.                 //deep clone entity
  47.                 deepCloneEntity(entityArray,newObjectArray);
  48.                 entityArray=newObjectArray;
  49.         }
  50.         //        else
  51.         //        {
  52.         //                newObjectArray=entityArray;
  53.         //        }
  54.         for(int i=0;i<entityArray.length();i++)
  55.         {
  56.                 AcDbObject* pObj1=NULL;
  57.                 Acad::ErrorStatus es;
  58.                 if((es = acdbOpenAcDbObject(pObj1, entityArray[i],AcDb::kForWrite))!=Acad::eOk)
  59.                 {
  60.                         continue;
  61.                 }
  62.                 AcDbEntity* pEnt;
  63.                 pEnt=AcDbEntity::cast(pObj1);
  64.                 if(pEnt!=NULL)
  65.                 {
  66.                         //根据需要转化
  67.                         pEnt->transformBy(matrixTran);
  68.                 }
  69.                 pObj1->close();
  70.         }
  71. }
  72. static AcGeMatrix3d getTransMatrix3d(AcGePoint3d startPoint,AcGePoint3d endPoint)
  73. {
  74.         AcGePoint3d tolerancePt;
  75.         tolerancePt[0]=startPoint[0];
  76.         tolerancePt[1]=startPoint[1];
  77.         tolerancePt[2]=startPoint[2];
  78.         if( fabs(startPoint.z-endPoint.z) < 1e-7)//g采用tolerance管件误差
  79.         {
  80.                 tolerancePt.z = startPoint.z + 5000.0;
  81.         }
  82.         else
  83.         {
  84.                 //tolerancePt.x = insert采用pt.x + 5000.0;
  85.                 AcGeVector3d dirction1=endPoint-startPoint;
  86.                 if(dirction1.x==0 && dirction1.y==0)
  87.                 {
  88.                         //这种情况属于平行z轴方向的插入
  89.                         tolerancePt.x = startPoint.x + 5000.0;
  90.                 }
  91.                 else
  92.                 {
  93.                         //在插入点与延伸点为空间两点时确定y轴点
  94.                         AcGeVector3d dirciton2=AcGeVector3d(dirction1.x,dirction1.y,0);
  95.                         AcGeVector3d dirciton3=dirciton2.crossProduct(dirction1);
  96.                         AcGeVector3d dirciton4=dirciton3.crossProduct(dirction1);
  97.                         tolerancePt=startPoint+dirciton4;
  98.                 }
  99.         }
  100.         //得到转化阵列
  101.         AcGeMatrix3d oldUCS,newUCS;
  102.         oldUCS=setUCS(startPoint,endPoint,tolerancePt);
  103.         acedGetCurrentUCS(newUCS);
  104.         acedSetCurrentUCS(oldUCS);
  105.         return newUCS;
  106. }
  107. //本函数代替ucs 3p
  108. static AcGeMatrix3d setUCS(AcGePoint3d orient,AcGePoint3d xPoint,AcGePoint3d yPoint)
  109. {
  110.         //将ucs中点转化到wcs
  111.         AcGeMatrix3d oldUCS;
  112.         //        AcDbDatabase* currDatabase=acdbHostApplicationServices()->workingDatabase();
  113.         //        acdbUcsMatrix(oldUCS,currDatabase);//当前坐标系
  114.         acedGetCurrentUCS(oldUCS);
  115.         //将ucs中点转化到wcs
  116.         wcsToucs(orient);
  117.         wcsToucs(xPoint);
  118.         wcsToucs(yPoint);
  119.         //计算新的z抽向量,
  120.         AcGeVector3d vec1=AcGeVector3d(xPoint[0]-orient[0],
  121.                 xPoint[1]-orient[1],
  122.                 xPoint[2]-orient[2]);
  123.         AcGeVector3d vec2=AcGeVector3d(yPoint[0]-orient[0],
  124.                 yPoint[1]-orient[1],
  125.                 yPoint[2]-orient[2]);
  126.         AcGeVector3d xAxis=vec1;
  127.         AcGeVector3d zAxis=xAxis.crossProduct(vec2);
  128.         AcGeVector3d yAxis=zAxis.crossProduct(xAxis);
  129.         xAxis.normalize();
  130.         yAxis.normalize();
  131.         zAxis.normalize();
  132.         AcGeMatrix3d newUCS;
  133.         newUCS.setCoordSystem(orient,xAxis,yAxis,zAxis);
  134.         Acad::ErrorStatus es=acedSetCurrentUCS(newUCS);
  135.         return oldUCS;
  136. }
  137. static int wcsToucs(ads采用point& pt)
  138. {
  139.         struct resbuf wcs;
  140.         wcs.restype=RTSHORT;
  141.         wcs.resval.rint=0;
  142.         struct resbuf ucs;
  143.         ucs.restype=RTSHORT;
  144.         ucs.resval.rint=1;
  145.         return acedTrans(pt,&ucs,&wcs,false,pt);
  146. }
  147. static int wcsToucs(AcGePoint3d& pt)
  148. {
  149.         ads采用point tp={pt[0],pt[1],pt[2]};
  150.         int ret = wcsToucs(tp);
  151.         pt=AcGePoint3d(tp[0],tp[1],tp[2]);
  152.         return ret;
  153. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:16 , Processed in 0.149358 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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