【求助】有无多段线批量避让天正标注的插件
如图,想要图片这种避让效果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)
天正需要自己研究,这个程序处理不了。我的ai提示词是这样写的:用autolisp写一个程序。第一步选择多段线,第二步选择与多段线有交叉的实体,第三步多段线在与实体交叉处自动打断,多段线打断处间隔250mm。
没有意义吧,线粗不就可以区分 你有种再说一遍 发表于 2025-5-10 15:08
没有意义吧,线粗不就可以区分
我也感觉没意义,但是现在公司给其他设计公司做外包呢,人家就这样的要求标准 你是一名顶尖程序员现在帮我用autolisp给autocad2022写一个插件,要求默认使用局部变量;所有变量作用域均被限制在函数内部,完全避免全局污染,它可以批量处理选中的多段线,在每个天正引出标注与多段线的交点处自动打断多段线,缝隙为250mm宽,(天正引出标注的实体类型为:TCH_MULTILEADER)
---------
加载进cad就显示 错误: 输入的列表有缺陷,让ai改了4次,还是错误: 输入的列表有缺陷
---------
不求大佬帮我改代码,想知道大佬是怎么问的,如何引导ai逐步修改呢
tranque 发表于 2025-5-10 15:27
我也感觉没意义,但是现在公司给其他设计公司做外包呢,人家就这样的要求标准
有很多东西不是技术问题,而是沟通问题,
我教你一招,
直接画完图纸之后,把时间卡死,最后对方无可奈可的接受,毕竟能看得过去,大家也懂. 你有种再说一遍 发表于 2025-5-10 17:06
有很多东西不是技术问题,而是沟通问题,
我教你一招,
直接画完图纸之后,把时间卡死,最后对方无可奈可的 ...
不教人好:lol
最后钱难要,就麻烦了。 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)
shujh1989 发表于 2025-5-12 17:45
天正需要自己研究,这个程序处理不了。我的ai提示词是这样写的:用autolisp写一个程序。第一步选择多段线, ...
多段线的打断,天正电气的两个命令:导线至上,导线至下都可以打断的多段线的,现在想在标注的地方打断真不太好弄
页:
[1]
2