1. 说明

        本例允许用户输入一个块参照的名称,指定块参照的插入点等参数,然后将块参照插
入到模型空间。

2. 思路

        AutoCAD 有块定义和块参照两个概念。这两个概念的关系:
        块定义不是一个实体,而是一种对实体的描述,通过定义块获得;
        块参照则是一种实体,图形窗口中显示的“块”都是块参照,通过插入块获得
        在 ObjectARX 编程中,块定义通过块表记录来保存,而块参照由 AcDbBlockReference 类来表示。既然块参照是一种实体,那么创建块参照的过程与创建一条直线似乎不应该有什么区别,事实的确如此!
//AcDbBlockReference 类的构造函数定义为:
//块参照由 AcDbBlockReference 类来表示:
AcDbBlockReference(
const AcGePoint3d& position,  //position 是块参照的插入点
AcDbObjectId blockTableRec);  //blockTableRec 是块参照所参照的块表记录(块定义)的 ID
3. 步骤
(1) 在CCreateEnt中添加函数AddBlk()
    //插入块参照static void InsertBlockReference(); //添加块参照
//插入块参照
void CCreateEnt::InsertBlockReference()
{ // 获得用户输入的块定义名称TCHAR blkName[40];if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) != RTNORM) {return;}// 获得当前数据库的块表AcDbBlockTable *pBlkTbl;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);// 查找用户指定的块定义是否存在CString strBlkDef;strBlkDef.Format(_T("%s"), blkName);if (!pBlkTbl->has(strBlkDef)){acutPrintf(_T("\n当前图形中未包含指定名称的块定义!"));pBlkTbl->close();return;}// 获得用户输入的块参照的插入点ads_point pt;if (acedGetPoint(NULL, _T("\n输入块参照的插入点:"), pt) != RTNORM){pBlkTbl->close();return;}AcGePoint3d ptInsert = asPnt3d(pt);// 获得用户指定的块表记录AcDbObjectId blkDefId;pBlkTbl->getAt(strBlkDef, blkDefId);// 创建块参照对象AcDbBlockReference *pBlkRef = new AcDbBlockReference(ptInsert, blkDefId); // 将块参照添加到模型空间AcDbBlockTableRecord *pBlkTblRcd;pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite); AcDbObjectId entId;pBlkTblRcd->appendAcDbEntity(entId, pBlkRef);// 关闭数据库的对象pBlkRef->close();pBlkTblRcd->close();pBlkTbl->close();
}
        AcDbBlockTable::has 函数:为了增加函数的容错能力,增加了判断当前图形的块表中是否包含与指定名称匹配的块表记录的语句。
        acedGetPoint 函数能够暂停程序,等待用户输入一个点,然后获得该点的坐标。
        acedGetPoint 函数定义为:

//acedGetPoint 函数定义为:
//acedGetPoint 函数能够暂停程序,等待用户输入一个点,然后获得该点的坐标。
int acedGetPoint( const ads_point pt,  //pt在当前UCS中指定了一个相对基点,如果指定了该参数,当用户移动鼠标选择要输入//的点时,系统会在光标到基点之间创建一根临时直线,如果不需要基点,可以直接输入NULL;const char * prompt, //prompt将会显示在命令行中,给用户提供指导信息,如果不需要该参数,输入NULL即可;ads_point result);    //result参数返回用户输入的点。//关于acedGetPoint函数返回值的问题,关于获得用户输入信息的相关内容。
//ads_point 是原来的 ADS 编程中定义的一种数据类型,其定义为:typedef ads_real ads_point[3];
//ads_real 则被定义为:typedef double ads_real;
       ads_point 实际上是一个三维浮点数组,它至今仍在与 ADS 相关的编程中使用。
        从 ads_point 转换到 AcGePoint3d 类型的点,即可以通过数组元素直接赋值,也可以通过
asPnt3d 函数直接转化:
         通过数组元素交换:
                ptInsert[X] = pt[X];
                ptInsert[Y] = pt[Y];
                ptInsert[Z] = pt[Z];
         使用 asPnt3d 函数(需要包含 geassign.h 头文件):
                AcGePoint3d ptInsert = asPnt3d(pt);
                之所以可以使用 X、Y 和 Z 直接作为数组的下标,是由于这三个字母在 ObjectARX 有特 殊的定义:
                enum { X = 0, Y = 1, Z = 2 };

(2) 在acrxEntryPoint.cpp中

ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyInsertBlockReference, MyInsertBlockReference, ACRX_CMD_MODAL, NULL) //创建块参照
    //当前项目中注册一个命令 InsertBlockReferencestatic void MidasMyGroupMyInsertBlockReference(){//添加长方体CCreateEnt::InsertBlockReference();}

