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