admin 发表于 2024-3-6 11:44:44

图层操作

//从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;//删除图层表迭代器,释放其占用的内存
}

admin 发表于 2024-3-6 11:51:04

        // 新建一个图层
        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();
        }

admin 发表于 2024-3-6 11:51:21

使用图形对话框设置指定图层的颜色// 使用图形对话框设置指定图层的颜色
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();
}

admin 发表于 2024-3-6 11:51:34

删除一个图层// 删除一个图层
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]
查看完整版本: 图层操作