效果展示

1. 自己创建一个块, 名称为: 测试块

2. 输入命令MyInsertBlockReference

3. 输入要插入块的名称: 测试块

4. 在需要的位置点击插入块

拓展: 为增强代码的可重用性, 将代码拆分:

    //添加块参照(Id,插入点,比例,旋转角度)static AcDbObjectId InsertBlockDef(AcDbObjectId blockRefId, const AcGePoint3d &InsertPoint, const AcGePoint3d, double scale, double roation); //添加块参照(Id,插入点,比例,旋转角度)//修改块参照插入比例static void SetScaleFactor(AcDbBlockReference *pBlockRef, double scale); //修改块参照插入比例//获得指定名称的块定义static AcDbObjectId GetBlockDefId(const TCHAR* blockDefName); //获得指定名称的块定义//添加块参照static void InsertBlockRef(); //添加块参照
//添加块参照(Id,插入点,比例,旋转角度)
AcDbObjectId CCreateEnt::InsertBlockDef(AcDbObjectId blockRefId, const AcGePoint3d &InsertPoint, const AcGePoint3d, double scale, double roation)
{//设置图块的插入点,旋转角度,比例AcDbBlockReference *pBlockRef = new AcDbBlockReference(InsertPoint, blockRefId);pBlockRef->setRotation(roation);SetScaleFactor(pBlockRef, scale);//把新建的图块参照实体加入到新建的块表记录中,并取得插入实体的ID//用于返回值return CCreateEnt::PostToModelSpace(pBlockRef);
}//修改块参照插入比例
void CCreateEnt::SetScaleFactor(AcDbBlockReference *pBlockRef, double scale)
{assert(pBlockRef);AcGeScale3d geScale(scale, scale, scale);pBlockRef->setScaleFactors(geScale);
}//获得指定名称的块定义
AcDbObjectId CCreateEnt::GetBlockDefId(const TCHAR* blockDefName)
{//获得当前数据库的块表AcDbBlockTable* pBlockTable = NULL;Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);//获得用户指定块表记录AcDbObjectId blockDefId;es = pBlockTable->getAt(blockDefName, blockDefId);//关闭数据库对象pBlockTable->close();if (es == Acad::eOk){return blockDefId;}else{return AcDbObjectId::kNull;}
}//添加块参照
void CCreateEnt::InsertBlockRef()
{//获取用户输入的块定义名称TCHAR blockName[40];if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blockName) != RTNORM) {return;}//查找用户输入的块定义是否存在AcDbObjectId blockDefId = CCreateEnt::GetBlockDefId(blockName);if (blockDefId.isNull()){acutPrintf(_T("\n当前图形中未包含指定名称的块定义!"));return;}//获得用户输入的块参照的插入点ads_point pt;if (acedGetPoint(NULL, _T("\n输入块参照的插入点: "), pt) != RTNORM){return;}AcGePoint3d ptInsert = asPnt3d(pt);//创建块对象对象AcDbBlockReference *pblockRef = new AcDbBlockReference(ptInsert, blockDefId);//将比例放大一倍SetScaleFactor(pblockRef, 2);//将块参照添加到模型空间CCreateEnt::PostToModelSpace(pblockRef);
}

