/Submitted/sprinkler.lsp

https://github.com/idragonb/Sprinkler · Lisp · 384 lines · 273 code · 80 blank · 31 comment · 0 complexity · 0216a81cc058bccd450395594f6adb8b MD5 · raw file

  1. (defun getarms (notifier-object reactor-object parameter-list)
  2. (setq obj notifier-object) ; the arms block
  3. (setq handlearms (vlax-get-property obj 'Handle))
  4. (setq blkorg (vlax-get-property obj 'InsertionPoint))
  5. ; the blocks collection - we add our entities to a block name after the handle of the arms
  6. ;get origin
  7. ;if exists, erase ********
  8. (erase-subblock handlearms)
  9. ;(remove-connection obj)
  10. ; create new
  11. (setq blk (create-subblock obj blkorg handlearms))
  12. ;(make-connection obj)
  13. )
  14. (defun getdynamicproperty (obj property / props proplist nn prop propval retval) ; gets given dynamic property value from property name in dynamic block
  15. (setq props (vlax-invoke-method obj 'GetDynamicBlockProperties))
  16. (setq proplist (vlax-safearray->list (vlax-variant-value props)))
  17. (setq nn 0)
  18. (while (< nn (length proplist))
  19. (setq prop (nth nn proplist))
  20. ; (vlax-dump-object prop T)
  21. (setq propname (vlax-get-property prop 'PropertyName))
  22. (setq propval (vlax-variant-value (vlax-get-property prop 'Value)))
  23. (if (= propname property)
  24. (setq retval propval)
  25. )
  26. (setq nn (1+ nn))
  27. )
  28. retval
  29. )
  30. (defun setdynamicproperty (obj property val / )
  31. (setq props (vlax-invoke-method obj 'GetDynamicBlockProperties))
  32. (setq proplist (vlax-safearray->list (vlax-variant-value props)))
  33. (setq nn 0)
  34. (while (< nn (length proplist))
  35. (setq prop (nth nn proplist))
  36. ; (vlax-dump-object prop T)
  37. (setq propname (vlax-get-property prop 'PropertyName))
  38. ;(setq propval (vlax-variant-value (vlax-get-property prop 'Value)))
  39. (if (= propname property)
  40. (vlax-put-property prop 'Value val)
  41. )
  42. (setq nn (1+ nn))
  43. )
  44. retval
  45. )
  46. (defun create-subblock (obj blkorg handlearms)
  47. (setq acadd (vlax-get-acad-object))
  48. (setq doc (vlax-get-property acadd 'ActiveDocument))
  49. (setq mspace (vlax-get-property doc 'ModelSpace))
  50. (setq blks (vlax-get-property doc 'Blocks))
  51. (setq objorigin (vlax-3D-point (list 0 0 0)))
  52. (setq blk (vlax-invoke-method blks 'Add objorigin handlearms)) ; create block
  53. (vlax-invoke-method mspace 'InsertBlock blkorg handlearms 1 1 1 0) ; insert it
  54. ; get geometry from dynamic block **********************************************
  55. (setq angright (getdynamicproperty obj "ArmAngleRight"))
  56. (setq armlength (getdynamicproperty obj "ArmLengthRight"))
  57. (setq angleft (getdynamicproperty obj "ArmAngleLeft"))
  58. ;************************************************************************************
  59. ; create outer arc ********
  60. (setq obj-outerarc (vlax-invoke-method blk 'AddArc objorigin armlength angright angleft))
  61. ;(setq outerarc-color (getcolor-from-att "OuterLineColor" obj))
  62. (setq outerarc-color (getattribute "OuterLineColor" obj 1))
  63. (setq color (vlax-get-property obj-outerarc 'TrueColor))
  64. (vlax-put-property color 'ColorIndex outerarc-color); change to yellow
  65. (vlax-put-property obj-outerarc 'TrueColor color)
  66. ; create inner arc *****
  67. (setq obj-innerarc (vlax-invoke-method blk 'AddArc objorigin 5 angright angleft))
  68. ;(setq innerarc-color (getcolor-from-att "InnerLineColor" obj))
  69. (setq innerarc-color (getattribute "InnerLineColor" obj 1))
  70. (vlax-put-property color 'ColorIndex innerarc-color) ;green
  71. (vlax-put-property obj-innerarc 'TrueColor color)
  72. ; keypoints ************
  73. (setq ptrain0 (vlax-3D-point (polar (list 0 0 0) angright 5)))
  74. (setq ptraout0 (vlax-3D-point (polar (list 0 0 0) angright armlength)))
  75. (setq ptlain0 (vlax-3D-point (polar (list 0 0 0) angleft 5)))
  76. (setq ptlaout0 (vlax-3D-point (polar (list 0 0 0) angleft armlength)))
  77. ; create temporary lines for hatch *******************
  78. (setq obj-ri (vlax-invoke-method blk 'AddLine objorigin ptrain0))
  79. (setq obj-ro (vlax-invoke-method blk 'AddLine ptrain0 ptraout0))
  80. (setq obj-li (vlax-invoke-method blk 'AddLine objorigin ptlain0))
  81. (setq obj-lo (vlax-invoke-method blk 'AddLine ptlain0 ptlaout0))
  82. ;*****************************************************
  83. ; remove objectsnap temporarily **********************
  84. (setq curosmode (getvar "osmode"))
  85. (setvar "osmode" 0)
  86. ; create region for inner hatch **********************
  87. (setq objectsinner (vlax-make-safearray vlax-vbObject '(0 . 2)))
  88. (vlax-safearray-put-element objectsinner 0 obj-ri)
  89. (vlax-safearray-put-element objectsinner 1 obj-li)
  90. (vlax-safearray-put-element objectsinner 2 obj-innerarc)
  91. (setq regioninner (vlax-invoke-method blk 'AddRegion objectsinner))
  92. ;(setq innerhatchtype (gethatchtype "HatchTypeInner" obj))
  93. (setq innerhatchtype (getattribute "HatchTypeInner" obj 0))
  94. (setq hatchinner (vlax-invoke-method blk 'AddHatch 0 innerhatchtype :vlax-true))
  95. (vlax-invoke-method hatchinner 'AppendOuterLoop regioninner)
  96. ;(setq innerhatch-color (getcolor-from-att "HatchColorInner" obj))
  97. (setq innerhatch-color (getattribute "HatchColorInner" obj 1))
  98. (vlax-put-property color 'ColorIndex innerhatch-color)
  99. (vlax-put-property hatchinner 'TrueColor color)
  100. ; create region for outer hatch ************************
  101. (setq objectsouter (vlax-make-safearray vlax-vbObject '(0 . 3)))
  102. (vlax-safearray-put-element objectsouter 0 obj-ro)
  103. (vlax-safearray-put-element objectsouter 1 obj-lo)
  104. (vlax-safearray-put-element objectsouter 2 obj-innerarc)
  105. (vlax-safearray-put-element objectsouter 3 obj-outerarc)
  106. (setq regionouter (vlax-invoke-method blk 'AddRegion objectsouter))
  107. ;(setq outerhatchtype (gethatchtype "HatchTypeOuter" obj))
  108. (setq outerhatchtype (getattribute "HatchTypeOuter" obj 0))
  109. (setq hatchouter (vlax-invoke-method blk 'AddHatch 0 outerhatchtype :vlax-true))
  110. (vlax-invoke-method hatchouter 'AppendOuterLoop regionouter)
  111. ;(setq outerhatch-color (getcolor-from-att "HatchColorOuter" obj))
  112. (setq outerhatch-color (getattribute "HatchColorOuter" obj 1))
  113. (vlax-put-property color 'ColorIndex outerhatch-color)
  114. (vlax-put-property hatchouter 'TrueColor color)
  115. (setq outerhatchscale (getattribute "HatchScaleOuter" obj 2))
  116. (vlax-put-property hatchouter 'PatternScale outerhatchscale)
  117. ; delete temporary objects ****************************
  118. (vlax-invoke-method obj-li 'Delete)
  119. (vlax-invoke-method obj-lo 'Delete)
  120. (vlax-invoke-method obj-ri 'Delete)
  121. (vlax-invoke-method obj-ro 'Delete)
  122. (setq objringout (nth 0 (vlax-safearray->list(vlax-variant-value regionouter))))
  123. (setq objringin (nth 0 (vlax-safearray->list(vlax-variant-value regioninner))))
  124. (vlax-invoke-method objringin 'Delete)
  125. (vlax-invoke-method objringout 'Delete)
  126. ;*********************************************************
  127. (setvar "osmode" curosmode)
  128. blk
  129. )
  130. (defun getattribute (chktag blk type / nn lower upper att tag val retval) ; type 0 = string, 1 = integer, 2 = real
  131. (setq nn 0)
  132. (setq atts (vlax-variant-value (vlax-invoke-method blk 'GetAttributes)))
  133. (setq lower (vlax-safearray-get-l-bound atts 1))
  134. (setq upper (vlax-safearray-get-u-bound atts 1))
  135. (while (<= nn upper)
  136. (setq att (vlax-safearray-get-element atts nn))
  137. (setq tag (vlax-get-property att 'TagString))
  138. (setq val (vlax-get-property att 'TextString))
  139. (if (= tag chktag)
  140. (setq retval val)
  141. )
  142. (setq nn (1+ nn))
  143. )
  144. (cond
  145. ((= type 0) (setq retval retval)) ; stays string
  146. ((= type 1) (setq retval (atoi retval))) ; integer
  147. ((= type 2) (setq retval (atof retval))) ; real
  148. )
  149. retval
  150. )
  151. (defun setattribute (chktag blk content type / nn lower upper att tag) ; type 0 = string, 1 = integer, 2 = real
  152. (setq nn 0)
  153. (setq atts (vlax-variant-value (vlax-invoke-method blk 'GetAttributes)))
  154. (setq lower (vlax-safearray-get-l-bound atts 1))
  155. (setq upper (vlax-safearray-get-u-bound atts 1))
  156. (while (<= nn upper)
  157. (setq att (vlax-safearray-get-element atts nn))
  158. (setq tag (vlax-get-property att 'TagString))
  159. ;(setq val (vlax-get-property att 'TextString))
  160. (if (= tag chktag)
  161. (cond
  162. ((= type 0) (vlax-put-property att 'TextString content))
  163. ((= type 1) (vlax-put-property att 'TextString (itoa content)))
  164. ((= type 2) (vlax-put-property att 'TextString (rtos content)))
  165. )
  166. )
  167. (setq nn (1+ nn))
  168. )
  169. (vlax-invoke-method att 'Update)
  170. (vlax-invoke-method blk 'Update)
  171. content
  172. )
  173. (defun remove-connection (obj-sprinkler)
  174. (setq phandle (getattribute "PolylineHandle" obj-sprinkler 0))
  175. (setq obj-polyline (vlax-ename->vla-object (handent phandle)))
  176. (setq ptn (get-sprinkler-origin obj-sprinkler))
  177. (setq vertexcode (getattribute "VertexCode" obj-sprinkler 1))
  178. (cond
  179. ((= vertexcode 0) (remove-vertex obj-polyline ptn))
  180. ((= vertexcode 1) (remove-vertices-at-point obj-polyline ptn))
  181. ((= vertexcode 2) (remove-vertices-on-perpendicular obj-polyline ptn))
  182. ((= vertexcode 3) (remove-vertices-on-radial obj-polyline ptn))
  183. ((= vertexcode 4) (remove-vertices-last-two obj-polyline))
  184. )
  185. )
  186. (defun remove-vertices-on-perpendicular (obj-polyline pt)
  187. (setq index (get-vertex-index obj-polyline pt))
  188. (remove-vertex-by-index (obj-polyline index))
  189. (remove-vertex-by-index (obj-polyline index))
  190. (remove-vertex-by-index (obj-polyline (1+ index)))
  191. )
  192. (defun remove-vertices-at-point (obj-polyline pt)
  193. (setq index (get-vertex-index obj-polyline pt))
  194. (remove-vertex-by-index (obj-polyline index))
  195. (remove-vertex-by-index (obj-polyline index))
  196. )
  197. (defun remove-vertex (obj-polyline pt)
  198. (setq index (get-vertex-index obj-polyline pt))
  199. (remove-vertex-by-index (obj-polyline index))
  200. )
  201. (defun remove-vertex-by-index (obj-polyline index)
  202. (setq coords (vlax-variant-value (vlax-get-property obj-polyline 'Coordinates)))
  203. (setq lower (vlax-safearray-get-l-bound coords 1))
  204. (setq upper (vlax-safearray-get-u-bound coords 1))
  205. (setq amt (/ (- (1+ upper) lower) 2))
  206. (setq nn 0)
  207. (setq flag nil)
  208. (setq newcoords '())
  209. (while (< nn amt)
  210. (setq x (vlax-safearray-get-element coords (* nn 2)))
  211. (setq y (vlax-safearray-get-element coords (1+ (* nn 2))))
  212. (if (or (= flag 1) (/= nn index))
  213. (setq newcoords (append newcoords (list x y)))
  214. (setq flag 1)
  215. )
  216. (if flag (setq retval nn))
  217. (setq nn (1+ nn))
  218. )
  219. (if flag (setq amt (1- amt)))
  220. (setq limits (cons 0 (- (* 2 amt) 1)))
  221. (setq coords (vlax-make-safearray vlax-vbDouble limits))
  222. (vlax-safearray-fill coords newcoords)
  223. (vlax-put-property obj-polyline 'Coordinates coords)
  224. )
  225. (defun get-vertex-index (obj-polyline pt)
  226. (setq coords (vlax-variant-value (vlax-get-property obj-polyline 'Coordinates)))
  227. (setq lower (vlax-safearray-get-l-bound coords 1))
  228. (setq upper (vlax-safearray-get-u-bound coords 1))
  229. (setq amt (/ (- (1+ upper) lower) 2))
  230. (setq nn 0)
  231. (setq flag nil)
  232. (setq xpt (nth 0 pt))
  233. (setq ypt (nth 1 pt))
  234. (while (< nn amt)
  235. (setq x (vlax-safearray-get-element coords (* nn 2)))
  236. (setq y (vlax-safearray-get-element coords (1+ (* nn 2))))
  237. (if (or (= flag 1) (not (and (equal x xpt 0.01) (equal y ypt 0.01))))
  238. (princ)
  239. (setq flag 1)
  240. )
  241. (if flag (setq retval nn))
  242. (setq nn (1+ nn))
  243. )
  244. retval
  245. )
  246. (defun erase-subblock(handlearms / filt ssset nn len ent old)
  247. (if (tblsearch "BLOCK" handlearms)
  248. (progn
  249. (setq filt (list (cons 0 "INSERT") (cons 2 handlearms)))
  250. (setq ssset (ssget "X" filt))
  251. (setq nn 0)
  252. (if ssset
  253. (setq len (sslength ssset))
  254. (setq len 0)
  255. )
  256. (while (< nn len)
  257. (setq ent (ssname ssset nn))
  258. (entdel ent)
  259. (setq nn (1+ nn))
  260. )
  261. (setq old (vlax-invoke-method blks 'Item handlearms))
  262. (vlax-invoke-method old 'Delete)
  263. )
  264. )
  265. )
  266. ;(setq ent (car (entsel)))
  267. ;(setq obj (vlax-ename->vla-object ent))
  268. ;(setq myReactor (vlr-object-reactor (list obj) "My Reactor" '((:vlr-modified . getarms))))
  269. (defun c:is () ; insert sprinkler
  270. (setq pt (getpoint "\nPick insertion point..."))
  271. (insertsprinkler pt)
  272. )
  273. (defun insertsprinkler (pt)
  274. (setq ptvar (vlax-3D-point pt))
  275. (setq acadd (vlax-get-acad-object))
  276. (setq doc (vlax-get-property acadd 'ActiveDocument))
  277. (setq mspace (vlax-get-property doc 'ModelSpace))
  278. (setq arms (vla-InsertBlock mspace ptvar "sprinkler" 1 1 1 0))
  279. (setq myReactor (vlr-object-reactor (list arms) "My Reactor" '((:vlr-modified . getarms))))
  280. (setq copyReactor (vlr-object-reactor (list arms) "Copy Reactor" '((:vlr-copied . makecopy))))
  281. (vlr-pers myReactor)
  282. (vlr-pers copyReactor)
  283. (vlax-put-property arms 'InsertionPoint ptvar)
  284. arms
  285. )
  286. (defun c:cs () ; copy sprinkler
  287. (setq sprinkler1 (pick-sprinkler))
  288. (setq pt (getpoint "\nPlease choose new insertion point..."))
  289. (setq sprinkler2 (insertsprinkler pt))
  290. (setattribute "HatchTypeInner" sprinkler2 (getattribute "HatchTypeInner" sprinkler1 0) 0)
  291. (setattribute "HatchTypeOuter" sprinkler2 (getattribute "HatchTypeOuter" sprinkler1 0) 0)
  292. (setattribute "HatchScaleInner" sprinkler2 (getattribute "HatchScaleInner" sprinkler1 0) 0)
  293. (setattribute "HatchColorInner" sprinkler2 (getattribute "HatchColorInner" sprinkler1 0) 0)
  294. (setattribute "InnerLineColor" sprinkler2 (getattribute "InnerLineColor" sprinkler1 0) 0)
  295. (setattribute "InnerLineLinetype" sprinkler2 (getattribute "InnerLineLinetype" sprinkler1 0) 0)
  296. (setattribute "HatchScaleOuter" sprinkler2 (getattribute "HatchScaleOuter" sprinkler1 0) 0)
  297. (setattribute "HatchColorOuter" sprinkler2 (getattribute "HatchColorOuter" sprinkler1 0) 0)
  298. (setattribute "OuterLineColor" sprinkler2 (getattribute "OuterLineColor" sprinkler1 0) 0)
  299. (setattribute "OuterLineLinetype" sprinkler2 (getattribute "OuterLineLinetype" sprinkler1 0) 0)
  300. (setattribute "OuterLineVisibility" sprinkler2 (getattribute "OuterLineVisibility" sprinkler1 0) 0)
  301. (setattribute "Offset" sprinkler2 (getattribute "Offset" sprinkler1 0) 0)
  302. (setattribute "SPRINKLERTYPE" sprinkler2 (getattribute "SPRINKLERTYPE" sprinkler1 0) 0)
  303. (vlax-put-property sprinkler2 'Rotation 0)
  304. )