ObjectArx2010图层操作总结

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

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

1. 新建一个图层

CLayerOperator定义了NewLayer函数,用于完成图层的新建操作,NewLayer的完整代码如下:

// 新建一个图层
void CLayerOperator::NewLayer(ACHAR* layerName)
{
    //获得当前图形的层表
    AcDbLayerTable *pLayerTbl;
    acdbHostApplicationServices()
        ->workingDatabase()
        ->getLayerTable(pLayerTbl,AcDb::kForWrite);

    //是否已经包含指定的层表记录
    if(pLayerTbl->has(layerName)){
        pLayerTbl->close();
        acedPrompt(_T("对应名称的图层已经存在!"));
        return;
    }

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

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

    //设置图形的当前图层
    acdbHostApplicationServices()
        ->workingDatabase()
        ->setClayer(layerTblRcdId);

    pLayerTblRcd->close();
    pLayerTbl->close();
}

NewLayer的具体实现注释已经非常详尽,首先获得当前图形的层表,然后判断层表中是否已经存在指定名称的图层,如果是,则直接返回,否则创建层表记录并将新建的层表记录添加到层表中,最后通过AcDbDatabase类的setClayer函数将新建的图层设置成当前图层。

2.使用图形对话框设置指定图层的颜色

// 使用图形对话框设置指定图层的颜色
void CLayerOperator::SetLayerColor(ACHAR* layerName)
{
    //获得当前图形的层表
    AcDbLayerTable *pLayerTbl;
    acdbHostApplicationServices()
        ->workingDatabase()
        ->getLayerTable(pLayerTbl,AcDb::kForRead);

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

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

3.删除一个图层

// 删除一个图层
void CLayerOperator::DelLayer(ACHAR* layerName)
{
    //获得当前图形的层表
    AcDbLayerTable *pLayerTbl;
    acdbHostApplicationServices()
        ->workingDatabase()
        ->getLayerTable(pLayerTbl,AcDb::kForRead);

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

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

    pLayerTblRcd->close();
    pLayerTbl->close();
}
发表评论0条 】
网友评论(共?条评论)..
ObjectArx2010图层操作总结