|
一般来说,更改图层设置后需要重生成图纸,但是重生成时间开销太大。为了降低时间开销,可以采取以下两种方法。
一、通过设置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);
} |
|