找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2713|回复: 9

[每日一码] 分享! lee大师的grread with snap function

[复制链接]

已领礼包: 3198个

财富等级: 富可敌国

发表于 2014-8-26 10:04:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. ;; Object Snap for grread: Snap Function  -  Lee Mac
  2. ;; Returns: [fun] A function requiring two arguments:
  3. ;; p - [lst] UCS Point to be snapped
  4. ;; o - [int] Object Snap bit code
  5. ;; The returned function returns either the snapped point (displaying an appropriate snap symbol)
  6. ;; or the supplied point if the snap failed for the given Object Snap bit code.

  7. (defun LM:grsnap:snapfunction ( )
  8.     (eval
  9.         (list 'lambda '( p o / q )
  10.             (list 'if '(zerop (logand 16384 o))
  11.                 (list 'if
  12.                    '(setq q
  13.                         (cdar
  14.                             (vl-sort
  15.                                 (vl-remove-if 'null
  16.                                     (mapcar
  17.                                         (function
  18.                                             (lambda ( a / b )
  19.                                                 (if (and (= (car a) (logand (car a) o)) (setq b (osnap p (cdr a))))
  20.                                                     (list (distance p b) b (car a))
  21.                                                 )
  22.                                             )
  23.                                         )
  24.                                        '(
  25.                                             (0001 . "_end")
  26.                                             (0002 . "_mid")
  27.                                             (0004 . "_cen")
  28.                                             (0008 . "_nod")
  29.                                             (0016 . "_qua")
  30.                                             (0032 . "_int")
  31.                                             (0064 . "_ins")
  32.                                             (0128 . "_per")
  33.                                             (0256 . "_tan")
  34.                                             (0512 . "_nea")
  35.                                             (2048 . "_app")
  36.                                             (8192 . "_par")
  37.                                         )
  38.                                     )
  39.                                 )
  40.                                '(lambda ( a b ) (< (car a) (car b)))
  41.                             )
  42.                         )
  43.                     )
  44.                     (list 'LM:grsnap:displaysnap '(car q)
  45.                         (list 'cdr
  46.                             (list 'assoc '(cadr q)
  47.                                 (list 'quote
  48.                                     (LM:grsnap:snapsymbols
  49.                                         (atoi (cond ((getenv "AutoSnapSize")) ("5")))
  50.                                     )
  51.                                 )
  52.                             )
  53.                         )
  54.                         (LM:OLE->ACI
  55.                             (if (= 1 (getvar 'cvport))
  56.                                 (atoi (cond ((getenv "Layout AutoSnap Color")) ("117761")))
  57.                                 (atoi (cond ((getenv  "Model AutoSnap Color")) ("104193")))
  58.                             )
  59.                         )
  60.                     )
  61.                 )
  62.             )
  63.            '(cond ((car q)) (p))
  64.         )
  65.     )
  66. )

  67. ;; Object Snap for grread: Display Snap  -  Lee Mac
  68. ;; pnt - [lst] UCS point at which to display the symbol
  69. ;; lst - [lst] grvecs vector list
  70. ;; col - [int] ACI colour for displayed symbol
  71. ;; Returns nil

  72. (defun LM:grsnap:displaysnap ( pnt lst col / scl )
  73.     (setq scl (/ (getvar 'viewsize) (cadr (getvar 'screensize)))
  74.           pnt (trans pnt 1 2)
  75.     )
  76.     (grvecs (cons col lst)
  77.         (list
  78.             (list scl 0.0 0.0 (car  pnt))
  79.             (list 0.0 scl 0.0 (cadr pnt))
  80.             (list 0.0 0.0 scl 0.0)
  81.            '(0.0 0.0 0.0 1.0)
  82.         )
  83.     )
  84. )

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

  88. (defun LM:grsnap:snapsymbols ( p / -p -q -r a c i l q r )
  89.     (setq -p (- p) q (1+  p)
  90.           -q (- q) r (+ 2 p)
  91.           -r (- r) i (/ pi 6.0)
  92.            a 0.0
  93.     )
  94.     (repeat 12
  95.         (setq l (cons (list (* r (cos a)) (* r (sin a))) l)
  96.               a (- a i)
  97.         )
  98.     )
  99.     (setq c (apply 'append (mapcar 'list (cons (last l) l) l)))
  100.     (list
  101.         (list 1
  102.             (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p)
  103.             (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q)
  104.         )
  105.         (list 2
  106.             (list -r -q) (list 0  r) (list 0  r) (list r -q)
  107.             (list -p -p) (list p -p) (list p -p) (list 0  p) (list 0  p) (list -p -p)
  108.             (list -q -q) (list q -q) (list q -q) (list 0  q) (list 0  q) (list -q -q)
  109.         )
  110.         (cons 4 c)
  111.         (vl-list* 8 (list -r -r) (list r r) (list r -r) (list -r r) c)
  112.         (list 16
  113.             (list p 0) (list 0 p) (list 0 p) (list -p 0) (list -p 0) (list 0 -p) (list 0 -p) (list p 0)
  114.             (list q 0) (list 0 q) (list 0 q) (list -q 0) (list -q 0) (list 0 -q) (list 0 -q) (list q 0)
  115.             (list r 0) (list 0 r) (list 0 r) (list -r 0) (list -r 0) (list 0 -r) (list 0 -r) (list r 0)
  116.         )
  117.         (list 32
  118.             (list  r r) (list -r -r) (list  r q) (list -q -r) (list  q r) (list -r -q)
  119.             (list -r r) (list  r -r) (list -q r) (list  r -q) (list -r q) (list  q -r)
  120.         )
  121.         (list 64
  122.             '( 0  1) (list  0  p) (list  0  p) (list -p  p) (list -p  p) (list -p -1) (list -p -1) '( 0 -1)
  123.             '( 0 -1) (list  0 -p) (list  0 -p) (list  p -p) (list  p -p) (list  p  1) (list  p  1) '( 0  1)
  124.             '( 1  2) (list  1  q) (list  1  q) (list -q  q) (list -q  q) (list -q -2) (list -q -2) '(-1 -2)
  125.             '(-1 -2) (list -1 -q) (list -1 -q) (list  q -q) (list  q -q) (list  q  2) (list  q  2) '( 1  2)
  126.         )
  127.         (list 128
  128.             (list (1+ -p) 0) '(0 0) '(0 0) (list 0 (1+ -p))
  129.             (list (1+ -p) 1) '(1 1) '(1 1) (list 1 (1+ -p))
  130.             (list -p q) (list -p -p) (list -p -p) (list q -p)
  131.             (list -q q) (list -q -q) (list -q -q) (list q -q)
  132.         )
  133.         (vl-list* 256 (list -r r)  (list r r) (list -r (1+ r)) (list r (1+ r)) c)
  134.         (list 512
  135.             (list -p -p) (list  p -p) (list -p  p) (list p p) (list -q -q) (list  q -q)
  136.             (list  q -q) (list -q  q) (list -q  q) (list q q) (list  q  q) (list -q -q)
  137.         )
  138.         (list 2048
  139.             (list   -p     -p) (list    p      p) (list   -p      p) (list    p     -p)
  140.             (list (+ p 05) -p) (list (+ p 06) -p) (list (+ p 05) -q) (list (+ p 06) -q)
  141.             (list (+ p 09) -p) (list (+ p 10) -p) (list (+ p 09) -q) (list (+ p 10) -q)
  142.             (list (+ p 13) -p) (list (+ p 14) -p) (list (+ p 13) -q) (list (+ p 14) -q)
  143.             (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p)
  144.             (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q)
  145.         )
  146.         (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))
  147.     )
  148. )

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

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

  154.     (defun str->lst ( str / pos )
  155.         (if (setq pos (vl-string-position 44 str))
  156.             (cons (substr str 1 pos) (str->lst (substr str (+ pos 2))))
  157.             (list str)
  158.         )
  159.     )

  160.     (if (wcmatch str "`@*")
  161.         (setq str (substr str 2))
  162.         (setq bpt '(0.0 0.0 0.0))
  163.     )           

  164.     (if
  165.         (and
  166.             (setq lst (mapcar 'distof (str->lst str)))
  167.             (vl-every 'numberp lst)
  168.             (< 1 (length lst) 4)
  169.         )
  170.         (mapcar '+ bpt lst)
  171.     )
  172. )

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

  176. (defun LM:grsnap:snapmode ( str )
  177.     (vl-some
  178.         (function
  179.             (lambda ( x )
  180.                 (if (wcmatch (car x) (strcat (strcase str t) "*"))
  181.                     (progn
  182.                         (princ (cadr x)) (caddr x)
  183.                     )
  184.                 )
  185.             )
  186.         )
  187.        '(
  188.             ("endpoint"      " of " 00001)
  189.             ("midpoint"      " of " 00002)
  190.             ("center"        " of " 00004)
  191.             ("node"          " of " 00008)
  192.             ("quadrant"      " of " 00016)
  193.             ("intersection"  " of " 00032)
  194.             ("insert"        " of " 00064)
  195.             ("perpendicular" " to " 00128)
  196.             ("tangent"       " to " 00256)
  197.             ("nearest"       " to " 00512)
  198.             ("appint"        " of " 02048)
  199.             ("parallel"      " to " 08192)
  200.             ("none"          ""     16384)
  201.         )
  202.     )
  203. )

  204. ;; OLE -> ACI  -  Lee Mac
  205. ;; Args: c - [int] OLE Colour

  206. (defun LM:OLE->ACI ( c )
  207.     (apply 'LM:RGB->ACI (LM:OLE->RGB c))
  208. )

  209. ;; OLE -> RGB  -  Lee Mac
  210. ;; Args: c - [int] OLE Colour

  211. (defun LM:OLE->RGB ( c )
  212.     (mapcar '(lambda ( x ) (lsh (lsh (fix c) x) -24)) '(24 16 8))
  213. )

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

  216. (defun LM:RGB->ACI ( r g b / c o )
  217.     (if (setq o (vla-getinterfaceobject (LM:acapp) (strcat "autocad.accmcolor." (substr (getvar 'acadver) 1 2))))
  218.         (progn
  219.             (setq c (vl-catch-all-apply '(lambda ( ) (vla-setrgb o r g b) (vla-get-colorindex o))))
  220.             (vlax-release-object o)
  221.             (if (vl-catch-all-error-p c)
  222.                 (prompt (strcat "\nError: " (vl-catch-all-error-message c)))
  223.                 c
  224.             )
  225.         )
  226.     )
  227. )

  228. ;; Application Object  -  Lee Mac
  229. ;; Returns the VLA Application Object

  230. (defun LM:acapp nil
  231.     (eval (list 'defun 'LM:acapp 'nil (vlax-get-acad-object)))
  232.     (LM:acapp)
  233. )

  234. (vl-load-com) (princ)


circletangents.gif

  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. ;;----------------------------------------------------------------------;;

评分

参与人数 2D豆 +15 贡献 +1 收起 理由
XDSoft + 10 + 1 很给力!经验;技术要点;资料分享奖!
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-8-26 14:31:21 | 显示全部楼层
很实用,顶了。。。。。。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-26 14:33:33 | 显示全部楼层
:)留个记号
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-26 16:01:05 来自手机 | 显示全部楼层
还是高飞的Pointmonitor方便
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-26 17:19:10 | 显示全部楼层
这么长,看着都晕.佩服!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-27 08:26:50 | 显示全部楼层
代码分两份这是……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-27 09:40:43 | 显示全部楼层
好像很牛的样子!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-13 11:45:52 | 显示全部楼层
望洋兴叹啊  搞不懂
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-16 15:03:36 | 显示全部楼层
绝对牛呀,赞赞
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-12-21 21:11:37 | 显示全部楼层
还以为是牢固版主发明的,原来是LeeMac
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-24 05:43 , Processed in 0.501963 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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