ObjectARX_符号表---->图层

LAYER命令:图层特性管理器:查看图层

锁定图层: layiso ;解锁图层:layuniso

创建图层记录:

void ZffCHAP4NewLayer()
{
// 提示用户输入新建图层的名称
char layerName[100];
if (acedGetString(Adesk::kFalse, "\n输入新图层的名称:",layerName) != RTNORM)
   return;

// 获得当前图形的层表
AcDbLayerTable *pLayerTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);

// 是否已经包含指定的层表记录
if (pLayerTbl->has(layerName))
{
pLayerTbl->close();
return;
}

// 创建新的层表记录
AcDbLayerTableRecord *pLayerTblRcd = new AcDbLayerTableRecord();
pLayerTblRcd->setName(layerName);

// 设置颜色,层的其他属性(线型等)都用缺省值
AcCmColor color; 
color.setColorIndex(1); 
pLayerTblRcd->setColor(color); 

// 将新建的层表记录添加到层表中
AcDbObjectId layerTblRcdId;
pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
pLayerTblRcd->close();
pLayerTbl->close();
}

修改指定图层的颜色

void ZffCHAP4LayerColor()
{
// 提示用户输入要修改的图层名称
char layerName[100];
if (acedGetString(Adesk::kFalse, "\n输入图层的名称:",layerName) != RTNORM)
  return;

// 获得当前图形的层表
AcDbLayerTable *pLayerTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);

// 判断是否包含指定名称的层表记录
if (!pLayerTbl->has(layerName))
{
pLayerTbl->close();
return;
}

// 获得指定层表记录的指针
AcDbLayerTableRecord *pLayerTblRcd = NULL;
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();
}

删除指定的图层

void ZffCHAP4DelLayer()
{
// 提示用户输入要修改的图层名称
char layerName[100];
if (acedGetString(Adesk::kFalse, "\n输入图层的名称:",layerName) != RTNORM)
return;

// 获得当前图形的层表
AcDbLayerTable *pLayerTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);

// 判断是否包含指定名称的层表记录
if (!pLayerTbl->has(layerName))
{
pLayerTbl->close();
return;
}

// 获得指定层表记录的指针
AcDbLayerTableRecord *pLayerTblRcd = NULL;
pLayerTbl->getAt(layerName, pLayerTblRcd, AcDb::kForWrite);
pLayerTblRcd->erase();  // 为其设置“删除”标记
pLayerTblRcd->close();
pLayerTbl->close();
}

所有图层及其特性导出到文本文件

void ZffCHAP4ExportLayer()
{
// 创建所要导出的文本文件
CStdioFile f;
CFileException e;
char *pFileName = "C:\\layers.txt";
if (!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite, &e))
{
acutPrintf("\n创建导出文件失败!");
return;
}

// 获得层表指针
AcDbLayerTable *pLayerTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);

// 使用遍历器访问每一条层表记录
AcDbLayerTableIterator *pItr = NULL;
AcDbLayerTableRecord *pLayerTblRcd = NULL;
pLayerTbl->newIterator(pItr);
for (pItr->start(); !pItr->done(); pItr->step())
{
pItr->getRecord(pLayerTblRcd, AcDb::kForRead);

// 输出图层的信息
CString strLayerInfo; // 图层名称
char *layerName = NULL;
pLayerTblRcd->getName(layerName);
strLayerInfo = layerName;
free(layerName);

strLayerInfo += ",";  // 分隔符
CString strColor; // 图层颜色
AcCmColor color = pLayerTblRcd->color();
strColor.Format("%d", color.colorIndex());
strLayerInfo += strColor;

strLayerInfo += ",";
CString strLinetype; // 图层线型
AcDbLinetypeTableRecord *pLinetypeTblRcd = NULL;
acdbOpenObject(pLinetypeTblRcd,pLayerTblRcd->linetypeObjectId(),AcDb::kForRead);
char *linetypeName = NULL;
pLinetypeTblRcd->getName(linetypeName);
pLinetypeTblRcd->close();
strLinetype = linetypeName;
free(linetypeName);
strLayerInfo += strLinetype;

strLayerInfo += ",";
CString strLineWeight;  // 图层的线宽
AcDb::LineWeight lineWeight = pLayerTblRcd->lineWeight();
strLineWeight.Format("%d", lineWeight);
strLayerInfo += strLineWeight;

// 将图层特性写入到文件中
f.WriteString(strLayerInfo);
f.WriteString("\n");
pLayerTblRcd->close();
}
delete pItr;
pLayerTbl->close();
}

根据文本文件导入所有图层及其特性

//读取一行文本之后,需要根据分隔符( “,” )来解析出图层的名称、颜色、线型和线宽
BOOL GetFieldText(CString strLineText, CStringArray &fields)
{ 
if (strLineText.Find(",", 0) == -1) // 如果找不到英文逗号,函
数退出
{
return FALSE;
} 
int nLeftPos = 0, nRightPos = 0; // 查找分隔符的起始位置
while ((nRightPos = strLineText.Find(",", nRightPos)) != -1)
{
fields.Add(strLineText.Mid(nLeftPos, nRightPos - nLeftPos));
nLeftPos = nRightPos + 1;
nRightPos++; 
}
// 最后一个列的数据
fields.Add(strLineText.Mid(nLeftPos));
return TRUE;
}

