ObjectArx2010图层操作总结

2012-04-13 22:36:00|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:ObjectArx, C/C++, AutoCAD|来源:唯设编程网

4.导出图层到文件中

// 导出图层到文件中
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();
}

5. 从文件导入图层到模型空间

// 从文件导入图层
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开发过程中尽量使用第二种方案。

发表评论0条 】
网友评论(共?条评论)..
ObjectArx2010图层操作总结