2012-04-13 22:36:00|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:ObjectArx, C/C++, AutoCAD|来源:唯设编程网
// 导出图层到文件中 void CLayerOperator::ExportLayers(ACHAR* fileName) { //创建所要导出的文件 CStdioFile f2; CFileException err; if(!f2.Open(fileName,CFile::modeCreate|CFile::modeWrite,&err)){ acutPrintf(_T(" 创建导出文件失败!")); return; } //获得层表指针 AcDbLayerTable *pLayerTbl; AcDbLayerTableRecord *pLayerTblRcd; acdbHostApplicationServices() ->workingDatabase() ->getLayerTable(pLayerTbl,AcDb::kForRead); //使用遍历器访问每一条层表记录 AcDbLayerTableIterator *pItr; pLayerTbl->newIterator(pItr); f2.WriteString(LayerInfo::FormatTitle()); f2.WriteString(_T(" ")); for(pItr->start();!pItr->done();pItr->step()){ pItr->getRecord(pLayerTblRcd,AcDb::kForRead); //图层信息 LayerInfo layerInfo; //1.图层的名称 ACHAR *layerName; pLayerTblRcd->getName(layerName); //使用后需要手动free layerInfo.layerName=layerName; free(layerName); //2.图层的颜色 AcCmColor color=pLayerTblRcd->color(); layerInfo.colorIndex=color.colorIndex(); //3.图层的线型 AcDbLinetypeTableRecord *pLineTypeTblRcd; acdbOpenObject(pLineTypeTblRcd, pLayerTblRcd->linetypeObjectId(), AcDb::kForRead); ACHAR* lineTypeName; pLineTypeTblRcd->getName(lineTypeName); //使用后需要手动free pLineTypeTblRcd->close(); layerInfo.typeName=lineTypeName; free(lineTypeName); //4.图层的线宽 AcDb::LineWeight lineWeight=pLayerTblRcd->lineWeight(); layerInfo.weight=lineWeight; //将图层特性写入到文件中 f2.WriteString(layerInfo.ToString()); f2.WriteString(_T(" ")); pLayerTblRcd->close(); } delete pItr; pLayerTbl->close(); }
// 从文件导入图层 void CLayerOperator::ImportLayers(ACHAR* fileName) { //打开所要导入的文本文件 CStdioFile f; CFileException err; if(!f.Open(fileName,CFile::modeRead,&err)){ acutPrintf(_T(" 打开导入文件失败!")); return; } //读取文件中的每一行数据 CString strLineText; //读取标题行 if(!f.ReadString(strLineText)) return; while(f.ReadString(strLineText)){ //跳过空行 if(strLineText.IsEmpty()) continue; LayerInfo layInfo=LayerInfo::LoadByStr(strLineText); //加载图层到图形数据库 LoadLayer(layInfo); } }
依据文件信息创建图层时,很可能出现指定的现在没有载入的情况,关于ObjectArx导入线型,网上搜集了很多资料,总结了以下两种方法。
a.使用命令的方式导入线型,具体代码如下:
// 采用命令方式加载一种新的线型 bool CLayerOperator::_CMDLoadLineType(ACHAR* linetype){ AcDbLinetypeTable *pLinetypeTbl; bool flag1=true; acdbHostApplicationServices() ->workingDatabase() ->getSymbolTable(pLinetypeTbl, AcDb::kForRead); if(!pLinetypeTbl->has(linetype)) flag1=false; pLinetypeTbl->close(); if(!flag1){ if(acedCommand(RTSTR, _T("LINETYPE"), RTSTR, _T("L"), RTSTR, linetype, RTSTR, _T(""), RTSTR, _T(""), 0)!=RTNORM) acutPrintf(_T(" 调入线型%s时出现错误!"),linetype); return false; } return true; }
b.直接使用ObjectArx2010提供的API函数
//加载线型 //数入参数:AcDbDatabase *pDb, 数据库 // const CString linetype 线型名称 AcDbObjectId CLayerOperator::LoadLineType(const ACHAR* linetype, const ACHAR* fileName, AcDbDatabase* pDb) { AcDbObjectId lineTypeId=GetLineId(linetype,pDb); //对应名称的线型已经存在 if(lineTypeId!=0) return lineTypeId; //从文件中加载线型 Acad::ErrorStatus es=pDb->loadLineTypeFile(linetype,fileName); //如果加载成功 if(es==Acad::eOk){ lineTypeId=GetLineId(linetype,pDb); }else{//如果加载失败,返回默认的ID lineTypeId=GetLineId(_T("Continous"),pDb); } return lineTypeId; } //取得线型ID //输入参数:AcDbDatabase* pDb, 数据库 // const ACHAR *LineName 线型名称 AcDbObjectId CLayerOperator::GetLineId(const ACHAR *LineName, AcDbDatabase* pDb) { AcDbLinetypeTable* pTable=NULL; AcDbObjectId id=AcDbObjectId::kNull; pDb->getLinetypeTable(pTable,AcDb::kForRead); if(pTable){ Acad::ErrorStatus Error=pTable->getAt(LineName,id); pTable->close(); } return id; }
读者可以根据实际情况选用,笔者建议在ObjectArx2010开发过程中尽量使用第二种方案。