• ObjectARX如何锁定一个图层


    一般来说,更改图层设置后需要重生成图纸,但是重生成时间开销太大。为了降低时间开销,可以采取以下两种方法。

    一、通过设置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);//这一步必不可少
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    二、直接向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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    SQL基础理论篇(九):存储过程
    数据结构—线性表(下)
    小程序request请求封装
    开发工程师必备————【Day17】q前端HTML基础知识点
    多线程编程
    SpringMVC之JSON返回及异常处理机制
    基于Nodejs的电博客管理系统的设计和实现
    Java 基于 SpringBoot+Vue 的留守儿童关爱网站
    WebSocketSession 发布订阅模式的学习
    计算机网络:应用层 (DNS FTP)
  • 原文地址:https://blog.csdn.net/mary288267/article/details/126470626