| 
积分19248明经币 个注册时间2015-8-18在线时间 小时威望 金钱 个贡献 激情  
 | 
 
| 本帖最后由 你有种再说一遍 于 2025-11-1 02:02 编辑 
 众所周知,C#有个瞬态图元,并且有个main模式是刷新不消失的.
 有什么功能是我们必须要用瞬态实现而不是普通图元呢?
 1,无加载插件和加载后下次打开,都不应该显示的.
 如果用普通图元,命令事件的保存命令触发时候也可以删除普通图元,不过如果有其他插件通过`doc.CloseAndSave()`就出现幽灵图元污染了数据库,这是极其不专业的行为.
 2,数据库进出事件不触发.
 3,选择事件不触发.
 
 满足上述这种情况的有:bo边界出现不闭合的圆圈.
 似乎有点寡淡,为什么只有这个命令用到,还有啥情况是必须用到呢?
 今天给大家带来一个功能就很好的用到以上特性.
 
 
 用布局画图的人会频繁切换布局,然后一旦切换就令视口重绘,如何降低这种重绘带来的卡顿呢?
 那就是把布局的图元chspace过来.
 
 chspace哪个视口呢?
 我们提前把所有视口的边界用瞬态映射到模型,然后通过交互视口影子就可以实现了.
 
 chspace什么范围的图元呢?
 1,整个布局拷贝过来.
 2,根据影子的视口获取图框,把图框内范围拷贝过来,此时需要倒序索引?要多少个索引?岂不是要维护?
 mapA[瞬态id]=(布局id,视口id,图框id)
 mapB[图框id]=图框内图元?
 备注:图框名称需要配置中设置.
 
 视口影子:鼠标钩子+四叉树定位瞬态图元.
 影子刷新:如果视口显示位置变化了就用数据库对象改变事件进行改变视口影子.
 如此一来,单击视口影子就可以显示图元(chspace布局to模型),再次单击就可以回收图元.
 
 唉!既然有这个效果了,为什么我们不直接加一个功能,把chspace过来的图元给改完之后,再联动回布局那边呢?也就是"在位编辑".
 在位编辑大家都知道原理吧,就是一个HashSet而已.
 然后"添加"和"删除"就自己封装咯.
 备注:由于我不想触发全局刷新,因此不采用褪色度.
 
 唉!既然是这样,为什么不加一个ctrl+单击视口影子,此时进行跳转到布局,定位到视口本体.
 可选配置:
 1,跳转后把其他视口全部关闭,实现快速查看.并且双击ctrl后显示全部视口.命令事件保存实现打开全部视口.
 2,跳转后显示全部视口.
 3,跳转后不变.
 逆跳:
 视口本体可以用ctrl+单击跳转到视口影子.
 
 
 实现回收"在位编辑"的HashSet普通图元:
 A,命令事件:
 拦截保存,这样就不会保存到数据库里面了.
 B,加载后执行接口,文档打开事件:
 防止`doc.CloseAndSave()`我们仍然需要打开时候清理.
 b1,打开后遍历一次全图,查看被标记xdata的普通图元.
 b2,把普通图元全部用规则重定义重写.
 b3,在主字典记录这些普通图元,然后打开后直接删了.
 C,共享内存
 其他软件也可以通过共享内存直接获取我的HashSet,约定名称为:"LayoutWorkSet",第一个int32作为长度.
 D:提供命令
 命令清理可以给某种情况下清理.
 命令配置启用停用.
 
 悬停事件:
 视口影子可以用悬停显示图片技术提示用户:
 在博客最下面有C#相关的: https://www.cnblogs.com/edata/p/17311897.html
 
 这一切都那么环环相扣,真是一个设计感十足的功能.
 (完)
 | 
 |