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. React Native Android开发环境配置

    近些年,Web前端甚是火爆,火爆程度堪比我毕业时的移动端开发一般.随着JavaScript的火爆,移动端也不安分了起来,ReactNative就异军突起了,几乎要做到"一次学习,四处开发&q ...

  2. Fullpage.js全屏滚动jQuery插件

    兼容性: 支持 IE8+ 及其他现代浏览器. 主要功能: 1.支持鼠标滚动: 2.支持前进后退键盘控制; 3.多个回调函数; 4.支持手机.移动设备; 5.支持窗口缩放自动调整; 6.可设置滚动宽度. ...

  3. CALayer简介

    一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...

  4. Roman to Integer(将罗马数字转成整数)

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  5. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  6. Day4_迭代器

    迭代器: 是一个重复的过程,每一次重复都是基于上一次的结果而来. 可迭代对象: 凡是对象有_iter_方法(对象._iter_),该对象就是可迭代对象. 字符串,列表,元组,字典等都是可迭代对象. 可 ...

  7. 【计算机视觉】深度相机(一)--TOF总结

    http://www.voidcn.com/blog/lg1259156776/article/p-6302915.html 1.1 TOF初探 TOF是Time of flight的简写,直译为飞行 ...

  8. 对比Cassandra、 Mongodb、CouchDB、Redis、Riak、 Membase、Neo4j、HBase

    转自:http://www.cnblogs.com/alephsoul-alephsoul/archive/2013/04/26/3044630.html 导读:Kristóf Kovács 是一位软 ...

  9. currval of sequence "follow_id_seq" is not yet defined in this session

    postgresql上使用 select currval('follow_id_seq'); 报错: currval of sequence "follow_id_seq" is  ...

  10. (译) JSON-RPC 2.0 规范(中文版)

    http://wiki.geekdream.com/Specification/json-rpc_2.0.html 起源时间: 2010-03-26(基于2009-05-24版本) 更新: 2013- ...