圆周期性显示和消失——瞬态实现(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插件定制联系↓↓↓