明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: highflybir

[【高飞鸟】] 【飞鸟集】高仿Align命令

    [复制链接]
发表于 2012-9-9 10:27 | 显示全部楼层
飞鸟的程序必须支持
发表于 2012-9-9 13:25 | 显示全部楼层
支持高飞兄,学习了
发表于 2012-9-9 15:31 | 显示全部楼层
顶这个代码,确实太好用了,感谢楼主。
发表于 2012-9-9 18:57 | 显示全部楼层
做个演示吧
发表于 2012-9-9 23:19 | 显示全部楼层
研究一下下
发表于 2012-9-11 10:49 | 显示全部楼层
vlisp2012 发表于 2012-9-7 21:08
还是犀牛的模式好,先指定3个源点,再指定3个目标点。省得鼠标两边跑

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

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

点评

如何让这个命令 默认就是yes,同意缩放  发表于 2019-12-1 10:04
发表于 2012-9-11 11:49 | 显示全部楼层
好程序必须要支持支持
发表于 2012-9-11 20:15 | 显示全部楼层
大儒,好样的,顶你!!!
发表于 2012-9-11 22:45 | 显示全部楼层
学习~~
发表于 2012-9-12 13:32 | 显示全部楼层
kwok 发表于 2012-9-7 23:02
赞同,cad把简单事弄复杂化了,,,,,,,,

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

  4. ;;;-----------------------------------------------------------;;
  5. ;;; 三点维的平齐命令,山寨Express Tools的align                ;;
  6. ;;; 命令:Align3d ,可自己修改                                 ;;
  7. ;;; Author: Highflybird, Date:2012-8-6.                       ;;
  8. ;;; All copyrights reserved.                                  ;;
  9. ;;;-----------------------------------------------------------;;
  10. (defun C:Align3d (/        sel   sP1   sP2          sP3        dP1   dP2   dP3          sclp
  11.                   scl        mat0  mat1  mat2  mat        i     ent   obj          app
  12.                   doc        pt
  13.                  )
  14.   (setvar "cmdecho" 0)
  15.   (if (setq sel (ssget))
  16.     (progn
  17.       (initget 9)
  18.       (setq sP1 (getpoint "\n 指定第一个源点:"))
  19.       (initget 9)
  20.       (princ "\n 指定第一个目标点:")
  21.       (command "_.move" sel "" sP1 pause)
  22.       (setq dP1 (getvar "lastpoint"))
  23.       (setq pt (mapcar '- dP1 sP1))
  24.       (initget 9)
  25.       (setq sP2 (getpoint "\n 指定第二个源点:"))
  26.       (initget 9)
  27.       (setq dP2 (getpoint sP2 "\n 指定第二个目标点:"))
  28.       (setq sP2 (mapcar '- sP2 pt))
  29.       (initget 8)
  30.       (setq sP3 (getpoint "\n 指定第三个源点或 <继续>:"))

  31.       (if (null sP3)
  32.         (progn
  33.           (setq sP3 (Mat:Rotate90 sP2 sP1))
  34.           (setq dP3 (Mat:Rotate90 dP2 dP1))
  35.         )
  36.         (progn
  37.           (initget 9)
  38.           (progn
  39.             (setq dP3 (getpoint sP3 "\n 指定第三个目标点:"))
  40.             (setq sP3 (mapcar '- sP3 pt))
  41.           )
  42.         )
  43.       )
  44.       (foreach x '(sP1 sP2 sP3 dP1 dP2 dP3)
  45.         (set x (trans (eval x) 1 0))
  46.       )
  47.       (initget "Yes No")
  48.       (setq sclp
  49.              (getkword "\n 是否基于对齐点缩放对象?[是(Y)/否(N)] <否>:")
  50.       )
  51.       (command "_.move" sel "" dP1 sP1)
  52.       (setq mat1 (Mat:Get3PMatrix sP1 sP2 sP3))
  53.       (setq mat2 (Mat:Get3PMatrix dP1 dP2 dP3))
  54.       (if (= "Yes" sclp)
  55.         (setq scl  (/ (distance dP1 dP2) (distance sP2 sP1))
  56.               mat0 (list (list scl 0 0 0)
  57.                          (list 0 scl 0 0)
  58.                          (list 0 0 scl 0)
  59.                          '(0 0 0 1)
  60.                    )
  61.               mat  (Mat:mxm (cadr mat2) (Mat:mxm mat0 (car mat1)))
  62.         )
  63.         (setq mat (Mat:mxm (cadr mat2) (car mat1)))
  64.       )

  65.       (setq app (vlax-get-acad-object))
  66.       (setq doc (vla-get-ActiveDocument app))
  67.       (vla-StartUndoMark doc)
  68.       (setq i 0)
  69.       (if sel
  70.         (repeat        (sslength sel)
  71.           (setq ent (ssname sel i))
  72.           (setq obj (vlax-ename->vla-object ent))
  73.           (vla-transformby obj (vlax-tmatrix mat))
  74.           (setq i (1+ i))
  75.         )
  76.       )
  77.       (vla-EndUndoMark doc)
  78.       (vlax-release-object doc)
  79.       (vlax-release-object app)
  80.     )
  81.   )
  82.   (princ)
  83. )

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-9 00:52 , Processed in 0.999672 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表