tranque 发表于 2025-5-10 13:01:51

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

如图,想要图片这种避让效果

shujh1989 发表于 2025-5-12 20:14:24

tranque 发表于 2025-5-12 18:54
多段线的打断,天正电气的两个命令:导线至上,导线至下都可以打断的多段线的,现在想在标注的地方打断真 ...
还是有办法实现的,支持天正给排水的引出标注,天正电气不清楚我没有装这个软件。(defun c:QQ1 (/ *error* plines ss i ent pts pt param params entData tempLine startPt endPt param1 param2)
(vl-load-com)

(defun *error* (msg)
    (if (not (wcmatch msg "Function cancelled,*quit*,*exit*"))
      (princ (strcat "\n错误: " msg))
    )
    (princ)
)

; 步骤1:选择多段线(允许多选)
(princ "\n步骤1/3: 选择要打断的多段线(可多选)...")
(if (setq plines (ssget '((0 . "*POLYLINE"))))
    (progn
      ; 步骤2:选择天正引出标注的引线
      (princ "\n步骤2/3: 选择天正引出标注的引线...")
      (if (setq ss (ssget '((0 . "~VIEWPORT")))) ; 专门选择天正引出标注
      (progn
          ; 遍历每条多段线
          (repeat (setq k (sslength plines))
            (setq pline (ssname plines (setq k (1- k))))
            (princ (strcat "\n正在处理多段线 " (itoa (- (sslength plines) k)) "/" (itoa (sslength plines))))
            
            ; 按选择顺序处理每个天正引出标注
            (setq i 0)
            (repeat (sslength ss)
            (setq ent (ssname ss i))
            (setq entData (entget ent))
            (setq i (1+ i))
            
            ; 获取引线的起点和转折点
            (if (and (setq startPt (cdr (assoc 10 entData))) ; 起点
                     (setq endPt (cdr (assoc 11 entData))))   ; 转折点或终点
                (progn
                  ; 创建临时直线用于求交
                  (setq tempLine (entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 endPt))))
                  
                  ; 求交
                  (setq pts (vlax-invoke (vlax-ename->vla-object pline)
                                        'IntersectWith
                                        (vlax-ename->vla-object tempLine)
                                        acExtendNone))
                  (entdel tempLine) ; 删除临时直线
                  
                  (while pts
                  (setq pt (list (car pts) (cadr pts) (caddr pts)))
                  (if (setq param (vlax-curve-getParamAtPoint pline pt))
                      (progn
                        ; 计算打断点前后125mm的位置
                        (setq param1 (vlax-curve-getParamAtDist pline (max 0.0 (- (vlax-curve-getDistAtParam pline param) 125.0))))
                        (setq param2 (vlax-curve-getParamAtDist pline (min (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline))
                                                                         (+ (vlax-curve-getDistAtParam pline param) 125.0))))
                        
                        ; 执行打断
                        (command "._break" pline
                                 "_non" (vlax-curve-getPointAtParam pline param1)
                                 "_non" (vlax-curve-getPointAtParam pline param2))
                        (setq pline (entlast)) ; 更新为后半段
                        
                        (princ (strcat "\n已打断多段线,位置: " (rtos (vlax-curve-getDistAtParam pline param) 2 2) "mm"))
                      )
                  )
                  (setq pts (cdddr pts))
                  )
                )
            )
            )
          )
          (princ "\n步骤3/3: 已完成所有多段线的打断操作。")
      )
      (princ "\n取消: 未选择天正引出标注。")
      )
    )
    (princ "\n取消: 未选择多段线。")
)
(princ)
)

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

shujh1989 发表于 2025-5-12 17:45:16

天正需要自己研究,这个程序处理不了。我的ai提示词是这样写的:用autolisp写一个程序。第一步选择多段线,第二步选择与多段线有交叉的实体,第三步多段线在与实体交叉处自动打断,多段线打断处间隔250mm。

你有种再说一遍 发表于 2025-5-10 15:08:42

没有意义吧,线粗不就可以区分

tranque 发表于 2025-5-10 15:27:07

你有种再说一遍 发表于 2025-5-10 15:08
没有意义吧,线粗不就可以区分

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

tranque 发表于 2025-5-10 16:28:39

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

你有种再说一遍 发表于 2025-5-10 17:06:01

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

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

tiancao100 发表于 2025-5-10 19:21:53

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

不教人好:lol
最后钱难要,就麻烦了。

shujh1989 发表于 2025-5-12 17:42:44

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

编码另存为ansi的格式试一试。天正不太好搞,好像检测不出来。这是ai写的代码,能运行。(defun c:qq1(/ *error* pline ss i ent pts pt param params breakPairs lastDist)
(vl-load-com)

(defun *error* (msg)
    (if (not (wcmatch msg "Function cancelled,*quit*,*exit*"))
      (princ (strcat "\n错误: " msg))
    )
    (princ)
)

; 步骤1:选择多段线
(if (setq pline (car (entsel "\n步骤1/3: 选择要打断的多段线: ")))
    (progn
      (if (not (wcmatch (cdr (assoc 0 (entget pline))) "*POLYLINE"))
      (progn
          (princ "\n错误: 所选对象不是多段线!")
          (exit)
      )
      )
      
      ; 步骤2:选择交叉实体
      (princ "\n步骤2/3: 选择与多段线交叉的实体...")
      (if (setq ss (ssget '((0 . "~VIEWPORT")))) ; 排除视口,选择其他所有实体
      (progn
          (setq params nil)
         
          ; 收集所有交点参数
          (repeat (setq i (sslength ss))
            (setq ent (ssname ss (setq i (1- i))))
            (if (not (eq ent pline)) ; 排除多段线自身
            (progn
                (setq pts (vlax-invoke (vlax-ename->vla-object pline)
                                    'IntersectWith
                                    (vlax-ename->vla-object ent)
                                    acExtendNone))
                (while pts
                  (setq pt (list (car pts) (cadr pts) (caddr pts)))
                  (if (setq param (vlax-curve-getParamAtPoint pline pt))
                  (setq params (cons param params))
                  )
                  (setq pts (cdddr pts))
                )
            )
            )
          )
         
          ; 步骤3:处理打断点(保持250mm间隔)
          (if params
            (progn
            (setq params (vl-sort params '<))
            (setq breakPairs nil)
            (setq lastDist -1e308) ; 初始值
            
            ; 筛选满足间距要求的参数
            (foreach param params
                (setq curDist (vlax-curve-getDistAtParam pline param))
                (if (>= (abs (- curDist lastDist)) 250.0) ; 检查250mm间距
                  (progn
                  ; 计算打断点前后125mm的位置
                  (setq param1 (vlax-curve-getParamAtDist pline (max 0.0 (- curDist 125.0))))
                  (setq param2 (vlax-curve-getParamAtDist pline (min (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline))
                                                                     (+ curDist 125.0))))
                  (setq breakPairs (cons (list param1 param2) breakPairs))
                  (setq lastDist curDist)
                  )
                )
            )
            
            ; 按从后向前顺序打断
            (setq breakPairs (vl-sort breakPairs '(lambda (a b) (> (car a) (car b)))))
            
            ; 执行打断
            (foreach pair breakPairs
                (command "._break" pline
                         "_non" (vlax-curve-getPointAtParam pline (car pair))
                         "_non" (vlax-curve-getPointAtParam pline (cadr pair)))
                (setq pline (entlast)) ; 更新为后半段
            )
            
            (princ (strcat "\n步骤3/3: 已在 " (itoa (length breakPairs)) " 个位置打断多段线,保持250mm间隔。"))
            )
            (princ "\n警告: 未发现多段线与所选实体的交叉点!")
          )
      )
      (princ "\n取消: 未选择任何实体。")
      )
    )
    (princ "\n取消: 未选择多段线。")
)
(princ)
)

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

tranque 发表于 2025-5-12 18:54:51

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

多段线的打断,天正电气的两个命令:导线至上,导线至下都可以打断的多段线的,现在想在标注的地方打断真不太好弄
页: [1] 2
查看完整版本: 【求助】有无多段线批量避让天正标注的插件