admin 发表于 2024-3-2 11:15:12

deepCloneEntity


staticvoid deepCloneEntity ( AcDbObjectIdArray sourceObjectList, AcDbObjectIdArray& descObjectList )
{
        //----不清空输出数组的元素,仅仅将克隆得到的实体追加输出
        //        if ( descObjectList.length() > 0 )
        //        {
        //清空目的对象数组
        // descObjectList.removeSubArray(0,descObjectList.length()-1);
        //        }

        //----获取模型空间的对象ID
        AcDbBlockTable *pBlockTable = NULL;
        if ( acdbCurDwg()->getBlockTable ( pBlockTable, AcDb::kForRead ) != Acad::eOk )
                return ;

        AcDbObjectIdmodelSpaceId;
        pBlockTable->getAt ( ACDB采用MODEL采用SPACE, modelSpaceId );
        pBlockTable->close();

        //----克隆实体
        //----不能使用单个克隆的方案,否则sourceObjectList内实体间的引用关系得不到相应克隆
        AcDbIdMapping idMap;
        if ( acdbCurDwg()->deepCloneObjects ( sourceObjectList, modelSpaceId, idMap ) != Acad::eOk )
                return ;

        //----对新生成的对象参考输入顺序排序
        AcDbIdMappingIter iter ( idMap );
        AcDbIdPair idPair;
        AcDbObjectId id;
        for ( int i = 0; i < sourceObjectList.length(); i++ )
        {
                id = sourceObjectList.at ( i );
                for ( iter.start(); !iter.done(); iter.next() )
                {
                        iter.getMap ( idPair );
                        if ( id == idPair.key() )
                        {
                                if ( idPair.isCloned() )
                                        descObjectList.append ( idPair.value() );
                                break;
                        }
                }
        }
}

        //transformByMatrix(entityArray,newUCS.inverse());

static void transformByMatrix(AcDbObjectIdArray& entityArray,AcGeMatrix3d matrixTran,short flag=1)
{
        AcDbObjectIdArray newObjectArray;

        if(flag)
        {
                //deep clone entity
                deepCloneEntity(entityArray,newObjectArray);
                entityArray=newObjectArray;
        }
        //        else
        //        {
        //                newObjectArray=entityArray;
        //        }
        for(int i=0;i<entityArray.length();i++)
        {
                AcDbObject* pObj1=NULL;
                Acad::ErrorStatus es;
                if((es = acdbOpenAcDbObject(pObj1, entityArray,AcDb::kForWrite))!=Acad::eOk)
                {
                        continue;
                }
                AcDbEntity* pEnt;


                pEnt=AcDbEntity::cast(pObj1);
                if(pEnt!=NULL)
                {
                        //根据需要转化
                        pEnt->transformBy(matrixTran);
                }
                pObj1->close();
        }
}


static AcGeMatrix3d getTransMatrix3d(AcGePoint3d startPoint,AcGePoint3d endPoint)
{
        AcGePoint3d tolerancePt;
        tolerancePt=startPoint;
        tolerancePt=startPoint;
        tolerancePt=startPoint;
        if( fabs(startPoint.z-endPoint.z) < 1e-7)//g采用tolerance管件误差
        {
                tolerancePt.z = startPoint.z + 5000.0;

        }
        else
        {

                //tolerancePt.x = insert采用pt.x + 5000.0;
                AcGeVector3d dirction1=endPoint-startPoint;
                if(dirction1.x==0 && dirction1.y==0)
                {
                        //这种情况属于平行z轴方向的插入
                        tolerancePt.x = startPoint.x + 5000.0;
                }
                else
                {
                        //在插入点与延伸点为空间两点时确定y轴点
                        AcGeVector3d dirciton2=AcGeVector3d(dirction1.x,dirction1.y,0);
                        AcGeVector3d dirciton3=dirciton2.crossProduct(dirction1);
                        AcGeVector3d dirciton4=dirciton3.crossProduct(dirction1);
                        tolerancePt=startPoint+dirciton4;
                }

        }
        //得到转化阵列
        AcGeMatrix3d oldUCS,newUCS;
        oldUCS=setUCS(startPoint,endPoint,tolerancePt);
        acedGetCurrentUCS(newUCS);
        acedSetCurrentUCS(oldUCS);
        return newUCS;

}


//本函数代替ucs 3p
static AcGeMatrix3d setUCS(AcGePoint3d orient,AcGePoint3d xPoint,AcGePoint3d yPoint)
{
        //将ucs中点转化到wcs
        AcGeMatrix3d oldUCS;
        //        AcDbDatabase* currDatabase=acdbHostApplicationServices()->workingDatabase();
        //        acdbUcsMatrix(oldUCS,currDatabase);//当前坐标系

        acedGetCurrentUCS(oldUCS);

        //将ucs中点转化到wcs
        wcsToucs(orient);
        wcsToucs(xPoint);
        wcsToucs(yPoint);

        //计算新的z抽向量,

        AcGeVector3d vec1=AcGeVector3d(xPoint-orient,
                xPoint-orient,
                xPoint-orient);
        AcGeVector3d vec2=AcGeVector3d(yPoint-orient,
                yPoint-orient,
                yPoint-orient);
        AcGeVector3d xAxis=vec1;
        AcGeVector3d zAxis=xAxis.crossProduct(vec2);
        AcGeVector3d yAxis=zAxis.crossProduct(xAxis);

        xAxis.normalize();
        yAxis.normalize();
        zAxis.normalize();

        AcGeMatrix3d newUCS;
        newUCS.setCoordSystem(orient,xAxis,yAxis,zAxis);

        Acad::ErrorStatus es=acedSetCurrentUCS(newUCS);


        return oldUCS;

}


static int wcsToucs(ads采用point& pt)
{
        struct resbuf wcs;
        wcs.restype=RTSHORT;
        wcs.resval.rint=0;

        struct resbuf ucs;
        ucs.restype=RTSHORT;
        ucs.resval.rint=1;
        return acedTrans(pt,&ucs,&wcs,false,pt);
}

static int wcsToucs(AcGePoint3d& pt)
{
        ads采用point tp={pt,pt,pt};
        int ret = wcsToucs(tp);
        pt=AcGePoint3d(tp,tp,tp);
        return ret;
}
页: [1]
查看完整版本: deepCloneEntity