圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
[assembly: CommandClass(typeof(IfoxDemo.Commands))]
namespace IfoxDemo
{
    // 新增的圆形闪烁命令实现
    public class Commands
    {
        [CommandMethod("xx")]
        public void FlashCircles()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                // 收集当前数据库中的所有圆形
                List<Entity> circleEntities = CollectAllCircles();

                if (circleEntities.Count == 0)
                {
                    ed.WriteMessage("\n未找到圆形实体。");
                    return;
                }

                // 设置圆形颜色为红色 (颜色索引1为红色)
                foreach (Circle circle in circleEntities)
                {
                    circle.ColorIndex = 1; // 红色
                }

                ed.WriteMessage($"\n找到 {circleEntities.Count} 个圆形。");
                ed.WriteMessage("\n按ESC键切换圆形的显示/隐藏状态,按其他键结束命令。\n");

                Flash circleFlash = null;
                bool circlesVisible = false; // 初始状态为隐藏

                while (true)
                {
                    // 提示用户操作
                    PromptPointOptions ppo = new PromptPointOptions("\n按ESC键切换圆形显示状态: \n");
                    PromptPointResult ppr = ed.GetPoint(ppo);

                    // 如果用户按ESC键
                    if (ppr.Status == PromptStatus.Cancel)
                    {
                        // 切换显示状态
                        circlesVisible = !circlesVisible;

                        if (circlesVisible)
                        {
                            // 创建瞬态显示 (显示红色圆形)
                            if (circleFlash != null)
                                circleFlash.FlashlistErase();

                            circleFlash = new Flash(circleEntities);
                            ed.WriteMessage("\n圆形已显示。");
                        }
                        else
                        {
                            // 移除瞬态显示 (隐藏圆形)
                            if (circleFlash != null)
                            {
                                circleFlash.FlashlistErase();
                                ed.WriteMessage("\n圆形已隐藏。");
                            }
                        }
                    }
                    else
                    {
                        // 用户点击鼠标
                        break;
                    }
                }

                // 确保清理资源
                if (circleFlash != null)
                    circleFlash.FlashlistErase();

                ed.WriteMessage("\n命令已结束。");
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\n错误: " + ex.Message);
            }
        }

        private List<Entity> CollectAllCircles()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            List<Entity> circles = new List<Entity>();

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                try
                {
                    // 获取模型空间
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                    // 遍历模型空间中的所有实体
                    foreach (ObjectId objId in btr)
                    {
                        if (objId.IsErased)
                            continue;

                        Entity ent = tr.GetObject(objId, OpenMode.ForRead) as Entity;
                        if (ent is Circle)
                        {
                            // 克隆圆形实体,避免直接修改原始对象
                            Circle circleClone = ent.Clone() as Circle;
                            //稍微移动一点,
                            circleClone.TransformBy(Matrix3d.Displacement(new Vector3d(0.01, 0.01, 0)));
                            circles.Add(circleClone);
                        }
                    }

                    tr.Commit();
                }
                catch (System.Exception ex)
                {
                    Editor ed = doc.Editor;
                    ed.WriteMessage("\n收集圆形错误: " + ex.Message);
                    tr.Abort();
                }
            }

            return circles;
        }
    }
    // 瞬态类封装代码保持不变
    public class Flash
    {
        public FlashEntity flash = null;
        public Entity ent = null;
        public List<FlashEntity> listflash = new List<FlashEntity>();
        public List<Entity> listent = new List<Entity>();

        public Flash(Entity ent)
        {
            this.ent = ent;
            flash = new FlashEntity(ent);
            Transient.CapturedDrawable = flash;
            TransientManager.CurrentTransientManager.AddTransient(flash,
                    TransientDrawingMode.Main, 128, new IntegerCollection());
        }

        public Flash(List<Entity> ents)
        {
            for (int i = 0; i < ents.Count; i++)
            {
                this.listent.Add(ents[i]);
                listflash.Add(new FlashEntity(listent[i]));
                Transient.CapturedDrawable = listflash[i];
                TransientManager.CurrentTransientManager.AddTransient(listflash[i],
                        TransientDrawingMode.Main, 128, new IntegerCollection());
            }
        }

        public void FlashUpdate(Entity ent)
        {
            if (ent == null)
            {
                this.ent = ent;
                flash = new FlashEntity(ent);
                Transient.CapturedDrawable = flash;
                TransientManager.CurrentTransientManager.AddTransient(flash,
                    TransientDrawingMode.Main, 128, new IntegerCollection());
            }
            else
            {
                this.ent = ent;
                flash._ent = ent;
                TransientManager.CurrentTransientManager.UpdateTransient(flash, new IntegerCollection());
            }
        }

        public void FlashUpdate(List<Entity> ents)
        {
            if (ents == null)
            {
                this.listent = ents;
                foreach (var item in ents)
                {
                    flash._ents.Add(item);
                }
                foreach (var item in listflash)
                {
                    Transient.CapturedDrawable = item;
                    TransientManager.CurrentTransientManager.AddTransient(item,
                        TransientDrawingMode.Main, 128, new IntegerCollection());
                }
            }
            else
            {
                this.listent = ents;

                for (int i = 0; i < ents.Count; i++)
                {
                    listflash[i]._ent = ents[i];
                }
                foreach (var item in listflash)
                {
                    TransientManager.CurrentTransientManager.UpdateTransient(item, new IntegerCollection());
                }
            }
        }

        public void FlashErase()
        {
            if (flash == null) return;
            flash._ent = null;
            TransientManager.CurrentTransientManager.EraseTransient(flash, new IntegerCollection());
            flash = null;
        }

        public void FlashlistErase()
        {
            if (listflash == null) return;
            foreach (var item in listflash)
            {
                item._ent = null;
            }

            foreach (var item in listflash)
            {
                TransientManager.CurrentTransientManager.EraseTransient(item, new IntegerCollection());
            }
            listflash = null;
        }
    }

    public class FlashEntity : Transient
    {
        public Entity _ent;
        public List<Entity> _ents = new List<Entity>();

        public FlashEntity(Entity ent)
        {
            _ent = ent;
        }

        public FlashEntity(List<Entity> ents)
        {
            foreach (var item in ents)
            {
                _ents.Add(item);
            }
        }

        protected override int SubSetAttributes(DrawableTraits traits)
        {
            traits.FillType = FillType.FillAlways;
            return (int)DrawableAttributes.IsAnEntity;
        }

        protected override void SubViewportDraw(ViewportDraw vd)
        {
            vd.Geometry.Draw(_ent);
            foreach (Entity ent in _ents)
            {
                vd.Geometry.Draw(ent);
            }
        }

        protected override bool SubWorldDraw(WorldDraw wd)
        {
            return false;
        }
    }

}

CAD插件定制联系↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山水CAD插件定制

你的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值