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. mysql基础优化-explain的使用-mysql死锁

    MySQL的优化 主要包括三个方面,首先是SQL语句的优化,其次是表结构的优化(这里主要指索引的优化),最后是服务器配置的优化. 一.SQL语句的优化 在 where 及 order by 涉及的列上 ...

  2. LeetCode刷题之合并排序链表

    合并两个有序链表并返回一个新的列表.新列表应该由连接在一起的节点前两个列表 给定实例:Input: 1->2->4, 1->3->4Output: 1->1->2- ...

  3. 深入浅出web服务器与python应用程序之间的联系

    简单来说,Web服务器是在运行在物理服务器上的一个程序,它永久地等待客户端(主要是浏览器,比如Chrome,Firefox等)发送请求.Web 服务器接受 Http Request,返回 Respon ...

  4. index() checkbox单选问题

    index() 只对兄弟节点有用 如果这种结构要选择checkbox 时用prop附加属性 removeAttr清楚属性 $('.checkbox').prop('checked',true) $(' ...

  5. valid sudoku(数独)

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  6. 二叉树的序列化和反序列化(Java)

    请实现两个函数,分别用来序列化和反序列化二叉树 序列化就是将二叉树以字符串输出,反序列化:根据自己输出的字符串,构建二叉树. 这里先序遍历输出,且为了方便反序列化,各个节点","隔 ...

  7. Web服务cxf框架发布2

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...

  8. linux中安装程序及账户管理

    程序安装及管理 1. Linux 应用程序基础  Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...

  9. 免费私有gitLab服务推荐

    阿里云code :https://code.aliyun.com/,可以免费开50个私有项目. 配套的持续交付:https://crp.aliyun.com

  10. LCA最近公共祖先(倍增版)

    倍增版LCA lac即最近公共祖先,u和v最近公共祖先就是两节点公用的祖先中深度最大的 比如 其中 lca(1,2)=4, lca(2,3)=4, lca(3,5)=1, lca(2,5)=4; 如何 ...