static void InsertBlock()
{
//获取要插入的块名
TCHAR str[40];
acedGetString(Adesk::kFalse, _T("\n请输入要插入的块名称:"), str);
CString blockName ;
blockName.Format(_T("%s"), str);

//判断在当前图纸中是否已经被定义
AcDbDatabase *pCurDb = acdbHostApplicationServices()->workingDatabase();
AcDbBlockTable *pBlkTab;
AcDbObjectId blockId;
pCurDb->getBlockTable(pBlkTab, AcDb::kForRead);

//当前图纸中未定义该块
if (!pBlkTab->has(blockName))
{
pBlkTab->close();

//获取指定的外部图纸中的数据库
TCHAR *filePath = _T("D:\\BlockTest.dwg");
CString strName;
strName.Format(_T("%s"), filePath);
AcDbDatabase *pDwg = getDatabaseByDwg(strName);

//获取外部数据库中该块中所有实体的id
AcDbObjectIdArray objIds;
getIdsByDwgBlkName(pDwg, blockName, objIds);//该函数属于自己编写,将在后面给出

//将外部数据库中对应ID的实体写入到pDb数据库中,该操作的作用是选择出我们所需要的所有实体

AcDbDatabase *pDb= NULL;
pDwg->wblock(pDb, objIds, AcGePoint3d(0, 0, 0));

//将pDb中的所有实体插入到当前图形中
Acad::ErrorStatus es = pCurDb->insert(blockId, blockName, pDb, Adesk::kFalse);
if (Acad::eOk != es)
{
acutPrintf(_T("\n插入块错误!"));
return;
}
delete pDb;
}

//当前图纸中已经定义了该块
else
{
pBlkTab->getAt(blockName, blockId);
}

//获取块参照的插入点
ads_point pt;
acedGetPoint(NULL, _T("请选择插入点:"), pt);
AcGePoint3d ptInsert = asPnt3d(pt);

//创建块参照
AcDbBlockReference *pBlkRef = new AcDbBlockReference(ptInsert, blockId);

//获得模型空间块表记录,并插入块参照
AcDbBlockTable *pBlockTab;
acdbHostApplicationServices()->workingDatabase()
->getBlockTable(pBlockTab, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTabRcd;
pBlockTab->getAt(ACDB_MODEL_SPACE, pBlockTabRcd, AcDb::kForWrite);
pBlockTab->close();
pBlockTabRcd->appendZcDbEntity(pBlkRef);

//获得属性
AcDbBlockTableRecord *pBlkDefRcd;
acdbOpenObject(pBlkDefRcd, blockId, AcDb::kForRead);
if (pBlkDefRcd->hasAttributeDefinitions())
{

//遍历块表记录
AcDbBlockTableRecordIterator *pItr;
pBlkDefRcd->newIterator(pItr);
for (pItr->start(); !pItr->done(); pItr->step())
{

//如果是属性,则加入到要插入的属性对象中
AcDbEntity *pEnt;
pItr->getEntity(pEnt, AcDb::kForRead);
AcDbAttributeDefinition *pAttDef = AcDbAttributeDefinition::cast(pEnt);
if (pAttDef != NULL)
{
AcDbAttribute *pAtt = new AcDbAttribute();
pAtt->setPropertiesFrom(pAttDef);
pAtt->setInvisible(pAttDef->isInvisible());
pAtt->setHorizontalMode(pAttDef->horizontalMode());
pAtt->setVerticalMode(pAttDef->verticalMode());

AcGePoint3d basePt = pAttDef->position();
basePt.x += ptInsert.x;
basePt.y += ptInsert.y;
basePt.z += ptInsert.z;
pAtt->setPosition(basePt);

pAtt->setHeight(pAttDef->height());
pAtt->setTextStyle(pAttDef->textStyle());

//设置属性的Tag、TextString

pAtt->setTag(pAttDef->tag());
pAtt->setTextString(pAttDef->textString());
pAtt->setFieldLength(pAttDef->fieldLength());

//将属性对象追加到块参照中

pBlkRef->appendAttribute(pAtt);
pAtt->close();
pEnt->close();
}
}
delete pItr;
}
pBlkDefRcd->close();
pBlockTabRcd->close();
pBlkRef->close();

}

将外部dwg图纸中指定带属性的块插入到当前图纸中的更多相关文章

  1. Spring配置文件中指定init-method属性的作用

    bean 配置文件属性 init-method 用于在bean初始化时指定执行方法,用来替代继承 InitializingBean接口.相关链接:https://www.cnblogs.com/Joe ...

  2. Pychram 在model中修改class属性值后更新到Navicat Premium中

    一.pycharm数据更新的问题bug问题 1.在更改user_email字端属性后出现数据库信息无法更新到数据库,出现的bug原因是数据库修改了属性之后没有做migrate 和 makemigrat ...

  3. 开题报告中如何将一段文字插入到word表格中

    1,举例如下,打开空白word,设计一个20列的表格.任意一段文字. 2,选中这段文字,点击替换按钮.查找内容为“?”,替换为“^&,”(后面是逗号),并勾选“使用通配符”. 3,全部替换得到 ...

  4. python模块中的__all__属性

    转自:http://blog.csdn.net/sxingming/article/details/52903377 python模块中的__all__属性,可用于模块导入时限制,如:from mod ...

  5. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  6. css3中的scroll-behavior属性

    scroll-behavior属性 当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,CSS 属性 scroll-behavior 为一个滚动框指定滚动行为,当用户通过鼠标滑 ...

  7. OC中在.h和.m中声明的属性和成员变量有何区别?

    相比Swift而言,OC规矩太多. 差不多,.h中声明的属性和成员变量均可以在子类中访问到.而.m则不可.而属性其实也就是成员变量的一种简写,其内部自动包含了getter和setter方法. 如图:V ...

  8. C#中字段、属性、只读、构造函数赋值、反射赋值的相关

    C#中字段.属性和构造函数赋值的问题 提出问题 首先提出几个问题: 1.如何实现自己的注入框架? 2.字段和自动属性的区别是什么? 3.字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4.为 ...

  9. set-cookie中的SameSite属性

    原文:set-cookie中的SameSite属性 再见,CSRF:讲解set-cookie中的SameSite属性 2016-04-14 13:18:42 来源:360安全播报 作者:暗羽喵 阅读: ...

随机推荐

  1. sudoku solver(数独)

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  2. 阅读spring源码

    读Spring源码之前,你要先清楚,为什么你要用Spring... Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯, ...

  3. 阿里REDIS优化

  4. Linux常用资源(不断改进中)

    Linux常用命令全集:  http://linux.chinaitlab.com/special/linuxcom/Index.html ubuntu 12.04 配置指南: http://www. ...

  5. .Net中stirng转Systen.Type的一种实现思路

    今天在上班的过程中,许长时间未联系的大学小伙伴发来消息,带着一个疑问来找我. 他的需求是type动态添加,这对我来说当然很easy,用泛型就好了, 随后,手起刀落,Demo就写出来,如下: 写了一个方 ...

  6. 【python进阶】深入理解系统进程2

    前言 在上一篇[python进阶]深入理解系统进程1中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing ...

  7. 异步任务spring @Async注解源码解析

    1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...

  8. JQuery(三)-- AJAX的深入理解以及JQuery的使用

    HTTP HTTP http: 超文本传输协议.特点:  简单.快速.灵活.无状态.无连接 URL: 统一资源定位符. 组成:协议名://主机IP:端口号/项目资源地址?传递参数的键值对#锚点 ①ip ...

  9. vue.js常见的报错信息及其解决方法的记录

    1.Vue packages version mismatch 翻译:vue包版本匹配错误 报错样例: 报错原因:通常出现于一些依赖库的更新或者安装新的依赖库之后(可以认为npm update已经成为 ...

  10. 3d轮播图——类似酷狗的轮播

    说到轮播图,其实只要是跟web开发相关的无论是前端后端应该都不陌生,各种各样的轮播图,从以前的单纯的平面山水画遮盖滑动或滚动,到Jquery的animate甚至是h5+css3,各种炫酷的轮播图更是层 ...