仲文玉 发表于 2012-9-9 10:27:24

飞鸟的程序必须支持

海盗曹 发表于 2012-9-9 13:25:42

支持高飞兄,学习了

hhh454 发表于 2012-9-9 15:31:18

顶这个代码,确实太好用了,感谢楼主。

13579 发表于 2012-9-9 18:57:45

做个演示吧

pimgu 发表于 2012-9-9 23:19:51

研究一下下

自贡黄明儒 发表于 2012-9-11 10:49:50

vlisp2012 发表于 2012-9-7 21:08 static/image/common/back.gif
还是犀牛的模式好,先指定3个源点,再指定3个目标点。省得鼠标两边跑

【低仿Align命令】
;;为了表示对H版此贴的支持,写如下程序
;;为了你的鼠标不移来移去,同时符合Autocad的习惯
;;H版的程序牵涉到久被人遗忘的<线性代数>,头疼.本程序用的是土办法


;;为了表示对H版此贴的支持,写如下程序
;;为了你的鼠标不移来移去,同时符合Autocad的习惯
;;H版的程序牵涉到久被人遗忘的<线性代数>,头疼.本程序用的是土办法
;;written by 自贡黄明儒
;;移动+旋转+缩放,相当于Align,本命令用于二维绘图
(defun HH:MSRotate (/ APP DOC P1 P2 P3 P4 REPLY SS)
    (setq app (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument app))
    (vla-StartUndoMark doc)
    (and (setq ss (ssget))
(setq p1 (getpoint "\n 指定第一个源点:"))
(princ "\n 指定第一个目标点:")
(command "_.move" ss "" p1 pause)
    )
    (setq p3 (getvar "LASTPOINT"))
    (and p1
(setq p2 (getpoint "\n 指定第二个源点:"))
(setq p4 (getpoint "\n 指定第二个目标点:"))
(command "_.ROTATE" ss "" p3 "R" p3 p2 p4)
    )
    (initget "Yes No")
    (setq
      reply
       (GETKWORD "\n 是否基于对齐点缩放对象?[是(Y)/否(N)] <否>:")
    )
    (if (equal reply "Yes")
      (progn (setq p2 (mapcar '- p2 (mapcar '- p3 p1)))
      (setq p2 (/ (distance p3 p4) (distance p1 p2)))
      (command "_.scale" ss "" p3 p2)
      )
    )
    (vla-EndUndoMark doc)
    (vlax-release-object doc)
    (vlax-release-object app)
    (princ)
)

gufeng 发表于 2012-9-11 11:49:46

好程序必须要支持支持

vlisp2012 发表于 2012-9-11 20:15:41

大儒,好样的,顶你!!!

preone 发表于 2012-9-11 22:45:52

学习~~

自贡黄明儒 发表于 2012-9-12 13:32:59

kwok 发表于 2012-9-7 23:02 static/image/common/back.gif
赞同,cad把简单事弄复杂化了,,,,,,,,

;;;先选目标三个点,再点目标三个点,似乎解决了鼠标移来移去的问题,但
;;;使用起来不方便.Autocad设计的align的点取顺序,还是很道理的.
;;;自贡黄明儒:H版的这个程序,可以演绎出许多我们自己需要的程序

;;;先选目标三个点,再点目标三个点,似乎解决了鼠标移来移去的问题,但
;;;使用起来不方便.Autocad设计的align的点取顺序,还是很道理的.
;;;自贡黄明儒:H版的这个程序,可以演绎出许多我们自己需要的程序

;;;-----------------------------------------------------------;;
;;; 三点维的平齐命令,山寨Express Tools的align                ;;
;;; 命令:Align3d ,可自己修改                                 ;;
;;; Author: Highflybird, Date:2012-8-6.                     ;;
;;; All copyrights reserved.                                  ;;
;;;-----------------------------------------------------------;;
(defun C:Align3d (/        sel   sP1   sP2          sP3        dP1   dP2   dP3          sclp
                  scl        mat0mat1mat2mat        i   ent   obj          app
                  doc        pt
               )
(setvar "cmdecho" 0)
(if (setq sel (ssget))
    (progn
      (initget 9)
      (setq sP1 (getpoint "\n 指定第一个源点:"))
      (initget 9)
      (princ "\n 指定第一个目标点:")
      (command "_.move" sel "" sP1 pause)
      (setq dP1 (getvar "lastpoint"))
      (setq pt (mapcar '- dP1 sP1))
      (initget 9)
      (setq sP2 (getpoint "\n 指定第二个源点:"))
      (initget 9)
      (setq dP2 (getpoint sP2 "\n 指定第二个目标点:"))
      (setq sP2 (mapcar '- sP2 pt))
      (initget 8)
      (setq sP3 (getpoint "\n 指定第三个源点或 <继续>:"))

      (if (null sP3)
        (progn
          (setq sP3 (Mat:Rotate90 sP2 sP1))
          (setq dP3 (Mat:Rotate90 dP2 dP1))
        )
        (progn
          (initget 9)
          (progn
          (setq dP3 (getpoint sP3 "\n 指定第三个目标点:"))
          (setq sP3 (mapcar '- sP3 pt))
          )
        )
      )
      (foreach x '(sP1 sP2 sP3 dP1 dP2 dP3)
        (set x (trans (eval x) 1 0))
      )
      (initget "Yes No")
      (setq sclp
             (getkword "\n 是否基于对齐点缩放对象?[是(Y)/否(N)] <否>:")
      )
      (command "_.move" sel "" dP1 sP1)
      (setq mat1 (Mat:Get3PMatrix sP1 sP2 sP3))
      (setq mat2 (Mat:Get3PMatrix dP1 dP2 dP3))
      (if (= "Yes" sclp)
        (setq scl(/ (distance dP1 dP2) (distance sP2 sP1))
              mat0 (list (list scl 0 0 0)
                       (list 0 scl 0 0)
                       (list 0 0 scl 0)
                       '(0 0 0 1)
                   )
              mat(Mat:mxm (cadr mat2) (Mat:mxm mat0 (car mat1)))
        )
        (setq mat (Mat:mxm (cadr mat2) (car mat1)))
      )

      (setq app (vlax-get-acad-object))
      (setq doc (vla-get-ActiveDocument app))
      (vla-StartUndoMark doc)
      (setq i 0)
      (if sel
        (repeat        (sslength sel)
          (setq ent (ssname sel i))
          (setq obj (vlax-ename->vla-object ent))
          (vla-transformby obj (vlax-tmatrix mat))
          (setq i (1+ i))
        )
      )
      (vla-EndUndoMark doc)
      (vlax-release-object doc)
      (vlax-release-object app)
    )
)
(princ)
)

页: 1 2 [3] 4 5
查看完整版本: 【飞鸟集】高仿Align命令