1. ;; maximum circle inscribed in a closed polyline
    2. ;;; writed by Gian Paolo Cattaneo
    3. ;;; edited by GSLS(SS) 2012-8-5
    4. (defun C:TesT (/ POLY POLY_vl Dx Dy Lp
    5. List_vert_poly list_p_int P_center dist
    6. step1 step2 t1 t2 t3 t4 R0 area
    7. len i
    8. )
    9. (gc)
    10. (prompt "\nSelect Polyline: ")
    11. (if (setq POLY (ssname (ssget ":S" '((0 . "LWPOLYLINE"))) 0))
    12. (progn
    13. (setq i 1)
    14. (setq area (vlax-curve-getArea poly)
    15. len (vlax-curve-getDistAtParam
    16. poly
    17. (vlax-curve-getEndParam poly)
    18. )
    19. )
    20. (setq step1 (max 10 (fix (/ len 0.4 (sqrt area))))) ;_--> grid_1
    21. (setq step2 10) ;_--> grid_2
    22. (setq list_vert_poly (LWPoly->List POLY 10))
    23. (grid_1)
    24. (setq t1 (getvar "MilliSecs"))
    25. (Point_int)
    26. (setq t2 (getvar "MilliSecs"))
    27. ;|
    28. (foreach a list_p_int
    29. (entmake (list (cons 0 "POINT")
    30. (cons 10 a)
    31. (cons 62 3))))|;
    32. ;_(grid+)
    33. (Point_center)
    34. (setq t3 (getvar "MilliSecs"))
    35. (setq i 0)
    36. (while (and (> (- Dist R0) 1e-8) (< i 10))
    37. (grid_2)
    38. (Point_center)
    39. (setq i (1+ i))
    40. )
    41. (setq t4 (getvar "MilliSecs"))
    42. (entmake
    43. (list
    44. (cons 0 "CIRCLE")
    45. (cons 10 P_center)
    46. (cons 40 dist)
    47. )
    48. )
    49. (princ
    50. (strcat "\ntime1 = " (rtos (- t2 t1) 2 0) " MilliSecs")
    51. )
    52. (princ
    53. (strcat "\ntime2 = " (rtos (- t3 t2) 2 0) " MilliSecs")
    54. )
    55. (princ
    56. (strcat "\ntime3 = " (rtos (- t4 t3) 2 0) " MilliSecs")
    57. )
    58. (princ)
    59. )
    60. )
    61. )
    62. ;; Restituisce una griglia di punti all'interno del getboundingbox della poly selezionata
    63. ;; Returns a grid of points within the BoundingBox of the selected poly
    64. (defun grid_1 (/ p1 p2 X1 Y1 l1)
    65. (vla-getboundingbox (vlax-ename->vla-object POLY) 'p1 'p2)
    66. (setq p1 (vlax-safearray->list p1)
    67. p2 (vlax-safearray->list p2)
    68. p1 (list (car p1) (cadr p1))
    69. p2 (list (car p2) (cadr p2))
    70. )
    71. (setq Dx (/ (- (car p2) (car p1)) step1))
    72. (setq Dy (/ (- (cadr p2) (cadr p1)) step1))
    73. (setq Lp (list p1)
    74. X1 (car p1)
    75. Y1 (cadr p1)
    76. )
    77. (repeat step1
    78. (setq Lp (cons (list (setq X1 (+ X1 Dx)) Y1) Lp))
    79. )
    80. (setq Lp (list Lp))
    81. (repeat step1
    82. (setq Lp (cons (mapcar (function (lambda (x)
    83. (list (car x) (+ (cadr x) Dy))
    84. )
    85. )
    86. (car lp)
    87. )
    88. Lp
    89. )
    90. )
    91. )
    92. (setq Lp (apply (function append) Lp))
    93. )
    94. ;; Restituisce una griglia di punti intorno al punto centrale (provvisorio)
    95. ;; Returns a grid of points around the center point (provisional)
    96. (defun grid_2 (/ X1 Y1 P1)
    97. (setq list_p_int nil
    98. X1 (- (car P_center) Dx)
    99. Y1 (- (cadr P_center) Dy)
    100. P1 (list X1 Y1)
    101. Dx (/ (* 2 Dx) step2)
    102. Dy (/ (* 2 Dy) step2)
    103. )
    104. (setq list_p_int (list P1))
    105. (repeat step2
    106. (setq list_p_int (cons (list (setq X1 (+ X1 Dx)) Y1) list_p_int))
    107. )
    108. (setq list_p_int (list list_p_int))
    109. (repeat step2
    110. (setq list_p_int
    111. (cons (mapcar (function (lambda (x)
    112. (list (car x) (+ (cadr x) Dy))
    113. )
    114. )
    115. (car list_p_int)
    116. )
    117. list_p_int
    118. )
    119. )
    120. )
    121. (setq list_p_int (apply (function append) list_p_int))
    122. )
    123. ;; restituisce la lista dei punti interni ad un poligono
    124. ;; dati: - lista coordinate dei punti -> Lp
    125. ;; - lista coordinate vertici poligono -> list_vert_poly
    126. ;; Returns the list of points inside the polyline
    127. (defun Point_int ()
    128. (setq list_p_int
    129. (vl-remove-if-not
    130. (function
    131. (lambda (pt)
    132. ;_determine point in curve , use widding number
    133. (equal
    134. PI
    135. (abs
    136. (apply
    137. (function +)
    138. (mapcar (function (lambda (x y / a)
    139. (rem (- (angle pt x) (angle pt y)) PI)
    140. )
    141. )
    142. list_vert_poly
    143. (cdr list_vert_poly)
    144. )
    145. )
    146. )
    147. 1e-8
    148. )
    149. )
    150. )
    151. Lp
    152. )
    153. )
    154. )
    155. ;; Infittisce la griglia inserendo altri punti
    156. ;; nel centro delle diagonali tra i punti interni
    157. ;; Insert points (interior) to increase the density of the grid
    158. (defun grid+ (/ G+)
    159. (setq G+
    160. (mapcar '(lambda (x)
    161. (list (+ (car x) (/ Dx 2)) (+ (cadr x) (/ Dy 2)))
    162. )
    163. list_p_int
    164. )
    165. )
    166. (setq list_p_int (append G+ list_p_int))
    167. )
    168. ;; Da una lista di punti restituisce quello più lontano da un oggetto
    169. ;; dati: - lista dei punti -> list_p_int
    170. ;; - oggetto -> POLY_vl
    171. ;; Returns the farthest point from the polyline
    172. (defun Point_center (/ Pa Pvic)
    173. (foreach Pa list_p_int
    174. (setq Pvic (vlax-curve-getClosestPointTo Poly Pa))
    175. (if (> (distance Pa Pvic) Dist)
    176. (setq P_center Pa
    177. R0 Dist
    178. Dist (distance Pa Pvic)
    179. )
    180. )
    181. )
    182. )
    183. ;;
    184. (defun LWPoly->List (en acc / a b vetex bu p1 p2 l r ang an1 N)
    185. ;;Acc --- 0 ~ 99
    186. (setq ent (entget en))
    187. (while (setq ent (member (assoc 10 ent) ent))
    188. (setq b (cons (cdar ent) b)
    189. ent (member (assoc 42 ent) ent)
    190. b (cons (cdar ent) b)
    191. ent (cdr ent)
    192. vetex (cons b vetex)
    193. b nil
    194. )
    195. )
    196. (while vetex
    197. (setq a (car vetex)
    198. vetex (cdr vetex)
    199. bu (car a)
    200. p1 (cadr a)
    201. )
    202. (if l
    203. (setq p2 (car l))
    204. (setq p2 (cadr (last vetex))
    205. l (cons p2 l)
    206. )
    207. )
    208. (if (equal bu 0 1e-6)
    209. (setq l (cons p1 l))
    210. (progn
    211. (setq ang (* 2 (atan bu))
    212. r (/ (distance p1 p2)
    213. (* 2 (sin ang))
    214. )
    215. c (polar p1
    216. (+ (angle p1 p2) (- (/ pi 2) ang))
    217. r
    218. )
    219. r (abs r)
    220. ang (abs (* ang 2.0))
    221. N (abs (fix (/ ang 0.0174532925199433)))
    222. N (min N (1+ Acc))
    223. )
    224. (if (= N 0)
    225. (setq l (cons p1 l))
    226. (progn
    227. (setq an1 (/ ang N)
    228. ang (angle c p2)
    229. )
    230. (if (not (minusp bu))
    231. (setq an1 (- an1))
    232. )
    233. (repeat (1- N)
    234. (setq ang (+ ang an1)
    235. l (cons (polar c ang r) l)
    236. )
    237. )
    238. (setq l (cons p1 l))
    239. )
    240. )
    241. )
    242. )
    243. )
    244. )