LAYER命令:图层特性管理器:查看图层指针
锁定图层: layiso ;解锁图层:layunisocode
建立图层记录:orm
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(); }
修改指定图层的颜色get
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(); }
删除指定的图层it
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(); }
全部图层及其特性导出到文本文件io
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(); }
根据文本文件导入全部图层及其特性class
//读取一行文本以后,须要根据分隔符( “,” )来解析出图层的名称、颜色、线型和线宽 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(); }