一般来说,更改图层设置后需要重生成图纸,但是重生成时间开销太大。为了降低时间开销,可以采取以下两种方法。
一、通过设置LAYLOCKFADECTL避免重生成
找到需要锁定的图层,打开它,设置其为锁定状态。但是注意,使用该方式前必须设置LAYLOCKFADECTL系统变量为一个新值,设定图层锁定后再设回原值。
void SetLayLock()
{int iOldLockFade, iNewLockFade;struct resbuf buf;acedGetVar(_T("LAYLOCKFADECTL"), &buf);iOldLockFade = buf.resval.rint;iNewLockFade = iOldLockFade ? -iOldLockFade : 1;buf.resval.rint = iNewLockFade;acedSetVar(_T("LAYLOCKFADECTL"), &buf); //这一步必不可少,否则不会暗显锁定图层的对象//提示用户选择一个实体ads_name ss;ads_point pt;if (RTNORM != acedEntSel(_T("请选择一个实体"), ss, pt))return;AcDbObjectId id;if (Acad::eOk == acdbGetObjectId(id, ss)){AcDbEntity* pEnt;if (Acad::eOk == acdbOpenObject(pEnt, id, AcDb::kForRead)){id = pEnt->layerId();pEnt->close();AcDbLayerTableRecord* pLyrRec;if (Acad::eOk == acdbOpenObject(pLyrRec, id, AcDb::kForWrite)){pLyrRec->setIsLocked(true);pLyrRec->close();}}}buf.resval.rint = iOldLockFade;acedSetVar(_T("LAYLOCKFADECTL"), &buf);//这一步必不可少
}
二、直接向CAD发送命令
这种方法同样不需要重生成图纸,但是并不推荐,首先是CAD命令行最多只能输入256个字符,当需要锁定多个图层(在ads_command的实参字符串中,每个图层名中用,隔开)时,ads_command实参字符串长度可能超过256;其次,图层名称中含有诸如#、.等通配符时需要特殊处理;最后,由于未知的原因,采用发送命令的方式无法锁定部分图层。
void SetLayLock2()
{//提示用户选择一个实体ads_name ss;ads_point pt;if (RTNORM != acedEntSel(_T("请选择一个实体"), ss, pt))return;CString sLayer;TCHAR* pszLayer;AcDbObjectId id;if (Acad::eOk == acdbGetObjectId(id, ss)){AcDbEntity* pEnt;if (Acad::eOk == acdbOpenObject(pEnt, id, AcDb::kForRead)){pszLayer= pEnt->layer();sLayer = pszLayer;acutDelString(pszLayer);pEnt->close();}}if (!sLayer.IsEmpty())ads_command(RTSTR, _T("-layer"), RTSTR, _T("lo"), RTSTR, sLayer, RTSTR, _T(""), RTNONE);
}