admin 发表于 2024-2-29 11:05:09

[功能]沿曲线移动

;;;[功能]沿曲线移动 Move by curve=============================================
(defun C:Mee (/ ANG ANG1 ANG2 D0 D1 D2 DIS E0 P1 P2 SS)
;;(alert "沿曲线移动对象:\n 沿曲线上两点移动")
(if (and
      (setq ss (LM:ssget "\n >移动对象:" '(((0 . "*")))))
      (setq e0 (Fsxm-entsel "\n >>选择曲线:"
                              '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))
               )
      )
      (setq p1 (getpoint "\n >>>移动基点:"))
      (setq p2 (getpoint "\n >>>移动到:"))
      )
    (progn
      (setq e0 (car e0))
      (setq p1 (vlax-curve-getclosestpointto e0 p1))
      (setq p2 (vlax-curve-getclosestpointto e0 p2))
      (setq d0      (- (vlax-curve-getDistAtPoint e0 p2)
                   (vlax-curve-getDistAtPoint e0 p1)
                )
      )
      (setq dis (getreal (strcat "\n 移动距离<" (VL-PRINC-TO-STRING d0) ">:")))
      (if (not dis)
      (setq dis d0)
      ;;输入dis后,计算新p2
      (progn         
          (setq d1 (vlax-curve-getDistAtPoint e0 p1))
          (setq d2 (+ d1 dis))         
          (setq p2(vlax-curve-getPointAtDist e0 d2))
      )
      )

   (setq ang1 (vlax-curve-getParamAtPoint e0 p1))
   (setq ang1 (vlax-curve-getFirstDeriv e0 ang1))
   (setq ang1 (angle ang1 '(0 0 0)))
   (setq ang2 (vlax-curve-getParamAtPoint e0 p2))
   (setq ang2 (vlax-curve-getFirstDeriv e0 ang2))
   (setq ang2 (angle ang2 '(0 0 0)))
   (setq ang (/ (* (- ang2 ang1) 180) pi))   
      (ACET-UNDO-BEGIN)
      (vl-cmdf "采用.move" ss "" "non" p1 "non" p2)
      (vl-cmdf ".采用rotate" ss "" "non" p2 ang)
      (ACET-UNDO-END)
    )
)
(princ "\n沿曲线上两点移动对象 Mee")
(princ)
)
(princ "\n 沿曲线上两点移动对象 Mee")
(princ)
;;;[功能]沿曲线移动 Move by curve=============================================
"觉得好,就打赏"
页: [1]
查看完整版本: [功能]沿曲线移动