|
- //从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);//将新图层的颜色设置为上一步创建的颜色的副本。
- AcDbObjectId lId;//存储新图层的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;//删除图层表迭代器,释放其占用的内存
- }
复制代码 |
|