XDSoft 发表于 2020-6-22 02:46:36

(XD::Drag:Move)通用拖动移动函数(支持 改基点、对齐、缩放、左右翻、上下翻、...


(defun XD::Drag:Move (info   ss            basepoint          mode         /      _keys
                      an   an1    box         d1          d2         dynpt      kw
                      lastang            mat         mat1          p1         p2      pt
                      ptbase s1            s2         scl          ss2         yorn      ret
                     )
(defun _keyword (kw)
    (defun _rcallback (dynpt)
      (if (not lastang)
      (setq lastang (angle p1 dynpt))
      )
      (setq an      (- (setq an1 (angle p1 dynpt)) lastang)
            mat      (xdrx-matrix-setrotation an '(0 0 1) p1)
      )
      (xdrx-entity-transform ss mat)
      (xd::text:adjust ss)
      (setq mat1 (xdrx-matrix-product mat mat1))
      (setq lastang an1)
    )
    (defun _micallback (dynpt)
      (xdrx-entity-delete ss2)
      (setq ss2 (xdrx-entity-copy ss t))
      (setq mat (xdrx-matrix-setmirror (list (trans p1 1 0) dynpt)))
      (xdrx-entity-transform ss2 mat)
      (xd::text:adjust ss2)
      (setq mat1 (xdrx-matrix-product mat mat1))
    )
    (defun _sclcallback      (dynpt)
      (xdrx-entity-delete ss2)
      (setq ss2 (xdrx-entity-copy ss t))
      (setq box (xdrx-points-ucs2wcs (xdrx-entity-box ss2)))
      (setq mat      (xdrx-matrix-setscale
                  (/ (distance dynpt (trans p1 1 0))
                     (distance (car box) (nth 3 box))
                  )
                  (trans p1 1 0)
                )
      )
      (xdrx-entity-transform ss2 mat)
      (xd::text:adjust ss2)
      (setq mat1 (xdrx-matrix-product mat mat1))
    )
    (setq ptbase (xd::drag:getbasepoint))
    (cond
      ((= kw "T")
       (if (setq pt (getpoint "\n新的基点<退出>:"))
         (progn (xd::drag:setbasepoint (trans pt 1 0)))
       )
      )
      ((= kw "A")
       (setq mat (xdrx-matrix-setrotation (/ pi 2.0) '(0 0 1) p1))
       (xdrx-entity-transform ss mat)
      )
      ((= kw "R")
       (setq p1          (xd::drag:getbasepoint)
             mat1 (xdrx-matrix-identity 3)
       )
       (xdrx-pointmonitor "_rcallback")
       (if (not (setq p2 (getpoint p1 "\n旋转轴第二点<退出>:")))
         (progn
         (xdrx-entity-transform ss2 (xdrx-matrix-inverse mat1))
         )
       )
       (xdrx-pointmonitor)
       (xd::drag:setbasepoint (trans p1 1 0))
      )
      ((= kw "M")
       (setq mat1 (xdrx-matrix-identity 3))
       (if (and      (setq p1 (getpoint "\n镜像轴第一点<退出>:"))
                (xdrx-pointmonitor "_micallback")
                (setq p2 (getpoint p1 "\n镜像轴第二点<退出>:"))
         )
         (progn      (setq mat (xdrx-matrix-setmirror
                            (list (trans p1 1 0) (trans p2 1 0))
                        )
                )
                (xdrx-entity-delete ss2)
                (xdrx-entity-transform ss mat)
                (xd::text:adjust ss)
         )
         (progn      (xdrx-entity-transform ss (xdrx-matrix-inverse mat1))
         )
       )
       (xdrx-pointmonitor)
      )
      ((= kw "S")
       (setq mat
            (xdrx-matrix-setmirror
                (list ptbase
                      (mapcar '+ ptbase (trans (getvar "ucsydir") 1 0 t))
                )
            )
       )
       (xdrx-entity-transform ss mat)
       (xd::text:adjust ss)
      )
      ((= kw "D")
       (setq mat
            (xdrx-matrix-setmirror
                (list ptbase
                      (mapcar '+ ptbase (trans (getvar "ucsxdir") 1 0 t))
                )
            )
       )
       (xdrx-entity-transform ss mat)
       (xd::text:adjust ss)
      )
      ((= kw "L")
       (setq mat1 (xdrx-matrix-identity 3))
       (if (and      (setq p1 (getpoint "\n基点<退出>:"))
                (xdrx-pointmonitor "_sclcallback")
                (setq p2 (getpoint p1 "\n镜第二点<输入>:"))
         )
         (progn      (xdrx-entity-delete ss2)
                (xdrx-entity-transform ss mat)
                (xd::text:adjust ss)
         )
         (progn
         (if (setq scl (getreal "\n输入放大比例系数<退出>:"))
             (progn (setq mat (xdrx-matrix-setscale scl (trans p1 1 0)))
                  (xdrx-entity-transform ss mat)
             )
         )
         )
       )
       (xdrx-pointmonitor)
      )
      ((= kw "F")
       (if (and      (setq yorn (xdrx-yesorno "\n是否缩放:" 0))
                (setq s1 (getpoint "\n对齐源轴第一点<退出>:"))
                (setq s2 (getpoint s1 "\n源轴第二点<退出>:"))
                (xdrx-grdraw 1 -1 s1 s2)
                (setq d1 (getpoint "\n对齐目标轴第一点<退出>:"))
                (setq d2 (getpoint d1 "\n对齐目标轴第二点<退出>:"))
         )
         (progn      (xdrx-entity-align
                  ss
                  ptbase
                  (mapcar '+
                        ptbase
                        (mapcar '- (trans s2 1 0) (trans s1 1 0))
                  )
                  (trans d1 1 0)
                  (trans d2 1 0)
                  (if (= yorn 1)
                  t
                  nil
                  )
                )
         )
       )
      )
    )
    (setq ptbase (xd::drag:getbasepoint))
)
(if (not mode)
    (setq mode 7)
)
(if (not basepoint)
    (setq basepoint 5)
)
(if (= (type basepoint) 'INT)
    (progn (setq basepoint (abs basepoint))
         (if (or (< basepoint 1) (> basepoint 9))
             (setq basepoint 5)
         )
         (setq basepoint (xd::geom:get9pt ss basepoint))
    )
)
(setq      lastang      nil
      _keys nil
)
(if (not info)
    (setq info "\n插入点")
)
(setq info (strcat info "["))
(setq      _keys (cons "T" _keys)
      info(xdrx-prompt info "改基点(T)" t)
)
(if (= (rem 2 mode) 2)
    (setq _keys      (cons "F" _keys)
          info      (xdrx-prompt info "/对齐(F)" t)
    )
)
(if (= (rem 4 mode) 4)
    (setq _keys      (cons "A" _keys)
          info      (xdrx-prompt info "/转90度(A)" t)
    )
)
(if (= (rem 8 mode) 8)
    (setq _keys      (cons "S" _keys)
          info      (xdrx-prompt info "/左右翻(S)" t)
    )
)
(if (= (rem 16 mode) 16)
    (setq _keys      (cons "D" _keys)
          info      (xdrx-prompt info "/上下翻(D)" t)
    )
)
(if (= (rem 32 mode) 32)
    (setq _keys      (cons "R" _keys)
          info      (xdrx-prompt info "/改转角(R)" t)
    )
)
(if (= (rem 64 mode) 64)
    (setq _keys      (cons "M" _keys)
          info      (xdrx-prompt info "/镜像(M)" t)
    )
)
(if (= (rem 128 mode) 128)
    (setq _keys      (cons "L" _keys)
          info      (xdrx-prompt info "/缩放(L)" t)
    )
)
(setq _keys (xdrx-string-join _keys " "))
(setq info (strcat info "]<退出>:"))
(and (xd::drag:setbasepoint (trans basepoint 1 0))
       (xd::doc:setkeyword _keys)
       (xd::drag:callbacksetkeyword "_keyword")
       (setq ret (xd::drag:simplemove ss info (trans basepoint 1 0) t))
)
ret
)

dyjwyqz5221 发表于 2020-6-23 15:35:12

非常好用的函数,功能齐全,值得拥有!

凌乱的核桃仁 发表于 2020-7-13 14:14:17

很好的资料,感谢分享

ko05050 发表于 2020-7-27 12:18:33

学习学习         

sevenhaj 发表于 2021-10-26 14:32:45

感谢感谢,

striver 发表于 2024-1-24 15:00:19

非常棒的通用拖动移动函数,很多地方都用得到,需要好好学习下。
页: [1]
查看完整版本: (XD::Drag:Move)通用拖动移动函数(支持 改基点、对齐、缩放、左右翻、上下翻、...