(23)ObjectARX2015 + vs2012操作图层
1. 说明
//新建图层static void NewLayer(); //新建图层
//新建图层
void CLayerOper::NewLayer()
{// 提示用户输入新建图层的名称TCHAR layerName[100];if (acedGetString(Adesk::kFalse, _T("\n输入新图层的名称:"), layerName) != RTNORM) { return;} // 获得当前图形的层表AcDbLayerTable *pLayerTbl;acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);// 是否已经包含指定的层表记录if (pLayerTbl->has(layerName)) { pLayerTbl->close(); return; } // 创建新的层表记录AcDbLayerTableRecord *pLayerTblRcd; pLayerTblRcd = new AcDbLayerTableRecord(); pLayerTblRcd->setName(layerName); // 将新建的层表记录添加到层表中AcDbObjectId layerTblRcdId; pLayerTbl->add(layerTblRcdId, pLayerTblRcd); //AcDbDatabase 类的 setClayer 函数能够设置图形的当前图层。acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId); pLayerTblRcd->close(); pLayerTbl->close();
}
(2) 修改指定图层的颜色: 添加新类 CModifyLayer, 添加 ModifyLayerColor 函数
Adesk::Boolean acedSetColorDialog( int& nColor, //nColor 参数指定了显示【选择颜色】对话框时的默认颜色,并且在函数返回值后保存用户选择的新颜色Adesk::Boolean bAllowMetaColor, //bAllowMetaColor 参数限定在【选择颜色】对话框中是否可以选择“随层”或“随块”int nCurLayerColor); //nCurLayerColor 参数指定当前图层的颜色。AcCmColor //代表颜色对象,可以通过颜色索引来构建一个新的颜色对象。//通过颜色索引,可以将【选择颜色】对话框的结果设置为指定图层的颜色,
其相关代码为:AcCmColor color;
color.setColorIndex(nNewColor);
pLayerTblRcd->setColor(color);
void ModifyLayerColor(); //修改图层颜色
//修改图层颜色
void CModifyLayer::ModifyLayerColor()
{// 提示用户输入要修改的图层名称TCHAR layerName[100];if (acedGetString(Adesk::kFalse, _T("\n输入图层的名称:"), layerName) != RTNORM){return;}// 获得当前图形的层表AcDbLayerTable *pLayerTbl;acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);// 判断是否包含指定名称的层表记录if (!pLayerTbl->has(layerName)){pLayerTbl->close();return;}// 获得指定层表记录的指针AcDbLayerTableRecord *pLayerTblRcd;pLayerTbl->getAt(layerName, pLayerTblRcd, AcDb::kForWrite);// 弹出“颜色”对话框AcCmColor oldColor = pLayerTblRcd->color();int nCurColor = oldColor.colorIndex(); // 图层修改前的颜色int nNewColor = oldColor.colorIndex(); // 用户选择的颜色if (acedSetColorDialog(nNewColor, Adesk::kFalse, nCurColor)){AcCmColor color;color.setColorIndex(nNewColor);pLayerTblRcd->setColor(color);}// 关闭pLayerTblRcd->close();pLayerTbl->close();
}
(3) 删除一个数据库对象非常简单:将其以“写”模式打开,调用 AcDbObject 类的 erase 函数,最后关闭该对象
void DelLayer(); //删除图层
//删除图层
void CModifyLayer::DelLayer()
{// 提示用户输入要修改的图层名称TCHAR layerName[100];if (acedGetString(Adesk::kFalse, _T("\n输入图层的名称:"), layerName) != RTNORM) {return;}// 获得当前图形的层表AcDbLayerTable *pLayerTbl;acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);// 判断是否包含指定名称的层表记录if (!pLayerTbl->has(layerName)){pLayerTbl->close();return;}// 获得指定层表记录的指针AcDbLayerTableRecord *pLayerTblRcd;pLayerTbl->getAt(layerName, pLayerTblRcd, AcDb::kForWrite);pLayerTblRcd->erase(); // 为其设置“删除”标记pLayerTblRcd->close();pLayerTbl->close();
}
void ExportLayer(); //导出图层到文本文档
//导出图层到文本文档
void CModifyLayer::ExportLayer()
{// 创建所要导出的文本文件CStdioFile f;CFileException e;TCHAR *pFileName = _T("C:\\layers.txt");if (!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite, &e)){acutPrintf(_T("\n创建导出文件失败!"));return;}// 获得层表指针AcDbLayerTable *pLayerTbl;AcDbLayerTableRecord *pLayerTblRcd;acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);// 使用遍历器访问每一条层表记录AcDbLayerTableIterator *pItr;pLayerTbl->newIterator(pItr);for (pItr->start(); !pItr->done(); pItr->step()){pItr->getRecord(pLayerTblRcd, AcDb::kForRead);// 输出图层的信息CString strLayerInfo; // 图层名称TCHAR *layerName;pLayerTblRcd->getName(layerName);strLayerInfo = layerName;free(layerName);strLayerInfo += ","; // 分隔符CString strColor; // 图层颜色AcCmColor color = pLayerTblRcd->color();strColor.Format(_T("%d"), color.colorIndex());strLayerInfo += strColor;strLayerInfo += ",";CString strLinetype; // 图层线型AcDbLinetypeTableRecord *pLinetypeTblRcd;acdbOpenObject(pLinetypeTblRcd, pLayerTblRcd->linetypeObjectId(), AcDb::kForRead);TCHAR *linetypeName;pLinetypeTblRcd->getName(linetypeName);pLinetypeTblRcd->close();strLinetype = linetypeName;free(linetypeName);strLayerInfo += strLinetype;strLayerInfo += ",";CString strLineWeight; // 图层的线宽AcDb::LineWeight lineWeight = pLayerTblRcd->lineWeight();strLineWeight.Format(_T("%d"), lineWeight);strLayerInfo += strLineWeight;// 将图层特性写入到文件中f.WriteString(strLayerInfo);f.WriteString(_T("\n"));pLayerTblRcd->close();}delete pItr;pLayerTbl->close();
}
(5) 按照文本文件中的图层列表在当前图形中创建图层,并且符合图层列表中的各项特性:
//解析文本(图层的名称、颜色、线型和线宽)
BOOL GetFieldText(CString strLineText, CStringArray &fields); //解析文本(图层的名称、颜色、线型和线宽)
//解析文本(图层的名称、颜色、线型和线宽)
BOOL CModifyLayer::GetFieldText(CString strLineText, CStringArray &fields)
{if (strLineText.Find(_T(","), 0) == -1) // 如果找不到英文逗号,函数退出{return FALSE;}int nLeftPos = 0, nRightPos = 0; // 查找分隔符的起始位置while ((nRightPos = strLineText.Find(_T(","), nRightPos)) != -1){fields.Add(strLineText.Mid(nLeftPos, nRightPos - nLeftPos));nLeftPos = nRightPos + 1;nRightPos++;}// 最后一个列的数据fields.Add(strLineText.Mid(nLeftPos));return TRUE;
}
//从文本文档到导入图层
void ImportLayer(); //从文本文档到导入图层
//从文本文档到导入图层
void CModifyLayer::ImportLayer()
{// 打开所要导入的文本文件CStdioFile f;CFileException e;TCHAR *pFileName = _T("C:\\layers.txt");if (!f.Open(pFileName, CFile::modeRead, &e)){acutPrintf(_T("\n打开导入文件失败!"));return;}// 获得层表指针AcDbLayerTable *pLayerTbl;AcDbLayerTableRecord *pLayerTblRcd;acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);// 读取文件中的每一行数据CString strLineText; // 一行文字while (f.ReadString(strLineText)){// 跳过空行if (strLineText.IsEmpty())continue;// 解析出图层名称、颜色、线型和线宽CStringArray layerInfos;if (!GetFieldText(strLineText, layerInfos))continue;// 创建新的层表记录,或者打开存在的块表记录AcDbLayerTableRecord *pLayerTblRcd;AcDbObjectId layerTblRcdId;if (pLayerTbl->has(layerInfos.GetAt(0))){pLayerTbl->getAt(layerInfos.GetAt(0), layerTblRcdId);}else{ pLayerTblRcd = new AcDbLayerTableRecord();pLayerTblRcd->setName(layerInfos.GetAt(0));pLayerTbl->add(layerTblRcdId, pLayerTblRcd);pLayerTblRcd->close();}acdbOpenObject(pLayerTblRcd, layerTblRcdId, AcDb::kForWrite);// 设置层表记录的颜色AcCmColor color;Adesk::UInt16 colorIndex = _wtol(layerInfos.GetAt(1));color.setColorIndex(colorIndex);pLayerTblRcd->setColor(color);// 设置线型AcDbLinetypeTable *pLinetypeTbl;AcDbObjectId linetypeId;acdbHostApplicationServices()->workingDatabase()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);if (pLinetypeTbl->has(layerInfos.GetAt(2))){pLinetypeTbl->getAt(layerInfos.GetAt(2), linetypeId);}else {pLinetypeTbl->getAt(_T("Continous"), linetypeId);}pLayerTblRcd->setLinetypeObjectId(linetypeId);pLinetypeTbl->close();// 设置线宽AcDb::LineWeight lineWeight = (AcDb::LineWeight)_wtol(layerInfos.GetAt(3));pLayerTblRcd->setLineWeight(lineWeight);pLayerTblRcd->close();}pLayerTbl->close();
}
(6) 在acrxEntryPoint.cpp中
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyNewLayer, MyNewLayer, ACRX_CMD_MODAL, NULL) //新建图层
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDelLayer, MyDelLayer, ACRX_CMD_MODAL, NULL) //删除图层
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyModifyLayerColor, MyModifyLayerColor, ACRX_CMD_MODAL, NULL) //插入图层
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyExportLayer, MyExportLayer, ACRX_CMD_MODAL, NULL) //导出图层
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyImportLayer, MyImportLayer, ACRX_CMD_MODAL, NULL) //导入图层
//当前项目中注册命令 新建/删除/插入/导出/导入static void MidasMyGroupMyNewLayer(){CLayerOper m_layerOper;m_layerOper.NewLayer();}static void MidasMyGroupMyDelLayer(){CModifyLayer m_modifyLayer;m_modifyLayer.DelLayer();}static void MidasMyGroupMyModifyLayerColor(){CModifyLayer m_modifyLayer;m_modifyLayer.ModifyLayerColor();}static void MidasMyGroupMyExportLayer(){CModifyLayer m_modifyLayer;m_modifyLayer.ExportLayer();}static void MidasMyGroupMyImportLayer(){CModifyLayer m_modifyLayer;m_modifyLayer.ImportLayer();}
效果展示:
(23)ObjectARX2015 + vs2012操作图层相关推荐
- (15)ObjectARX2015 + vs2012创建三维实体
1. 说明 ObjectARX 中提供了三类创建三维实体的方法: (1)创建标准形状的实体 (2)拉伸面域创建实体 ...
- (7)ObjectARX2015 + vs2012创建多段线以及实体的旋转移动放缩
提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...
- (9)ObjectARX2015 + vs2012创建面域
提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...
- (12)ObjectARX2015 + vs2012创建尺寸标注
提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...
- (14)ObjectARX2015 + vs2012创建和编辑对象时的动态拖动技术
提示:看之前的博客(1)(4)和(12),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线 ...
- (6)ObjectARX2015 + vs2012创建圆弧
提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上. (1)ObjectARX2015 + vs2012创建直线_qq_ ...
- maptalks常见操作——图层置顶置底、添加清空图层、添加标注、切换底图、添加缩放工具、事件监听(点击面出弹框)、右键菜单、绘制mark、锁定视角
maptalks常见操作--图层置顶置底.添加清空图层.添加标注.切换底图.添加缩放工具.事件监听(点击面出弹框).右键菜单.绘制mark.锁定视角 1.图层置顶 置底 layer.show().br ...
- C# VS2012操作word文档 (二).插入表格图片
在上一篇文章"C# VS2012创建word文档.(一)"中我们讲述了如何使用VS2012引用COM中Miscrosoft Word 14.0 Object Library实现创建 ...
- C# VS2012操作word文档 (一).创建文档
该文章主要是讲述如何使用VS2012创建word文档,因为在项目中我们可能需要点击一个按钮把数据库中的项目表单或图片显示到word文档中,因此该文章主要分析如何使用VS2012创建word文档并填写相 ...
- (31)ObjectARX2015 + vs2012选择集
1. 说明 在 ObjectARX 开发过程中,经常需要用户和 AutoCAD 之间进行交互操作,除了前面介绍的acedGetXX系列函数之外,选择集是AutoCAD和用户交互操作的重 ...
最新文章
- mac terminal vim delete key
- C 指针的有意思的描述
- Redis资料汇总专题
- 原理图、PCB和实物是如何对应起来的
- 特征选择--文本分类: 信息增益
- 从实例入手学习Shiro与Web的整合
- 使用spring的@autowired注解,无法实例化dao
- 插入排序最优_排序专题插入排序
- 戴尔商台试机选购指南
- android 生成签名和SHA1签名信息
- CCLayer中Touch事件(Standard Touch Delegate Targeted Touch Delegate)
- mssql 不能连接mysql,ASP连接MSSQL的错误:拒绝访问_MySQL
- Aspose.Excel模板输出中名称管理器的使用
- fillna填充某一列_DataFrame基础运算以及空值填充的案例分析
- Android 开发中渐变背景的简单使用
- 《手把手教你构建自己的 Linux 系统》学习笔记(9)
- 信息系统项目管理师必背整体核心考点
- 秒懂Retrofit2之GsonConverter
- 简单归纳一下32位、64位、x86、x64的区别和联系
- 兼莱宝分享:不想一直打工,可以做这5个冷门生意,竞争比较小,利润却很不错
热门文章
- 开发一款游戏需要什么技术
- 上计算机课的心得体会作文,计算机学习心得体会范文
- 数据应用系统的压力测试方案
- 【LaTex】 Font “FandolSong-Regular“ does not contain requested(fontspec)Script “CJK“.如何抑制此种警告?
- 原生js获取浏览器语言配置,设置文本多语言(小demo)
- linux下kegg注释软件,如何使用KAAS进行KEGG注释
- 【RDMA】MPI over InfiniBand, Omni-Path, Ethernet/iWARP, and RoCE 测试结果
- 在latex中设置表格背景色
- jqGrid设置表格列的背景色
- MySQL中临时表(TEMPORARY)