本帖最后由 yanshengjiang 于 2025-10-13 12:00 编辑

翻阅电脑找到一个lsp源代码“为阀门和水泵添加扩展数据.lsp”
测试一番发现可以改成下面这个功能,经过deepseek润色。    没仔细测试,请明友帮忙反馈下bug
  1. ; 重新设计 entsel2 函数,支持多种调用方式
  2. ; (entsel2 msg) - 只提供提示信息
  3. ; (entsel2 filter-list) - 只提供过滤条件  
  4. ; (entsel2 (list msg filter-list)) - 同时提供提示信息和过滤条件
  5. ;; 1. 只提供提示信息
  6. ;;(entsel2 "请选择一条直线:")
  7. ;; 2. 只提供过滤条件  
  8. ;;(entsel2 '((0 . "LINE") (8 . "0")))
  9. ;; 3. 同时提供提示信息和过滤条件
  10. ;;(entsel2 (list "选择0层上的圆:" '((0 . "CIRCLE") (8 . "0"))))
  11. (defun entsel2 (arg / jspt gr code pt ss ent oldent loop d ptlst result msg filter-list)
  12.   ;; 内部函数:计算点偏移
  13.   (defun jspt (pt w ww)
  14.     (list (+ (car pt) w) (+ (cadr pt) ww))
  15.   )

  16.   ;; 解析参数 - 支持多种调用方式
  17.   (setq msg nil
  18.         filter-list nil)
  19.   
  20.   (cond
  21.     ; 情况1: 参数是字符串 -> 只设置提示信息
  22.     ((= (type arg) 'STR)
  23.      (setq msg arg))
  24.    
  25.     ; 情况2: 参数是列表(过滤条件)-> 只设置过滤条件
  26.     ((and (= (type arg) 'LIST)
  27.           (not (and (= (length arg) 2)
  28.                     (= (type (car arg)) 'STR))))
  29.      (setq filter-list arg))
  30.    
  31.     ; 情况3: 参数是包含2个元素的列表,且第一个是字符串 -> 提示信息和过滤条件
  32.     ((and (= (type arg) 'LIST)
  33.           (= (length arg) 2)
  34.           (= (type (car arg)) 'STR))
  35.      (setq msg (car arg)
  36.            filter-list (cadr arg)))
  37.    
  38.     ; 情况4: 其他情况(如 nil 或无效参数)
  39.     (t
  40.      (setq msg nil filter-list nil))
  41.   )

  42.   ;; 显示提示信息
  43.   (if msg(prompt(strcat "\n" msg))(prompt "\n选择对象:"))
  44.   (if filter-list (princ filter-list))

  45.   (setq loop t)
  46.   (setq oldent nil)
  47.   (setq result nil)
  48.   
  49.   (while loop
  50.     (setq gr (grread t 15 2)
  51.           code (car gr)
  52.           pt (cadr gr)
  53.     )
  54.    
  55.     (cond
  56.       ((= code 3)  ; 鼠标左键 - 确认选择
  57.        (if oldent
  58.          (progn
  59.            (setq result (list oldent pt))
  60.            (setq loop nil)
  61.          )
  62.          (progn
  63.            (setq result nil)
  64.            (setq loop nil)
  65.          )
  66.        )
  67.       )
  68.       
  69.       ((= code 5)  ; 鼠标移动 - 实时高亮
  70.        (redraw)  ; 清除所有临时图形
  71.       
  72.        ; 取消旧图元高亮
  73.        (if oldent
  74.          (progn
  75.            (redraw oldent 4)
  76.            (setq oldent nil)
  77.          )
  78.        )
  79.       
  80.        ; 尝试选择并高亮新图元
  81.        (if (and
  82.              (setq d (* (/ (getvar "viewsize") (cadr (getvar "screensize"))) (getvar "pickbox")))
  83.              (setq ptlst (list (jspt pt d d)
  84.                                (jspt pt (* -1 d) d)
  85.                                (jspt pt (* -1 d) (* -1 d))
  86.                                (jspt pt d (* -1 d))))
  87.              ; 使用解析后的filter-list作为ssget的过滤条件
  88.              (setq ss (ssget "_C" (car ptlst) (caddr ptlst) (if filter-list filter-list)))
  89.              (= (sslength ss) 1)
  90.              (setq ent (ssname ss 0))
  91.          )
  92.          (progn
  93.            (redraw ent 3)  ; 高亮新图元
  94.            (setq oldent ent)  ; 记录新图元
  95.          )
  96.        )
  97.       )
  98.       
  99.       ((or (= code 11) (= code 25))  ; 鼠标右键 - 退出
  100.        (setq result nil)
  101.        (setq loop nil)
  102.       )
  103.       (t)  ; 其他事件忽略
  104.     )
  105.   )
  106.   
  107.   ; 清理工作:取消所有高亮
  108.   (if oldent (redraw oldent 4))
  109.   (princ)
  110.   result  ; 返回选择结果
  111. )



网友答: 本帖最后由 yanshengjiang 于 2025-10-12 02:10 编辑



网友答: 谢谢分享,你辛苦了。

网友答: 我记得有一个剪切功能也是这样亮显,横2条中间竖一条交叉,点上下中间交叉段高亮显剪切。楼主那个图片填充研发一下看

网友答: 楼主最近比较高产

网友答:
pengbin 发表于 2025-10-12 12:05
我记得有一个剪切功能也是这样亮显,横2条中间竖一条交叉,点上下中间交叉段高亮显剪切。楼主那个图片填充 ...

哪个图片填充?估计我不会。

网友答: 感谢分享。  

网友答: 多谢分享!!!!!!
  • 上一篇:工具面板切换标签不闪屏
  • 下一篇:没有了