明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 668|回复: 10

【求助】有无多段线批量避让天正标注的插件

[复制链接]
发表于 2025-5-10 13:01:51 | 显示全部楼层 |阅读模式
如图,想要图片这种避让效果

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2025-5-12 20:14:24 | 显示全部楼层
tranque 发表于 2025-5-12 18:54
多段线的打断,天正电气的两个命令:导线至上,导线至下都可以打断的多段线的,现在想在标注的地方打断真 ...

还是有办法实现的,支持天正给排水的引出标注,天正电气不清楚我没有装这个软件。
  1. (defun c:QQ1 (/ *error* plines ss i ent pts pt param params entData tempLine startPt endPt param1 param2)
  2.   (vl-load-com)
  3.   
  4.   (defun *error* (msg)
  5.     (if (not (wcmatch msg "Function cancelled,*quit*,*exit*"))
  6.       (princ (strcat "\n错误: " msg))
  7.     )
  8.     (princ)
  9.   )
  10.   
  11.   ; 步骤1:选择多段线(允许多选)
  12.   (princ "\n步骤1/3: 选择要打断的多段线(可多选)...")
  13.   (if (setq plines (ssget '((0 . "*POLYLINE"))))
  14.     (progn
  15.       ; 步骤2:选择天正引出标注的引线
  16.       (princ "\n步骤2/3: 选择天正引出标注的引线...")
  17.       (if (setq ss (ssget '((0 . "~VIEWPORT")))) ; 专门选择天正引出标注
  18.         (progn
  19.           ; 遍历每条多段线
  20.           (repeat (setq k (sslength plines))
  21.             (setq pline (ssname plines (setq k (1- k))))
  22.             (princ (strcat "\n正在处理多段线 " (itoa (- (sslength plines) k)) "/" (itoa (sslength plines))))
  23.             
  24.             ; 按选择顺序处理每个天正引出标注
  25.             (setq i 0)
  26.             (repeat (sslength ss)
  27.               (setq ent (ssname ss i))
  28.               (setq entData (entget ent))
  29.               (setq i (1+ i))
  30.               
  31.               ; 获取引线的起点和转折点
  32.               (if (and (setq startPt (cdr (assoc 10 entData))) ; 起点
  33.                        (setq endPt (cdr (assoc 11 entData))))   ; 转折点或终点
  34.                 (progn
  35.                   ; 创建临时直线用于求交
  36.                   (setq tempLine (entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 endPt))))
  37.                   
  38.                   ; 求交
  39.                   (setq pts (vlax-invoke (vlax-ename->vla-object pline)
  40.                                         'IntersectWith
  41.                                         (vlax-ename->vla-object tempLine)
  42.                                         acExtendNone))
  43.                   (entdel tempLine) ; 删除临时直线
  44.                   
  45.                   (while pts
  46.                     (setq pt (list (car pts) (cadr pts) (caddr pts)))
  47.                     (if (setq param (vlax-curve-getParamAtPoint pline pt))
  48.                       (progn
  49.                         ; 计算打断点前后125mm的位置
  50.                         (setq param1 (vlax-curve-getParamAtDist pline (max 0.0 (- (vlax-curve-getDistAtParam pline param) 125.0))))
  51.                         (setq param2 (vlax-curve-getParamAtDist pline (min (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline))
  52.                                                                          (+ (vlax-curve-getDistAtParam pline param) 125.0))))
  53.                         
  54.                         ; 执行打断
  55.                         (command "._break" pline
  56.                                  "_non" (vlax-curve-getPointAtParam pline param1)
  57.                                  "_non" (vlax-curve-getPointAtParam pline param2))
  58.                         (setq pline (entlast)) ; 更新为后半段
  59.                         
  60.                         (princ (strcat "\n已打断多段线,位置: " (rtos (vlax-curve-getDistAtParam pline param) 2 2) "mm"))
  61.                       )
  62.                     )
  63.                     (setq pts (cdddr pts))
  64.                   )
  65.                 )
  66.               )
  67.             )
  68.           )
  69.           (princ "\n步骤3/3: 已完成所有多段线的打断操作。")
  70.         )
  71.         (princ "\n取消: 未选择天正引出标注。")
  72.       )
  73.     )
  74.     (princ "\n取消: 未选择多段线。")
  75.   )
  76.   (princ)
  77. )

  78. (princ "\n输入 QQ1 执行多段线打断(支持多选多段线,按选择顺序处理)")
  79. (princ)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tranque + 1 测试了下,天正电气也可以用的,多谢了

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-5-12 17:45:16 | 显示全部楼层
天正需要自己研究,这个程序处理不了。我的ai提示词是这样写的:用autolisp写一个程序。第一步选择多段线,第二步选择与多段线有交叉的实体,第三步多段线在与实体交叉处自动打断,多段线打断处间隔250mm。
回复 支持 1 反对 0

使用道具 举报

发表于 2025-5-10 15:08:42 | 显示全部楼层
没有意义吧,线粗不就可以区分
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-10 15:27:07 | 显示全部楼层
你有种再说一遍 发表于 2025-5-10 15:08
没有意义吧,线粗不就可以区分

我也感觉没意义,但是现在公司给其他设计公司做外包呢,人家就这样的要求标准
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-10 16:28:39 | 显示全部楼层
你是一名顶尖程序员现在帮我用autolisp给autocad2022写一个插件,要求默认使用局部变量;所有变量作用域均被限制在函数内部,完全避免全局污染,它可以批量处理选中的多段线,在每个天正引出标注与多段线的交点处自动打断多段线,缝隙为250mm宽,(天正引出标注的实体类型为:TCH_MULTILEADER)
---------
加载进cad就显示 错误: 输入的列表有缺陷,让ai改了4次,还是错误: 输入的列表有缺陷
---------
不求大佬帮我改代码,想知道大佬是怎么问的,如何引导ai逐步修改呢

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-5-10 17:06:01 | 显示全部楼层
tranque 发表于 2025-5-10 15:27
我也感觉没意义,但是现在公司给其他设计公司做外包呢,人家就这样的要求标准

有很多东西不是技术问题,而是沟通问题,
我教你一招,
直接画完图纸之后,把时间卡死,最后对方无可奈可的接受,毕竟能看得过去,大家也懂.
回复 支持 反对

使用道具 举报

发表于 2025-5-10 19:21:53 | 显示全部楼层
你有种再说一遍 发表于 2025-5-10 17:06
有很多东西不是技术问题,而是沟通问题,
我教你一招,
直接画完图纸之后,把时间卡死,最后对方无可奈可的 ...

不教人好
最后钱难要,就麻烦了。
回复 支持 反对

使用道具 举报

发表于 2025-5-12 17:42:44 | 显示全部楼层
tranque 发表于 2025-5-10 16:28
你是一名顶尖程序员现在帮我用autolisp给autocad2022写一个插件,要求默认使用局部变量;所有变量作用域均 ...

编码另存为ansi的格式试一试。天正不太好搞,好像检测不出来。这是ai写的代码,能运行。
  1. (defun c:qq1(/ *error* pline ss i ent pts pt param params breakPairs lastDist)
  2.   (vl-load-com)
  3.   
  4.   (defun *error* (msg)
  5.     (if (not (wcmatch msg "Function cancelled,*quit*,*exit*"))
  6.       (princ (strcat "\n错误: " msg))
  7.     )
  8.     (princ)
  9.   )
  10.   
  11.   ; 步骤1:选择多段线
  12.   (if (setq pline (car (entsel "\n步骤1/3: 选择要打断的多段线: ")))
  13.     (progn
  14.       (if (not (wcmatch (cdr (assoc 0 (entget pline))) "*POLYLINE"))
  15.         (progn
  16.           (princ "\n错误: 所选对象不是多段线!")
  17.           (exit)
  18.         )
  19.       )
  20.       
  21.       ; 步骤2:选择交叉实体
  22.       (princ "\n步骤2/3: 选择与多段线交叉的实体...")
  23.       (if (setq ss (ssget '((0 . "~VIEWPORT")))) ; 排除视口,选择其他所有实体
  24.         (progn
  25.           (setq params nil)
  26.          
  27.           ; 收集所有交点参数
  28.           (repeat (setq i (sslength ss))
  29.             (setq ent (ssname ss (setq i (1- i))))
  30.             (if (not (eq ent pline)) ; 排除多段线自身
  31.               (progn
  32.                 (setq pts (vlax-invoke (vlax-ename->vla-object pline)
  33.                                       'IntersectWith
  34.                                       (vlax-ename->vla-object ent)
  35.                                       acExtendNone))
  36.                 (while pts
  37.                   (setq pt (list (car pts) (cadr pts) (caddr pts)))
  38.                   (if (setq param (vlax-curve-getParamAtPoint pline pt))
  39.                     (setq params (cons param params))
  40.                   )
  41.                   (setq pts (cdddr pts))
  42.                 )
  43.               )
  44.             )
  45.           )
  46.          
  47.           ; 步骤3:处理打断点(保持250mm间隔)
  48.           (if params
  49.             (progn
  50.               (setq params (vl-sort params '<))
  51.               (setq breakPairs nil)
  52.               (setq lastDist -1e308) ; 初始值
  53.               
  54.               ; 筛选满足间距要求的参数
  55.               (foreach param params
  56.                 (setq curDist (vlax-curve-getDistAtParam pline param))
  57.                 (if (>= (abs (- curDist lastDist)) 250.0) ; 检查250mm间距
  58.                   (progn
  59.                     ; 计算打断点前后125mm的位置
  60.                     (setq param1 (vlax-curve-getParamAtDist pline (max 0.0 (- curDist 125.0))))
  61.                     (setq param2 (vlax-curve-getParamAtDist pline (min (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline))
  62.                                                                        (+ curDist 125.0))))
  63.                     (setq breakPairs (cons (list param1 param2) breakPairs))
  64.                     (setq lastDist curDist)
  65.                   )
  66.                 )
  67.               )
  68.               
  69.               ; 按从后向前顺序打断
  70.               (setq breakPairs (vl-sort breakPairs '(lambda (a b) (> (car a) (car b)))))
  71.               
  72.               ; 执行打断
  73.               (foreach pair breakPairs
  74.                 (command "._break" pline
  75.                          "_non" (vlax-curve-getPointAtParam pline (car pair))
  76.                          "_non" (vlax-curve-getPointAtParam pline (cadr pair)))
  77.                 (setq pline (entlast)) ; 更新为后半段
  78.               )
  79.               
  80.               (princ (strcat "\n步骤3/3: 已在 " (itoa (length breakPairs)) " 个位置打断多段线,保持250mm间隔。"))
  81.             )
  82.             (princ "\n警告: 未发现多段线与所选实体的交叉点!")
  83.           )
  84.         )
  85.         (princ "\n取消: 未选择任何实体。")
  86.       )
  87.     )
  88.     (princ "\n取消: 未选择多段线。")
  89.   )
  90.   (princ)
  91. )

  92. (princ "\n输入 BPBreakWithSpacing 执行多段线打断(250mm间隔)")
  93. (princ)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tranque + 1 你太帅了

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-12 18:54:51 | 显示全部楼层
shujh1989 发表于 2025-5-12 17:45
天正需要自己研究,这个程序处理不了。我的ai提示词是这样写的:用autolisp写一个程序。第一步选择多段线, ...

多段线的打断,天正电气的两个命令:导线至上,导线至下都可以打断的多段线的,现在想在标注的地方打断真不太好弄
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-22 14:35 , Processed in 0.162121 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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