2012-04-13 22:36:00|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:ObjectArx, C/C++, AutoCAD|来源:唯设编程网
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函数将新建的图层设置成当前图层。
// 使用图形对话框设置指定图层的颜色 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(); }
// 删除一个图层 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(); }