明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: wowan1314

[源码] 【源码分享之自由系列1】可代替copy的自由复制程序--------V1.8版

    [复制链接]
发表于 2014-3-30 16:07:27 | 显示全部楼层
距离要可以改成相对原图形与复制后的距离就好了
发表于 2014-7-14 10:24:10 | 显示全部楼层
本帖最后由 小菜123 于 2014-7-14 10:25 编辑


试用了一下,因为自己使用习惯的原因,做了点修改,加了90度和45度的极轴追踪,为了简化,去掉几个键的功能,拷贝时可以使用快捷键定义的zoom w ;zoom p ;和一个自定义的view r o命令(没有考虑大小写的不同,只针对自己的定义命令),捕捉改为根据系统捕捉方式,发上源码供大家参考:
  1. (DEFUN C:c (/      SS     PT    SIZE   OLDOS  BB     PT1    NEARPT
  2.        G2      H     D    LST   PTX  PTY    PTT1   PTT2
  3.        PTT3   PTT4   AERROR Aerror_end  olderr PT0    SS0
  4.        APT1   JULI   zhuyi1 zhuyi2 F3  F8     pt0x   pt0y
  5.        STARTPT WS ASC REAL cl wpt1 wpt2 get_osmode
  6.       )
  7.   (defun Aerror  (x)
  8.     (Aerror_end)
  9.     (AND oldos (COMMAND "ERASE" SS ""))
  10.   )
  11.   (defun Aerror_end ()
  12.     (setq *error* olderr)
  13.     (if  oldos
  14.       (setvar "osmode" oldos)
  15.     )
  16.     (if  oldCM
  17.       (setvar "cmdecho" oldCM)
  18.     )
  19.     (command "_.undo" "e")
  20.     (REDRAW)
  21.     (prinC)
  22.   )
  23.   ;;;返回捕捉模式字串
  24.   (DEFUN get_osmode (/ cur_mode mode$)
  25.     (SETQ mode$ "")
  26.     (IF    (< 0 (SETQ cur_mode (GETVAR "osmode")) 16384)
  27.       (MAPCAR (FUNCTION    (LAMBDA    (x)
  28.               (IF (NOT (ZEROP (LOGAND cur_mode (CAR x))))
  29.                 (IF    (ZEROP (STRLEN mode$))
  30.                   (SETQ mode$ (CADR x))
  31.                   (SETQ mode$ (STRCAT mode$ "," (CADR x)))
  32.                 )
  33.               )
  34.             )
  35.           )
  36.           '((1 "_end")
  37.         (2 "_mid")
  38.         (4 "_cen")
  39.         (8 "_nod")
  40.         (16 "_qua")
  41.         (32 "_int")
  42.         (64 "_ins")
  43.         (128 "_per")
  44.         (256 "_tan")
  45.         (512 "_nea")
  46.         (1024 "_qui")
  47.         (2048 "_app")
  48.         (4096 "_ext")
  49.         (8192 "_par")
  50.            )
  51.       )
  52.     )
  53.     mode$
  54.   )
  55.     ;;====================程序开始================
  56.   (IF (SETQ SS0 (SSGET ":L"))
  57.     (SETQ PT0 (getpoint "\n选择复制基点:"))
  58.   )
  59.   (IF (AND SS0 PT0)
  60.     (PROGN
  61.       (setq olderr  *error*
  62.       *error* Aerror
  63.       )
  64.       (setq oldos (getvar "osmode")
  65.       oldCM (getvar "cmdecho")
  66.       )
  67.       (setq F8 (getvar "ORTHOMODE")
  68.       F3 T ws  (vlax-Create-Object "WScript.Shell")
  69.       )
  70.       ;;(setvar "osmode" 0)
  71.       (setvar "cmdecho" 0)
  72.       (setvar "nomutt" 0)
  73.       (setq zhuyi1 "\n点取位置或\n[转90度(A)/左右翻(D)/上下翻(S)/对齐(F)/改转角(G)/改基点(T)/默认<"  ;;;/大1倍(+)/小一倍(-)/量取(Z)
  74.       zhuyi2 "mm>(空格)]"
  75.       )
  76.       (command "_.undo" "be")
  77.       (IF *JULI*
  78.   (setq juli *JULI*)
  79.   (setq juli 100)
  80.       )
  81.       (WHILE pt0
  82.   (if pt1
  83.     (setq  pt   pt1
  84.     pt0  pt1
  85.     SS   SS0
  86.     PT0X (mapcar '+ pt0 '(1 0 0))
  87.     PT0y (mapcar '+ pt0 '(0 1 0))
  88.     )
  89.     (setq  pt   pt0
  90.     SS   SS0
  91.     PT0X (mapcar '+ pt0 '(1 0 0))
  92.     PT0y (mapcar '+ pt0 '(0 1 0))
  93.     )
  94.   )
  95.   (command "_.copy" SS "" "0,0" "@")
  96.   (PRINC (strcat zhuyi1 (rtos juli 2) zhuyi2))
  97.   (while PT
  98.     (setq  BB  (grread T 5 1)
  99.     STARTPT  (CADR BB)
  100.     )
  101.     (cond
  102.       ((= (car BB) 5)
  103.        (SETQ PT1 STARTPT)
  104.        (redRaw)
  105.        (setq size (* (getvar "viewsize") 2))

  106.        (if (AND F3
  107.           (not (zerop (strlen (get_osmode)))) ;;有捕捉
  108.           (gxl-Sel-ReDrawSel SS 2)
  109.           (setq
  110.       nearpt (osnap PT1 (get_osmode)) ;;(osnap PT1 "_ENDP,_MID,_INT,NEA")
  111.           )
  112.      )      ; 取得的捕捉点,端点,中点,交点,最近点.
  113.          (PROGN
  114.      (setq g2 nearpt)
  115.      (setq h   (/ (getvar "viewsize")
  116.             (cadr (getvar "screensize"))
  117.          )
  118.            d   (getvar "pickbox")
  119.            lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h))
  120.            ptx (car g2)
  121.            pty (cadr g2)
  122.      )
  123.      (foreach x lst
  124.        (setq ptt1 (list (- ptx x) (- pty x))
  125.        ptt2 (list (+ ptx x) (- pty x))
  126.        ptt3 (list (+ ptx x) (+ pty x))
  127.        ptt4 (list (- ptx x) (+ pty x))
  128.        )
  129.        (grvecs
  130.          (list 2 ptt1 ptt2 ptt2 ptt3 ptt3 ptt4 ptt4 ptt1)
  131.        )
  132.      )
  133.      (setq pt1 g2)
  134.      (gxl-Sel-ReDrawSel SS 1)
  135.          )
  136.        )
  137.        (IF (AND (= G2 NIL) (= F8 1))
  138.          (PROGN
  139.      (setq PT1 STARTPT)
  140.      (IF
  141.        (OR (< (* pi 0.25) (ANGLE PT1 PT0) (* pi 0.75))
  142.            (< (* pi 1.25) (ANGLE PT1 PT0) (* pi 1.75))
  143.        )
  144.         (SETQ PT1
  145.          (inters pt1
  146.            (polar pt1
  147.             (+ (angle pt0 pt0Y) (* pi 0.5))
  148.             1.0
  149.            )
  150.            pt0
  151.            pt0Y
  152.            nil
  153.          )
  154.         )
  155.         (SETQ PT1
  156.          (inters pt1
  157.            (polar pt1
  158.             (+ (angle pt0 pt0X) (* pi 0.5))
  159.             1.0
  160.            )
  161.            pt0
  162.            pt0X
  163.            nil
  164.          )
  165.         )
  166.      )
  167.          )
  168.        )
  169.        (cond ((AND (= G2 NIL)
  170.              (or (< (angle pt0 startpt) (* 0.01 pi)) (> (angle pt0 startpt) (* 1.99 pi)))  ;;;0度方向
  171.          );;and
  172.                        ;;(PROGN  ;;(princ (angle pt0 startpt))
  173.          (SETQ PT1
  174.          (inters pt1
  175.            (polar pt1
  176.             (+ (angle pt0 pt0X) (* pi 0.5))
  177.             1.0
  178.            )
  179.            pt0
  180.            pt0X
  181.            nil
  182.          )
  183.          ) ;;setq
  184.              )
  185.        ((AND (= G2 NIL)
  186.              (and (< (angle pt0 startpt) (* 0.26 pi)) (> (angle pt0 startpt) (* 0.24 pi)))  ;;;45度方向
  187.          );;and
  188.          (SETQ PT1
  189.          (inters pt1
  190.            (polar pt1 (* 0.75 pi)
  191.             ;;(+ (angle pt0 pt0X) (* pi 0.5))
  192.             1.0
  193.            )
  194.            pt0
  195.            (polar pt0 (* 0.25 pi) 1.0)
  196.            nil
  197.          )
  198.          ) ;;setq
  199.              )
  200.        ((AND (= G2 NIL)
  201.              (and (< (angle pt0 startpt) (* 0.51 pi)) (> (angle pt0 startpt) (* 0.49 pi)))  ;;;90度方向
  202.          );;and
  203.          (SETQ PT1
  204.          (inters pt1
  205.            (polar pt1
  206.             (+ (angle pt0 pt0Y) (* pi 0.5))
  207.             1.0
  208.            )
  209.            pt0
  210.            pt0Y
  211.            nil
  212.          )
  213.         ) ;;setq
  214.              )
  215.        ((AND (= G2 NIL)
  216.              (and (< (angle pt0 startpt) (* 0.76 pi)) (> (angle pt0 startpt) (* 0.74 pi)))  ;;;135度方向
  217.          );;and
  218.          (SETQ PT1
  219.          (inters pt1
  220.            (polar pt1 (* 1.25 pi)
  221.               ;;(+ (angle pt0 pt0X) (* pi 0.5))
  222.             1.0
  223.            )
  224.            pt0
  225.            (polar pt0 (* 0.75 pi) 1.0)
  226.            nil
  227.          )
  228.          ) ;;setq
  229.              )
  230.        ((AND (= G2 NIL)
  231.              (and (< (angle pt0 startpt) (* 1.01 pi)) (> (angle pt0 startpt) (* 0.99 pi)))  ;;;180度方向
  232.          );;and
  233.          (SETQ PT1
  234.          (inters pt1
  235.            (polar pt1 (* 1.5 pi)
  236.               ;;(+ (angle pt0 pt0X) (* pi 0.5))
  237.             1.0
  238.            )
  239.            pt0
  240.            (polar pt0 pi 1.0)
  241.            nil
  242.          )
  243.          ) ;;setq
  244.              )
  245.        ((AND (= G2 NIL)
  246.              (and (< (angle pt0 startpt) (* 1.26 pi)) (> (angle pt0 startpt) (* 1.24 pi)))  ;;;225度方向
  247.          );;and
  248.          (SETQ PT1
  249.          (inters pt1
  250.            (polar pt1 (* 1.75 pi)
  251.               ;;(+ (angle pt0 pt0X) (* pi 0.5))
  252.             1.0
  253.            )
  254.            pt0
  255.            (polar pt0 (* 1.25 pi) 1.0)
  256.            nil
  257.          )
  258.          ) ;;setq
  259.              )
  260.        ((AND (= G2 NIL)
  261.              (and (< (angle pt0 startpt) (* 1.51 pi)) (> (angle pt0 startpt) (* 1.49 pi)))  ;;;270度方向
  262.          );;and
  263.          (SETQ PT1
  264.          (inters pt1
  265.            (polar pt1 (* 2 pi)
  266.               ;;(+ (angle pt0 pt0X) (* pi 0.5))
  267.             1.0
  268.            )
  269.            pt0
  270.            (polar pt0 (* 1.5 pi) 1.0)
  271.            nil
  272.          )
  273.          ) ;;setq
  274.              )
  275.        ((AND (= G2 NIL)
  276.              (and (< (angle pt0 startpt) (* 1.76 pi)) (> (angle pt0 startpt) (* 1.74 pi)))  ;;;270度方向
  277.          );;and
  278.          (SETQ PT1
  279.          (inters pt1
  280.            (polar pt1 (* 2.25 pi)
  281.               ;;(+ (angle pt0 pt0X) (* pi 0.5))
  282.             1.0
  283.            )
  284.            pt0
  285.            (polar pt0 (* 1.75 pi) 1.0)
  286.            nil
  287.          )
  288.          ) ;;setq
  289.              )
  290.        );;cond
  291.        (GRVECS
  292.          (LIST 1314
  293.          PT0
  294.          PT1
  295.          1314
  296.          STARTPT
  297.          (mapcar '+ (LIST size 0 0) STARTPT)
  298.          1314
  299.          STARTPT
  300.          (mapcar '- STARTPT (LIST size 0 0))
  301.          1314
  302.          STARTPT
  303.          (mapcar '- STARTPT (LIST 0 size 0))
  304.          1314
  305.          STARTPT
  306.          (mapcar '+ (LIST 0 size 0) STARTPT)
  307.          )
  308.        )
  309.        (COMMAND "MOVE" SS "" PT PT1)
  310.        (SETQ PT PT1
  311.        G2 NIL
  312.        )
  313.       )
  314.       ((= (car BB) 3) (SETQ PT NIL))
  315.       ((member (car BB) '(11 25)) (SETQ pt0 NIL) (EXIT))
  316.       ((member BB '((2 97) (2 65)))
  317.        (COMMAND "ROTATE" SS "" PT1 90)
  318.       )
  319.       ((member BB '((2 71) (2 103)))  ;;((2 82) (2 114)) 大小写的R
  320.        (redraw)
  321.        (COMMAND "ROTATE" SS "" PT1 pause)
  322.       )
  323.       ((member BB '((2 70) (2 102)))
  324.        (REDRAW)
  325.        ;;对齐
  326.        (setvar "osmode" oldos)
  327.        (initget 1)
  328.        (IF (SETQ APT1 (getpoint "\n选择第一个源点:"))
  329.          (PROGN
  330.      (COMMAND "align" SS "" APT1)
  331.      (princ "\n选择第一个目标点:")
  332.      (COMMAND pause)
  333.      (princ "\n选择第二个源点:")
  334.      (COMMAND pause)
  335.      (princ "\n选择第二个目标点:")
  336.      (COMMAND pause)
  337.      (COMMAND "" "N")
  338.      (REDRAW)
  339.      (setvar "osmode" 0)
  340.          )
  341.          (PRINC (strcat zhuyi1 (rtos juli 2) zhuyi2))
  342.        )
  343.       )
  344.       ((member BB '((2 115) (2 83)))
  345.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(1 0)) "Y")
  346.       )
  347.            ;|
  348.       ((member BB '((2 32)))
  349.        (IF JULI
  350.          (progn (setq pt1 (polar PT0 (ANGLE PT0 PT1) JULI))
  351.           (COMMAND "MOVE" SS "" PT PT1)
  352.           (SETQ PT nil)
  353.          )
  354.        )
  355.       )
  356.       |;
  357.       ((and (null cl) (member BB '((2 32)))) (SETQ pt0 NIL) (EXIT)) ;;空格改为退出 cl是避免快捷键中的空格
  358.       ((member BB
  359.          '((2 46)
  360.            (2 49)
  361.            (2 48)
  362.            (2 50)
  363.            (2 51)
  364.            (2 52)
  365.            (2 53)
  366.            (2 54)
  367.            (2 55)
  368.            (2 56)
  369.            (2 57)
  370.           )
  371.        )
  372.        (redraw)
  373.        (setq
  374.        ASC (CADR BB)
  375.        )
  376.        (setq real
  377.         (getreal
  378.           (car
  379.       (list ""
  380.             (vlax-invoke-method ws 'sendkeys (chr asc))
  381.       )
  382.           )
  383.         )
  384.        )
  385.        (setq pt1 (polar PT0 (ANGLE PT0 PT1) real))
  386.        (COMMAND "MOVE" SS "" pt PT1)
  387.        (SETQ *JULI* real
  388.        JULI  *JULI*
  389.        PT NIL
  390.        )
  391.       )
  392.       ;|
  393.       ((member BB '((2 90) (2 122))) ;;;大小写的Z,与zoom冲突
  394.        (redraw)
  395.        (setq
  396.          juli (getdist
  397.           (strcat "\n输入复制距离<" (rtos juli 2) ">:")
  398.         )
  399.        )
  400.        (setq pt1 (polar PT0 (ANGLE PT0 PT1) JULI))
  401.        (COMMAND "MOVE" SS "" PT PT1)
  402.        (SETQ PT nil
  403.        *JULI* JULI
  404.        )
  405.       )
  406.       |;
  407.       ((member BB '((2 100) (2 68)))
  408.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(0 1)) "Y")
  409.       )
  410.       ;;((member BB '((2 43) (2 61))) ;;+号
  411.       ;; (COMMAND "scale" SS "" PT1 "2")
  412.      ;; )
  413.       ((member BB '((2 116) (2 84)))
  414.        (setvar "osmode" oldos)
  415.        (redRaw)
  416.        (IF (setq pt (getpoint "\n请选择新基点:"))
  417.          (PRINC (strcat zhuyi1 (rtos juli 2) zhuyi2))
  418.          (exit)
  419.        )
  420.        (setvar "osmode" 0)
  421.       )
  422.      ;; ((equal BB '(2 45)) ;-号
  423.      ;;  (COMMAND "scale" SS "" PT1 "0.5")
  424.      ;; )
  425.       ((equal BB '(2 6))
  426.        (if (= f3 NIL)
  427.          (progn (setq f3 T) (prompt "\n<对象捕捉 开>"))
  428.          (progn (setq f3 NIL) (prompt "\n<对象捕捉 关>"))
  429.        )
  430.        (redraw)
  431.       )
  432.       ((equal BB '(2 15))
  433.        (if (= f8 0)
  434.          (progn (setq f8 1) (prompt "\n<正交 开>"))
  435.          (progn (setq f8 0) (prompt "\n<正交 关>"))
  436.        )
  437.        (setvar "orthomode" f8)
  438.        (redraw)
  439.       )
  440.       ((member BB '((2 39)
  441.         (2 95)
  442.         (2 90)
  443.         (2 79)
  444.         (2 77)
  445.         (2 32)
  446.         (2 87)
  447.         (2 80)
  448.         (2 45)
  449.         (2 86)
  450.         (2 73)
  451.         (2 69)
  452.         (2 82)
  453.         (2 10)
  454.        )
  455.         );;member
  456.        (if (equal BB '(2 10))
  457.            (progn  
  458.        (cond ((equal cl '(2 87))
  459.         (redraw)
  460.         (gxl-Sel-ReDrawSel SS 2)
  461.         (command "_.zoom" "w")
  462.         (initget 1)
  463.         (setq wpt1 (getpoint "\nSpecify first corner:"))
  464.         (initget 1)
  465.         (setq wpt2 (getcorner wpt1 "\nSpecify opposite corner:"))
  466.         ;;(while (/= 0 (getvar "cmdactive")) (vl-cmdf PAUSE))
  467.         (command wpt1 wpt2)
  468.         (PRINC (strcat zhuyi1 (rtos juli 2) zhuyi2))
  469.        )
  470.        ((equal cl '(2 80)) (command "_.zoom" "p"))
  471.        ((equal cl '(2 79)) (command "-view" "r" "o"))
  472.                    )
  473.        (setq cl nil)
  474.      )
  475.            (setq cl bb);;else
  476.        )   
  477.            
  478.       )
  479.     )
  480.   )
  481.   ;;END 内WHILE

  482.       )
  483.       ;;END 外WHILE
  484.     )          ;END progn
  485.   )
  486.   ;;end if
  487.   (Aerror_end)
  488. )

评分

参与人数 2明经币 +1 金钱 +6 收起 理由
baoyizhu + 6 很给力!
wowan1314 + 1 赞一个! 圆心如何捕捉到的呢?

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2014-7-14 11:25:45 | 显示全部楼层
小菜123 发表于 2014-7-14 10:24
试用了一下,因为自己使用习惯的原因,做了点修改,加了90度和45度的极轴追踪,为了简化,去掉几个键的功 ...

谢谢小菜老大
发表于 2014-7-14 16:30:56 | 显示全部楼层
楼主,为什么增加不了圆心捕捉呢?增加程序的捕捉,偏偏就是圆心增加不了,其他都可以
发表于 2014-7-28 15:36:20 | 显示全部楼层
不错支持,就是复制的时候会闪动,希望能出1.7版:)
发表于 2014-10-24 23:34:31 来自手机 | 显示全部楼层
不错啊。。。。。。。。马克一下
发表于 2014-10-25 13:14:27 | 显示全部楼层
感谢楼主分享源码
发现一处BUG:在执行命令点选基点后(不移动鼠标),滚轮缩放后,被复制物体就不见了,选基点后选先移动一点再滚是没问题.
还有就是一个建议,建议保持用户默认的捕捉开关
发表于 2014-10-25 13:36:23 | 显示全部楼层
dybdyb_1999 发表于 2014-7-28 15:36
不错支持,就是复制的时候会闪动,希望能出1.7版:)

是的.  

不好意思 现在刚刚说的BUG又没有出现了..
发表于 2014-10-31 23:44:00 | 显示全部楼层
小菜123 发表于 2014-7-14 10:24
试用了一下,因为自己使用习惯的原因,做了点修改,加了90度和45度的极轴追踪,为了简化,去掉几个键的功 ...

你这个好像用不了,加载不起
发表于 2014-11-8 14:20:34 | 显示全部楼层
不能够下载 好伤心,注册好,努力的赚取点积分,,,,,,,,,,,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 10:55 , Processed in 0.164284 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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