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);
//将扩展字典改为硬拥有,否则写块出去后会丢失
AcDbEntity *pEnt=NULL;
es = pIter->getEntity(pEnt,AcDb::kForWrite);
if (Acad::eOk == es)
{
AcDbObjectId dicId= pEnt->extensionDictionary();
if (AcDbObjectId::kNull != dicId)
{
AcDbObjectPointer<AcDbDictionary> pDic(dicId,AcDb::kForWrite);
if(Acad::eOk == pDic.openStatus())
{
pDic->setTreatElementsAsHard(Adesk::kTrue);
pDic->close();
}
}
pEnt->close();
}
}
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=;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=;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);
// if (pEnt->isKindOf(AcDbDimension::desc()))
// {
// AcDbDimension *pDim=AcDbDimension::cast(pEnt);
// pDim->recomputeDimBlock();
// }
pEnt->recordGraphicsModified();
pEnt->close();
}
}
Adesk::Int32 nLength;
acedSSLength(ss,&nLength);
if (nLength>)
{
acedSSSetFirst(ss,NULL);
}
//acedCommand(RTSTR,_T("_.select"),RTPICKS,ss,RTSTR,_T(""),RTNONE);
acedSSFree(ss);

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

  1. C# 解决读取dbf文件,提示Microsoft Jet 数据库引擎找不到对象的问题

    前言 最新项目需要经常和dbf文件打交道,在实际场景中很多软件需要和一些老的系统进行数据交互,而这些系统都在使用foxpro数据库,读取dbf文件一般都是分为两种情况:第一:安装foxpro的驱动进行 ...

  2. WPF 后台读取样式文件

    ResourceDictionary dic = new ResourceDictionary { Source = new Uri("Styles.xaml",UriKind.R ...

  3. PHP读取CSV文件把数据插入到数据库,本地没有问题,阿里云测试服务器不行

    原因是 本地windows和服务器linux编码不同,在代码中不要加编码转换的内容,而是把csv文件另存为utf-8文件上传就可以了,windows和Linux都就可以了. html代码: PHP端代 ...

  4. C# 读取CAD文件缩略图(DWG文件)

    //C# 读取CAD文件缩略图(DWG文件) https://blog.csdn.net/hanghangaidoudou/article/details/8589574 //2010-09-04 1 ...

  5. 批量输出dwg文件中的文本

    公司来了一批图纸,里面有一部分内容需要复制到excel中,几百张来图每一张都 手工复制,烦死了.编写一个CAD插件,自动导出文本,简单记录在下面. 想法是: 1.输入命令,选择所有dwg文件 2.挨个 ...

  6. 无需AutoCAD,用C#生成DWG文件

    是一个类库:Teigha.NET for .DWG 利用它就可以在无需安装AutoCAD软件的情况下,生成.读取DWG文件,适合那些导入导出的场合. Teigha曾用名OpenDWG .DWGdire ...

  7. java读取文件内容并输出到控制台,java中实现文件复制

    public class TestFileInputStream { public static void main(String [] args) { //读取指定文件中内容,并在控制台输出 Fil ...

  8. input type="file"文件上传到后台读取

    html页面(表单采用bootStrap) js部分: //更换头像时把上传的图片post方式到控制器 <script type="text/javascript"> ...

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

    文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...

随机推荐

  1. Unix高级编程Note2

    [Unix Note2] 1.信号屏蔽 2.信号不会排队,即产生同时产生10次,会被合并为1次. 3.sigsuspend,sigsuspend后,进程就挂在那里,等待着开放的信号的唤醒.系统在接收到 ...

  2. FTP上传下载--python

    import socket import struct import json import subprocess import os class MYTCPServer: address_famil ...

  3. golang之流程控制(注意点)

    Go在流程控制方面特点如下: 没有do和while循环,只有一个广义的for语句 switch语句灵活多变,还可以用于类型判断 if语句和switch语句都可以包含一条初始化子语句 break语句和c ...

  4. scrollView不能进行滚动

    原因:scrollView里只能包含一个layout,多个时,是不能进行滚动的.

  5. 8.3 mysql 表操作

    库操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等    performance_sch ...

  6. Gym 100792C Colder-Hotter (三分)

    题意:系统有一个点对,让你去猜,每次你猜一个,如果这个数和系统里的那个点距离比上一个你猜的近,那么返回1,否则返回0,第一次猜一定返回0,在不超过500次的情况下,猜出正确答案. 析:是一个简单的三分 ...

  7. ORA-12541: TNS: 无监听程序、监听程序当前无法识别连接描述符中请求的服务

    %ORACLE_HOME%\product\11.2.0\dbhome_1\NETWORK\ADMIN 这个文件夹下有SAMPLE 里面有详细配置说明 有3个文件, listener.ora sqln ...

  8. 桥接模式及C++实现

    桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一,关键就是这个抽象和实 ...

  9. 机器学习—集成学习(GBDT)

    一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...

  10. 6、Docker Image

    6.1 什么是image 文件和meta data的集合(root filesystem) 分层的,并且每一层都可以添加.改变.删除文件,成为一个新的image 不同的image可以共享相同的laye ...