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开发过程中尽量使用第二种方案。