CAD.Net COM方式快捷命令别名重定义
本帖最后由 fangmin723 于 2024-6-26 09:29 编辑感谢大佬告知:该段代码出自于IFoxCAD群,点击链接加入QQ频道【CAD二次开发】
貌似只能在AutoCAD中适用,欢迎大家积极测试
#if acad
/// <summary>
/// 快捷命令别名重定义
/// </summary>
/// <param name="aliases">快捷命令别名对象集合</param>
public static void ReSetCmds(params CmdAlias[] aliases)
{
foreach (var alias in aliases)
{
if (Utils.IsCommandDefined(alias.NewAlias) && !alias.IsReplace) return;
// 卸载原命令(卸载前前可判断命令是否已经定义)
if (Utils.IsCommandDefined(alias.OldAlias) && alias.IsRemoveOld)
{
Utils.RemoveCommand(alias.OldAlias, alias.OldAlias);
}
// 定义ReSet7命令调用Test777函数
Utils.AddCommand(alias.NewAlias, alias.NewAlias, alias.NewAlias, CommandFlags.Modal, alias.CmdAction);
}
}
#endif
#if acad
/// <summary>
/// 快捷命令别名对象集合添加方法
/// </summary>
/// <param name="aliases">快捷命令别名对象集合</param>
/// <param name="OldAlias">原命令别名</param>
/// <param name="NewAlias">新命令别名</param>
/// <param name="CmdAction">命令调用函数</param>
/// <param name="IsRemoveOld">是否移除原别名,默认:<see langword="true"/>移除</param>
/// <param name="IsReplace">是否覆盖已定义别名,默认:<see langword="true"/>覆盖</param>
public static void Add(this List<CmdAlias> aliases, string OldAlias, string NewAlias, CommandCallback CmdAction, bool IsRemoveOld = true, bool IsReplace = true)
{
aliases.Add(new CmdAlias(OldAlias, NewAlias, CmdAction, IsRemoveOld, IsReplace));
}
#endif
namespace System.Runtime.CompilerServices
{
/// <summary>
/// 保留供编译器用于跟踪元数据。 开发人员不应在源代码中使用此类。
/// </summary>
public class IsExternalInit { }
}
record的使用:山人指导!
#if acad
/// <summary>
/// 快捷命令别名对象
/// </summary>
/// <param name="OldAlias">原命令别名</param>
/// <param name="NewAlias">新命令别名</param>
/// <param name="CmdAction">命令调用函数</param>
/// <param name="IsRemoveOld">是否移除原别名,默认:<see langword="true"/>移除</param>
/// <param name="IsReplace">是否覆盖已定义别名,默认:<see langword="true"/>覆盖</param>
public record class CmdAlias(string OldAlias, string NewAlias, CommandCallback CmdAction, bool IsRemoveOld = true, bool IsReplace = true);
#endif
fangmin723 发表于 2024-6-25 15:07
是啊,之前没有考虑到动态更改命令这一层
因为低版本无法实现AddCommand,所以我很早就发现这个缺陷了.
不要迷恋官方提供的接口,因为这个接口说不定其他cad也没有,其他软件revit也没有,所以要从本质出发去想问题.
如果没有AddCommand,那么就需要动态编译,而动态编译无法更改的,所以不用它,从而再想一个调用函数的方法.
触发函数,无非就是等待无命令期间,阻塞主线程,执行你的函数,再放行主线程. 本帖最后由 fangmin723 于 2024-6-25 15:01 编辑
你有种再说一遍 发表于 2024-6-25 14:56
有没有可能,可以完全扔掉CommandMethod,自己写一个特性,
然后启动时候遍历全部特性,组成一个hashmap,接 ...
扔掉CommandMethod没试过,但我自己另外写了个,可以反编译下看看CommandMethod特性原代码,在那个基础上去完善成自己想要的,我觉得可以一试 fangmin723 发表于 2024-6-25 17:30
动态编译的话,可以用反射获取方法
其实福萝卜已经教会我了...
在拦截输入法上面有一个功能是逐个字发送到命令栏,
那么在命令栏上面检测空格和回车也不是什么难题,
因此我根本就不需要启动时候去实现动态编译.
我甚至可以利用这个方法屏蔽命令
如果是我,我就用hashmap来作为命令 你有种再说一遍 发表于 2024-6-25 14:15
如果是我,我就用hashmap来作为命令
嗯嗯,没有用过hashmap,之前学习java的时候了解了下,好像和字典差不多,都是键值对 fangmin723 发表于 2024-6-25 14:27
嗯嗯,没有用过hashmap,之前学习java的时候了解了下,好像和字典差不多,都是键值对
就是词典啦,因为这个hashmap有hash,所以我喜欢念这个 你有种再说一遍 发表于 2024-6-25 14:38
就是词典啦,因为这个hashmap有hash,所以我喜欢念这个
原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的,就是标记有CommandMethod的方法 fangmin723 发表于 2024-6-25 14:48
原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的, ...
有没有可能,可以完全扔掉CommandMethod,自己写一个特性,
然后启动时候遍历全部特性,组成一个hashmap,接着拦截命令栏事件,输入命令之后先过一次map,有就执行,没有就放行给原始命令 fangmin723 发表于 2024-6-25 14:59
扔掉CommandMethod没试过,但我自己另外写了个,可以反编译下看看CommandMethod特性原代码,在那个基础上 ...
但是你这样无助于动态更换命令... 你有种再说一遍 发表于 2024-6-25 15:05
但是你这样无助于动态更换命令...
是啊,之前没有考虑到动态更改命令这一层 本帖最后由 d1742647821 于 2024-6-25 16:09 编辑
fangmin723 发表于 2024-6-25 14:48
原来如此啊,大佬这段代码有测试过吗,好像只能更改自定义的, ...
所以昨天我就问你,没有桥接函数,如何定义cad自带的命令,比如line copy这种,惊惊这种方案不行的,别想着用什么特性了,cad自身的命令你上哪去打特性
页:
[1]
2