明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2736|回复: 19

多功能复制、移动、旋转

  [复制链接]
发表于 2019-9-2 22:55 | 显示全部楼层 |阅读模式
本帖最后由 baoxiaozhong 于 2019-9-3 12:17 编辑

  1. (defun c:cx ( / *error* c cmde s ang )
  2.   (defun *error* (msg)
  3.     (if c (setvar 'COPYMODE c))
  4.     (if cmde (setvar 'CMDECHO cmde))
  5.     (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  6.       (princ (strcat "\n错误: " msg))
  7.     )
  8.   )
  9.   (if (setq cmde (getvar 'CMDECHO)) (setvar 'CMDECHO 0))
  10.   (if (setq c (getvar 'COPYMODE)) (setvar 'COPYMODE 1))
  11.   (defun do_C nil
  12.     (prompt "\n下一点:")
  13.     (command "_.point" "_non" "@")
  14.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  15.     (setq sss (cons s sss))
  16.     (entdel (entlast))
  17.     (command "_.undo" "m")
  18.     (command "_.copy" s "" "_non" (getvar 'LASTPOINT) "_non" (getvar 'LASTPOINT))
  19.     (command "_.move" s "" "_non" (if llp (setq lp llp) (setq lp (getvar 'LASTPOINT))) pause)
  20.     (setq lllp (mapcar '- (setq llp (getvar 'LASTPOINT)) lp))
  21.   )
  22.   (defun do_CC nil
  23.     (command "_.point" "_non" "@")
  24.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  25.     (setq sss (cons s sss))
  26.     (entdel (entlast))
  27.     (command "_.undo" "m")
  28.     (command "_.copy" s "" "_non" (getvar 'LASTPOINT) "_non" (getvar 'LASTPOINT))
  29.     (command "_.move" s "" "_non" (if llp llp (setq lp (getvar 'LASTPOINT))) "_non" (if llp (setq llp (mapcar '+ llp lllp)) lp))
  30.   )
  31.   (defun do_CCC ( / n k kk pt d )
  32.     (command "_.point" "_non" "@")
  33.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  34.     (setq sss (cons s sss))
  35.     (entdel (entlast))
  36.     (command "_.undo" "m")
  37.     (initget 7)
  38.     (setq n (getint "\n输入数组数量<结束按空格键>"))
  39.     (command "_.copy" s "" "_non" (getvar 'LASTPOINT) "_non" (getvar 'LASTPOINT))
  40.     (command "_.move" s "" "_non" (if llp (setq lp llp) (setq lp (getvar 'LASTPOINT))) pause)
  41.     (setq lllp (mapcar '- (setq llp (getvar 'LASTPOINT)) lp))
  42.     (setq k (float n))
  43.     (setq d (/ (distance lllp '(0.0 0.0 0.0)) k))
  44.     (prompt "\n设定总距离") (princ (rtos d 2 8)) (prompt "\t ENTER 继续")
  45.     (command pause)
  46.     (setq kk 0.0)
  47.     (repeat (- n 1)
  48.       (setq pt (mapcar '- lp (mapcar '* (list (* (setq kk (1+ kk)) (/ 1.0 k)) (* kk (/ 1.0 k)) (* kk (/ 1.0 k))) lllp)))
  49.       (command "_.copy" s "" "_non" lp "_non" pt)
  50.     )
  51.     (setvar 'LASTPOINT llp)
  52.   )
  53.   (defun do_M nil
  54.     (prompt "\n下一点:")
  55.     (command "_.point" "_non" "@")
  56.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  57.     (setq sss (cons s sss))
  58.     (entdel (entlast))
  59.     (command "_.undo" "m")
  60.     (command "_.move" s "" "_non" (if llp (setq lp llp) (setq lp (getvar 'LASTPOINT))) pause)
  61.     (setq lllp (mapcar '- (setq llp (getvar 'LASTPOINT)) lp))
  62.   )
  63.   (defun do_MM nil
  64.     (command "_.point" "_non" "@")
  65.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  66.     (setq sss (cons s sss))
  67.     (entdel (entlast))
  68.     (command "_.undo" "m")
  69.     (command "_.move" s "" "_non" (if llp llp (setq lp (getvar 'LASTPOINT))) "_non" (if llp (setq llp (mapcar '+ llp lllp)) lp))
  70.   )
  71.   (defun do_R ( / lo g )
  72.     (setq lo T)
  73.     (while lo
  74.       (prompt "\n按鼠标左键<鼠标输入>; 鼠标右键<键盘输入>")
  75.       (setq g (grread nil 14 0))
  76.       (cond
  77.         ((eq (car g) 3) (do_RM))
  78.         ((or (eq (car g) 25) (eq (car g) 11)) (do_RK))
  79.       )
  80.     )
  81.   )
  82.   (defun do_RM ( / pt osm pola )
  83.     (setq osm (getvar 'OSMODE))
  84.     (setvar 'OSMODE 0)
  85.     (setq pola (getvar 'POLARANG))
  86.     (setvar 'POLARANG 0.0)
  87.     (prompt "\n输入角度<鼠标输入> : ")
  88.     (command "_.point" "_non" "@")
  89.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  90.     (setq sss (cons s sss))
  91.     (entdel (entlast))
  92.     (command "_.undo" "m")
  93.     (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) pause)
  94.     (command "_.line" "_non" pt "_non" (cadr (grread 1)) "")
  95.     (setq ang (atof (rtos (cvunit (getvar 'LASTANGLE) "radians" "degrees"))))
  96.     (setvar 'LASTPOINT pt)
  97.     (setvar 'OSMODE osm)
  98.     (setvar 'POLARANG pola)
  99.     (entdel (entlast))
  100.     (setq lo nil)
  101.   )
  102.   (defun do_RK ( / pt osm pola )
  103.     (setq osm (getvar 'OSMODE))
  104.     (setvar 'OSMODE 0)
  105.     (setq pola (getvar 'POLARANG))
  106.     (setvar 'POLARANG 0.0)
  107.     (initget 3)
  108.     (setq ang (getreal "\n输入角度"))
  109.     (command "_.point" "_non" "@")
  110.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  111.     (setq sss (cons s sss))
  112.     (entdel (entlast))
  113.     (command "_.undo" "m")
  114.     (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) ang)
  115.     (setvar 'LASTPOINT pt)
  116.     (setvar 'OSMODE osm)
  117.     (setvar 'POLARANG pola)
  118.     (setq lo nil)
  119.   )
  120.   (defun do_RT nil
  121.     (command "_.point" "_non" "@")
  122.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  123.     (setq sss (cons s sss))
  124.     (entdel (entlast))
  125.     (command "_.undo" "m")
  126.     (command "_.rotate" s "" "_non" (if llp llp (getvar 'LASTPOINT)) 90)
  127.   )
  128.   (defun do_RR nil
  129.     (command "_.point" "_non" "@")
  130.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  131.     (setq sss (cons s sss))
  132.     (entdel (entlast))
  133.     (command "_.undo" "m")
  134.     (command "_.rotate" s "" "_non" (if llp llp (getvar 'LASTPOINT)) "")
  135.   )
  136.   (defun do_RRR nil
  137.     (command "_.point" "_non" "@")
  138.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  139.     (setq sss (cons s sss))
  140.     (entdel (entlast))
  141.     (command "_.undo" "m")
  142.     (command "_.rotate" s "" "_non" (if llp llp (getvar 'LASTPOINT)) (if ang (setq ang (- ang)) 0))
  143.   )
  144.   (defun do_RRRR ( / lo g )
  145.     (setq lo T)
  146.     (while lo
  147.       (prompt "按鼠标左键<鼠标输入>; 鼠标右键<键盘输入>")
  148.       (setq g (grread nil 14 0))
  149.       (cond
  150.         ((eq (car g) 3) (do_RRRRM))
  151.         ((or (eq (car g) 25) (eq (car g) 11)) (do_RRRRK))
  152.       )
  153.     )
  154.   )
  155.   (defun do_RRRRM ( / loo g pt osm pola ss entl n k kk d )
  156.     (setq osm (getvar 'OSMODE))
  157.     (setvar 'OSMODE 0)
  158.     (setq pola (getvar 'POLARANG))
  159.     (setvar 'POLARANG 0.0)
  160.     (prompt "\n输入角度<鼠标输入> : ")
  161.     (command "_.point" "_non" "@")
  162.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  163.     (setq sss (cons s sss))
  164.     (entdel (entlast))
  165.     (command "_.undo" "m")
  166.     (command "_.copy" s "" "_non" "@" "_non" "@")
  167.     (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) pause)
  168.     (command "_.line" "_non" pt "_non" (cadr (grread 1)) "")
  169.     (setvar 'LASTPOINT pt)
  170.     (setq ang (atof (rtos (cvunit (getvar 'LASTANGLE) "radians" "degrees"))))
  171.     (entdel (entlast))
  172.     (setq loo T)
  173.     (while loo
  174.       (prompt "\n鼠标左键控制角度小于180度;鼠标右键控制角度大于180度")
  175.       (setq g (grread nil 14 0))
  176.       (cond
  177.         ((eq (car g) 3) (setq loo nil))
  178.         ((or (eq (car g) 25) (eq (car g) 11)) (if (not (minusp ang)) (setq ang (- ang 360.0)) (setq ang (+ ang 360.0))) (setq loo nil))
  179.       )
  180.     )
  181.     (setq ss (ssadd))
  182.     (initget 6)
  183.     (setq n (getint "\n输入数组数量<结束按空格键><ENTER旋转一次>"))
  184.     (if (not (null n))
  185.       (progn
  186.         (setq k (float n))
  187.         (setq d (/ ang k))
  188.         (prompt "\n设定角度输入单位") (princ (rtos d 2 8)) (prompt "\t ENTER 继续")
  189.         (command pause)
  190.         (setq kk 0)
  191.         (repeat (- n 1)
  192.           (setq kk (1+ kk))
  193.           (if (= kk 1)
  194.             (progn
  195.               (setq entl (entlast))
  196.               (command "_.copy" s "" "_non" "@" "_non" "@")
  197.               (while (setq entl (entnext entl))
  198.                 (ssadd entl ss)
  199.               )
  200.               (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) (* (* (- 1.0) (/ 1.0 k)) ang))
  201.             )
  202.             (progn
  203.               (command "_.copy" s "" "_non" "@" "_non" "@")
  204.               (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) (* (* (- 1.0) (/ 1.0 k)) ang))
  205.             )
  206.           )
  207.         )
  208.       )
  209.     )
  210.     (if (/= (sslength ss) 0) (setq s ss))
  211.     (setvar 'LASTPOINT pt)
  212.     (setvar 'OSMODE osm)
  213.     (setvar 'POLARANG pola)
  214.     (setq lo nil)
  215.   )
  216.   (defun do_RRRRK ( / pt osm pola ss entl n k kk d )
  217.     (setq osm (getvar 'OSMODE))
  218.     (setvar 'OSMODE 0)
  219.     (setq pola (getvar 'POLARANG))
  220.     (setvar 'POLARANG 0.0)
  221.     (initget 3)
  222.     (setq ang (getreal "\n键盘输入角度"))
  223.     (command "_.point" "_non" "@")
  224.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  225.     (setq sss (cons s sss))
  226.     (entdel (entlast))
  227.     (command "_.undo" "m")
  228.     (command "_.copy" s "" "_non" "@" "_non" "@")
  229.     (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) ang)
  230.     (setq ss (ssadd))
  231.     (initget 6)
  232.     (setq n (getint "\n输入数组数量<结束按空格键><ENTER旋转一次>"))
  233.     (if (not (null n))
  234.       (progn
  235.         (setq k (float n))
  236.         (setq d (/ ang k))
  237.         (prompt "\n设定角度输入单位:") (princ (rtos d 2 8)) (prompt "\t ENTER 继续")
  238.         (command pause)
  239.         (setq kk 0)
  240.         (repeat (- n 1)
  241.           (setq kk (1+ kk))
  242.           (if (= kk 1)
  243.             (progn
  244.               (setq entl (entlast))
  245.               (command "_.copy" s "" "_non" "@" "_non" "@")
  246.               (while (setq entl (entnext entl))
  247.                 (ssadd entl ss)
  248.               )
  249.               (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) (* (* (- 1.0) (/ 1.0 k)) ang))
  250.             )
  251.             (progn
  252.               (command "_.copy" s "" "_non" "@" "_non" "@")
  253.               (command "_.rotate" s "" "_non" (setq pt (if llp llp (getvar 'LASTPOINT))) (* (* (- 1.0) (/ 1.0 k)) ang))
  254.             )
  255.           )
  256.         )
  257.       )
  258.     )
  259.     (if (/= (sslength ss) 0) (setq s ss))
  260.     (setvar 'LASTPOINT pt)
  261.     (setvar 'OSMODE osm)
  262.     (setvar 'POLARANG pola)
  263.     (setq lo nil)
  264.   )
  265.   (defun do_U nil
  266.     (command "_.undo" "b")
  267.     (setq llp (car l))
  268.     (setq s (car sss))
  269.     (setvar 'LASTPOINT llp)
  270.     (setq l (cdr l))
  271.     (setq sss (cdr sss))
  272.   )
  273.   (defun mcr ( / loop gr sss l p lp llp lllp )
  274.     (setq loop T)
  275.     (if (not (eq s nil))
  276.       (while loop
  277.         (prompt "\n\S\选择对象 \P\重设基准点 \C\复制 \A\数组 \D\连续复制 \M\移动 \N\连续移动 \R\旋转 \T\连续旋转 \E\前次旋转 \Y\数组旋转 \TAB\旋转90度 \ U\复原 ESC键或鼠标右键结束")
  278.         (setq gr (grread nil 14 0))
  279.         (cond
  280.           ((or (equal gr '(2 115)) (equal gr '(2 83))) (progn (setq s nil) (mcr)))
  281.           ((or (equal gr '(2 112)) (equal gr '(2 80))) (progn (setq p (getpoint "\n选择基准点")) (setq llp nil) (setvar 'LASTPOINT p)))
  282.           ((or (equal gr '(2 99)) (equal gr '(2 67))) (do_C))
  283.           ((or (equal gr '(2 100)) (equal gr '(2 68))) (do_CC))
  284.           ((or (equal gr '(2 97)) (equal gr '(2 65))) (do_CCC))
  285.           ((or (equal gr '(2 109)) (equal gr '(2 77))) (do_M))
  286.           ((or (equal gr '(2 110)) (equal gr '(2 78))) (do_MM))
  287.           ((or (equal gr '(2 114)) (equal gr '(2 82))) (do_R))
  288.           ((or (equal gr '(2 116)) (equal gr '(2 84))) (do_RR))
  289.           ((or (equal gr '(2 101)) (equal gr '(2 69))) (do_RRR))
  290.           ((or (equal gr '(2 121)) (equal gr '(2 89))) (do_RRRR))
  291.           ((or (equal gr '(2 117)) (equal gr '(2 85))) (do_U))
  292.           ((equal gr '(2 9)) (do_RT))
  293.           ((or (equal gr '(2 27)) (eq (car gr) 25) (eq (car gr) 11)) (setq loop nil))
  294.         )
  295.       )
  296.       (progn
  297.         (setq s (ssget "_"))
  298.         (setq p (getpoint "\n选择基准点"))
  299.         (setvar 'LASTPOINT p)
  300.         (mcr)
  301.       )
  302.     )
  303.   )
  304.   (mcr)
  305.   (*error* nil)
  306.   (princ)
  307. )



源码附件在六楼。

源码是类似mocoro,可以做复制、移动及旋转,但是尚缺镜像及比例放大缩小,是否可再帮忙新增镜像及比例放大缩小?

 楼主| 发表于 2019-9-3 11:15 | 显示全部楼层
本帖最后由 baoxiaozhong 于 2019-9-3 11:40 编辑
mikewolf2k 发表于 2019-9-3 11:06
有些字符被当做格式替换了。源码请用插入代码功能。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 0 反对 1

使用道具 举报

发表于 2020-5-5 10:25 | 显示全部楼层
非常感谢楼主的分享   我有一个画通信管道的插件   每次画出来井的角度和线的角度都不一样    试一下这个旋转功能什么效果  
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2020-6-3 20:02 | 显示全部楼层

会不会是编码问题,附件是WORD档,你再自行转成纯文字的TXT试试,这个版本,我用2014 用了半年多了,没出现问题过。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-3 08:31 | 显示全部楼层
好奇用了一下  缺少参数
发表于 2019-9-3 08:31 | 显示全部楼层
好奇用了一下  缺少参数
 楼主| 发表于 2019-9-3 10:43 | 显示全部楼层
love1030312 发表于 2019-9-3 08:31
好奇用了一下  缺少参数

缺少什么参数,我这里使用是正常的。
发表于 2019-9-3 11:06 | 显示全部楼层
有些字符被当做格式替换了。源码请用插入代码功能。
发表于 2019-9-4 08:13 | 显示全部楼层
感谢分享啊
发表于 2019-9-4 18:35 | 显示全部楼层
费这么大劲弄这个干啥
 楼主| 发表于 2019-9-8 18:48 | 显示全部楼层
本帖最后由 baoxiaozhong 于 2019-9-8 18:55 编辑
  1. ((or (equal gr '(2 73)) (equal gr '(2 105))) (do_MIR))
复制代码

目前是多设一个 I 键为镜像,

但是捕抓键盘的参数已经找到了,可是子参数的镜像,都试不出来,有好心人可以指导一下吗?
  1. ;;mirror
  2.   (defun do_MIR nil
  3.     (prompt "\n下一點:")
  4.     (command "_.point" "_non" "@")
  5.     (setq l (cons (trans (cdr (assoc 10 (entget (entlast)))) 0 1) l))
  6.     (setq sss (cons s sss))
  7.     (entdel (entlast))
  8.     (command "_.undo" "m")
  9.     (command "_.mirror" s "" "_non" (getvar 'LASTPOINT) "_non" (getvar 'LASTPOINT))
  10.     (command "_.move" s "" "_non" (if llp (setq lp llp) (setq lp (getvar 'LASTPOINT))) pause)
  11.     (setq lllp (mapcar '- (setq llp (getvar 'LASTPOINT)) lp))
  12.   )


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

本版积分规则

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

GMT+8, 2024-4-26 04:51 , Processed in 0.320363 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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