|
项目场景:绘制对线并设置图层
画一条线, 并且给这条线设置一个具有新名字的新图层,
但这里有个遗留问题: 如果设置的新的图层名字原本已经有了, 则会把这条线设置到0层, 而不是直接把这条直线设置到已经有重名的那个图层
这个遗留问题等后续再解决吧. 暂时记录下
解决方案:对张帆书中代码进行了修改
首先是创建一条直线
AcGePoint3d ptStart(0, 0, 0);
AcGePoint3d ptEnd(-100, 100, 0);
AcDbObjectId lineId = CLineUtil::Add(ptStart, ptEnd);
创建后再用SetLayer函数进行图层设置
CEntityUtil::SetLayer(lineId, _T("站场图层"))
1
然后用设置图层的函数把这条直线设置上图层信息
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
AcDbEntity* pEnt = NULL;
if (acdbOpenObject(pEnt,EntityId, AcDb::kForWrite)==Acad::eOk)
{
AcDbLayerTable* pLayerTbl;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);
if (pLayerTbl->has(layerName))
{
acedPrompt(_T("图层已经存在!"));
pEnt->setLayer(layerName);
pLayerTbl->close();
pEnt->close();
return;
}
else
{
AcDbLayerTableRecord* pLayerTblRcd;
pLayerTblRcd = new AcDbLayerTableRecord;
pLayerTblRcd->setName(layerName);
AcDbObjectId layerTblRcdId;
pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
pEnt->setLayer(layerTblRcdId);
pLayerTblRcd->close();
pLayerTbl->close();
pEnt->close();
}
}
else
{
pEnt->close();
acutPrintf(_T("实体对象有错误!"));
}
}
上面的SetLayer函数中的缺陷等后续章节学习后再回头思考问题和解决
张帆书中的SetLayer代码是假设在dwg中已经有了要设置的图层了, 再把对象按照这个既有图层的名字来给对象设置,
如果在dwg中没有要设置的图层, 那么就会赋给对象一个0层作为默认
//张帆书中原版的设置图层代码:
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
AcDbEntity* pEnt = NULL;
if (acdbOpenObject(pEnt, EntityId, AcDb::kForWrite) == Acad::eOk)
{
pEnt->setLayer(layerName);
pEnt->close();
}
}
|
|