明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 24476|回复: 118

[资源] 好程序不敢独享!

    [复制链接]
发表于 2014-8-26 09:55 | 显示全部楼层 |阅读模式
本帖最后由 lucas_3333 于 2015-5-15 20:07 编辑

从第一版到第二版 都只支持第一点捕捉,因为grread的关系,第二点带捕捉有点困难!
这是第一版本
  1. (defun c:cam4 (/ *ERROR* STRBRK FOO1 FOO2

  2.                  ANG BLG C1 CEN CEN2 CODE DATA DELTA DIS
  3.                  EN GR IANG LEN LST POLY RAD RAD1 RAD2 TAN)
  4.   ;; by Lee McDonnell (Lee Mac)  ~  19.12.2009
  5.   
  6.   (vl-load-com)
  7.   

  8.   (defun *error* (msg)
  9.     (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  10.         (princ (strcat "\n** Error: " msg " **")))
  11.     (princ))
  12.   

  13.   (defun StrBrk (str chrc / pos lst)
  14.    
  15.     (while (setq pos (vl-string-position chrc str))
  16.       (setq lst (cons (substr str 1 pos) lst)
  17.             str (substr str (+ pos 2))))
  18.    
  19.     (reverse (cons str lst)))
  20.   

  21.   (if (setq cen (getpoint "\nPick Center of First Radius: "))
  22.     (progn
  23.       (setq poly (entmakex
  24.                    (list
  25.                      (cons 0 "LWPOLYLINE")
  26.                      (cons 100 "AcDbEntity")
  27.                      (cons 100 "AcDbPolyline")
  28.                      (cons 90 2)
  29.                      (cons 70 1)
  30.                      (cons 10 cen)
  31.                      (cons 10 (polar cen 0 1.))))

  32.             en   (reverse
  33.                    (vl-member-if
  34.                      (function
  35.                        (lambda (x)
  36.                          (= 39 (car x))))
  37.                      
  38.                      (reverse (entget poly)))))
  39.       

  40.       (defun foo1 nil (setq str "")
  41.         (while
  42.           (progn
  43.             (setq gr (grread 't 15 0) code (car gr) data (cadr gr))
  44.             
  45.             (cond (  (and (= 5 code) (listp data))
  46.                   
  47.                      (setq rad2 (distance cen2 data) delta (- rad rad2))
  48.                   
  49.                      (if (< (abs delta) len)
  50.                        (progn
  51.                        
  52.                          (setq tan  (sqrt (- (* len len) (* delta delta))) iAng (atan tan delta)
  53.                              
  54.                                blg1 (/ (sin (* 0.5 (- pi iAng))) (cos (* 0.5 (- pi iAng))))
  55.                              
  56.                                blg2 (/ (sin (* 0.5 iAng))        (cos (* 0.5 iAng))))
  57.                        
  58.                          (entmod
  59.                            (append en
  60.                              (list
  61.                                (cons 10 (polar cen  (+ ang iAng) rad))
  62.                                (cons 42 blg1)
  63.                                (cons 10 (polar cen  (- ang iAng) rad))
  64.                                    
  65.                                (cons 10 (polar cen2 (- ang iAng) rad2))
  66.                                (cons 42 blg2)
  67.                                (cons 10 (polar cen2 (+ ang iAng) rad2)))))) t))
  68.                   
  69.                   (  (and (= 3 code) (listp data))

  70.                      (setq rad2 (distance cen2 data) delta (- rad rad2))
  71.                   
  72.                      (if (< (abs delta) len)
  73.                        (progn
  74.                        
  75.                          (setq tan  (sqrt (- (* len len) (* delta delta))) iAng (atan tan delta)
  76.                              
  77.                                blg1 (/ (sin (* 0.5 (- pi iAng))) (cos (* 0.5 (- pi iAng))))
  78.                              
  79.                                blg2 (/ (sin (* 0.5 iAng))        (cos (* 0.5 iAng))))
  80.                        
  81.                          (entmod
  82.                            (append en
  83.                              (list
  84.                                (cons 10 (polar cen  (+ ang iAng) rad))
  85.                                (cons 42 blg1)
  86.                                (cons 10 (polar cen  (- ang iAng) rad))
  87.                                    
  88.                                (cons 10 (polar cen2 (- ang iAng) rad2))
  89.                                (cons 42 blg2)
  90.                                (cons 10 (polar cen2 (+ ang iAng) rad2))))) nil)))

  91.                   (  (= 2 code)

  92.                      (cond (  (or (= data 46) (< 47 data 58))
  93.                           
  94.                               (setq str (strcat str (princ (chr data)))))

  95.                            (  (and (< 0 (strlen str)) (= 8 data))

  96.                               (setq str (substr str 1 (1- (strlen str))))
  97.                               (princ (vl-list->string '(8 32 8))))

  98.                            (  (vl-position data '(32 13))

  99.                               (cond (  (zerop (strlen str)) t)

  100.                                     (  (and (setq tmp (distof str)) (not (zerop tmp)))
  101.                                    
  102.                                        (setq data (polar cen2 0 tmp) rad2 (distance cen2 data)

  103.                                              delta (- rad rad2))

  104.                                        (if (< (abs delta) len)
  105.                                          (progn

  106.                                            (setq tan  (sqrt (- (* len len) (* delta delta))) iAng (atan tan delta)

  107.                                                  blg1 (/ (sin (* 0.5 (- pi iAng))) (cos (* 0.5 (- pi iAng))))

  108.                                                  blg2 (/ (sin (* 0.5 iAng))        (cos (* 0.5 iAng))))
  109.                        
  110.                                            (entmod
  111.                                              (append en
  112.                                                (list
  113.                                                  (cons 10 (polar cen  (+ ang iAng) rad))
  114.                                                  (cons 42 blg1)
  115.                                                  (cons 10 (polar cen  (- ang iAng) rad))
  116.                                                 
  117.                                                  (cons 10 (polar cen2 (- ang iAng) rad2))
  118.                                                  (cons 42 blg2)
  119.                                                  (cons 10 (polar cen2 (+ ang iAng) rad2))))) nil)))

  120.                                     (t (setq str "")

  121.                                        (princ (strcat "\n** Invalid Input **" msg)))))
  122.                            (t )))
  123.                   
  124.                   (t )))))
  125.       

  126.       (defun foo2 nil  (setq str "")
  127.         (while
  128.           (progn
  129.             (setq gr (grread 't 15 0) code (car gr) data (cadr gr))
  130.             
  131.             (cond (  (and (= 5 code) (listp data))
  132.                   
  133.                      (setq dis (distance cen data) ang (angle cen data))
  134.                   
  135.                      (if (< rad dis)
  136.                        (progn
  137.                        
  138.                          (setq tan  (sqrt (- (* dis dis) (* rad rad)))
  139.                              
  140.                                iAng (atan tan rad)
  141.                              
  142.                                blg  (/ (sin (* 0.5 (- pi iAng)))
  143.                                        (cos (* 0.5 (- pi iAng)))))
  144.                        
  145.                          (entmod
  146.                            (append en
  147.                              (setq lst
  148.                                 (list
  149.                                   (cons 10 data)
  150.                                   (cons 10 (polar cen (+ ang iAng) rad))
  151.                                   (cons 42 blg)
  152.                                   (cons 10 (polar cen (- ang iAng) rad))))))) t))
  153.                   
  154.                   (  (and (= 3 code) (listp data))
  155.                   
  156.                      (setq dis (distance cen data) ang (angle cen data))
  157.                   
  158.                      (if (< rad dis)
  159.                        (progn
  160.                        
  161.                          (setq tan  (sqrt (- (* dis dis) (* rad rad)))
  162.                              
  163.                                iAng (atan tan rad)
  164.                              
  165.                                blg  (/ (sin (* 0.5 (- pi iAng)))
  166.                                        (cos (* 0.5 (- pi iAng)))))
  167.                        
  168.                          (setq en
  169.                            (append en
  170.                              (list
  171.                                (cons 10 data)
  172.                                (cons 10 data)
  173.                                (cons 10 (polar cen (+ ang iAng) rad))
  174.                                (cons 42 blg)
  175.                                (cons 10 (polar cen (- ang iAng) rad)))))
  176.                        
  177.                          (setq en (reverse
  178.                                     (vl-member-if
  179.                                       (function
  180.                                         (lambda (x)
  181.                                           (= 39 (car x))))
  182.                                     
  183.                                       (reverse
  184.                                         (entmod
  185.                                           (subst (cons 90 4) (assoc 90 en) en)))))
  186.                              
  187.                                cen2 data len (distance cen cen2) ang (angle cen cen2))
  188.                        
  189.                          (setq msg (princ "\nPick Second Radius: "))
  190.                          (foo1))))

  191.                   (  (= 2 code)

  192.                      (cond (  (or (vl-position data '(44 46)) (< 47 data 58))
  193.                           
  194.                               (setq str (strcat str (princ (chr data)))))

  195.                            (  (and (< 0 (strlen str)) (= 8 data))

  196.                               (setq str (substr str 1 (1- (strlen str))))
  197.                               (princ (vl-list->string '(8 32 8))))

  198.                            (  (vl-position data '(32 13))                           

  199.                               (cond (  (zerop (strlen str)) t)

  200.                                     (  (apply (function and)
  201.                                          (setq tmp
  202.                                            (mapcar (function distof) (StrBrk str 44))))

  203.                                        (setq data tmp dis (distance cen data) ang (angle cen data))

  204.                                        (if (< rad dis)
  205.                                          (progn

  206.                                            (setq tan  (sqrt (- (* dis dis) (* rad rad)))
  207.                              
  208.                                                  iAng (atan tan rad)
  209.                                                 
  210.                                                  blg  (/ (sin (* 0.5 (- pi iAng)))
  211.                                                          (cos (* 0.5 (- pi iAng)))))
  212.                                           
  213.                                            (setq en
  214.                                              (append en
  215.                                                (list
  216.                                                  (cons 10 data)
  217.                                                  (cons 10 data)
  218.                                                  (cons 10 (polar cen (+ ang iAng) rad))
  219.                                                  (cons 42 blg)
  220.                                                  (cons 10 (polar cen (- ang iAng) rad)))))
  221.                                           
  222.                                            (setq en (reverse
  223.                                                       (vl-member-if
  224.                                                         (function
  225.                                                           (lambda (x)
  226.                                                             (= 39 (car x))))
  227.                                                         
  228.                                                         (reverse
  229.                                                           (entmod
  230.                                                             (subst (cons 90 4) (assoc 90 en) en)))))
  231.                                                 
  232.                                                  cen2 data len (distance cen cen2) ang (angle cen cen2))
  233.                                           
  234.                                            (setq msg (princ "\nPick Second Radius: "))
  235.                                            (foo1))))

  236.                                     (t (setq str "")
  237.                                     
  238.                                        (princ (strcat "\n** Invalid Input **" msg)))))
  239.                            (t )))
  240.                                     
  241.                   (t )))))
  242.       
  243.       
  244.       (setq msg (princ "\nPick First Radius: ")) (setq str "")      
  245.       
  246.       (while
  247.         (progn
  248.           (setq gr (grread 't 15 0) code (car gr) data (cadr gr))

  249.           (cond (  (and (= 5 code) (listp data))
  250.                  
  251.                    (setq data (trans data 1 0) ang (angle cen data)

  252.                          dis (distance cen data))

  253.                    (entmod
  254.                      (append en
  255.                        (setq lst
  256.                          (list
  257.                            (cons 10 data)
  258.                            (cons 42 1.)
  259.                            (cons 10 (polar data (+ ang pi) (* 2. dis)))
  260.                            (cons 42 1.))))))

  261.                 (  (and (= 3 code) (listp data))
  262.                  
  263.                    (setq data (trans data 1 0))

  264.                    (setq en
  265.                      (append en
  266.                        (setq lst
  267.                          (list
  268.                            (cons 10 data)
  269.                            (cons 42 1.)
  270.                            (cons 10 (polar data (+ ang pi) (* 2. dis)))
  271.                            (cons 42 1.)
  272.                            (cons 10 data))))

  273.                          en (reverse
  274.                               (vl-member-if
  275.                                 (function
  276.                                   (lambda (x)
  277.                                     (= 39 (car x))))

  278.                                 (reverse
  279.                                   (entmod
  280.                                     (subst (cons 90 3) (assoc 90 en) en)))))
  281.                         
  282.                          rad (distance cen data))

  283.                    (princ (setq msg "\nPick Center of Second Radius: "))
  284.                    (foo2))

  285.                 (  (= code 2)

  286.                    (cond (  (or (= data 46) (< 47 data 58))
  287.                           
  288.                             (setq str (strcat str (princ (chr data)))))

  289.                          (  (and (< 0 (strlen str)) (= 8 data))

  290.                             (setq str (substr str 1 (1- (strlen str))))
  291.                             (princ (vl-list->string '(8 32 8))))

  292.                          (  (vl-position data '(32 13))                           

  293.                             (cond (  (zerop (strlen str)) t)

  294.                                   (  (and (setq tmp (distof str))
  295.                                           (not (zerop tmp)))
  296.                                    
  297.                                      (setq data (polar cen 0 tmp))

  298.                                      (setq en
  299.                                        (append en
  300.                                          (setq lst
  301.                                            (list
  302.                                              (cons 10 data)
  303.                                              (cons 42 1.)
  304.                                              (cons 10 (polar data (+ ang pi) (* 2. dis)))
  305.                                              (cons 42 1.)
  306.                                              (cons 10 data))))

  307.                                            en (reverse
  308.                                                 (vl-member-if
  309.                                                   (function
  310.                                                     (lambda (x)
  311.                                                       (= 39 (car x))))
  312.                                                   
  313.                                                   (reverse
  314.                                                     (entmod
  315.                                                       (subst (cons 90 3) (assoc 90 en) en)))))
  316.                                           
  317.                                            rad (distance cen data))

  318.                                      (setq msg (princ "\nPick Center of Second Radius: "))
  319.                                      (foo2))

  320.                                   (t (setq str "")

  321.                                      (princ (strcat "\n** Invalid Input **" msg)))))
  322.                          (t )))
  323.                  
  324.                 (t ))))))
  325.   (princ))


后来,我向leemac 提出,第二点捕捉就没有办法了吗?遗憾!
没过几天,leemac升级到了第三版,第一点与第二点都支持捕捉,好东西,不敢独享,特来与大家分享!  

  1. ;;-----------------------=={ Circle Tangents  }==-----------------------;;
  2. ;;                                                                      ;;
  3. ;;  This program allows the user to dynamically construct two circles   ;;
  4. ;;  connected with a pair of lines meeting the circumference of each    ;;
  5. ;;  circle at a tangent, resulting in a belt or cam shape.              ;;
  6. ;;                                                                      ;;
  7. ;;  Upon issuing the command syntax 'ctan' at the AutoCAD               ;;
  8. ;;  command-line, the program will issue four successive prompts: the   ;;
  9. ;;  user is prompted to specify the center of the first circle, the     ;;
  10. ;;  radius of the first circle, followed by the center & radius of      ;;
  11. ;;  the second circle.                                                  ;;
  12. ;;                                                                      ;;
  13. ;;  During each of these prompts, the circles and adjoining lines are   ;;
  14. ;;  displayed dynamically in real-time relative to the position of the  ;;
  15. ;;  AutoCAD cursor.                                                     ;;
  16. ;;                                                                      ;;
  17. ;;  Following valid responses to all prompts, the program will          ;;
  18. ;;  construct the resulting shape using a 2D polyline (LWPolyline).     ;;
  19. ;;                                                                      ;;
  20. ;;  However, if the radius of the second circle is greater than the     ;;
  21. ;;  combination of the distance between the circle centers & radius of  ;;
  22. ;;  the first circle, the program will instead construct a circle       ;;
  23. ;;  centered at the second given center, with radius equal to this      ;;
  24. ;;  maximum limit.                                                      ;;
  25. ;;                                                                      ;;
  26. ;;  Similarly, if the distance between the two circle centers is less   ;;
  27. ;;  than the radius of the first circle, the program will construct     ;;
  28. ;;  only the first circle.                                              ;;
  29. ;;                                                                      ;;
  30. ;;  Although the dynamic visual effect is dependent on heavy use of     ;;
  31. ;;  the AutoLISP grread function, this program utilises my GrSnap       ;;
  32. ;;  utility to enable full Object Snap functionality during the         ;;
  33. ;;  dynamic prompts. The latest version and full documentation for      ;;
  34. ;;  this utility may be found at: http://www.lee-mac.com/grsnap.html    ;;
  35. ;;                                                                      ;;
  36. ;;  Finally, this program has been designed to perform successfully     ;;
  37. ;;  under all UCS & View settings.                                      ;;
  38. ;;                                                                      ;;
  39. ;;----------------------------------------------------------------------;;
  40. ;;  Author:  Lee Mac, Copyright ?2014  -  www.lee-mac.com              ;;
  41. ;;----------------------------------------------------------------------;;
  42. ;;  Version 1.0    -    2014-08-25                                      ;;
  43. ;;                                                                      ;;
  44. ;;  First release.                                                      ;;
  45. ;;----------------------------------------------------------------------;;

  46. (defun c:ctan ( / *error* grcircle grarc grgetpoint an1 an2 cn1 cn2 di1 di2 ocs rd1 rd2 tmp )

  47.     (setq ctan:res 40 ;; arc resolution (int > 0)
  48.           ctan:2pi (+ pi pi)
  49.           ctan:inc (/ ctan:2pi ctan:res)
  50.     )
  51.    
  52.     (defun *error* ( msg )
  53.         (LM:endundo (LM:acdoc))
  54.         (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
  55.             (princ (strcat "\nError: " msg))
  56.         )
  57.         (redraw) (princ)
  58.     )

  59.     (defun grcircle ( cen rad / ang )
  60.         (setq ang 0.0)
  61.         (repeat ctan:res
  62.             (grdraw (polar cen ang rad) (polar cen (setq ang (+ ang ctan:inc)) rad) 1)
  63.         )
  64.     )

  65.     (defun grarc ( cen pt1 pt2 / ang rad )
  66.         (setq ang (angle cen pt1)
  67.               rad (distance cen pt1)
  68.         )
  69.         (repeat (fix (/ (rem (+ (- (angle cen pt2) ang) ctan:2pi) ctan:2pi) ctan:inc))
  70.             (grdraw pt1 (setq pt1 (polar cen (setq ang (+ ang ctan:inc)) rad)) 1)
  71.         )
  72.         (grdraw pt1 pt2 1)
  73.     )

  74.     (defun grgetpoint ( msg bpt flg fun / gr1 gr2 osf osm rtn str tmp )
  75.         (setq osf (LM:grsnap:snapfunction)
  76.               osm (getvar 'osmode)
  77.               fun (eval fun)
  78.               str ""
  79.         )
  80.         (princ msg)
  81.         (while
  82.             (progn
  83.                 (setq gr1 (grread t 15 0)
  84.                       gr2 (cadr gr1)
  85.                       gr1 (car  gr1)
  86.                 )
  87.                 (cond
  88.                     (   (= 5 gr1) (redraw)
  89.                         (osf gr2 osm)
  90.                         (fun gr2)
  91.                         t
  92.                     )
  93.                     (   (= 3 gr1) nil)
  94.                     (   (= 2 gr1)
  95.                         (cond
  96.                             (   (= 6 gr2)
  97.                                 (if (zerop (logand 16384 (setq osm (setvar 'osmode (boole 6 16384 (getvar 'osmode))))))
  98.                                     (princ "\n<Osnap on>")
  99.                                     (princ "\n<Osnap off>")
  100.                                 )
  101.                                 (princ msg)
  102.                             )
  103.                             (   (= 8 gr2)
  104.                                 (if (< 0 (strlen str))
  105.                                     (progn
  106.                                         (princ "\010\040\010")
  107.                                         (setq str (substr str 1 (1- (strlen str))))
  108.                                     )
  109.                                 )
  110.                                 t
  111.                             )
  112.                             (   (< 32 gr2 127)
  113.                                 (setq str (strcat str (princ (chr gr2))))
  114.                             )
  115.                             (   (member gr2 '(13 32))
  116.                                 (cond
  117.                                     (   (= "" str) nil)
  118.                                     (   (setq gr2 (LM:grsnap:parsepoint bpt str))
  119.                                         (setq osm 16384)
  120.                                         nil
  121.                                     )
  122.                                     (   (setq tmp (LM:grsnap:snapmode str))
  123.                                         (setq osm tmp
  124.                                               str ""
  125.                                         )
  126.                                     )
  127.                                     (   (and  flg (distof str))
  128.                                         (setq gr2 (mapcar '+ bpt (list (distof str) 0.0 0.0))
  129.                                               osm 16384
  130.                                         )
  131.                                         nil
  132.                                     )
  133.                                     (   (setq str "")
  134.                                         (princ (strcat "\n2D / 3D Point Required." msg))
  135.                                     )
  136.                                 )
  137.                             )
  138.                         )
  139.                     )
  140.                 )
  141.             )
  142.         )
  143.         (if (listp gr2) (osf gr2 osm))
  144.     )

  145.     (LM:startundo (LM:acdoc))
  146.     (if (setq cn1 (getpoint "\nSpecify center of 1st circle: "))
  147.         (progn
  148.             (while
  149.                 (and
  150.                     (setq tmp
  151.                         (grgetpoint "\nSpecify 1st radius: " cn1 t
  152.                             (function
  153.                                 (lambda ( gr2 )
  154.                                     (grcircle cn1 (distance cn1 gr2))
  155.                                 )
  156.                             )
  157.                         )
  158.                     )
  159.                     (equal 0.0 (setq rd1 (distance cn1 tmp)) 1e-8)
  160.                 )
  161.                 (princ "\nRadius cannot be zero.")
  162.             )
  163.             (if
  164.                 (and tmp
  165.                     (setq cn2
  166.                         (grgetpoint "\nSpecify center of 2nd circle: " cn1 nil
  167.                             (function
  168.                                 (lambda ( gr2 / an1 an2 di1 pt1 pt2 )
  169.                                     (if (< rd1 (setq di1 (distance cn1 gr2)))
  170.                                         (progn
  171.                                             (setq an1 (angle cn1 gr2)
  172.                                                   an2 (atan (sqrt (- (* di1 di1) (* rd1 rd1))) rd1)
  173.                                                   pt1 (polar cn1 (+ an1 an2) rd1)
  174.                                                   pt2 (polar cn1 (- an1 an2) rd1)
  175.                                             )
  176.                                             (grarc  cn1 pt1 pt2)
  177.                                             (grdraw gr2 pt1 1)
  178.                                             (grdraw gr2 pt2 1)
  179.                                         )
  180.                                         (grcircle cn1 rd1)
  181.                                     )
  182.                                 )
  183.                             )
  184.                         )
  185.                     )
  186.                     (setq di1 (distance cn1 cn2)
  187.                           an1 (angle cn1 cn2)
  188.                           ocs (trans '(0.0 0.0 1.0) 1 0 t)
  189.                     )
  190.                 )
  191.                 (if (< rd1 di1)
  192.                     (if
  193.                         (setq tmp
  194.                             (grgetpoint "\nSpecify 2nd radius: " cn2 t
  195.                                 (function
  196.                                     (lambda ( gr2 / an2 pt1 pt2 pt3 pt4 )
  197.                                         (if (< (abs (setq di2 (- rd1 (setq rd2 (distance cn2 gr2))))) di1)
  198.                                             (progn
  199.                                                 (setq an2 (atan (sqrt (- (* di1 di1) (* di2 di2))) di2)
  200.                                                       pt1 (polar cn1 (+ an1 an2) rd1)
  201.                                                       pt2 (polar cn1 (- an1 an2) rd1)
  202.                                                       pt3 (polar cn2 (- an1 an2) rd2)
  203.                                                       pt4 (polar cn2 (+ an1 an2) rd2)
  204.                                                 )
  205.                                                 (grarc  cn1 pt1 pt2)
  206.                                                 (grarc  cn2 pt3 pt4)
  207.                                                 (grdraw pt1 pt4 1)
  208.                                                 (grdraw pt2 pt3 1)
  209.                                             )
  210.                                             (grcircle cn2 (+ di1 rd1))
  211.                                         )
  212.                                     )
  213.                                 )
  214.                             )
  215.                         )
  216.                         (if (< (abs (setq di2 (- rd1 (setq rd2 (distance cn2 tmp))))) di1)
  217.                             (progn
  218.                                 (setq an2 (atan (sqrt (- (* di1 di1) (* di2 di2))) di2))
  219.                                 (entmake
  220.                                     (list
  221.                                        '(000 . "LWPOLYLINE")
  222.                                        '(100 . "AcDbEntity")
  223.                                        '(100 . "AcDbPolyline")
  224.                                        '(090 . 40)
  225.                                        '(070 . 01)
  226.                                         (cons 010 (trans (polar cn1 (+ an1 an2) rd1) 1 ocs))
  227.                                         (cons 042 (/ (sin (/ (- pi an2) 2.0)) (cos (/ (- pi an2) 2.0))))
  228.                                         (cons 010 (trans (polar cn1 (- an1 an2) rd1) 1 ocs))
  229.                                         (cons 010 (trans (polar cn2 (- an1 an2) rd2) 1 ocs))
  230.                                         (cons 042 (/ (sin (/ an2 2.0)) (cos (/ an2 2.0))))
  231.                                         (cons 010 (trans (polar cn2 (+ an1 an2) rd2) 1 ocs))
  232.                                         (cons 210 ocs)
  233.                                     )
  234.                                 )
  235.                             )
  236.                             (entmake
  237.                                 (list
  238.                                    '(000 . "CIRCLE")
  239.                                     (cons 010 (trans cn2 1 ocs))
  240.                                     (cons 040 (+ di1 rd1))
  241.                                     (cons 210 ocs)
  242.                                 )
  243.                             )
  244.                         )
  245.                     )
  246.                     (entmake
  247.                         (list
  248.                            '(000 . "CIRCLE")
  249.                             (cons 010 (trans cn1 1 ocs))
  250.                             (cons 040 rd1)
  251.                             (cons 210 ocs)
  252.                         )
  253.                     )
  254.                 )
  255.             )
  256.         )
  257.     )
  258.     (*error* nil)
  259.     (princ)
  260. )

  261. ;; Object Snap for grread: Snap Function  -  Lee Mac
  262. ;; Returns: [fun] A function requiring two arguments:
  263. ;; p - [lst] UCS Point to be snapped
  264. ;; o - [int] Object Snap bit code
  265. ;; The returned function returns either the snapped point (displaying an appropriate snap symbol)
  266. ;; or the supplied point if the snap failed for the given Object Snap bit code.

  267. (defun LM:grsnap:snapfunction ( )
  268.     (eval
  269.         (list 'lambda '( p o / q )
  270.             (list 'if '(zerop (logand 16384 o))
  271.                 (list 'if
  272.                    '(setq q
  273.                         (cdar
  274.                             (vl-sort
  275.                                 (vl-remove-if 'null
  276.                                     (mapcar
  277.                                         (function
  278.                                             (lambda ( a / b )
  279.                                                 (if (and (= (car a) (logand (car a) o)) (setq b (osnap p (cdr a))))
  280.                                                     (list (distance p b) b (car a))
  281.                                                 )
  282.                                             )
  283.                                         )
  284.                                        '(
  285.                                             (0001 . "_end")
  286.                                             (0002 . "_mid")
  287.                                             (0004 . "_cen")
  288.                                             (0008 . "_nod")
  289.                                             (0016 . "_qua")
  290.                                             (0032 . "_int")
  291.                                             (0064 . "_ins")
  292.                                             (0128 . "_per")
  293.                                             (0256 . "_tan")
  294.                                             (0512 . "_nea")
  295.                                             (2048 . "_app")
  296.                                             (8192 . "_par")
  297.                                         )
  298.                                     )
  299.                                 )
  300.                                '(lambda ( a b ) (< (car a) (car b)))
  301.                             )
  302.                         )
  303.                     )
  304.                     (list 'LM:grsnap:displaysnap '(car q)
  305.                         (list 'cdr
  306.                             (list 'assoc '(cadr q)
  307.                                 (list 'quote
  308.                                     (LM:grsnap:snapsymbols
  309.                                         (atoi (cond ((getenv "AutoSnapSize")) ("5")))
  310.                                     )
  311.                                 )
  312.                             )
  313.                         )
  314.                         (LM:OLE->ACI
  315.                             (if (= 1 (getvar 'cvport))
  316.                                 (atoi (cond ((getenv "Layout AutoSnap Color")) ("117761")))
  317.                                 (atoi (cond ((getenv  "Model AutoSnap Color")) ("104193")))
  318.                             )
  319.                         )
  320.                     )
  321.                 )
  322.             )
  323.            '(cond ((car q)) (p))
  324.         )
  325.     )
  326. )

  327. ;; Object Snap for grread: Display Snap  -  Lee Mac
  328. ;; pnt - [lst] UCS point at which to display the symbol
  329. ;; lst - [lst] grvecs vector list
  330. ;; col - [int] ACI colour for displayed symbol
  331. ;; Returns nil

  332. (defun LM:grsnap:displaysnap ( pnt lst col / scl )
  333.     (setq scl (/ (getvar 'viewsize) (cadr (getvar 'screensize)))
  334.           pnt (trans pnt 1 2)
  335.     )
  336.     (grvecs (cons col lst)
  337.         (list
  338.             (list scl 0.0 0.0 (car  pnt))
  339.             (list 0.0 scl 0.0 (cadr pnt))
  340.             (list 0.0 0.0 scl 0.0)
  341.            '(0.0 0.0 0.0 1.0)
  342.         )
  343.     )
  344. )

  345. ;; Object Snap for grread: Snap Symbols  -  Lee Mac
  346. ;; p - [int] Size of snap symbol in pixels
  347. ;; Returns: [lst] List of vector lists describing each Object Snap symbol

  348. (defun LM:grsnap:snapsymbols ( p / -p -q -r a c i l q r )
  349.     (setq -p (- p) q (1+  p)
  350.           -q (- q) r (+ 2 p)
  351.           -r (- r) i (/ pi 6.0)
  352.            a 0.0
  353.     )
  354.     (repeat 12
  355.         (setq l (cons (list (* r (cos a)) (* r (sin a))) l)
  356.               a (- a i)
  357.         )
  358.     )
  359.     (setq c (apply 'append (mapcar 'list (cons (last l) l) l)))
  360.     (list
  361.         (list 1
  362.             (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p)
  363.             (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q)
  364.         )
  365.         (list 2
  366.             (list -r -q) (list 0  r) (list 0  r) (list r -q)
  367.             (list -p -p) (list p -p) (list p -p) (list 0  p) (list 0  p) (list -p -p)
  368.             (list -q -q) (list q -q) (list q -q) (list 0  q) (list 0  q) (list -q -q)
  369.         )
  370.         (cons 4 c)
  371.         (vl-list* 8 (list -r -r) (list r r) (list r -r) (list -r r) c)
  372.         (list 16
  373.             (list p 0) (list 0 p) (list 0 p) (list -p 0) (list -p 0) (list 0 -p) (list 0 -p) (list p 0)
  374.             (list q 0) (list 0 q) (list 0 q) (list -q 0) (list -q 0) (list 0 -q) (list 0 -q) (list q 0)
  375.             (list r 0) (list 0 r) (list 0 r) (list -r 0) (list -r 0) (list 0 -r) (list 0 -r) (list r 0)
  376.         )
  377.         (list 32
  378.             (list  r r) (list -r -r) (list  r q) (list -q -r) (list  q r) (list -r -q)
  379.             (list -r r) (list  r -r) (list -q r) (list  r -q) (list -r q) (list  q -r)
  380.         )
  381.         (list 64
  382.             '( 0  1) (list  0  p) (list  0  p) (list -p  p) (list -p  p) (list -p -1) (list -p -1) '( 0 -1)
  383.             '( 0 -1) (list  0 -p) (list  0 -p) (list  p -p) (list  p -p) (list  p  1) (list  p  1) '( 0  1)
  384.             '( 1  2) (list  1  q) (list  1  q) (list -q  q) (list -q  q) (list -q -2) (list -q -2) '(-1 -2)
  385.             '(-1 -2) (list -1 -q) (list -1 -q) (list  q -q) (list  q -q) (list  q  2) (list  q  2) '( 1  2)
  386.         )
  387.         (list 128
  388.             (list (1+ -p) 0) '(0 0) '(0 0) (list 0 (1+ -p))
  389.             (list (1+ -p) 1) '(1 1) '(1 1) (list 1 (1+ -p))
  390.             (list -p q) (list -p -p) (list -p -p) (list q -p)
  391.             (list -q q) (list -q -q) (list -q -q) (list q -q)
  392.         )
  393.         (vl-list* 256 (list -r r)  (list r r) (list -r (1+ r)) (list r (1+ r)) c)
  394.         (list 512
  395.             (list -p -p) (list  p -p) (list -p  p) (list p p) (list -q -q) (list  q -q)
  396.             (list  q -q) (list -q  q) (list -q  q) (list q q) (list  q  q) (list -q -q)
  397.         )
  398.         (list 2048
  399.             (list   -p     -p) (list    p      p) (list   -p      p) (list    p     -p)
  400.             (list (+ p 05) -p) (list (+ p 06) -p) (list (+ p 05) -q) (list (+ p 06) -q)
  401.             (list (+ p 09) -p) (list (+ p 10) -p) (list (+ p 09) -q) (list (+ p 10) -q)
  402.             (list (+ p 13) -p) (list (+ p 14) -p) (list (+ p 13) -q) (list (+ p 14) -q)
  403.             (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p)
  404.             (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q)
  405.         )
  406.         (list 8192 (list r 1) (list -r -q) (list r 0) (list -r -r) (list r q) (list -r -1) (list r r) (list -r 0))
  407.     )
  408. )

  409. ;; Object Snap for grread: Parse Point  -  Lee Mac
  410. ;; bpt - [lst] Basepoint for relative point input, e.g. @5,5
  411. ;; str - [str] String representing point input
  412. ;; Returns: [lst] Point represented by the given string, else nil

  413. (defun LM:grsnap:parsepoint ( bpt str / str->lst lst )

  414.     (defun str->lst ( str / pos )
  415.         (if (setq pos (vl-string-position 44 str))
  416.             (cons (substr str 1 pos) (str->lst (substr str (+ pos 2))))
  417.             (list str)
  418.         )
  419.     )

  420.     (if (wcmatch str "`@*")
  421.         (setq str (substr str 2))
  422.         (setq bpt '(0.0 0.0 0.0))
  423.     )           

  424.     (if
  425.         (and
  426.             (setq lst (mapcar 'distof (str->lst str)))
  427.             (vl-every 'numberp lst)
  428.             (< 1 (length lst) 4)
  429.         )
  430.         (mapcar '+ bpt lst)
  431.     )
  432. )

  433. ;; Object Snap for grread: Snap Mode  -  Lee Mac
  434. ;; str - [str] Object Snap modifier
  435. ;; Returns: [int] Object Snap bit code for the given modifier, else nil

  436. (defun LM:grsnap:snapmode ( str )
  437.     (vl-some
  438.         (function
  439.             (lambda ( x )
  440.                 (if (wcmatch (car x) (strcat (strcase str t) "*"))
  441.                     (progn
  442.                         (princ (cadr x)) (caddr x)
  443.                     )
  444.                 )
  445.             )
  446.         )
  447.        '(
  448.             ("endpoint"      " of " 00001)
  449.             ("midpoint"      " of " 00002)
  450.             ("center"        " of " 00004)
  451.             ("node"          " of " 00008)
  452.             ("quadrant"      " of " 00016)
  453.             ("intersection"  " of " 00032)
  454.             ("insert"        " of " 00064)
  455.             ("perpendicular" " to " 00128)
  456.             ("tangent"       " to " 00256)
  457.             ("nearest"       " to " 00512)
  458.             ("appint"        " of " 02048)
  459.             ("parallel"      " to " 08192)
  460.             ("none"          ""     16384)
  461.         )
  462.     )
  463. )

  464. ;; OLE -> ACI  -  Lee Mac
  465. ;; Args: c - [int] OLE Colour

  466. (defun LM:OLE->ACI ( c )
  467.     (apply 'LM:RGB->ACI (LM:OLE->RGB c))
  468. )

  469. ;; OLE -> RGB  -  Lee Mac
  470. ;; Args: c - [int] OLE Colour

  471. (defun LM:OLE->RGB ( c )
  472.     (mapcar '(lambda ( x ) (lsh (lsh (fix c) x) -24)) '(24 16 8))
  473. )

  474. ;; RGB -> ACI  -  Lee Mac
  475. ;; Args: r,g,b - [int] Red, Green, Blue values

  476. (defun LM:RGB->ACI ( r g b / c o )
  477.     (if (setq o (vla-getinterfaceobject (LM:acapp) (strcat "autocad.accmcolor." (substr (getvar 'acadver) 1 2))))
  478.         (progn
  479.             (setq c (vl-catch-all-apply '(lambda ( ) (vla-setrgb o r g b) (vla-get-colorindex o))))
  480.             (vlax-release-object o)
  481.             (if (vl-catch-all-error-p c)
  482.                 (prompt (strcat "\nError: " (vl-catch-all-error-message c)))
  483.                 c
  484.             )
  485.         )
  486.     )
  487. )

  488. ;; Start Undo  -  Lee Mac
  489. ;; Opens an Undo Group.

  490. (defun LM:startundo ( doc )
  491.     (LM:endundo doc)
  492.     (vla-startundomark doc)
  493. )

  494. ;; End Undo  -  Lee Mac
  495. ;; Closes an Undo Group.

  496. (defun LM:endundo ( doc )
  497.     (while (= 8 (logand 8 (getvar 'undoctl)))
  498.         (vla-endundomark doc)
  499.     )
  500. )

  501. ;; Active Document  -  Lee Mac
  502. ;; Returns the VLA Active Document Object

  503. (defun LM:acdoc nil
  504.     (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  505.     (LM:acdoc)
  506. )

  507. ;; Application Object  -  Lee Mac
  508. ;; Returns the VLA Application Object

  509. (defun LM:acapp nil
  510.     (eval (list 'defun 'LM:acapp 'nil (vlax-get-acad-object)))
  511.     (LM:acapp)
  512. )

  513. (vl-load-com)
  514. (princ
  515.     (strcat
  516.         "\n:: CircleTangents.lsp | Version 1.0 | \\U+00A9 Lee Mac "
  517.         (menucmd "m=$(edtime,0,yyyy)")
  518.         " www.lee-mac.com ::"
  519.         "\n:: Type \"ctan\" to Invoke ::"
  520.     )
  521. )
  522. (princ)

  523. ;;----------------------------------------------------------------------;;
  524. ;;                             End of File                              ;;
  525. ;;----------------------------------------------------------------------;;

复制代码





本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 金钱 +50 收起 理由
BaoWSE + 1 赞一个!
gzbccy + 1 + 50 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2014-9-3 14:54 | 显示全部楼层
山寨版本

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2024-2-7 13:10 | 显示全部楼层
强大的程序,目前想到可以用在链条、转动设备,齿轮机械。
发表于 2014-8-26 10:04 | 显示全部楼层
很强大  不过我用不到!
发表于 2014-8-26 10:04 | 显示全部楼层
好程序,不错
发表于 2014-8-26 10:31 | 显示全部楼层
用不到,但是可以学习学习代码!  支持源码!
发表于 2014-8-26 11:39 | 显示全部楼层
好强大的程序啊
发表于 2014-8-26 12:11 | 显示全部楼层
太牛了...好厉害的样子啊..
切线都可以动态...
高手啊
发表于 2014-8-26 12:13 | 显示全部楼层
我记得leemac好像是动态高手吧
下过他的程序
楼主有他的主页网盘什么的吗?
 楼主| 发表于 2014-8-26 12:43 | 显示全部楼层
ysq101 发表于 2014-8-26 12:13
我记得leemac好像是动态高手吧
下过他的程序
楼主有他的主页网盘什么的吗?

http://lee-mac.com/index.html
发表于 2014-8-26 12:48 | 显示全部楼层
的确够强大
虽然用不到,也顶一下
发表于 2014-8-26 12:54 | 显示全部楼层
谢谢楼主无私分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 22:58 , Processed in 1.134922 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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