void ZffCHAP4ImportLayer()
{
// 打开所要导入的文本文件
CStdioFile f;
CFileException e;
char *pFileName = "C:\\layers.txt";
if (!f.Open(pFileName, CFile::modeRead, &e))
{
acutPrintf("\n打开导入文件失败!");
return;
}

// 获得层表指针
AcDbLayerTable *pLayerTbl = NULL;
AcDbLayerTableRecord *pLayerTblRcd = NULL;
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 = NULL;
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 = atoi(layerInfos.GetAt(1));
color.setColorIndex(colorIndex);
pLayerTblRcd->setColor(color);

// 设置线型
AcDbLinetypeTable *pLinetypeTbl = NULL;
AcDbObjectId linetypeId;
acdbHostApplicationServices()->workingDatabase()->getLinetypeTable(pLinetypeTbl,AcDb::kForRead);
if (pLinetypeTbl->has(layerInfos.GetAt(2)))
{
pLinetypeTbl->getAt(layerInfos.GetAt(2), linetypeId);
}
else
{
pLinetypeTbl->getAt("Continous", linetypeId);
}
pLayerTblRcd->setLinetypeObjectId(linetypeId);
pLinetypeTbl->close();

// 设置线宽
AcDb::LineWeight lineWeight =(AcDb::LineWeight)atol(layerInfos.GetAt(3)); 
pLayerTblRcd->setLineWeight(lineWeight);
pLayerTblRcd->close();
}
pLayerTbl->close();
}

转载于:https://my.oschina.net/u/2930533/blog/1596681

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX是一种用于AutoCAD软件定制化开发的API。张帆的《ObjectARX开发实例教程》是一本适合初学者入门的书籍,通过实例的方式对ObjectARX进行系统性讲解。 本书共分为18章,从AutoCAD开发环境的搭建开始讲起,引领读者逐步深入了解ObjectARX。每一章都包含了相关实例,全面讲解了AutoCAD编程基础、ObjectARX、COM技术等相关知识点,让读者能够深入了解各种开发技术,如绘图、编辑、图形操作等。 本书的实例都是实用性强、综合性好的项目,作者在实例讲述了ObjectARX的各种技术应用,通过详细讲解及代码演示,使读者能够掌握这些方法,进而灵活应用到实际项目。此外,文还介绍了D-BASE文件格式、UNIX操作系统等相关知识,以帮助读者更好地理解AutoCAD的架构原理。 总之,张帆的《ObjectARX开发实例教程》是一本详实而全面的AutoCAD相关书籍,适合有编程基础并对AutoCAD感兴趣的读者学习参考。其的案例演示丰富,对初学者来说十分友好,同时也能帮助已有一定开发经验的开发人员深造提高。 ### 回答2: ObjectARX是AutoCAD的开放式编程接口,使得开发者可以在AutoCAD上创建个性化的工具和应用程序。这使得AutoCAD成为一个灵活性更高的应用程序。 张帆的《ObjectARX开发实例教程》是一本以实践为主的教程,带领读者从零开始学习如何使用ObjectARX进行自定义开发。教程分为四部分,以一个图像处理器为示例介绍了ObjectARX的编写、调试、应用等技术。 第一部分介绍了ObjectARX的介绍、编程工具的准备和环境的搭建。第二部分从绘图交互的角度介绍了如何利用ObjectARX实现AutoCAD图形处理。第三部分以实例介绍了如何利用ObjectARX编写实用功能的插件程序,并介绍了用户界面设计方面的知识。第四部分介绍了如何编写和发布新的应用程序。 在实例教程,张帆深入深出地剖析了ObjectARX开发的重要概念和技巧,介绍了它们在实际编程过程的应用。该书比较深入且严谨,可以帮助读者了解ObjectARX的各种实用细节,同时它也适合有一定编程基础的开发者学习。 总之,《ObjectARX开发实例教程》是入门到高阶的一本好书,对初学者和已有一定开发经验的开发者都非常适用。它既介绍了ObjectARX的基础,又让读者从编写插件和应用程序的角度发掘ObjectARX的灵活性和强大性。这使得读者可以在实践学习编程技术,提升创造的灵活性和效率。 ### 回答3: “ObjectARX开发实例教程”是一本详细介绍了如何使用Autodesk的ObjectARX编程接口来进行CAD软件二次开发的实战教程。本书作者张帆是一位经验丰富的Autodesk软件开发专家,既有实践经验,也有丰富的教学经验,因此他在本书将所涉及的内容讲解得非常清晰易懂。 本书从基础概念入手,先介绍了Autodesk的CAD软件和ObjectARX编程接口的基本知识,并且提供了许多实例来帮助读者更好地理解这些知识。在后续章节,作者则依次介绍了ObjectARX的各个重要模块,如数据库、图形界面、用户界面、3D绘图等,针对每个模块提供了大量的实例代码,并详细讲解了其实现原理和使用技巧。 作为一本实战教程,本书还提供了很多实际应用场景下的编程技巧,例如如何处理大型CAD工程,如何实现CAD联网等等,这些内容将对实际开发非常有帮助。 总之,“ObjectARX开发实例教程”是一本很实用的CAD软件开发教程,对于想要学习ObjectARX编程接口的开发人员来说,读本书将是一种强有力的支持和帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值