1. ;;说明:图框代码
    2. ;;20190104日更新: 提示图框生成确认长度是否正确
    3. ;;20190804日更新: 图形已存在图块,提示你如何处理
    4. ;;20190804日新增:去重复图框
    5. ;;20190805日新增:新增批量插入指北针
    6. ;;20191023日新增: 惠州竣工测量图框
    7. ;;20191023日新增: 图框扩展数据重新赋值
    8. ;;20200721日新增: 广东省交通规划设计研究院图框
    9. (vl-load-com)
    10. ;;说明:3.布局输出(201902210136)
    11. (defun c:TKOUTPUT()
    12. (setvar "CMDECHO" 0)
    13. (setvar "OSMODE" 0)
    14. (setq
    15. wordStr
    16. (GetWord
    17. "请选择成图单位:
    18. \nA 广东省建科建筑设计院有限公司
    19. \nB 广东省冶金建筑设计研究院
    20. \nC 广东有色工程勘察设计院
    21. \nD 广州地铁设计研究院有限公司
    22. \nE 广州市科城建筑设计有限公司
    23. \nF 广州市市政工程设计研究院
    24. \nG 广州市天驰测绘技术有限公司
    25. \nH 中国有色金属长沙勘察设计研究院有限公司
    26. \nI 核工业赣州工程勘察院
    27. \nJ 广东省建筑设计研究院
    28. \nK 核工业鹰潭工程勘察院
    29. \nL 建材广州工程勘测院有限公司
    30. \nN 惠州竣工
    31. \nM 天津市市政工程设计研究院
    32. \nO 湖南省地质工程勘察院
    33. \nP 中国电建集团
    34. \nQ 广东省交通规划设计研究院
    35. "
    36. '("A建科" "B冶金" "C有色" "D地铁" "E科城" "F市政" "G天驰" "H长沙勘察" "I核工业" "J省院" "K鹰潭" "L建材" "N惠州竣工" "M天津市政" "O湖南地质" "P中国电建集团" "Q交通规划院")
    37. )
    38. )
    39. (setq intNum (substr wordStr 1 1))
    40. (setq cldw
    41. (cdr
    42. (assoc
    43. intNum
    44. (list
    45. (cons "A" "广东省建科建筑设计院有限公司")
    46. (cons "B" "广东省冶金建筑设计研究院")
    47. (cons "C" "广东有色工程勘察设计院")
    48. (cons "D" "广州地铁设计研究院有限公司")
    49. (cons "E" "广州市科城建筑设计有限公司")
    50. (cons "F" "广州市市政工程设计研究院")
    51. (cons "G" "广州市天驰测绘技术有限公司")
    52. (cons "H" "中国有色金属长沙勘察设计研究院有限公司")
    53. (cons "I" "核工业赣州工程勘察院")
    54. (cons "J" "广东省建筑设计研究院")
    55. (cons "K" "核工业鹰潭工程勘察院")
    56. (cons "L" "建材广州工程勘测院有限公司")
    57. (cons "N" "惠州竣工")
    58. (cons "M" "天津市市政工程设计研究院")
    59. (cons "O" "湖南省地质工程勘察院")
    60. (cons "P" "中国电建集团")
    61. (cons "Q" "广东省交通规划设计研究院")
    62. )
    63. )
    64. )
    65. )
    66. (setq bjNum (getint "\n每布局输出图框个数<默认个数 10> :"))
    67. (setq leng (getint "\n输入总图幅号 <默认当前图形图框总数> :"))
    68. (if (= bjNum nil)(setq bjNum 10))
    69. (setq strsat (car(_vl-times)))
    70. (setvar "CMDECHO" 0)
    71. (setq tkname (strcat cldw ".dwg"))
    72. (if (setq tkFlieName (findfile tkname))
    73. (progn
    74. ;;;视口坐标表
    75. (setq tkpts
    76. (cond
    77. ((= wordStr "A建科")
    78. (setq withd 184 height 121)
    79. '((-97.5 -64 0.0) (97.5 -64 0.0) (97.5 64 0.0) (-97.5 64 0.0))
    80. )
    81. ((= wordStr "J省院")
    82. (setq withd 184 height 121)
    83. '((-92 -60.5 0.0) (92 -60.5 0.0) (92 60.5 0.0) (-92 60.5 0.0))
    84. )
    85. ((= wordStr "N惠州竣工")
    86. (setq withd 190 height 130.5)
    87. '((-95.0 65.25 0.0) (-95.0 -65.25 0.0) (77.9851 -65.25 0.0) (77.9851 -62.699 0.0) (95.0 -62.699 0.0) (95.0 65.25 0.0) (-95.0 65.25 0.0))
    88. )
    89. ((= wordStr "M天津市政")
    90. (setq withd 200 height 130)
    91. '((-100 -65 0.0) (100 -65 0.0) (100 65 0.0) (-100 65 0.0))
    92. )
    93. (t (setq withd 190 height 130.5)'((-95 -65.25 0.0) (95 -65.25 0.0) (95 65.25 0.0) (-95 65.25 0.0)))
    94. )
    95. )
    96. (setq AcadApplic (vlax-get-acad-object))
    97. (setq AcadDocuments (vla-get-Documents AcadApplic))
    98. (setq AcadDocument (vla-get-ActiveDocument AcadApplic))
    99. (setq preferenceSel (vla-get-Preferences AcadApplic))
    100. (setq ModelSpace (vla-get-ModelSpace AcadDocument))
    101. (setq AcadLayouts (vla-get-Layouts AcadDocument))
    102. (setq BLOCK (vla-get-Blocks AcadDocument))
    103. (setq LayerSel (vla-get-Layers AcadDocument))
    104. (setq AcadPref (vla-get-display preferenceSel))
    105. (vla-ZoomExtents AcadApplic)
    106. (vla-put-ActiveSpace AcadDocument 1)
    107. (vla-put-LayoutCreateViewport AcadPref :vlax-false)
    108. ;;;创建图层
    109. (if (not (tblsearch "layer" "图框"))
    110. (vla-add LayerSel "图框")
    111. )
    112. (if (not (tblsearch "layer" "不打印"))
    113. (vla-PUT-Plottable (vla-add LayerSel "不打印") :vlax-false)
    114. )
    115. ;;;过滤图框选择集
    116. (setq ss (ssget "X" (list (cons 0 "INSERT")(cons 2 "Lzx图框")(cons 8 "不打印"))) i 0 num_ang_list nil)
    117. ;;;省院需要
    118. (repeat (sslength ss)
    119. (setq en (ssname ss i))
    120. (setq entBox (BF-ent-getbox en 0.01))
    121. (setq obj (vlax-ename->vla-object en))
    122. (setq lst_att (vlax-safearray->list (vlax-variant-value (vla-GetAttributes obj))))
    123. (setq num (vla-get-textstring (car lst_att)))
    124. (setq ang (vla-get-Rotation obj))
    125. (setq point (vlax-get obj 'InsertionPoint))
    126. ;;创建块
    127. (setq ssbox (ssget "c" (car entBox)(cadr entBox) (list (cons 2 "Lzx图框")(cons 8 "不打印"))))
    128. (setq ssblock (ssadd))
    129. (setq w 0)
    130. (repeat (sslength ssbox)
    131. (setq ename (ssname ssbox w))
    132. (setq obj (vla-Copy(vlax-ename->vla-object ename)))
    133. (VxSetAtts obj (list (cons "图幅号" (strcat "T"(cdr(car(VxGetAtts obj)))))))
    134. (ssadd (vlax-vla-object->ename obj) ssblock)
    135. (setq w (1+ w))
    136. )
    137. (setq blockName (rtos (car(_vl-times))2 8))
    138. (if (tblsearch "BLOCK" blockName)(setq blockName (strcat blockName (rtos (BF-Math-Rand) 2 10))))
    139. (command "_.BLOCK" blockName point ssblock "")
    140. (setq ssblock NIL)
    141. (setq num_ang_list (cons (list (atoi num) ang en point blockName) num_ang_list))
    142. (setq i (1+ i))
    143. )
    144. (setq ent_num_list (bf-List-Sort num_ang_list '<))
    145. ;;每布局输出图框个数分割
    146. (setq splitList (BF-list-split ent_num_list bjNum))
    147. (if (= leng nil)(setq leng (length ent_num_list)))
    148. (setq i 0 gx 1 tunum 1)
    149. ;;;循环创建布局
    150. (foreach lst splitList
    151. ;(setq lst (nth 0 splitList))
    152. (setq qsh (car (car lst)))
    153. (setq jdh (car (car(reverse lst))))
    154. (setq newLayout(vla-add AcadLayouts (strcat (rtos qsh 2 0)"-" (rtos jdh 2 0))))
    155. (vla-put-ActiveLayout (vla-Item AcadDocuments (vla-get-Name AcadDocument)) newLayout);;激活布局
    156. ;;;循环创建当前布局的视口
    157. (setq startPoint '(1000 1000 0))
    158. (foreach jxk lst
    159. ;;计算数据
    160. (setq interPoint (polar startPoint 3.74343 115.25))
    161. (setq Center (vlax-3D-point startPoint))
    162. ;计算缩放比例
    163. (setq dxfList (entget (caddr jxk)(list"*")))
    164. (setq height (cdr(cadr(assoc "图框高" (cdr(assoc -3 dxfList))))))
    165. (setq scbl
    166. (cond
    167. ((= wordStr "M天津市政") (/ height 130))
    168. ((= wordStr "J省院") (/ height 120))
    169. ((= wordStr "A建科") (/ height 128))
    170. (t (/ height 130.5))
    171. )
    172. )
    173. ;;窗口缩放
    174. (vla-ZoomCenter AcadApplic Center 200)
    175. ;;创建视口
    176. (setq matPts (BF-Mat-ScaleByMatrix (BF-Mat-TranslateByMatrix tkpts '(0 0 0) startPoint) startPoint scbl))
    177. (mapcar 'command (append (list "_-vports" "P") matPts (list "c")))
    178. (setq pviewportObj (vlax-ename->vla-object (entlast)))
    179. (vla-put-Layer pviewportObj "图框")
    180. (vla-Display pviewportObj :vlax-true)
    181. (vla-put-MSpace Acaddocument :vlax-true)
    182. (vla-put-ActivePViewport Acaddocument pviewportObj)
    183. (vla-Regen Acaddocument acAllViewports)
    184. ;;视口旋转与缩放
    185. (vl-cmdf "_.ucs" "W")
    186. (vl-cmdf "_.Plan" "")
    187. (setq degress (BF-math-radions->degress (cadr jxk)))
    188. (vl-cmdf "ucs" "z" degress)
    189. (vl-cmdf "_.Plan" "")
    190. (setq newPoint (trans (nth 3 jxk) 0 1))
    191. (vl-cmdf "_.zoom" "c" newPoint height)
    192. (vla-put-MSpace Acaddocument :vlax-false)
    193. ;;
    194. (if (tblsearch "block" cldw)
    195. (setq tkFlieName cldw)
    196. )
    197. (setq tkObject (vla-InsertBlock (vla-get-PaperSpace AcadDocument) Center tkFlieName 1 1 1 0))
    198. (vla-ScaleEntity tkObject Center scbl)
    199. (vla-put-Layer tkObject "图框")
    200. ;;
    201. (setq str (rtos (car jxk) 2 0))
    202. (cond
    203. ;;;;交通规划院
    204. ((= intNum "Q")
    205. (setq txtPt (polar startPoint 0.66130465 (* scbl 103.806)))
    206. (entmakeX(list '(0 . "TEXT") (cons 1 (strcat "第" str "页")) (cons 8 "图框") (cons 10 txtPt)(cons 11 txtPt)(cons 7 "GHDI")(cons 40 2.2)(cons 41 0.8)(cons 72 1)(cons 73 2)))
    207. (setq txtPt (polar startPoint 0.61276709 (* scbl 110.848)))
    208. (entmakeX(list '(0 . "TEXT") (cons 1 (strcat "共" (rtos leng 2 0) "页"))(cons 8 "图框") (cons 10 txtPt)(cons 11 txtPt)(cons 7 "GHDI")(cons 40 2.2)(cons 41 0.8)(cons 72 1)(cons 73 2)))
    209. )
    210. ;;;;惠州竣工
    211. ((= intNum "N")
    212. (setq txtPt (polar startPoint 5.67517 (* scbl 111.9925)))
    213. (entmakeX(list '(0 . "TEXT") (cons 1 (strcat "图幅" str))(cons 8 "图框") (cons 10 txtPt)(cons 11 txtPt)(cons 7 "ST") (cons 40 1)(cons 72 1)(cons 73 2)))
    214. )
    215. ;;;;广东省建科建筑设计院有限公司
    216. ((= intNum "E")
    217. (setq str1
    218. (cond
    219. ((= (strlen str) 0 )(strcat "000" str))
    220. ((= (strlen str) 1 )(strcat "00" str))
    221. ((= (strlen str) 2 )(strcat "0" str))
    222. ((= (strlen str) 3 )str)
    223. )
    224. )
    225. (BF-ent-addtext (strcat "DX-" str1) (polar startPoint 5.62258 115.7625) 1.25 0 22)
    226. (BF-ent-putdxf (entlast) 7 "图框")
    227. )
    228. ;;;;广州地铁设计研究院有限公司
    229. ((= intNum "D")
    230. (setq str1
    231. (cond
    232. ((= (strlen str) 0 )(strcat "000" str))
    233. ((= (strlen str) 1 )(strcat "00" str))
    234. ((= (strlen str) 2 )(strcat "0" str))
    235. ((= (strlen str) 3 )str)
    236. )
    237. )
    238. (BF-ent-addtext (strcat "附图2-" str1) (polar interPoint 5.64074 112.273) 1.4 0 22)
    239. (BF-ent-putdxf (entlast) 7 "图框")
    240. )
    241. ;;;;广州市天驰测绘技术有限公司 中国有色金属长沙勘察设计研究院有限公司 广东有色工程勘察设计院 核工业赣州工程勘察院 建材广州工程勘测院有限公司
    242. ((wcmatch intNum "G,H,C,I,L,K,F,O")
    243. (setq obj (vlax-ename->vla-object (BF-ent-addcircle (polar startPoint 5.60258 113.2279) 1.9)))
    244. (vla-put-layer obj "图框")
    245. (vla-ScaleEntity obj Center (/ height 130.5))
    246. (setq obj (vlax-ename->vla-object (BF-ent-addline (polar startPoint 5.58586 113.0453) (polar startPoint 5.61924 113.4421))))
    247. (vla-put-layer obj "图框")
    248. (vla-ScaleEntity obj Center (/ height 130.5))
    249. (setq obj (vlax-ename->vla-object (BF-ent-addtext str (polar startPoint 5.60345 112.29) 0.9 0 22)))
    250. (vla-put-layer obj "图框")
    251. (vla-ScaleEntity obj Center (/ height 130.5))
    252. (setq obj (vlax-ename->vla-object (BF-ent-addtext (rtos leng 2 0) (polar startPoint 5.60128 114.1489) 0.9 0 22)))
    253. (vla-put-layer obj "图框")
    254. (vla-ScaleEntity obj Center (/ height 130.5))
    255. )
    256. ((= intNum "J");;;;广东省建筑设计研究院
    257. (BF-ent-addtext (strcat "T" str) (polar startPoint 5.5918 114.0695) 1.4 0 22)
    258. (BF-ent-putdxf (entlast) 8 "图框")
    259. ;;;创建接边相邻图块
    260. ;;插入图块 (SSLENGTH ssblock)
    261. (setq xltkPoint (polar startPoint 5.13313 74.2163))
    262. (setq tkObject (vla-InsertBlock (vla-get-PaperSpace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3D-point xltkPoint) (nth 4 jxk) 1 1 1 0))
    263. (setq tkBox (BF-ent-getbox (vlax-vla-object->ename tkObject) 0.01))
    264. (setq pbox1 (mapcar '- xltkPoint (car tkBox) ))
    265. (setq pbox2 (mapcar '- (cadr tkBox) xltkPoint ))
    266. (vla-ScaleEntity tkObject (vlax-3D-point xltkPoint)
    267. (min
    268. (/ 7 (max (cadr pbox1)(cadr pbox2)))
    269. (/ 15 (max (car pbox1)(car pbox2)))
    270. )
    271. )
    272. (vla-put-Layer tkObject "图框")
    273. )
    274. ((= intNum "P");;;;中国电建集团
    275. (setq txtPt (polar startPoint 5.60258 (* scbl 113.2279)))
    276. (entmakeX(list '(0 . "TEXT") (cons 1 (strcat "图幅" str))(cons 8 "图框") (cons 10 txtPt)(cons 11 txtPt)(cons 7 "ST") (cons 40 1.8)(cons 72 1)(cons 73 2)))
    277. )
    278. )
    279. ;;计算下一个图框位置
    280. (setq tunum (1+ tunum))
    281. (setq startPoint (polar startPoint 0 (* scbl (+ withd 100))))
    282. )
    283. ;(vla-ZoomExtents (vlax-get-acad-object))
    284. (setq i (1+ i))
    285. )
    286. )
    287. (alert (strcat "程序:布局输出\n搜索路径下找不到:【" tkname "】模板文件"))
    288. )
    289. (prompt (strcat "布局输出程序运行时间: " (rtos (/ (- (car(_vl-times))strsat)1000.0)2 3) " 毫秒" ))
    290. (princ)
    291. )
    292. (defun AddViewports(pts)
    293. (command "_VIEWPORTS" "p")
    294. (mapcar 'command pts )
    295. (command "c" )
    296. (entlast)
    297. )
    298. ;;返回关联表指定KEY后指定数量的所有数据
    299. (defun XD::AssocList:AddSubItem(lst key val / new old)
    300. (if (setq old (assoc key lst))
    301. (progn
    302. (setq new (cons key (reverse (cons val (reverse (cdr old))))))
    303. (setq lst (subst new old lst))
    304. )
    305. (progn
    306. (setq lst (reverse (cons (list key val) (reverse lst))))
    307. )
    308. )
    309. lst
    310. )
    311. ;;;关联表添加一个子项
    312. (defun XD::AssocList:GetDataByKeyWithNums (lst key s / d el i)
    313. (if (and
    314. (setq key (assoc key lst))
    315. (setq d (member key lst))
    316. )
    317. (progn
    318. (setq i 0)
    319. (repeat s
    320. (setq el (cons (nth i d) el))
    321. (setq i (1+ i))
    322. )
    323. )
    324. )
    325. (reverse el)
    326. )
    327. ;;说明:布局程序使用函数
    328. (defun BF-pickset-sort (ssPts KEY FUZZ / E EN FUN LST N sortpts sortpts1)
    329. ;;1 点列表排序
    330. (defun sortpts (PTS FUN xyz FUZZ)
    331. (vl-sort pts
    332. '(lambda (a b)
    333. (if (not (equal (xyz a) (xyz b) fuzz))
    334. (fun (xyz a) (xyz b))
    335. )
    336. )
    337. )
    338. )
    339. ;;2 排序
    340. (defun sortpts1 (PTS KEY FUZZ)
    341. (setq Key (vl-string->list Key))
    342. (foreach xyz (reverse Key)
    343. (cond ((< xyz 100)
    344. (setq fun >)
    345. (setq xyz (nth (- xyz 88) (list car cadr caddr)))
    346. )
    347. (T
    348. (setq fun <)
    349. (setq xyz (nth (- xyz 120) (list car cadr caddr)))
    350. )
    351. )
    352. (setq Pts (sortpts Pts fun xyz fuzz))
    353. )
    354. )
    355. ;;3 本程序主程序
    356. (cond
    357. ((= (type ssPts) 'PICKSET)
    358. (repeat (setq n (sslength ssPts))
    359. (if (and (setq e (ssname ssPts (setq n (1- n))))
    360. (setq en (entget e))
    361. )
    362. (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
    363. )
    364. )
    365. (mapcar 'last (sortpts1 lst KEY FUZZ))
    366. )
    367. ((Listp ssPts)
    368. (cond
    369. ((vl-consp (car ssPts)) (sortpts1 ssPts KEY FUZZ))
    370. ((= (type (car ssPts)) 'ENAME)
    371. (foreach e ssPts
    372. (if (setq en (entget e))
    373. (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
    374. )
    375. )
    376. (mapcar 'last (sortpts1 lst KEY FUZZ))
    377. )
    378. (T
    379. (cond ((equal key "X") (vl-sort ssPts '>))
    380. (T (vl-sort ssPts '<))
    381. )
    382. )
    383. )
    384. )
    385. )
    386. )
    387. (defun VxSetAtts (Obj Lst / AttVal)
    388. (mapcar
    389. '(lambda (Att)
    390. (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst)))
    391. (vla-put-TextString Att AttVal)
    392. )
    393. )
    394. (vlax-invoke Obj "GetAttributes")
    395. )
    396. (vla-update Obj)
    397. (princ)
    398. )
    399. (defun VxGetAtts (Obj)
    400. (mapcar
    401. '(lambda (Att)
    402. (cons (vla-get-TagString Att)
    403. (vla-get-TextString Att)
    404. )
    405. )
    406. (vlax-invoke Obj "GetAttributes")
    407. )
    408. )
    409. (defun BF-ent-addtext (text pt zg ang dq)
    410. (BF-ent-maketext text pt zg ang 0.8 0 dq)
    411. )
    412. (defun BF-ent-maketext (text pt zg ang kgb qx dqys / y1 y2)
    413. (cond
    414. ((= dqys 0)
    415. (setq y1 (cons 72 4)
    416. y2 (cons 73 0)
    417. )
    418. )
    419. ((= dqys 11)
    420. (setq y1 (cons 72 0)
    421. y2 (cons 73 3)
    422. )
    423. )
    424. ((= dqys 12)
    425. (setq y1 (cons 72 0)
    426. y2 (cons 73 2)
    427. )
    428. )
    429. ((= dqys 13)
    430. (setq y1 (cons 72 0)
    431. y2 (cons 73 1)
    432. )
    433. )
    434. ((= dqys 21)
    435. (setq y1 (cons 72 1)
    436. y2 (cons 73 3)
    437. )
    438. )
    439. ((= dqys 22)
    440. (setq y1 (cons 72 1)
    441. y2 (cons 73 2)
    442. )
    443. )
    444. ((= dqys 23)
    445. (setq y1 (cons 72 1)
    446. y2 (cons 73 1)
    447. )
    448. )
    449. ((= dqys 31)
    450. (setq y1 (cons 72 2)
    451. y2 (cons 73 3)
    452. )
    453. )
    454. ((= dqys 32)
    455. (setq y1 (cons 72 2)
    456. y2 (cons 73 2)
    457. )
    458. )
    459. ((= dqys 33)
    460. (setq y1 (cons 72 2)
    461. y2 (cons 73 1)
    462. )
    463. )
    464. )
    465. (entmakex
    466. (list
    467. '(0 . "TEXT")
    468. (cons 10 pt)
    469. (cons 1 text)
    470. (cons 40 zg)
    471. (cons 50 ang)
    472. (cons 41 kgb)
    473. (cons 51 qx)
    474. (cons 7 "standard")
    475. '(71 . 0)
    476. y1
    477. y2
    478. (cons 11 pt)
    479. )
    480. )
    481. )
    482. (defun BF-ent-addline (startpt endpt)
    483. (entmakex
    484. (list '(000 . "LINE")
    485. '(100 . "AcDbEntity")
    486. '(100 . "AcDbLine")
    487. (cons 10 startpt) ;起点
    488. (cons 11 endpt) ;终点
    489. )
    490. )
    491. )
    492. (defun BF-ent-addcircle (cen rad)
    493. (entmakex
    494. (list
    495. '(000 . "circle")
    496. '(100 . "AcDbEntity")
    497. '(100 . "AcDbCircle")
    498. (cons 10 cen)
    499. (cons 40 rad)
    500. )
    501. )
    502. )
    503. (defun BF-list-split (lst x / lst2)
    504. (foreach n lst
    505. (if (and lst2 (/= x (length (car lst2))))
    506. (setq lst2 (cons (append (car lst2) (list n)) (cdr lst2)))
    507. (setq lst2 (cons (list n) lst2))
    508. )
    509. )
    510. (reverse lst2)
    511. )
    512. (defun bf-List-Sort (lst oper / x1 x2)
    513. (vl-sort lst
    514. '(lambda (x1 x2)
    515. (if
    516. (and
    517. (atom x1)
    518. (atom x2)
    519. )
    520. (apply oper (list x1 x2))
    521. (apply oper (list (car x1) (car x2)))
    522. )
    523. )
    524. )
    525. )
    526. (defun BF-math-radions->degress (radions)
    527. (if (numberp radions)
    528. (* radions (/ 180.0 pi))
    529. )
    530. )
    531. (defun BF-ent-getbox (ent offset / lst obj p1 p2 p3 p4)
    532. (setq obj (vlax-ename->vla-object ent))
    533. (vla-GetBoundingBox obj 'p1 'p3)
    534. (setq p1 (vlax-safearray->list p1)
    535. p3 (vlax-safearray->list p3)
    536. )
    537. (if (= "SPLINE" (cdr (assoc 0 (entget ent))))
    538. (progn
    539. (setq lst
    540. (mapcar
    541. '(lambda (a b)
    542. (vlax-curve-getClosestPointToProjection ent a b t)
    543. )
    544. (list p1
    545. (list (car p1) (cadr p3) (caddr p1))
    546. p3
    547. (list (car p3) (cadr p1) (caddr p1))
    548. )
    549. '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
    550. )
    551. )
    552. (setq
    553. p1 (apply 'mapcar (cons 'min lst))
    554. p3 (apply 'mapcar (cons 'max lst))
    555. )
    556. )
    557. )
    558. (if (or (not offset) (equal offset 0 0.0001))
    559. (list p1 p3)
    560. (list
    561. (BF-list- p1 (list offset offset 0))
    562. (BF-list+ p3 (list offset offset 0))
    563. )
    564. )
    565. )
    566. (defun BF-list- (lst1 lst2)
    567. (mapcar '- lst1 lst2)
    568. )
    569. (defun BF-list+ (lst1 lst2)
    570. (mapcar '+ lst1 lst2)
    571. )
    572. (defun BF-Math-Rand (/ a c m)
    573. (setq m 4294967296.0
    574. a 1664525.0
    575. c 1013904223.0
    576. $xn (rem (+ c
    577. (* a
    578. (cond ($xn)
    579. ((getvar 'date))
    580. )
    581. )
    582. )
    583. m
    584. )
    585. )
    586. (/ $xn m)
    587. )
    588. (defun BF-lst->str (lst del)
    589. (if (cdr lst)
    590. (strcat (car lst) del (BF-lst->str (cdr lst) del))
    591. (car lst)
    592. )
    593. )
    594. (defun GetWord(promptStr kwordList / acadobj doc)
    595. (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
    596. (vla-InitializeUserInput (vla-get-Utility doc) 1 (BF-lst->str kwordList " "))
    597. (vla-GetKeyword (vla-get-Utility doc) (strcat(BF-lst->str kwordList "/")"\n"))
    598. ;(vla-GetKeyword (vla-get-Utility doc) (strcat promptStr "[" (BF-lst->str kwordList "/") "]"))
    599. )
    600. (defun BF-Mat-TranslateByMatrix (target p1 p2)
    601. (BF-Mat-ApplyMatrixTransformation target
    602. (list
    603. (list 1. 0. 0.)
    604. (list 0. 1. 0.)
    605. (list 0. 0. 1.)
    606. )
    607. (mapcar '- p2 p1)
    608. )
    609. )
    610. (defun BF-Mat-ScaleByMatrix (target p1 scale / m)
    611. (BF-Mat-ApplyMatrixTransformation target
    612. (setq m
    613. (list
    614. (list scale 0. 0.)
    615. (list 0. scale 0.)
    616. (list 0. 0. scale)
    617. )
    618. )
    619. (mapcar '- p1 (BF-Mat-MxV m p1))
    620. )
    621. )
    622. (defun BF-Mat-ApplyMatrixTransformation (target matrix vector)
    623. (cond
    624. ((eq 'VLA-OBJECT (type target))
    625. (vla-TransformBy target
    626. (vlax-tMatrix
    627. (append (mapcar (function (lambda (x v) (append x (list v)))) matrix vector)
    628. '((0. 0. 0. 1.))
    629. )
    630. )
    631. )
    632. )
    633. ((listp target)
    634. (mapcar
    635. (function
    636. (lambda (point) (mapcar '+ (BF-Mat-MxV matrix point) vector))
    637. )
    638. target
    639. )
    640. )
    641. )
    642. )
    643. (defun BF-Mat-MxV (m v)
    644. (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
    645. )
    646. (defun BF-ent-putdxf (ename code val /)
    647. (cond
    648. ((BF-enamep ename)
    649. (setq ent (entget ename))
    650. (if (and (listp code) (listp val))
    651. (mapcar '(lambda (x y) (BF-ent-putdxf ename x y)) code val)
    652. (progn
    653. (if (null (BF-ent-getdxf ename code))
    654. (entmod (append ent (list (cons code val))))
    655. (entmod (subst (cons code val) (assoc code ent) ent))
    656. )
    657. (entupd ename)
    658. )
    659. )
    660. )
    661. ((BF-picksetp ename)
    662. (foreach s1 (BF-pickset->list ename)
    663. (BF-ent-putdxf s1 code val)
    664. )
    665. )
    666. ((BF-ename-listp ename)
    667. (foreach s1 ename
    668. (BF-ent-putdxf s1 code val)
    669. )
    670. )
    671. )
    672. ename
    673. )
    674. ;;;======================================
    675. ;;;===========以下为内裤部分=============
    676. ;;;======================================
    677. (defun BF-enamep (arg) (equal (type arg) 'ename))
    678. (defun BF-ent-getdxf ( ent i / getdxf)
    679. ;;取组码函数
    680. (defun getdxf (ent i)
    681. (mapcar 'cdr
    682. (vl-remove-if-not '(lambda (x) (= (car x) i)) ent)
    683. )
    684. )
    685. ;;主函数体(equal (type ent) 'vla-object)
    686. (cond
    687. ((equal (type ent) 'vla-object) (setq ent (entget (vlax-vla-object->ename ent) '("*"))))
    688. ((equal (type ent) 'ENAME) (setq ent (entget ent '("*"))))
    689. )
    690. (cond
    691. ((atom i)
    692. (setq result (getdxf ent i))
    693. )
    694. ((listp i)
    695. (setq result (apply 'append (mapcar '(lambda (x) (getdxf ent x)) i)))
    696. )
    697. )
    698. (if (= 1 (length result))
    699. (car result)
    700. result
    701. )
    702. )
    703. (defun BF-picksetp (x)
    704. (and (= (type x) 'pickset) (> (sslength x) 0))
    705. )
    706. (defun BF-pickset->list (SS)(vl-remove-if-not 'BF-enamep (mapcar 'cadr (ssnamex SS))))
    707. (defun BF-ename-listp (lst)
    708. (apply 'and (mapcar 'BF-enamep lst))
    709. )