明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7338|回复: 25

[求助]CAD 多重复制 如何用一个命令按扭完成!!

  [复制链接]
发表于 2003-10-14 10:28:00 | 显示全部楼层 |阅读模式
以前在2000I中有这样一个按扭,多重复制只要点一下按扭就可完成,现用2002、2004等软件都没这个按扭,而要手工输入M,多重复制 如何用一个命令按扭完成!请告之,不胜感谢!
发表于 2003-10-14 10:35:00 | 显示全部楼层
存成*.lsp,加载后,在command中输入cm即可。
(defun c:CM ()

;**** Internal error handler defined locally ****

(defun DR_ERR (S)                ; If an error (such as CTRL-C) occurs

  (if (/= S "Function cancelled") ; while this command is active...

      (if (= S "quit / exit abort")

          (princ)

          (princ (strcat "\nError: " S))

      );end if

  );end if

  (if DR_OER                          ;If an old error routine exists

     (setq *error* DR_OER)            ;then, reset it

  );end if

  (if (not BASEPT)                    ;if an initial displacement was used

      (foreach x SSELIST (redraw X 4));unhighlight the last selection set

  )

  (setvar "cmdecho" 1)                ;reset command echo upon error

  (princ)

);end error defun

  

;**** Set our new error handler ****

(if (not *DEBUG*)

     (if *error*

        (setq DR_OER *error* *error* DR_ERR)

        (setq *error* DR_ERR)

     );end if

);end if



;**** BEGIN MAIN FUNCTION ****

(if (setq EMARK (entlast))

     (while (setq B (entnext EMARK))

            (setq EMARK B)

     )

)

(setq SS (ssget))

(setvar "cmdecho" 0)

(prompt "\nBase point or Displacement: ")

(command "copy" SS "" pause)

(setq BASEPT (getvar "lastpoint"))

(prompt "\nCopy point: ")

(command pause)

(if (equal BASEPT (setq LASTPT (getvar "lastpoint")))

     (progn (setq REFPT LASTPT)

            (setq BASEPT nil)

     )

)

(if BASEPT

    (while (entnext EMARK)                               ;while there are new entities

           (setq SSOLD SS)

           (setq SS (ssadd))                             ;reset SS

           (while (entnext EMARK)                        ;while there are new entities

                  (setq EMARK (entnext EMARK))  

                  (ssadd EMARK SS)                       ;add them to new SS  

           )

           (if (equal BASEPT (setq LASTPT (getvar "lastpoint")))

               (progn (command "erase" SS "")

                      (command "copy" SSOLD "" REFPT "")

                      (setvar "lastpoint" (polar BASEPT ANGLPT DISTPT))

               )

               (progn (setq ANGLPT (angle BASEPT LASTPT))

                      (setq DISTPT (distance BASEPT LASTPT))

                      (setq REFPT (polar '(0.0 0.0 0.0) ANGLPT DISTPT))

                      (setq BASEPT LASTPT) ;increment basepoint

                      (prompt (strcat "\nCopy point <@" (rtos (car REFPT)) "," (rtos (cadr REFPT)) "," (rtos (caddr REFPT))">: "))

                      (command "copy" SS "" BASEPT pause)

               )

           )

    );end while

    (while (entnext EMARK)                               ;while there are new entities

           (setq SSOLD SS)

           (setq SS (ssadd))                             ;reset SS

           (while (entnext EMARK)                        ;while there are new entities

                  (setq EMARK (entnext EMARK))  

                  (redraw EMARK 3)

                  (if SSELIST

                     (setq SSELIST (append (list EMARK) SSELIST))

                     (setq SSELIST (list EMARK))

                  )

                  (ssadd EMARK SS)                       ;add them to new SS  

           )

           (ssget "")

           (setq REFPT (getpoint (strcat "\nDisplacement <" (rtos (car REFPT)) "," (rtos (cadr REFPT)) "," (rtos (caddr REFPT))">: ")))

           (if (not REFPT)

               (setq REFPT (getvar "lastpoint"))

           )

           (command "copy" SS "" REFPT "")

     );end while

);end if

(setvar "cmdecho" 1)

(princ)

);end defun

(princ)
发表于 2003-10-14 10:36:00 | 显示全部楼层
还真没发现系统有这个功能啊,害得我还自己开发了一个supercopy,现在一看,原来跟多重复制一模一样。

你可以自己做个菜单,自动输入M,就象那个在同一点break命令一样,依葫芦画瓢就可以了
 楼主| 发表于 2003-10-14 13:03:00 | 显示全部楼层
楼上的,如何做这个自动输入M,我做了一个,只能用于选一个对象,用框选就不行了,请赐教!!
发表于 2003-10-14 13:19:00 | 显示全部楼层
to citykunan :写程序不用这么长吧,我记得我的程序还不到10行代码。

^C^C_copy \\ _m这样可以有一次框选
发表于 2003-10-14 13:39:00 | 显示全部楼层
多重COPY以在COPY的指令里, 加以正確運用可以得到很好的較果. 但並用寫得那樣長的一條程序吧. 樓上的方法是很直接和實用. 呵呵. 但我很少用這個功能.



---------------------------------------------------
I love CAD . 共同交流共同進步.
发表于 2003-10-14 13:45:00 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2003-10-14 16:43:00 | 显示全部楼层
你们说得对,这个方法我也在用,只是只能选一次,另写长程序的朋友,你给的我试了,功能可以,只是结束时必须用ESC,,用右键还是继续复制啊!!
 楼主| 发表于 2003-10-14 16:46:00 | 显示全部楼层
你们说得对,这个方法我也在用,只是只能选一次,另写长程序的朋友,你给的我试了,功能可以,只是结束时必须用ESC,,用右键还是继续复制啊!!
发表于 2003-10-14 17:18:00 | 显示全部楼层
试试下面这个程序,右键退出,不过没有拖动效果,如果你们需要,我可以做一下
(defun c:Scopy( / ss pt pt2)
  (setvar "cmdecho" 0)
  (setq ss (ssget))
  (setq pt (getpoint "\n选择基点:"))
  (setq pt2 (getpoint pt "\n选择插入点:"))
  (while pt2
    (command "_.copy" ss "" pt pt2)
    (setq pt2 (getpoint pt "\n选择插入点:"))
  )
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:36 , Processed in 0.217099 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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