(18)ObjectARX2015 + vs2012插入块参照相关推荐

  1. (17)ObjectARX2015 + vs2012创建块定义

    1. 说明         本篇举例块定义中包含两条直线和一个圆. 2. 思路         所有的实体都保存在块表记录中,而块表记录则存储在块表中.实际上,用户在 AutoCAD 中定义块相当于增 ...

  2. OBJECT ARX 插入块

    添加块到块表中================ static void TESTaddblkcmd(){AcDbBlockTable* pBlkTbl; acdbHostApplicationServ ...

  3. CAD中插入外部参照字体会变繁体_CAD外部参照怎么用,什么是外部参照,和块有什么区别?...

    好课推荐: 1.CAD2014:点击查看 2.室内&全屋:点击查看 3.CAD2019:点击查看4.CAD2018:点击查看5.Bim教程:点击查看 6.室内手绘:点击查看7.CAD三维:点击 ...

  4. winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel

    点击蓝字关注我 0 引言 需求分析: 当需要在固定位置插入块或者是批量替换块时,可以通过获取块的坐标值,然后根据坐标位置进行插入块或者替换. 关键的第一步:就是获取块参照的坐标值. 结果: 1. 代码 ...

  5. cad插入块_CAD中的quot;块quot;能否修改?能!一个命令可快速解决

    "块"在CAD中用得比较多,为了提高制图的效率,在CAD中往往定义了各种各样的"块",比方说:对于机械制图,为了快速插入表面粗糙度,通常将表面粗糙度符号定义为一 ...

  6. CAD中插入外部参照字体会变繁体_CAD中形形色色的“替换”技巧你确定都知道了?...

    CAD使用技巧 CAD中的所有有关于替换的有哪些你知道吗?常见的有:字体替换.文字替换.块替换.标注替换.参照替换等.而有技巧的操作,可以事半功倍. 一.字体替换 很多人都遇到过打开图后,有的字体显示 ...

  7. 为什么在CAD图纸中插入外部参照后会出现多余图形?

    在使用浩辰CAD软件绘图的过程中,有些时候在CAD图纸中插入外部参照后图纸中就显示了一些不需要的图形:但是打开外部参照原图没有这些图形,插入到图纸后却显示出来了:这是什么原因呢?接下来以浩辰CAD软件 ...

  8. CAD中插入外部参照字体会变繁体_知道这些技巧-轻松攻克CAD所有困难

    28.如何使图形只能看而不能修改? 要是自己的图把它全部图层锁定就行了,打开不会变的:如果以后不想用了,就把里面所有东西都炸碎也可以:还有一种方法是用lisp语言写个加密程序,一旦运行后,图就只能看, ...

  9. CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时有些文字消失了?

    下面是本公众号文章分类目录,点击可打开分类文章列表: 安装卸载 文件格式.输入输出  异常.退出  基本操作技巧 设置及相关问题 界面和显示相关问题 CAD快捷键  视图设置和调整选择.组  坐标系. ...

最新文章

  1. dmol3给定关键字不在字典中_python中的数据结构与算法(2):字典与集合
  2. css3媒体查询实现网站响应式布局
  3. 简单工厂,工厂方法,抽象工厂
  4. python在会计工作中的应用-python有什么用(会计专业)
  5. go 接口 构造器_Go 中接口值的复制
  6. rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
  7. Docker容器时间与宿主机同步
  8. win10 x64下安装oracle 12c出现[INS-30131]报错的解决方案
  9. 几种常见的分布及其性质
  10. 7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析
  11. 高糊马赛克秒变高清,「脑补」面部细节,表情帝:这还是我吗?
  12. WindowsServer2012R2安装SSMS时提示安装windows kb2919355 更新
  13. python暴力破解
  14. 基于树莓派的车牌识别门禁系统(工作日记)
  15. oracle循环视频教程,Oracle高清视频课程全45集,赶紧收藏吧!
  16. git提交代码的两种方法步骤
  17. 【机器学习】SVM核方法
  18. 彻底卸载vscode Linux,Linux环境中Visual Studio Code 安装配置及其卸载(详细教程)
  19. 大O记法-BigO notation
  20. pkcs8 和 pkcs1 之间 互相 转换

热门文章

  1. 三阶魔方中心块乱了_关于三阶魔方中心块弹簧调试的相关建议以及一场小事故...
  2. 存贮论(一):基本概念、无约束的确定型存贮模型
  3. 【转】游戏引擎剖析(Game Engine Anatomy 101)
  4. 当我用C++开发出一款打字练习程序分析分享
  5. java表盘时钟的设计思路_初学js 自制表盘时钟很简单
  6. 分布式系统基础架构hadoop搭建
  7. 【Mysql】更新多个数据库下同名表同名字段的长度
  8. 使用zerotier时,微信记录恢复问题
  9. 信息安全管理过程方法和PDCA戴明环
  10. 关于tio的实战演练