明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1184|回复: 3

[命令] cad.net/Arx 修复自带命令的缺陷

[复制链接]
发表于 2024-9-5 21:26:01 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 2024-9-13 06:06 编辑

cad.net/Arx 修复自带命令的缺陷
都是lisp难以实现的,嘿嘿.

# 拷贝中断
问题链接:
https://www.cnblogs.com/JJBox/p/11464977.html
copy拷贝多图元的时候多次按esc会中断拷贝,并导致这些中断的图元无法显示.
可以看到我之前居然是去补锅,而不是阻止事件发生.

两种做法:
1,自己写一个copy命令,因为c#/Arx运行期间没有判断esc输入,自然就能避免这个问题.
2,通过命令事件处理(推荐)
copy命令前,设置flag=true,阻塞esc按键.
copy命令后,设置flag=flase,放行esc按键.
键盘钩子一直检测flag,为true就禁止esc的回调,就能否决输入.
好处就是不用重写copy命令,方便多了.

我需要判断lisp是否运行,因为我是利用命令事件vote原生命令,然后发送自己命令实现替换.
若lisp调用了该原生命令,那么将造成错误.
例如:(command "Line" pt1 pt2 "")
我重写的命令参数没有提供两点,而是提供了一点,别人的lisp工具就会造成参数缺失.
并且这个命令是常驻的,所以需要:
1,运行期间需要判断lisp是否运行,否则不替换.
2,如果运行lisp期间也允许替换,需要设置一个环境变量,使得别人lisp不替换.
http://bbs.mjtd.com/thread-188274-1-1.html
它这里也问了耶,但是没有答案.

# 复制视口冻结信息丢失
问题链接:
https://www.cnblogs.com/JJBox/p/11531115.html

想覆盖掉官方的ctrl+c/v,那么利用IFox剪贴板,
复制时候把冻结图层的信息存入配置[临时文件的dwg路径,视口句柄,图层集合...],
粘贴按照配置取出来并且设置就好了嘛.
IFox剪贴板:
http://bbs.mjtd.com/thread-191093-1-1.html

# 无级缩放
鼠标中键在缩放到某些程度,需要加zoom窗口范围去刷新缓存层,那么我们为什么不用鼠标钩子去获取这个阈值(或者命令历史最后一行的提示),然后发送命令进行zoom窗口捏.

# 输入法自动切换
原始来自于福萝卜的赫思工具箱,我加入了状态机,因为写得很完美了,甚至不想介绍了.你们要的键盘钩子可以从这里开始学习.
https://gitee.com/inspirefunctio ... B3%95/IMEControl.cs
福萝卜明经的账号是:
http://bbs.mjtd.com/thread-97618-1-1.html

# 新建图纸致命错误
通过ctrl+n新建图纸偶尔发现出错,尤其是op重置配置之后,利用子类化拦截之后发现的注册表问题.
继续研究之下,会发现是com的注册表丢失了,修补方案就是还原咯.
https://www.cnblogs.com/JJBox/p/14187031.html

# 取消标注关联(这个lisp可以干)
在布局的视口上面使用1:1大小的标注,此时开启关联标注(setvar 'dimassoc 2)进行标注时,cad会自动换算视口比例到标注图元的线性比例,也就是一个1:1的万能标注.
但是由于移动视口或者图元移动,关联会跑位,造成错误尺寸(巨大无比的数值).
为了阻止错误发生,就需要取消关联,用命令DDA可以手选标注并取消关联.不过,手选太麻烦了,可以通过数据库图元生成事件来获取标注.
这样标注之后,事件就自动取消它的关联.
取消标注关联:
c#是entity.GetPersistentRectorIds()反应器id,遍历内部删除关联反应器就可以了.
Arx版:https://www.cnblogs.com/edata/p/10731436.html

# 填充卡顿
http://bbs.mjtd.com/thread-190975-1-1.html

(好像没完,但是我没想到还有什么命令缺陷)
发表于 2024-9-6 09:38:53 | 显示全部楼层
建议大侠用arx写一个lisp函数run-dll   就是加载一个dll文件,运行里面的函数。这样可以扩展LISP的功能
 楼主| 发表于 2024-9-6 19:00:31 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-9-7 04:09 编辑
baitang36 发表于 2024-9-6 09:38
建议大侠用arx写一个lisp函数run-dll   就是加载一个dll文件,运行里面的函数。这样可以扩展LISP的功能

太庞大了...
本想做一个编译器把lisp转c#dll,
发现处理dwg数据库增删改查倒是没啥问题.

问题是:
1,界面函数量几何暴增.
DCL和OpenDCL转译,是选择winform还是WPF呢?
怎么把xaml封装给lisp?

2,FFI的处理手法.
基础数据/Linq函数/SIMD/多线程怎么提供?
根据版本差异可以导出不同版本的,怎么做导出工具呢?

举个例子:clisp怎么调用win32api的鼠标的?

```clisp
; 导入包,以便使用外部函数接口功能
(require 'ffi)

; 定义包(c#命名空间),用于封装Win32 API相关的代码,并载入两个包的符号(命名空间),简化调用.
; 例如,如果你在"FFI"包中有一个名为foreign函数,你可以在"WIN32-API"包中直接调用它,而不需要写成ffi:foreign简化调用.
(defpackage "WIN32-API"
  (:use "COMMON-LISP" "FFI"))

; 进入包的命名空间,之后的定义都在这个包中进行
(in-package "WIN32-API")

; 外部语言调用约定为stdcall,这是Win32 API常用的调用约定
(default-foreign-language :stdcall)

; 定义结构体存储鼠标坐标
(defcstruct point
  (x :long)
  (y :long))

; 定义外部C函数get-cursor-pos,用来获取鼠标的当前位置
; 指定返回类型为布尔值
; 函数参数是一个指向point结构体的指针
(defcfun ("GetCursorPos" get-cursor-pos) :boolean
  (lpPoint (:pointer (:struct point))))

; 定义Lisp函数,用来封装对get-cursor-pos函数的调用
(defun get-mouse-position ()
  (with-foreign-object (point '(:struct point)) ; 创建一个point结构体的实例
    (when (get-cursor-pos point) ; 调用如果成功
      (values (foreign-slot-value point '(:struct point) 'x) ; 返回x坐标
      (foreign-slot-value point '(:struct point) 'y))))) ; 返回y坐标
```

很多时候是因为这个工作没意义.(没钱)
还要提供lisp包管理,不然大家都当不成调包侠了.
并且还要改造编辑器,做一个有函数提示的编辑器.

好处就是大家不再需要关注代码的乱码问题,
坏处就是产生各种新代码标准,增添大家的痛苦面具.
发表于 2024-9-7 07:54:53 | 显示全部楼层
你有种再说一遍 发表于 2024-9-6 19:00
太庞大了...
本想做一个编译器把lisp转c#dll,
发现处理dwg数据库增删改查倒是没啥问题.

acad有个保留函数可以调用api,但在64位下调用有bug,没法传递64位指针。64位的整数传过去就变成32位了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 20:06 , Processed in 0.167760 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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