• cad.net 图层解锁时图层褪色度设置LayLockFadectl


    说明

    cad交互操作的时候,想跟cad的锁定和解锁一样拥有褪色度,那么你需要阅读此篇

    代码

    #if !HC2020
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Runtime;
    using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
    #else
    using GrxCAD.DatabaseServices;
    using GrxCAD.EditorInput;
    using GrxCAD.Runtime;
    using Acap =  GrxCAD.ApplicationServices.Application;
    #endif
    using System;
    
    namespace JoinBox
    {
        public class 选择图元设置图层褪色度
        {
            [CommandMethod("JJCmd_lock1")]
            public void JJCmd_lock1()
            {
                var dm = Acap.DocumentManager;
                var doc = dm.MdiActiveDocument;
                var db = doc.Database;
                var ed = doc.Editor;
    
                var pr = ed.GetEntity("\n请选择图元:锁定");
                if (pr.Status != PromptStatus.OK)
                    return;
                db.Action(tr => {
                    var getEnt = pr.ObjectId.ToEntity(tr);
                    getEnt.LayerLock(true, tr);
                });
            }
    
            [CommandMethod("JJCmd_lock2")]
            public void JJCmd_lock2()
            {
                var dm = Acap.DocumentManager;
                var doc = dm.MdiActiveDocument;
                var db = doc.Database;
                var ed = doc.Editor;
    
                var peo1 = new PromptEntityOptions("\n请选择图元:解锁")
                {
                    AllowObjectOnLockedLayer = true,
                    AllowNone                = true
                };
                var pr = ed.GetEntity(peo1);
                if (pr.Status != PromptStatus.OK)
                    return;
                db.Action(tr => {
                    var getEnt = pr.ObjectId.ToEntity(tr);
                    getEnt.LayerLock(false, tr);
                });
            }
        }
    }
    
    namespace JoinBox
    {
        public static partial class LayerHelper
        {
            /// <summary>
            /// 按图元锁定或解锁图层
            /// </summary>
            /// <param name="ent">图元实体</param>
            /// <param name="locked"><see langword="true"/>锁定,<see langword="false"/>解锁</param>
            /// <returns>原本状态</returns>
            public static bool LayerLock(this Entity ent, bool locked, Transaction tr)
            {
                return LayerLock(locked, ent.LayerId, tr, ent.Database);
            }
    
            /// <summary>
            /// 按层名锁定或解锁图层
            /// </summary>
            /// <param name="locked"><see langword="true"/>锁定,<see langword="false"/>解锁</param>
            /// <param name="layerId">图层</param>
            /// <param name="tr">事务</param>
            /// <param name="db">数据库</param>
            /// <returns>图层原本锁定的状态</returns>
            public static bool LayerLock(bool locked, ObjectId layerId, Transaction tr, Database db)
            {
                if (locked)
                {
                    //锁定图层:
                    //先遍历这个图层的图元,把它放入刷新队列,因为图层锁了的话图元就无法更改了
                    SetLayLockFadectl(true, layerId, tr, db);
                }
    
                bool oldSetting = false;
                var ltr = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;
                if (ltr != null)
                {
                    ltr.UpgradeOpen();
                    oldSetting = ltr.IsLocked;//原本的状态
                    ltr.IsLocked = locked;
                    ltr.IsOff = ltr.IsOff; //必须设置一下才能更新显示
                    ltr.DowngradeOpen();
                    ltr.Dispose();
                }
    
                if (!locked)
                {
                    //解锁图层:
                    //上面先解锁,再处理褪色度显示,因为图层锁了的话图元就无法更改了
                    SetLayLockFadectl(false, layerId, tr, db);
                }
                return oldSetting;
            }
    
            /// <summary>
            /// 设置图层褪色度显示
            /// </summary>
            /// <param name="locked"><see langword="true"/>锁定,<see langword="false"/>解锁</param>
            /// <param name="layerId">图层</param>
            /// <param name="tr">事务</param>
            /// <param name="db">数据库</param>
            static void SetLayLockFadectl(bool locked, ObjectId layerId, Transaction tr, Database db)
            {
                const string str = "LayLockFadectl";
                var value = int.Parse(CadSystem.Getvar(str));
                value = Math.Abs(value);//锁定-绝对值褪色...设置了会自动刷新屏幕显示
                if (!locked)
                    value *= -1;//解锁-负数...设置完之后要手动刷新
                CadSystem.Setvar(str, value.ToString());
    
                //方案一:获取屏幕内的图元...成功是成功,但是不在屏幕内的褪色度没有变化
                //var ids = ed.SelectViewportObjectId();
                //if (ids == null)
                //    return;
                //ids.ToEntity(tr, entItem => {
                //    entItem.EntityRedraw(BrightEntity.RecordGraphicsModified);
                //});
    
                //方案二:这个刷新不成功...博客搜:动画
                //ed.UpdateScreenEx();
    
                //方案三:遍历全图,过滤指定图层图元...这个TraverseEntitys函数在: https://www.cnblogs.com/JJBox/p/12196287.html
                db.TraverseEntitys(tr, entItem => {
                    if (entItem.LayerId == layerId)
                        entItem.EntityRedraw(BrightEntity.RecordGraphicsModified);
                    return false;
                });
    
                //解锁图层之后,有其他图层是锁定的,那么此时需要还原褪色度
                if (!locked)
                    CadSystem.Setvar(str, (value * -1).ToString());
            }
    
    
        }
    }
    
    public static class EditorHelper
    {
        /// <summary>
        /// 获取当前屏幕的所有图元
        /// </summary>
        /// <param name="ed"></param>
        /// <param name="tr"></param>
        /// <returns></returns>
        public static ObjectId[] SelectViewportObjectId(this Editor ed)
        {
            var view = ed.GetCurrentView();
            var cpt = view.CenterPoint;
            var w = view.Width / 2;
            var h = view.Height / 2;
          
            var min = new Point3d(cpt.X - w, cpt.Y - h, 0);
            var max = new Point3d(cpt.X + w, cpt.Y + h, 0);
            var ssget = ed.SelectCrossingWindow(min, max);
            if (ssget.Status != PromptStatus.OK)
                return null;
            return ssget.Value.GetObjectIds();
        }
    }
    

    特别说明

    0x01

    解锁是必须遍历全图的,若只遍历当前屏幕的图元,会呈现这样的效果,屏幕外没有退出淡显:

    0x02

    e大告诉我这个神奇的地方,估计是触发了某些桌子内部机制,就好像WPF的数据绑定触发?
    可以尝试注释掉这句再运行,会发现锁定褪色都不成功.acad08测试.
    ltr.IsOff = ltr.IsOff;

    相关说明

    cad.net 图元动画效果+图元刷新

    (完)

  • 相关阅读:
    浏览器报错:unexpected end of input 解决方法
    MySQL 分库分表方案,总结的非常好!
    打给比较形象的比方,就是你拿着大白菜去大街上卖。这大白菜就你自己(预估自己的价格:价格喊高了,把白菜价当灵芝价卖,把买家都吓跑了,也就无人问津了。报价过低,则委屈了自己),要提前写出月薪范围,节省双方时间
    一张图弄明白开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别
    一个简单的C++性能测试工具(ms级别)
    VS2005下第一个ATL
    Boost::thread库的使用
    简易安装python统计包
    pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
    Parallel.Invoke并行你的代码
  • 原文地址:https://www.cnblogs.com/JJBox/p/15995259.html
Copyright © 2020-2023  润新知