(18)ObjectARX2015 + vs2012插入块参照
1. 说明
2. 思路
//AcDbBlockReference 类的构造函数定义为:
//块参照由 AcDbBlockReference 类来表示:
AcDbBlockReference(
const AcGePoint3d& position, //position 是块参照的插入点
AcDbObjectId blockTableRec); //blockTableRec 是块参照所参照的块表记录(块定义)的 ID
//插入块参照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();
}
//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;
(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插入块参照相关推荐
- (17)ObjectARX2015 + vs2012创建块定义
1. 说明 本篇举例块定义中包含两条直线和一个圆. 2. 思路 所有的实体都保存在块表记录中,而块表记录则存储在块表中.实际上,用户在 AutoCAD 中定义块相当于增 ...
- OBJECT ARX 插入块
添加块到块表中================ static void TESTaddblkcmd(){AcDbBlockTable* pBlkTbl; acdbHostApplicationServ ...
- CAD中插入外部参照字体会变繁体_CAD外部参照怎么用,什么是外部参照,和块有什么区别?...
好课推荐: 1.CAD2014:点击查看 2.室内&全屋:点击查看 3.CAD2019:点击查看4.CAD2018:点击查看5.Bim教程:点击查看 6.室内手绘:点击查看7.CAD三维:点击 ...
- winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel
点击蓝字关注我 0 引言 需求分析: 当需要在固定位置插入块或者是批量替换块时,可以通过获取块的坐标值,然后根据坐标位置进行插入块或者替换. 关键的第一步:就是获取块参照的坐标值. 结果: 1. 代码 ...
- cad插入块_CAD中的quot;块quot;能否修改?能!一个命令可快速解决
"块"在CAD中用得比较多,为了提高制图的效率,在CAD中往往定义了各种各样的"块",比方说:对于机械制图,为了快速插入表面粗糙度,通常将表面粗糙度符号定义为一 ...
- CAD中插入外部参照字体会变繁体_CAD中形形色色的“替换”技巧你确定都知道了?...
CAD使用技巧 CAD中的所有有关于替换的有哪些你知道吗?常见的有:字体替换.文字替换.块替换.标注替换.参照替换等.而有技巧的操作,可以事半功倍. 一.字体替换 很多人都遇到过打开图后,有的字体显示 ...
- 为什么在CAD图纸中插入外部参照后会出现多余图形?
在使用浩辰CAD软件绘图的过程中,有些时候在CAD图纸中插入外部参照后图纸中就显示了一些不需要的图形:但是打开外部参照原图没有这些图形,插入到图纸后却显示出来了:这是什么原因呢?接下来以浩辰CAD软件 ...
- CAD中插入外部参照字体会变繁体_知道这些技巧-轻松攻克CAD所有困难
28.如何使图形只能看而不能修改? 要是自己的图把它全部图层锁定就行了,打开不会变的:如果以后不想用了,就把里面所有东西都炸碎也可以:还有一种方法是用lisp语言写个加密程序,一旦运行后,图就只能看, ...
- CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时有些文字消失了?
下面是本公众号文章分类目录,点击可打开分类文章列表: 安装卸载 文件格式.输入输出 异常.退出 基本操作技巧 设置及相关问题 界面和显示相关问题 CAD快捷键 视图设置和调整选择.组 坐标系. ...
最新文章
- dmol3给定关键字不在字典中_python中的数据结构与算法(2):字典与集合
- css3媒体查询实现网站响应式布局
- 简单工厂,工厂方法,抽象工厂
- python在会计工作中的应用-python有什么用(会计专业)
- go 接口 构造器_Go 中接口值的复制
- rabbitmq 消息长度_Spring Boot教程(29) – RabbitMQ必备基础
- Docker容器时间与宿主机同步
- win10 x64下安装oracle 12c出现[INS-30131]报错的解决方案
- 几种常见的分布及其性质
- 7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析
- 高糊马赛克秒变高清,「脑补」面部细节,表情帝:这还是我吗?
- WindowsServer2012R2安装SSMS时提示安装windows kb2919355 更新
- python暴力破解
- 基于树莓派的车牌识别门禁系统(工作日记)
- oracle循环视频教程,Oracle高清视频课程全45集,赶紧收藏吧!
- git提交代码的两种方法步骤
- 【机器学习】SVM核方法
- 彻底卸载vscode Linux,Linux环境中Visual Studio Code 安装配置及其卸载(详细教程)
- 大O记法-BigO notation
- pkcs8 和 pkcs1 之间 互相 转换
热门文章
- 三阶魔方中心块乱了_关于三阶魔方中心块弹簧调试的相关建议以及一场小事故...
- 存贮论(一):基本概念、无约束的确定型存贮模型
- 【转】游戏引擎剖析(Game Engine Anatomy 101)
- 当我用C++开发出一款打字练习程序分析分享
- java表盘时钟的设计思路_初学js 自制表盘时钟很简单
- 分布式系统基础架构hadoop搭建
- 【Mysql】更新多个数据库下同名表同名字段的长度
- 使用zerotier时,微信记录恢复问题
- 信息安全管理过程方法和PDCA戴明环
- 关于tio的实战演练