天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 61|回复: 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);

}

 

 

 

 

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

本版积分规则

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

GMT+8, 2024-11-1 10:22 , Processed in 0.150517 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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