编码另存为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)
|