明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 273|回复: 20

[基础] CAD.Net COM方式快捷命令别名重定义

[复制链接]
发表于 2024-6-25 09:29 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2024-6-26 09:29 编辑

感谢大佬告知:该段代码出自于IFoxCAD群,点击链接加入QQ频道【CAD二次开发】

貌似只能在AutoCAD中适用,欢迎大家积极测试
  1. #if acad
  2.                 /// <summary>
  3.                 /// 快捷命令别名重定义
  4.                 /// </summary>
  5.                 /// <param name="aliases">快捷命令别名对象集合</param>
  6.                 public static void ReSetCmds(params CmdAlias[] aliases)
  7.                 {
  8.                     foreach (var alias in aliases)
  9.                     {
  10.                         if (Utils.IsCommandDefined(alias.NewAlias) && !alias.IsReplace) return;
  11.                         // 卸载原命令(卸载前前可判断命令是否已经定义)
  12.                         if (Utils.IsCommandDefined(alias.OldAlias) && alias.IsRemoveOld)
  13.                         {
  14.                             Utils.RemoveCommand(alias.OldAlias, alias.OldAlias);
  15.                         }
  16.                         // 定义ReSet7命令调用Test777函数
  17.                         Utils.AddCommand(alias.NewAlias, alias.NewAlias, alias.NewAlias, CommandFlags.Modal, alias.CmdAction);
  18.                     }
  19.                 }
  20.         #endif


  21. #if acad
  22.         /// <summary>
  23.         /// 快捷命令别名对象集合添加方法
  24.         /// </summary>
  25.         /// <param name="aliases">快捷命令别名对象集合</param>
  26.         /// <param name="OldAlias">原命令别名</param>
  27.         /// <param name="NewAlias">新命令别名</param>
  28.         /// <param name="CmdAction">命令调用函数</param>
  29.         /// <param name="IsRemoveOld">是否移除原别名,默认:<see langword="true"/>移除</param>
  30.         /// <param name="IsReplace">是否覆盖已定义别名,默认:<see langword="true"/>覆盖</param>
  31.         public static void Add(this List<CmdAlias> aliases, string OldAlias, string NewAlias, CommandCallback CmdAction, bool IsRemoveOld = true, bool IsReplace = true)
  32.         {
  33.             aliases.Add(new CmdAlias(OldAlias, NewAlias, CmdAction, IsRemoveOld, IsReplace));
  34.         }
  35. #endif

  36. namespace System.Runtime.CompilerServices
  37. {
  38.     /// <summary>
  39.     /// 保留供编译器用于跟踪元数据。 开发人员不应在源代码中使用此类。
  40.     /// </summary>
  41.     public class IsExternalInit { }
  42. }


  43. record的使用:山人指导!

  44. #if acad
  45.     /// <summary>
  46.     /// 快捷命令别名对象
  47.     /// </summary>
  48.     /// <param name="OldAlias">原命令别名</param>
  49.     /// <param name="NewAlias">新命令别名</param>
  50.     /// <param name="CmdAction">命令调用函数</param>
  51.     /// <param name="IsRemoveOld">是否移除原别名,默认:<see langword="true"/>移除</param>
  52.     /// <param name="IsReplace">是否覆盖已定义别名,默认:<see langword="true"/>覆盖</param>
  53.     public record class CmdAlias(string OldAlias, string NewAlias, CommandCallback CmdAction, bool IsRemoveOld = true, bool IsReplace = true);
  54. #endif





点评

777就是出处  发表于 2024-6-26 08:51
发表于 2024-6-25 16:07 | 显示全部楼层
fangmin723 发表于 2024-6-25 15:07
是啊,之前没有考虑到动态更改命令这一层

因为低版本无法实现AddCommand,所以我很早就发现这个缺陷了.
不要迷恋官方提供的接口,因为这个接口说不定其他cad也没有,其他软件revit也没有,所以要从本质出发去想问题.
如果没有AddCommand,那么就需要动态编译,而动态编译无法更改的,所以不用它,从而再想一个调用函数的方法.
触发函数,无非就是等待无命令期间,阻塞主线程,执行你的函数,再放行主线程.
 楼主| 发表于 2024-6-25 14:59 | 显示全部楼层
本帖最后由 fangmin723 于 2024-6-25 15:01 编辑
你有种再说一遍 发表于 2024-6-25 14:56
有没有可能,可以完全扔掉CommandMethod,自己写一个特性,
然后启动时候遍历全部特性,组成一个hashmap,接 ...

扔掉CommandMethod没试过,但我自己另外写了个,可以反编译下看看CommandMethod特性原代码,在那个基础上去完善成自己想要的,我觉得可以一试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-25 17:44 | 显示全部楼层
fangmin723 发表于 2024-6-25 17:30
动态编译的话,可以用反射获取方法

其实福萝卜已经教会我了...
在拦截输入法上面有一个功能是逐个字发送到命令栏,
那么在命令栏上面检测空格和回车也不是什么难题,
因此我根本就不需要启动时候去实现动态编译.
我甚至可以利用这个方法屏蔽命令
发表于 2024-6-25 14:15 | 显示全部楼层
如果是我,我就用hashmap来作为命令
 楼主| 发表于 2024-6-25 14:27 | 显示全部楼层
你有种再说一遍 发表于 2024-6-25 14:15
如果是我,我就用hashmap来作为命令

嗯嗯,没有用过hashmap,之前学习java的时候了解了下,好像和字典差不多,都是键值对
发表于 2024-6-25 14:38 | 显示全部楼层
fangmin723 发表于 2024-6-25 14:27
嗯嗯,没有用过hashmap,之前学习java的时候了解了下,好像和字典差不多,都是键值对

就是词典啦,因为这个hashmap有hash,所以我喜欢念这个
 楼主| 发表于 2024-6-25 14:48 | 显示全部楼层
你有种再说一遍 发表于 2024-6-25 14:38
就是词典啦,因为这个hashmap有hash,所以我喜欢念这个

原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的,就是标记有CommandMethod的方法
发表于 2024-6-25 14:56 | 显示全部楼层
fangmin723 发表于 2024-6-25 14:48
原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的, ...

有没有可能,可以完全扔掉CommandMethod,自己写一个特性,
然后启动时候遍历全部特性,组成一个hashmap,接着拦截命令栏事件,输入命令之后先过一次map,有就执行,没有就放行给原始命令
发表于 2024-6-25 15:05 | 显示全部楼层
fangmin723 发表于 2024-6-25 14:59
扔掉CommandMethod没试过,但我自己另外写了个,可以反编译下看看CommandMethod特性原代码,在那个基础上 ...

但是你这样无助于动态更换命令...
 楼主| 发表于 2024-6-25 15:07 | 显示全部楼层
你有种再说一遍 发表于 2024-6-25 15:05
但是你这样无助于动态更换命令...

是啊,之前没有考虑到动态更改命令这一层
发表于 2024-6-25 16:06 | 显示全部楼层
本帖最后由 d1742647821 于 2024-6-25 16:09 编辑
fangmin723 发表于 2024-6-25 14:48
原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的, ...

所以昨天我就问你,没有桥接函数,如何定义cad自带的命令,比如line copy这种,惊惊这种方案不行的,别想着用什么特性了,cad自身的命令你上哪去打特性
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-28 23:06 , Processed in 0.228698 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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