使用wblockCloneObjects从后台读取dwg文件复制实体到当前数据库

AcDbDatabase *pNewDb=new AcDbDatabase(Adesk::kFalse);
        if (pNewDb == NULL)
        {
            return;
        }
        Acad::ErrorStatus es= pNewDb->readDwgFile(_T("D:\\123.dwg"));
        if (Acad::eOk != es || NULL == pNewDb)
        {
            acutPrintf(_T("\n打开dwg文件失败,错误码:%s"),acadErrorStatusText(es));
            return;
        }
        AcDbObjectIdArray objIdArray;
        AcDbBlockTable *pBlkTbl=NULL;
        es= pNewDb->getBlockTable(pBlkTbl,AcDb::kForRead);
        if (Acad::eOk != es || NULL == pBlkTbl)
        {
            acutPrintf(_T("\n获取源数据库块表失败,错误码:%s"),acadErrorStatusText(es));
            delete pNewDb;
            pNewDb=NULL;
            return;
        }
        AcDbBlockTableRecord *pMsBlkRcd=NULL;
        es= pBlkTbl->getAt(ACDB_MODEL_SPACE,pMsBlkRcd,AcDb::kForRead);
        pBlkTbl->close();
        if (Acad::eOk != es || NULL == pMsBlkRcd)
        {
            acutPrintf(_T("\n获取源数据库模型空间块表记录失败,错误码:%s"),acadErrorStatusText(es));
            delete pNewDb;
            pNewDb=NULL;
            return;
        }
        //遍历源数据库模型空间块记录中的实体
        AcDbBlockTableRecordIterator *pIter=NULL;
        pMsBlkRcd->newIterator(pIter);
        pMsBlkRcd->close();
        AcDbObjectId objId;
        for (pIter->start();!pIter->done();pIter->step())
        {
            pIter->getEntityId(objId);
            objIdArray.append(objId);
        }
        delete pIter;        

        //检查objectId
        if (objIdArray.isEmpty())
        {
            acutPrintf(_T("\n克隆失败,源数据库的模型空间没有实体!"));
            delete pNewDb;
            pNewDb=NULL;
            return;
        }
        AcDbIdMapping idMap;
        AcDbDatabase *pDb= acdbHostApplicationServices()->workingDatabase();
        //获取当前数据库的空间ID
        AcDbObjectId mSpaceId= pDb->currentSpaceId();
        //写块克隆 忽略重定义模式
        es =  pNewDb->wblockCloneObjects(objIdArray,mSpaceId,idMap,AcDb::kDrcIgnore);
        if (Acad::eOk != es)
        {
            acutPrintf(_T("\ndeepCloneObjects失败错误码:%s"),acadErrorStatusText(es));
            delete pNewDb;
            pNewDb=NULL;
            return;
        }
        //删除临时数据库
        delete pNewDb;
        pNewDb=NULL;

        AcDbIdPair IdPair;
        AcDbObjectIdArray arrID2;
        //获取克隆后的和原id匹配的对象的objectid,克隆idmap是全部的id映射,包括一些附带的数据
        for (int i=0;i<objIdArray.length();i++)
        {
            IdPair.setKey(objIdArray[i]);
            if (idMap.compute(IdPair))
            {
                arrID2.append(IdPair.value());
            }
        }
        if (!arrID2.isEmpty())
        {
            acutPrintf(_T("\n复制:%d个对象成功!"),arrID2.length());
        }

        #define Randmod(x) rand()%x
        //亮显选择集
        ads_name ss,ent;
        acedSSAdd(NULL,NULL,ss);
        for (int i=0;i<arrID2.length();i++)
        {
            AcDbEntityPointer pEnt(arrID2[i],AcDb::kForWrite);
            if (Acad::eOk == pEnt.openStatus())
            {
                pEnt->setColorIndex(Randmod(11));
            }
            acdbGetAdsName(ent,arrID2[i]);
            acedSSAdd(ent,ss,ss);
        }
        Adesk::Int32 nLength;
        acedSSLength(ss,&nLength);
        if (nLength>0)
        {
            acedSSSetFirst(ss,NULL);
        }
        //acedCommand(RTSTR,_T("_.select"),RTPICKS,ss,RTSTR,_T(""),RTNONE);
        acedSSFree(ss);

原文地址:https://www.cnblogs.com/edata/p/10777134.html

时间: 2024-10-28 20:25:47

使用wblockCloneObjects从后台读取dwg文件复制实体到当前数据库的相关文章

Java读取excel文件,并存入MySQL数据库

2019,刚毕业入职,需要更新数据库某表内容,就写了个Java读取excel文件的代码,代码尚存问题较大,过往阅者看看即可,以此记录小白点滴 初学Java,还没学到io流,jdbc等操作 代码用到poi 一些jar,数据库jar import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.s

WPF 后台读取样式文件

ResourceDictionary dic = new ResourceDictionary { Source = new Uri("Styles.xaml",UriKind.Relative) }; Style style = (Style)dic["TextBlockStyle"]; ResourceDictionary dic0 = (ResourceDictionary)System.Windows.Application.LoadComponent(ne

分批次读取csv文件,并保存到数据库

读取上百万行的csv文件,由于数据量太大,一次性将csv的内容读取出来,保存在内存中,会导致内存严重吃不消,最后直接宕机,所以建议采取分批次读数据然后保存数据库中,以下是简单测试方法,可根据具体需求做修改.对大批量数据的操作,建议用jdbc直接批量添加,修改,删除等操作. import java.util.List;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;impo

windows 与linux 下用C++读取sqlite实现文件复制(二)

2.分别查询读取sqlite表中的字段. 1 //在数据库中查询表: 2 // 执行SQL 3 char **dbResult; //是 char ** 类型,两个*号 4 int nRow, nColumn; 5 sprintf(sql, "select * from test1"); 6 int result = sqlite3_get_table( conndb, sql, &dbResult, &nRow, &nColumn, &err_msg

Java后台按行读取txt文件

java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了.接下来需要解读成乙方可以理解的东西 既然你使用了FileInputStream().那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据 解读完成后要输出

windows 与linux 下用C++读取sqlite实现文件复制(三)

5.实现文件复制 1 int CopyFile(char *SourceFile,char *NewFile) 2 { 3 ifstream in; 4 ofstream out; 5 in.open(SourceFile,ios::binary);//打开源文件 6 if(in.fail())//打开源文件失败 7 { 8 cout<<"Error 1: Fail to open the source file."<<endl; 9 in.close(); 1

input type=&quot;file&quot;文件上传到后台读取

html页面(表单采用bootStrap) js部分: //更换头像时把上传的图片post方式到控制器 <script type="text/javascript"> function upload() { var files = $('input[name="fileField"]').prop('files');//获取到文件列表 if (files.length == 0) { alert('请选择文件'); return; } else { va

Javascript写入txt和读取txt文件的方法

文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Var fso=new ActiveXObject(Scripting.FileSystemObject); 创建一个可以将文件翻译成文件流的对象. 第二步:用于创建一个textStream 对象 括号里边有三个属性 1. 文件的绝对路径 2. 文件的常数 只读=1,只写=2 ,追加=8 等权限.(Fo

细说Unity3D(一)——移动平台动态读取外部文件全解析

前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑和手指了.那么今天开始,小匹夫会记录一些平时工作中遇到的坑,以及小匹夫的应对方法,欢迎各位拍砖讨论.那么今天主要讨论一下Unity3D在移动端如何动态的读取外部文件,比如csv(txt),xml一类的文件.主要涉及的问题,就是PC端上本来测试的好好的东西,到了移动端就不能用了,所以要讨论一下PC端和