天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 67|回复: 0

ObjectARX如何锁定一个图层

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
一般来说,更改图层设置后需要重生成图纸,但是重生成时间开销太大。为了降低时间开销,可以采取以下两种方法。

一、通过设置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);
}

[code]原文链接:https://blog.csdn.net/mary288267/article/details/126470626[/code]

 

 

 

 

ObjectARX如何锁定一个图层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:26 , Processed in 0.138372 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表