图层操作
//从CAD的图层表中获取指定图层的ID(图层名称)AcDbObjectId CLayerUtil::GetLayerId(const TCHAR * layerName)
{
assert(layerName != NULL);
AcDbLayerTable *lTable = NULL;//AcDbLayerTable是AutoCAD中存储图层信息的数据结构
if (acdbHostApplicationServices()->workingDatabase()->getSymbolTable(lTable, AcDb::OpenMode::kForRead) != ErrorStatus::eOk)
return AcDbObjectId::kNull;//打开工作数据库并将lTable指向它,以读取模式打开
AcDbObjectId lId;//存储图层的ID
//检查指定的图层名是否存在于图层表中
if (lTable->has(layerName)) {
lTable->getAt(layerName, lId);
//如果指定的图层名存在于图层表中,这行代码将从图层表中获取该图层的ID,并将其存储在变量lId中
}
lTable->close();//关闭图层表,释放相关资源
return lId;//返回存储在变量lId中的图层ID
}
//处理AutoCAD的图层(图层名称,颜色索引)
AcDbObjectId CLayerUtil::Add(const ACHAR* layerName, const int colorIndex)
{
assert(layerName != NULL);//图层名称是否为空
bool colorRight = (colorIndex >= 1 && colorIndex <= 255);
assert(colorRight);//颜色索引是否在1到255的范围内
if (!colorRight)
{
acutPrintf(采用T("\n颜色索引值无效!"));
}
AcDbLayerTable* lTable = NULL;//AcDbLayerTable是AutoCAD中存储图层信息的数据结构。
if (acdbHostApplicationServices()->workingDatabase()->getSymbolTable(lTable, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
return AcDbObjectId::kNull;
if (lTable->has(layerName)) {
//检查指定的图层名是否已经存在于图层表中
lTable->close();
acutPrintf(TEXT("已存在该层名\n"));
return AcDbObjectId::kNull;
}
else {
//新建图层
AcDbLayerTableRecord* lRec = new AcDbLayerTableRecord();
lRec->setName(layerName);
//创建一个新的AcCmColor对象,并将其指针赋值给c。
AcCmColor* c = new AcCmColor();
//然后设置这个颜色的颜色索引为输入的colorIndex
c->setColorIndex(colorIndex);
lRec->setColor(*c);//将新图层的颜色设置为上一步创建的颜色的副本。
AcDbObjectIdlId;//存储新图层的ID。
lTable->add(lId, lRec);//将新图层添加到图层表中,并将新图层的ID存储在lId中
lRec->close(); //关闭新创建的图层记录,释放其内存
delete c;//删除创建的AcCmColor对象,释放其内存
lTable->close();
acutPrintf(TEXT("添加成功\n"));
return lId;
}
}
//设置指定图层的颜色(图层的名称,颜色索引)
bool CLayerUtil::SetColor(const TCHAR * layerName, const int colorIndex)
{ //将图层名称转换为图层ID,并将其赋值给lId
AcDbObjectId lId = GetLayerId(layerName);
assert(colorIndex >= 1 && colorIndex <= 255);
if (lId.isNull()) {
return false;
}
else
{
AcDbLayerTableRecord *lRec = NULL; // AutoCAD的图层表记录。
if (acdbOpenObject(lRec, lId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
return false;
AcCmColor *color = new AcCmColor();
color->setColorIndex(colorIndex);//设置新创建的颜色的颜色索引为输入的颜色索引
lRec->setColor(*color);//将新创建的颜色应用到打开的图层记录
delete color;
lRec->close();
return true;
}
}
//获取AutoCAD图层表中所有图层的ID
void CLayerUtil::GetLayerList(AcDbObjectIdArray & lIds)
{
AcDbLayerTable *lTable = NULL; //存储图层信息的数据
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(lTable, AcDb::OpenMode::kForRead);
AcDbLayerTableIterator * lIter = NULL;//这个迭代器用于遍历图层表
lTable->newIterator(lIter);//创建一个新的图层表迭代器,并将其赋值给lIter
for (lIter->start(); !lIter->done();lIter->step())
/*这是一个循环,开始于图层表的起始位置,当迭代器没有完成时
(即还有更多的图层),循环会继续。每次迭代后,
都会调用lIter->step()来前进到下一个图层。*/
{ //使用迭代器的getRecordId方法获取当前图层的ID,并将其赋值给lId
AcDbObjectId lId;
lIter->getRecordId(lId);
lIds.append(lId);//将当前图层的ID添加到输入参数lIds
}
delete lIter;//删除图层表迭代器,释放其占用的内存
} // 新建一个图层
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); //这里的layerName需要用(采用T("?"))这种格式来命名
//将新建的层表记录添加到层表中
AcDbObjectId layerTblRcdId;
pLayerTbl->add(layerTblRcdId,pLayerTblRcd);
//设置图形的当前图层
acdbHostApplicationServices()
->workingDatabase()
->setClayer(layerTblRcdId);
//关闭层表
pLayerTblRcd->close();
pLayerTbl->close();
}
使用图形对话框设置指定图层的颜色// 使用图形对话框设置指定图层的颜色
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();
}
页:
[1]