1. ;==========================================================================代码说明
    2. ;;单体对齐、等距排列插件/补充图框类别选择/ST-2020.03
    3. ;;双向对齐不做排列,水平:以左下角x值由左到右排列,垂直:以左下角y值由下到上排列。
    4. ;;编码思路:1,利用院长外包围9点函数找到合适移动基点。2,根据对齐形式计算移动终点。3,移动命令完成最后步骤。
    5. ;;图框、方框和手工操作则利用对角点作为ssget 框选点,全选图纸内容后再做移动,排列,注意边框不要重叠,否则会错位!
    6. ;;排图纸说明:图框为块的选2操作,默认都是同名块,点选图框右键可全选,不同名块勾选异名块,单独点选;图框不为块是方框的选3,默认同层同色矩形框可以快速全选,不共性的打钩单独点选;如果连方框都没有直接用4 手动框选图纸内容,没选一次画一个矩形框,选完右键继续,勾选边框比会自动采用标准图纸比例框。
    7. ;; /ST-2020.03.06更新。
    8. ;1,增加插图框程序,根据矩形框插入指定图框块,自动缩放居中,因每种图框款式不一,需后期手动微调位置,选取操作与上面矩形框排列一样。默认图框文件是 D\A2图框MR.dwg 左下角为插入点,要按照标准A2图幅(594x420mm)尺寸来做,不然缩放比例不对的;
    9. ;2,完善了dcl对话框程序,可记忆上次数值;
    10. ;3,补充处理因坐标系非世界系出错代码;
    11. ;4,有群组的时候框选类型会错位,未解决。
    12. ;==========================================================================
    13. ;; /ST-2020.03.09更新。
    14. ;1,处理了群组单体排列的问题;2,增加本图图框插入;
    15. ;3,增加阵列,只做了从左到右从上到下排列;
    16. ;4,增加单体速选.
    17. ;==========================================================================
    18. ;; /ST-2020.03.11更新。
    19. ;1,增加 自动/手选 顺序排列开关;2,增加复制阵列(自带那种);
    20. ;==========================================================================
    21. ;; /ST-2020.03.13更新。选取方式增加自动识别图框。
    22. ;用于异名图框块,或者非块的矩形外框图框的速选,要全对象计算对比,大型图纸尽量不要使用,使用布局图纸空间的应该问题不大。
    23. ;==========================================================================
    24. ;; /ST-2020.03.18更新。自动识别增加速选:直接框选生成边框,大型图慎用。
    25. (defun c:tt5 () (c:ent_DQPL));;方便自己调试设的快捷键
    26. (vl-load-com)
    27. ;==========================================================================对话框程式代码(不熟不多说)
    28. (defun c:ent_DQPL (/ DCL dd ucs)
    29. (if (= (getvar "WORLDUCS" ) 0) (if (tblsearch "ucs" "ucs_old") (command "ucs" "na" "s" "ucs_old" "y" "ucs" "w")
    30. (command "ucs" "na" "s" "ucs_old" "ucs" "w")) (setq ucs 1))
    31. (setq DCL (load_dialog (make-dcl-pl)))
    32. (new_dialog "rect01" DCL)
    33. (if (not cp_xx) (setq cp_xx 0))
    34. (if (not cp_dx) (setq cp_dx 100))
    35. (if (not YMK_TMP) (setq YMK_TMP 0))
    36. (if (not BGX_TMP) (setq BGX_TMP 0))
    37. (if (not CKB_TMP) (setq CKB_TMP 0))
    38. (if (not SX_TMP) (setq SX_TMP 0))
    39. (if (not zdSX_TMP) (setq zdSX_TMP 0))
    40. (if (not LB_TMP) (setq LB_TMP 1))
    41. (if (not tukuang_TMP) (setq tukuang_TMP 1) )
    42. (if (not t_lujing) (setq t_lujing "D:\\A2图框MR.dwg"))
    43. (if cp_dx1 (setq cp_xx 1 cp_dx cp_dx1 cp_dx1 nil) );判断手动点距离是否有
    44. (if tk_BLfile (setq t_lujing tk_BLfile))
    45. (if (not RB_zhenlieFS) (progn (SETQ RB_zhenlieFS 1)));阵列方式默认
    46. ;变灰判断
    47. (if (or (= cp_xx 1) (/= LB_TMP 1)) (mode_tile "row_sxdq" 1))
    48. (if (= cp_xx 0) (mode_tile "cp_d" 1))
    49. (if (or (= tukuang_TMP 1) (= tukuang_TMP 2)) (progn (mode_tile "k_lujing" 1) (mode_tile "k_liulan" 1)) )
    50. (if (= RB_zhenlieFS 1) (progn (mode_tile "k_shushu" 1) (mode_tile "k_tog_zhongdian" 0)) (progn (fuzhizhenlie) (mode_tile "k_shushu" 0) (mode_tile "k_tog_zhongdian" 1)))
    51. (if (not t_hengju) (setq t_hengju 100))
    52. (if (not t_hengshu) (setq t_hengshu 3))
    53. (if (not t_shuju) (setq t_shuju 100))
    54. (if (not t_shushu) (setq t_shushu 3))
    55. (if (not RB_zhenliejianju) (setq RB_zhenliejianju 1))
    56. (if t_hengju_dx (setq t_hengju t_hengju_dx t_hengju_dx nil));手动选间距赋值函数变量,自清空
    57. (if t_shuju_dx (setq t_shuju t_shuju_dx t_shuju_dx nil))
    58. (if (not RB_paixuFS) (setq RB_paixuFS 1));排序方式
    59. (if (not t_tog_zhongdian) (setq t_tog_zhongdian 0));阵列基点默认0-左下角
    60. (setdate)
    61. ;;水平
    62. (action_tile "dtpl1" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 1)")
    63. (action_tile "dtpl2" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 2)")
    64. (action_tile "dtpl3" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 3)")
    65. ;;垂直
    66. (action_tile "dtpl4" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 4)")
    67. (action_tile "dtpl5" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 5)")
    68. (action_tile "dtpl6" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 6)")
    69. ;;双向
    70. (action_tile "dtpl7" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 7)")
    71. (action_tile "dtpl8" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 8)")
    72. (action_tile "dtpl9" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 9)")
    73. (action_tile "dtpl10" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 10)")
    74. (action_tile "dtpl11" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 11)")
    75. (action_tile "dtpl12" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 12)")
    76. (action_tile "dtpl13" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 13)")
    77. (action_tile "dtpl14" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 14)")
    78. (action_tile "dtpl15" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 15)")
    79. ;;重排
    80. (action_tile "dxjj" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 16)"); 排列点选距离
    81. (action_tile "k_liulan" "(S_RECT) (S_PGON) (S_toggle) (setq t_moren 0) (done_dialog 17)");浏览
    82. (action_tile "k_ctk" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 18)");插图框确认键
    83. (action_tile "k_zlqueding" "(S_RECT) (S_PGON) (S_toggle) (if (or (= t_hengshu 0) (= t_shushu 0)) (alert \"输入数据有误!\") (done_dialog 19))");阵列确定按键
    84. (action_tile "k_bt_dianxuan" "(S_RECT) (S_PGON) (S_toggle) (done_dialog 20)");阵列点选距离
    85. ;--------------------------------------------------------------------------------非done项目
    86. (ACTION_TILE "xlb2" "(MODE_TILE \"row_sxdq\" 1)");变灰
    87. (ACTION_TILE "xlb3" "(MODE_TILE \"row_sxdq\" 1)");变灰
    88. (ACTION_TILE "xlb4" "(MODE_TILE \"row_sxdq\" 1)");变灰
    89. (ACTION_TILE "xlb5" "(MODE_TILE \"row_sxdq\" 1)");变灰
    90. (ACTION_TILE "xlb1" "(S_RECT) (if (= cp_xx 0) (MODE_TILE \"row_sxdq\" 0))");恢复
    91. (action_tile "cp_x" "(S_RECT) (if (= cp_xx 1) (progn (mode_tile \"cp_d\" 0) (mode_tile \"row_sxdq\" 1)) (progn (mode_tile \"cp_d\" 1) (if (= xlb1 1) (mode_tile \"row_sxdq\" 0))))")
    92. (action_tile "k_moren" "(S_RECT) (mode_tile \"k_lujing\" 1) (mode_tile \"k_liulan\" 1)")
    93. (action_tile "k_tuzhong" "(S_RECT) (mode_tile \"k_lujing\" 1) (mode_tile \"k_liulan\" 1)")
    94. (action_tile "k_chawenjian" "(S_RECT) (mode_tile \"k_lujing\" 0) (mode_tile \"k_liulan\" 0)")
    95. ;(action_tile "k_zlqueding" "(S_RECT) (S_PGON) (S_toggle) (if (= t_hengshu 0) (alert \"输入数据有误!\") )")
    96. (action_tile "k_rb_chongpaizhenlie" "(S_RECT) (chongpaizhenlie) (mode_tile \"k_shushu\" 1) (mode_tile \"k_rb_zuoxia\" 0) (mode_tile \"k_tog_zhongdian\" 0) (mode_tile \"k_paixuFS\" 0)")
    97. (action_tile "k_rb_fuzhizhenlie" "(S_RECT) (fuzhizhenlie) (mode_tile \"k_shushu\" 0) (mode_tile \"k_rb_zuoxia\" 1) (mode_tile \"k_tog_zhongdian\" 1) (mode_tile \"k_paixuFS\" 1)")
    98. ;--------------------------------------------------------------------------------
    99. (setq dd (start_dialog ))
    100. (cond
    101. ((= dd 1) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 0 7 9 0) (S_DQcx 0 9)));单体
    102. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 0 x 7 9 0) (tukuang_BK 0 9 x x x)));图框块
    103. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 0 x 7 9 0) (juxing_WL 0 9 x x x)));矩形框
    104. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 0 x 7 9 0) (select_SG 0 9 x x x)));手工选
    105. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 0 x 7 9 0) (zidongshibie_WL 0 9 x x x)));自动识别
    106. ))
    107. ((= dd 2) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 0 4 6 0) (S_DQcx 0 5)));单体
    108. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 0 x 4 6 0) (tukuang_BK 0 5 x x x)));图框块
    109. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 0 x 4 6 0) (juxing_WL 0 5 x x x)));矩形框
    110. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 0 x 4 6 0) (select_SG 0 5 x x x)));手工选
    111. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 0 x 4 6 0) (zidongshibie_WL 0 5 x x x)));自动识别
    112. ))
    113. ((= dd 3) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 0 1 3 0) (S_DQcx 0 1)));单体
    114. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 0 x 1 3 0) (tukuang_BK 0 1 x x x)));图框块
    115. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 0 x 1 3 0) (juxing_WL 0 1 x x x)));矩形框
    116. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 0 x 1 3 0) (select_SG 0 1 x x x)));手工选
    117. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 0 x 1 3 0) (zidongshibie_WL 0 1 x x x)));自动识别
    118. ))
    119. ((= dd 4) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 1 1 7 (* 0.5 pi)) (S_DQcx 1 1)));单体
    120. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 1 x 1 7 (* 0.5 pi)) (tukuang_BK 1 1 x x x)));图框块
    121. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 1 x 1 7 (* 0.5 pi)) (juxing_WL 1 1 x x x)));矩形框
    122. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 1 x 1 7 (* 0.5 pi)) (select_SG 1 1 x x x)));手工选
    123. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 1 x 1 7 (* 0.5 pi)) (zidongshibie_WL 1 1 x x x)));自动识别
    124. ))
    125. ((= dd 5) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 1 2 8 (* 0.5 pi)) (S_DQcx 1 5)));单体
    126. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 1 x 2 8 (* 0.5 pi)) (tukuang_BK 1 5 x x x)));图框块
    127. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 1 x 2 8 (* 0.5 pi)) (juxing_WL 1 5 x x x)));矩形框
    128. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 1 x 2 8 (* 0.5 pi)) (select_SG 1 5 x x x)));手工选
    129. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 1 x 2 8 (* 0.5 pi)) (zidongshibie_WL 1 5 x x x)));自动识别
    130. ))
    131. ((= dd 6) (cond ((= LB_TMP 1) (if (= cp_xx 1) (S_PLcx 1 3 9 (* 0.5 pi)) (S_DQcx 1 9)));单体
    132. ((= LB_TMP 2) (if (= cp_xx 1) (tukuang_BK 1 x 3 9 (* 0.5 pi)) (tukuang_BK 1 9 x x x)));图框块
    133. ((= LB_TMP 3) (if (= cp_xx 1) (juxing_WL 1 x 3 9 (* 0.5 pi)) (juxing_WL 1 9 x x x)));矩形框
    134. ((= LB_TMP 4) (if (= cp_xx 1) (select_SG 1 x 3 9 (* 0.5 pi)) (select_SG 1 9 x x x)));手工选
    135. ((= LB_TMP 5) (if (= cp_xx 1) (zidongshibie_WL 1 x 3 9 (* 0.5 pi)) (zidongshibie_WL 1 9 x x x)));自动识别
    136. ))
    137. ((= dd 7) (S_DQcx 2 7))
    138. ((= dd 8) (S_DQcx 2 4))
    139. ((= dd 9) (S_DQcx 2 1))
    140. ((= dd 10) (S_DQcx 2 8))
    141. ((= dd 11) (S_DQcx 2 5))
    142. ((= dd 12) (S_DQcx 2 2))
    143. ((= dd 13) (S_DQcx 2 9))
    144. ((= dd 14) (S_DQcx 2 6))
    145. ((= dd 15) (S_DQcx 2 3))
    146. ((= dd 16) (S_RECT2)) ;;排列点选间距
    147. ((= dd 17) (setq tk_BLfile (getfiled "选择图框文件" "C:/Users/Administrator/Desktop/" "dwg" 16)) (c:ent_DQPL))
    148. ((= dd 18) (cond ((= tukuang_TMP 1) (chatukuang "D:\\A2图框MR.dwg"))
    149. ((= tukuang_TMP 2) (chatukuang_tuzhong))
    150. ((= tukuang_TMP 3) (chatukuang t_lujing))))
    151. ((= dd 19) (if (= RB_zhenlieFS 1) (if (= LB_TMP 1) (cond ((= RB_zhenliejianju 1) ( zhenlie_DT t_hengju t_shuju t_hengshu 1))
    152. ((= RB_zhenliejianju 2) ( zhenlie_DT t_hengju t_shuju t_hengshu 2)))
    153. (cond ((= RB_zhenliejianju 1) ( zhenlie_SS t_hengju t_shuju t_hengshu 1))
    154. ((= RB_zhenliejianju 2) ( zhenlie_SS t_hengju t_shuju t_hengshu 3)))
    155. );if1
    156. (zhenlie_FUZHI t_shushu t_hengshu t_shuju t_hengju)
    157. );if2
    158. )
    159. ((= dd 20) (S_RECT3)) ;;阵列点选间距
    160. );cond
    161. (if (not ucs) (command "ucs" "na" "r" "ucs_old"))
    162. (princ)
    163. )
    164. ;==========================================================================辅助函数
    165. ;;提取勾选键、排距数值
    166. (DEFUN S_RECT()
    167. (SETQ cp_dx (ABS (ATOF (GET_TILE "cp_d"))) ;间距值
    168. cp_xx (atoi (GET_TILE "cp_x")) ;重排开关值
    169. xlb1 (atoi (GET_TILE "xlb1")));类别开关值
    170. ;t_moren (atoi (GET_TILE "k_moren"));默认图框开关值
    171. (COND ((= (GET_TILE "k_moren") "1") (SETQ tukuang_TMP 1))
    172. ((= (GET_TILE "k_tuzhong") "1") (SETQ tukuang_TMP 2))
    173. ((= (GET_TILE "k_chawenjian") "1") (SETQ tukuang_TMP 3))
    174. );图框类别
    175. (setq t_hengju (ATOF (GET_TILE "k_hengju"))
    176. t_hengshu (atoi (GET_TILE "k_hengshu"))
    177. t_shuju (ATOF (GET_TILE "k_shuju"))
    178. t_shushu (atoi (GET_TILE "k_shushu"))
    179. )
    180. (COND ((= (GET_TILE "k_rb_zhongzhong") "1") (SETQ RB_zhenliejianju 1))
    181. ((= (GET_TILE "k_rb_bianbian") "1") (SETQ RB_zhenliejianju 2))
    182. );阵列间距方式
    183. (COND ((= (GET_TILE "k_rb_zidong") "1") (SETQ RB_paixuFS 1))
    184. ((= (GET_TILE "k_rb_xuanxu") "1") (SETQ RB_paixuFS 2))
    185. );排序方式
    186. (COND ((= (GET_TILE "k_rb_chongpaizhenlie") "1") (SETQ RB_zhenlieFS 1))
    187. ((= (GET_TILE "k_rb_fuzhizhenlie") "1") (SETQ RB_zhenlieFS 2))
    188. );阵列方式 t_tog_zhongdian
    189. (setq t_tog_zhongdian (atoi (GET_TILE "k_tog_zhongdian")));阵列对齐基点
    190. )
    191. (defun S_RECT2 (/ pdx1);;选点定距函数(排列)
    192. (setq cp_dx1 (distance (setq pdx1(getpoint)) (getpoint pdx1)))
    193. (c:ent_DQPL)
    194. )
    195. (defun S_RECT3 (/ pdx1);;选点定距函数(阵列);
    196. (setq p1(getpoint "\n选取1点:") p2 (getcorner p1"\n选取2点(X差=横距,Y差=竖距):"))
    197. (setq t_hengju_dx (abs (- (car p1) (car p2))) t_shuju_dx (abs (- (cadr p1) (cadr p2))))
    198. (c:ent_DQPL)
    199. )
    200. ;; 院长函数 / 外包盒9点坐标;在此程序中发挥关键作用
    201. (defun ss9pt (ss n / ss i s1 ll rr box ptn a p1 p2 p3 p4 p5 p6 p7 p8 p9)
    202. (progn ss
    203. (setq i -1)
    204. (repeat (sslength ss)
    205. (setq s1 (ssname ss (setq i (1+ i))))
    206. (vla-GetBoundingBox (vlax-ename->vla-object s1) 'll 'rr)
    207. (setq box (list (vlax-safearray->list ll) (vlax-safearray->list rr))
    208. ptn (append box ptn)
    209. )
    210. )
    211. (setq a (mapcar '(lambda (x) (apply 'mapcar (cons x ptn))) (list 'min 'max))
    212. p1 (car a)
    213. p9 (cadr a)
    214. p5 (mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p9)
    215. p2 (list (car p5) (cadr p1))
    216. p3 (list (car p9) (cadr p1))
    217. p4 (list (car p1) (cadr p5))
    218. p6 (list (car p9) (cadr p5))
    219. p7 (list (car p1) (cadr p9))
    220. p8 (list (car p5) (cadr p9))
    221. )
    222. (nth (- n 1) (list p1 p2 p3 p4 p5 p6 p7 p8 p9))
    223. )
    224. )
    225. ;;选择集=>>名表
    226. (defun SStoLST (ss / i entname lst)
    227. (setq i -1)
    228. (if ss
    229. (while (setq entname (ssname ss(setq i(1+ i))))
    230. (setq lst (cons entname lst))))
    231. (reverse lst)
    232. )
    233. (defun setdate ();;设置dcl各个值
    234. (set_tile "cp_x" (rtos cp_xx 2 2))
    235. (set_tile "cp_d" (rtos cp_dx 2 2))
    236. (set_tile "toggle_ymk" (rtos YMK_TMP 2 2))
    237. (set_tile "toggle_bgx" (rtos BGX_TMP 2 2))
    238. (set_tile "toggle_ckb" (rtos CKB_TMP 2 2))
    239. (set_tile "toggle_sx" (rtos SX_TMP 2 2))
    240. (set_tile "toggle_sx2" (rtos zdSX_TMP 2 2))
    241. (cond ((= LB_TMP 1) (set_tile "xlb1" "1"))
    242. ((= LB_TMP 2) (set_tile "xlb2" "1"))
    243. ((= LB_TMP 3) (set_tile "xlb3" "1"))
    244. ((= LB_TMP 4) (set_tile "xlb4" "1"))
    245. ((= LB_TMP 5) (set_tile "xlb5" "1"))
    246. )
    247. (cond ((= tukuang_TMP 1) (set_tile "k_moren" "1"))
    248. ((= tukuang_TMP 2) (set_tile "k_tuzhong" "1"))
    249. ((= tukuang_TMP 3) (set_tile "k_chawenjian" "1"))
    250. )
    251. (set_tile "k_lujing" t_lujing)
    252. (set_tile "k_hengju" (rtos t_hengju 2 2))
    253. (set_tile "k_hengshu" (rtos t_hengshu 2 0))
    254. (set_tile "k_shuju" (rtos t_shuju 2 2))
    255. (set_tile "k_shushu" (rtos t_shushu 2 0))
    256. (cond ((= RB_zhenliejianju 1) (set_tile "k_rb_zhongzhong" "1"))
    257. ((= RB_zhenliejianju 2) (set_tile "k_rb_bianbian" "1"))
    258. );阵列间距方式
    259. (cond ((= RB_paixuFS 1) (set_tile "k_rb_zidong" "1"))
    260. ((= RB_paixuFS 2) (set_tile "k_rb_xuanxu" "1"))
    261. );排序方式
    262. (cond ((= RB_zhenlieFS 1) (set_tile "k_rb_chongpaizhenlie" "1"))
    263. ((= RB_zhenlieFS 2) (set_tile "k_rb_fuzhizhenlie" "1"))
    264. );阵列方式
    265. (set_tile "k_tog_zhongdian" (rtos t_tog_zhongdian 2 2));阵列对齐基点-默认左下角
    266. )
    267. (defun fuzhizhenlie ();点复制阵列选项变灰处理
    268. (mode_tile "k_no1" 1)
    269. (mode_tile "k_no2" 1)
    270. (mode_tile "k_shuipingduiqi" 1)
    271. (mode_tile "k_chuizhiduiqi" 1)
    272. (mode_tile "k_dengju,dianxuan" 1)
    273. ;(mode_tile "k_zlqueding" 1)
    274. (mode_tile "row_sxdq" 1)
    275. )
    276. (defun chongpaizhenlie ();点重排阵列选项变亮处理
    277. (S_PGON) (S_RECT)
    278. (mode_tile "k_no1" 0)
    279. (mode_tile "k_no2" 0)
    280. (mode_tile "k_shuipingduiqi" 0)
    281. (mode_tile "k_chuizhiduiqi" 0)
    282. (mode_tile "k_dengju,dianxuan" 0)
    283. ;(mode_tile "k_zlqueding" 0)
    284. (if (and (= LB_TMP 1) (= cp_xx 0)) (mode_tile "row_sxdq" 0))
    285. )
    286. ;==========================================================================主处理函数
    287. ;;单体对齐主程序,/ H-S=0:水平 / H-S=1:垂直 / H-S=2:双向 / 9NB:移动基点 /
    288. (defun S_DQcx (H-S 9NB / ang entdate entname gpname gpname_lst gpss_lst gx_list i nb nb0 p0 p1 p1a p2 pick_date ss ss_gp ss_gp_temp ss-9 ssall sslst sslst_px)
    289. (command "undo" "be");撤销开始点,对于批量操作做好撤销设置,不然一步步后退很麻烦。
    290. (prompt "\n选择对象:"); ssget 后面不能带操作说明,在其前可以用 prompt 先行提示。
    291. (if (= SX_TMP 1)
    292. (progn (setq pick_date (entget (car (entsel "\n点选源对象:"))) GX_list '())
    293. (if (= (cdr (assoc 0 pick_date)) "INSERT")
    294. (setq GX_list (list (assoc 0 pick_date) (assoc 2 pick_date)));图块类
    295. (progn (setq GX_list (list (assoc 0 pick_date) (assoc 8 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list))));其他类
    296. );;收集共性组码
    297. (prompt "\n选择要处理对象 / 全选<空格>:")
    298. (if (not (setq ssall (ssget GX_list))) (setq ssall (ssget "x" GX_list)));;共性选集(同层、同色)
    299. (sssetfirst nil ssall)
    300. (setq ss_gp (ssadd) ss (ssadd))
    301. );progn
    302. (setq ssall (ssget) ss_gp (ssadd) ss (ssadd)));if ;ss_gp:全部属于群组成员的选集
    303. ;;判断群组
    304. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    305. (setq i -1 GPname_lst '())
    306. (while (setq entname (ssname ssall (setq i (1+ i))))
    307. (if (= (cdr (assoc 102 (setq entdate (entget entname)))) "{ACAD_REACTORS") (progn (setq GPname (cdr (assoc 330 entdate))) (setq ss_gp (ssadd entname ss_gp))) (setq ss (ssadd entname ss)))
    308. (if (not (member GPname GPname_lst)) (setq GPname_lst (cons GPname GPname_lst)));群组名的表
    309. );while
    310. ;(sssetfirst nil ss);亮显ss
    311. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    312. ;; 单体ss选集处理
    313. (setq p0 (getpoint "\n选择对齐基点<退出>: "));getpoint 等很多函数后面可以接说明,\n 换行号,命令行会换一行再提示。
    314. (setq i -1);为了配合下面 ssname 函数设的变量,第一个对象编号为 0,所以设为 -1。
    315. (while (setq entname (ssname ss (setq i (1+ i))));while 对选集全部对象做循环处理,也可以用 repeat 函数来做。
    316. (setq ss-9 (ssadd) ss-9 (ssadd entname ss-9))
    317. (setq p1 (ss9pt ss-9 9NB));9NB是此函数参数之一,就是对象的9点之一(移动基点p1),根据对齐形式选取。
    318. (cond ((= H-S 0) (setq p2 (list (car p1) (cadr p0))));H-S也是参数之一,根据他来计算移动的目标点 p2
    319. ((= H-S 1) (setq p2 (list (car p0) (cadr p1))))
    320. ((= H-S 2) (setq p2 p0));双向对齐时,选的点p0就是目标点p2
    321. )
    322. (command "MOVE" entname "" "non" p1 "non" p2);移动命令完成
    323. );while
    324. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    325. ;;群组对象处理:
    326. (if ss_gp (progn
    327. (setq GPss_lst '());GPss_lst-各组对象选集 列表
    328. (foreach x GPname_lst
    329. (setq i -1 ss_gp_temp (ssadd)) ;ss_gp_temp-临时选集
    330. (while (setq entname (ssname ss_gp (setq i (1+ i))))
    331. (if (equal (cdr (assoc 330 (entget entname))) x) (setq ss_gp_temp (ssadd entname ss_gp_temp)))
    332. );while
    333. (setq GPss_lst (cons ss_gp_temp GPss_lst))
    334. );foreach1
    335. (foreach x GPss_lst
    336. (if (/= (sslength x) 0)
    337. (progn (setq p1 (ss9pt x 9NB))
    338. (cond ((= H-S 0) (setq p2 (list (car p1) (cadr p0))))
    339. ((= H-S 1) (setq p2 (list (car p0) (cadr p1))))
    340. ((= H-S 2) (setq p2 p0))
    341. )
    342. (command "MOVE" x "" "non" p1 "non" p2) ))
    343. );foreach2
    344. );progn
    345. );if
    346. ; ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    347. (command "undo" "e");撤销结束点,与开始点之间的操作一步撤销完成
    348. (princ);这个是标配吧
    349. );结束
    350. ;==========================================================================
    351. ;;单体排列主程序,/ H-S=0:水平 / H-S=1:垂直 / ang:水平0,垂直90° / NB:对象移动基点 / NB0: 移动目标点(选取合适的9点之一来计算)
    352. (defun S_PLcx (H-S NB NB0 ang / entname i p0 p1a ss sslst sslst_px ss-9)
    353. (command "undo" "be");同上
    354. (if (= SX_TMP 1)
    355. (progn (setq pick_date (entget (car (entsel "\n点选源对象:"))) GX_list '())
    356. (if (= (cdr (assoc 0 pick_date)) "INSERT")
    357. (setq GX_list (list (assoc 0 pick_date) (assoc 2 pick_date)));图块类
    358. (progn (setq GX_list (list (assoc 0 pick_date) (assoc 8 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list))));其他类
    359. );;收集共性组码
    360. (prompt "\n选择要处理对象 / 全选<空格>:")
    361. (if (not (setq ssall (ssget GX_list))) (setq ssall (ssget "x" GX_list)));;共性选集(同层、同色)
    362. (sssetfirst nil ssall)
    363. (setq ss_gp (ssadd) ss (ssadd))
    364. );progn
    365. (setq ssall (ssget) ss_gp (ssadd) ss (ssadd)));if ;ss_gp:全部属于群组成员的选集
    366. ;;判断群组
    367. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    368. (setq i -1 GPname_lst '())
    369. (while (setq entname (ssname ssall (setq i (1+ i))))
    370. (if (= (cdr (assoc 102 (setq entdate (entget entname)))) "{ACAD_REACTORS") (progn (setq GPname (cdr (assoc 330 entdate))) (setq ss_gp (ssadd entname ss_gp))) (setq ss (ssadd entname ss)))
    371. (if (not (member GPname GPname_lst)) (setq GPname_lst (cons GPname GPname_lst)));群组名的表
    372. );while
    373. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    374. ;; 单体ss选集处理
    375. (setq p0 (getpoint "\n选择对齐基点<退出>: "));排列的起点
    376. (setq sslst (SStoLST ss));;选集转成表以便下面进行排序
    377. ;等距排列其实跟上面对齐操作原理一样,但是要对选集对象排序一下,不然会乱,因为这里的移动终点是根据前对象计算的,而对齐只要根据自己点位计算就行。
    378. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    379. (if (= RB_paixuFS 1) (cond ((= H-S 0) (setq sslst_px (vl-sort sslst '(lambda (a b) (< (car (car (enbox a))) (car (car (enbox b))))))));;横排时按对象1点的x值小到大排序,得到新表
    380. ((= H-S 1) (setq sslst_px (vl-sort sslst '(lambda (a b) (< (cadr (car (enbox a))) (cadr (car (enbox b))))))));;竖排时按对象1点的y值小到大排序,得到新表
    381. );cond 自动排列
    382. (setq sslst_px sslst);;按选择顺序排列
    383. );if
    384. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    385. (setq i 0);这里循环设的i0,和上面-1是一样效果,都是从编号0开始
    386. (repeat (length sslst_px);这里用了repeat函数,注意这里对象是表,对比一下上面 while 的对象是选集,会发现原理一样,但用到的函数不一样
    387. (setq entname (nth i sslst_px))
    388. (setq ss-9 (ssadd) ss-9 (ssadd entname ss-9)
    389. p1a (ss9pt ss-9 NB));移动基点
    390. (command "MOVE" entname "" "non" p1a "non" p0);移动命令
    391. ;(if (not cp_dx1) (setq cp_dx1 cp_dx));这是对话框的一些代码
    392. (setq p0 (polar (ss9pt ss-9 NB0) ang cp_dx) i (1+ i)) ;这里是计算下一个对象的移动终点(p0重新赋值,循环使用)
    393. );repeat
    394. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    395. ;;群组对象处理:
    396. (if ss_gp (progn
    397. (setq GPss_lst '());GPss_lst-各组对象选集 列表
    398. (foreach x GPname_lst
    399. (setq i -1 ss_gp_temp (ssadd)) ;ss_gp_temp-临时选集
    400. (while (setq entname (ssname ss_gp (setq i (1+ i))))
    401. (if (equal (cdr (assoc 330 (entget entname))) x) (setq ss_gp_temp (ssadd entname ss_gp_temp)))
    402. );while
    403. (if (/= (sslength ss_gp_temp) 0) (setq GPss_lst (cons ss_gp_temp GPss_lst)))
    404. );foreach1
    405. (cond ((= H-S 0) (setq sslst_px (vl-sort GPss_lst '(lambda (a b) (< (car (ss9pt a 1)) (car (ss9pt b 1)))))));;横排时按对象1点的x值小到大排序,得到新表
    406. ((= H-S 1) (setq sslst_px (vl-sort GPss_lst '(lambda (a b) (< (cadr (ss9pt a 1)) (cadr (ss9pt b 1)))))));;竖排时按对象1点的y值小到大排序,得到新表
    407. );cond
    408. (princ GPss_lst ) (princ)
    409. (setq i 0)
    410. (repeat (length sslst_px)
    411. (setq entname (nth i sslst_px))
    412. (if (/= (sslength entname) 0)
    413. (progn (setq p1a (ss9pt entname NB))
    414. (command "MOVE" entname "" "non" p1a "non" p0)
    415. (setq p0 (polar (ss9pt entname NB0) ang cp_dx)));progn
    416. );if
    417. (setq i (1+ i))
    418. );repeat
    419. );progn
    420. );if
    421. ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    422. (command "undo" "e");同上
    423. ;(setq cp_dx1 nil);这是对话框的
    424. (princ)
    425. )
    426. ;; 更新补充代码0303 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
    427. ;==========================================================================辅助函数
    428. (DEFUN S_PGON () ;;类别选择函数
    429. (COND ((= (GET_TILE "xlb1") "1") (SETQ LB_TMP 1))
    430. ((= (GET_TILE "xlb2") "1") (SETQ LB_TMP 2))
    431. ((= (GET_TILE "xlb3") "1") (SETQ LB_TMP 3))
    432. ((= (GET_TILE "xlb4") "1") (SETQ LB_TMP 4))
    433. ((= (GET_TILE "xlb5") "1") (SETQ LB_TMP 5))
    434. )
    435. )
    436. (DEFUN S_toggle () ;;速选、异名块、不共性、长宽比 勾选开关函数
    437. (COND ((= (GET_TILE "toggle_ymk") "1") (SETQ YMK_TMP 1))
    438. ((= (GET_TILE "toggle_ymk") "0") (SETQ YMK_TMP 0))
    439. )
    440. (COND ((= (GET_TILE "toggle_bgx") "1") (SETQ BGX_TMP 1))
    441. ((= (GET_TILE "toggle_bgx") "0") (SETQ BGX_TMP 0))
    442. )
    443. (COND ((= (GET_TILE "toggle_ckb") "1") (SETQ CKB_TMP 1))
    444. ((= (GET_TILE "toggle_ckb") "0") (SETQ CKB_TMP 0))
    445. )
    446. (COND ((= (GET_TILE "toggle_sx") "1") (SETQ SX_TMP 1))
    447. ((= (GET_TILE "toggle_sx") "0") (SETQ SX_TMP 0))
    448. )
    449. (COND ((= (GET_TILE "toggle_sx2") "1") (SETQ zdSX_TMP 1))
    450. ((= (GET_TILE "toggle_sx2") "0") (SETQ zdSX_TMP 0))
    451. )
    452. )
    453. (defun enbox (ename / ll ur);单体外框对角点函数
    454. (vla-getboundingbox (vlax-ename->vla-object ename) 'll 'ur)
    455. (mapcar 'vlax-safearray->list (list ll ur)))
    456. (defun DQ_BK (SS_lst H-S 9NB / i p0 p1 p2 ss-name ss-9);选集类别-对齐函数
    457. (setq p0 (getpoint "\n选择对齐基点<退出>: "))
    458. (command "-layer" "u" (setq suo_str (layer_suo_str)) "");开锁
    459. (setq i -1)
    460. (while (setq ss-name (car (nth (setq i (1+ i)) SS_lst)));提取表元素中的 选集
    461. (setq ss-9 (ssadd) ss-9 (ssadd (caddr (nth i SS_lst)) ss-9))
    462. (setq p1 (ss9pt ss-9 9NB));9NB是此函数参数之一,就是对象的9点之一(移动基点p1),根据对齐形式选取。
    463. (cond ((= H-S 0) (setq p2 (list (car p1) (cadr p0))));H-S也是参数之一,根据他来计算移动的目标点 p2
    464. ((= H-S 1) (setq p2 (list (car p0) (cadr p1))))
    465. ((= H-S 2) (setq p2 p0));双向对齐时,选的点p0就是目标点p2
    466. )
    467. (command "MOVE" ss-name "" "non" p1 "non" p2);移动命令完成
    468. );while
    469. (command "-layer" "lo" suo_str "");回上锁
    470. )
    471. (defun PL_BK (SS_lst H-S NB NB0 ang / i p0 p1a ss-name ss-9);选集类别-排列函数
    472. (setq p0 (getpoint "\n选择对齐基点<退出>: "))
    473. (command "-layer" "u" (setq suo_str (layer_suo_str)) "");开锁
    474. (setq i -1)
    475. (while (setq ss-name (car (nth (setq i (1+ i)) SS_lst)));提取表元素中的 选集
    476. (setq ss-9 (ssadd) ss-9 (ssadd (caddr (nth i SS_lst)) ss-9))
    477. (setq p1a (ss9pt ss-9 NB))
    478. (command "MOVE" ss-name "" "non" p1a "non" p0);移动命令完成
    479. ;(if (not cp_dx1) (setq cp_dx1 cp_dx));这是对话框的一些代码
    480. (setq p0 (polar (ss9pt ss-9 NB0) ang cp_dx)) ;这里是计算下一个对象的移动终点(p0重新赋值,循环使用)
    481. );while
    482. (command "-layer" "lo" suo_str "");回上锁
    483. (princ)
    484. )
    485. (defun mid_pt (p1 p2);;中心函数
    486. (mapcar'*(mapcar'+ p1 p2)'(0.5 0.5 0.5))
    487. )
    488. (defun ckb_rec (p1 p2 / p1x p1y p2x p2y p3 rec ss-9);;手工选择勾选长宽比处理矩形函数
    489. (setq p1x (car p1) p1y (cadr p1)
    490. p2x (car p2) p2y (cadr p2)
    491. )
    492. (if (<= (abs (/ (- p2x p1x) 420)) (abs (/ (- p1y p2y) 297)))
    493. (setq p3 (polar (polar p1 0 (abs (* (/ (- p1y p2y) 297) 420))) (* 1.5 pi) (abs(- p1y p2y))))
    494. (setq p3 (polar (polar p1 0 (abs(- p2x p1x))) (* 1.5 pi) (abs (/ (* (- p2x p1x) 297) 420))))
    495. );if
    496. (command "RECTANG" "non" p1 "non" p3 "CHANGE" (setq rec (entlast)) "" "p" "c" 224 "")
    497. (setq ss-9 (ssadd) ss-9 (ssadd rec ss-9))
    498. (command "MOVE" rec "" "non" (ss9pt ss-9 5) "non" (mid_pt p1 p2))
    499. rec
    500. )
    501. (defun layer_suo_str (/ laylst_suo lays_jh str);;上锁图层名字字符串组合
    502. (setq lays_jh (vla-get-layers (vla-get-activedocument (vlax-get-Acad-Object))));文档图层集合
    503. (vlax-for x lays_jh
    504. (if (= (vla-get-lock x) :vlax-true)
    505. (SETQ laylst_suo (APPEND laylst_suo (LIST (vla-get-Name x)))));上锁的图层名表
    506. )
    507. (setq str "")
    508. (foreach x laylst_suo
    509. (setq str (strcat "," x str))
    510. )
    511. (substr str 2)
    512. )
    513. (defun chatukuang (tk_blfile / entname gx_list i pick_date pt scale ss_tk ss-9 ss-9a );;插图框主函数
    514. (command "undo" "be")
    515. ;(setq tk_BLfile (getfiled "选择图框文件" "" "dwg" 8))
    516. (setvar "INSUNITS" 4)
    517. (setq pick_date (entget (car (entsel "\n点选矩形框:"))) GX_list '() GX_list (list (assoc 0 pick_date) (assoc 8 pick_date) (assoc 70 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list)))
    518. (prompt "\n选择要处理对象 / 全选<空格>:")
    519. (if (not (setq ss_tk (ssget GX_list))) (setq ss_tk (ssget "x" GX_list)))
    520. (setq i -1)
    521. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    522. (setq ss-9 (ssadd) ss-9 (ssadd entname ss-9) pt (ss9pt ss-9 1))
    523. (if (<= (/ (distance (ss9pt ss-9 1) (ss9pt ss-9 3)) (distance (ss9pt ss-9 1) (ss9pt ss-9 7))) (/ 594. 420)) (setq scale (/ (distance (ss9pt ss-9 1) (ss9pt ss-9 7)) 420.)) (setq scale (/ (distance (ss9pt ss-9 1) (ss9pt ss-9 3)) 594.)));if
    524. (command "INSERT" tk_BLfile "non" pt scale "" 0 "move" (setq ss-9a (ssadd) ss-9a (ssadd (entlast) ss-9a)) "" "non" (ss9pt ss-9a 5) "non" (ss9pt ss-9 5))
    525. (entdel entname)
    526. );while
    527. (command "undo" "e")
    528. (princ)
    529. )
    530. (defun chatukuang_tuzhong (/ entname gx_list i pick_date pt5a pt5b scale ss_tk ss-9 tukuang_block);;插图框主函数-图中块
    531. (command "undo" "be")
    532. (setq tukuang_block (ssget ":s" (list '(0 . "insert"))) pt5a (ss9pt tukuang_block 5))
    533. (sssetfirst nil tukuang_block)
    534. (setq pick_date (entget (car (entsel "\n点选矩形框:"))) GX_list '() GX_list (list (assoc 0 pick_date) (assoc 8 pick_date) (assoc 70 pick_date)))
    535. (sssetfirst nil nil)
    536. (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list)))
    537. (prompt "\n选择要处理对象 / 全选<空格>:")
    538. (if (not (setq ss_tk (ssget GX_list))) (setq ss_tk (ssget "x" GX_list)))
    539. (setq i -1)
    540. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    541. (setq ss-9 (ssadd) ss-9 (ssadd entname ss-9) pt5b (ss9pt ss-9 5) scale (/ (distance (ss9pt ss-9 1) (ss9pt ss-9 9)) (distance (ss9pt tukuang_block 1) (ss9pt tukuang_block 9) )))
    542. (command "COPY" tukuang_block "" "non" pt5a "non" pt5b "SCALE" (entlast) "" "non" pt5b scale)
    543. (entdel entname)
    544. );while
    545. (command "undo" "e")
    546. (princ)
    547. )
    548. ;==========================================================================主处理函数
    549. ;;块图框处理主程序
    550. (defun tukuang_BK (H-S 9NB NB NB0 ang / all_lst all_lst_px entname i ss_tk suo_str tk+tz tk+tz+jdpt_lst tkname)
    551. (command "undo" "be")
    552. (if (= YMK_TMP 0)
    553. (progn (setq tkname (cdr (assoc 2 (entget (setq entname (car (entsel "\n点选图框块:")))))))
    554. (prompt "\n选择要处理对象 / 全选<空格>:")
    555. (if (not (setq ss_tk (ssget (list (cons 0 "INSERT") (cons 2 tkname))))) (setq ss_tk (ssget"x" (list (cons 0 "INSERT") (cons 2 tkname)))));;图框块选集(同名块)
    556. )
    557. (setq ss_tk (ssget (list (cons 0 "INSERT"))));图框块选集(异名块)
    558. );if
    559. (sssetfirst nil ss_tk)
    560. (setq i -1 tk+tz+jdpt_lst '() ALL_lst '())
    561. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    562. (setq tk+tz (ssget "c" (car (enbox entname)) (cadr (enbox entname))));单张图纸选集
    563. (setq tk+tz+jdpt_lst (list tk+tz (car (enbox entname)) entname));;单张图纸选集+左下角点+本图框名 的表
    564. (setq ALL_lst (cons tk+tz+jdpt_lst ALL_lst));;各自小表合并做大表
    565. );while
    566. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    567. (if (= RB_paixuFS 1) (cond ((= H-S 0) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (car (cadr a)) (car (cadr b)))))));;横排时按对象1点的x值小到大排序,得到新表
    568. ((= H-S 1) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (cadr (cadr a)) (cadr (cadr b)))))));;竖排时按对象1点的y值小到大排序,得到新表
    569. );cond
    570. (setq ALL_lst_px (reverse ALL_lst));选择顺序排列
    571. );if
    572. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    573. (if (= cp_xx 0) (DQ_BK ALL_lst_px H-S 9NB) (PL_BK ALL_lst_px H-S NB NB0 ang))
    574. (command "undo" "e")
    575. (princ)
    576. )
    577. ;--------------------------------------------------------------------------------
    578. ;;矩形框处理主程序
    579. (defun juxing_WL (H-S 9NB NB NB0 ang / all_lst all_lst_px entname gx_list i pick_date ss_tk suo_str tk+tz tk+tz+jdpt_lst)
    580. (command "undo" "be")
    581. (if (= BGX_TMP 0)
    582. (progn (setq pick_date (entget (car (entsel "\n点选矩形框:"))) GX_list '() GX_list (list (assoc 0 pick_date) (assoc 8 pick_date) (assoc 70 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list)))
    583. (prompt "\n选择要处理对象 / 全选<空格>:")
    584. (if (not (setq ss_tk (ssget GX_list))) (setq ss_tk (ssget "x" GX_list)));;矩形框选集(同层、同色)
    585. )
    586. (setq ss_tk (ssget (list (cons 0 "LWPOLYLINE") (cons 70 1))));矩形框选集(不共性)
    587. );if
    588. (sssetfirst nil ss_tk)
    589. (setq i -1 tk+tz+jdpt_lst '() ALL_lst '())
    590. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    591. (setq tk+tz (ssget "c" (car (enbox entname)) (cadr (enbox entname))));单张图纸选集
    592. (setq tk+tz+jdpt_lst (list tk+tz (car (enbox entname)) entname));;单张图纸选集+左下角点+本图框名 的表
    593. (setq ALL_lst (cons tk+tz+jdpt_lst ALL_lst));;各自小表合并做大表
    594. );while
    595. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    596. (if (= RB_paixuFS 1) (cond ((= H-S 0) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (car (cadr a)) (car (cadr b)))))));;横排时按对象1点的x值小到大排序,得到新表
    597. ((= H-S 1) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (cadr (cadr a)) (cadr (cadr b)))))));;竖排时按对象1点的y值小到大排序,得到新表
    598. );cond
    599. (setq ALL_lst_px (reverse ALL_lst));选择顺序排列
    600. );if
    601. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    602. (if (= cp_xx 0) (DQ_BK ALL_lst_px H-S 9NB) (PL_BK ALL_lst_px H-S NB NB0 ang))
    603. (command "undo" "e")
    604. (princ)
    605. )
    606. ;--------------------------------------------------------------------------------
    607. ;;手工选择处理主程序
    608. (defun select_SG (H-S 9NB NB NB0 ang / all_lst all_lst_px entname i p1 p2 rec ss_tk suo_str tk+tz tk+tz+jdpt_lst)
    609. (command "undo" "be")
    610. (setq ss_tk (ssadd))
    611. (prompt "\n每框选一次为一张图,右键结束选择:")
    612. (if (= CKB_TMP 0)
    613. (while (setq p1 (getpoint "\n点1:"))
    614. (setq p2 (getcorner p1 "\n点2:"))
    615. (command "RECTANG" "non" p1 "non" p2 "CHANGE" (setq rec (entlast)) "" "p" "c" 224 "")
    616. (setq ss_tk (ssadd rec ss_tk))
    617. );while
    618. (while (setq p1 (getpoint "\n点1:"))
    619. (setq p2 (getcorner p1 "\n点2:"))
    620. (setq ss_tk (ssadd (ckb_rec p1 p2) ss_tk))
    621. )
    622. );if
    623. (sssetfirst nil ss_tk)
    624. (setq i -1 tk+tz+jdpt_lst '() ALL_lst '())
    625. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    626. (setq tk+tz (ssget "c" (car (enbox entname)) (cadr (enbox entname))));单张图纸选集
    627. (setq tk+tz+jdpt_lst (list tk+tz (car (enbox entname)) entname));;单张图纸选集+左下角点+本图框名 的表
    628. (setq ALL_lst (cons tk+tz+jdpt_lst ALL_lst));;各自小表合并做大表
    629. );while
    630. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    631. (if (= RB_paixuFS 1) (cond ((= H-S 0) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (car (cadr a)) (car (cadr b)))))));;横排时按对象1点的x值小到大排序,得到新表
    632. ((= H-S 1) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (cadr (cadr a)) (cadr (cadr b)))))));;竖排时按对象1点的y值小到大排序,得到新表
    633. );cond
    634. (setq ALL_lst_px (reverse ALL_lst));选择顺序排列
    635. );if
    636. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    637. (if (= cp_xx 0) (DQ_BK ALL_lst_px H-S 9NB) (PL_BK ALL_lst_px H-S NB NB0 ang))
    638. (command "undo" "e")
    639. (princ)
    640. )
    641. ;--------------------------------------------------------------------------------
    642. ;;自动识别图框画矩形框-处理主程序
    643. (defun zidongshibie_WL (H-S 9NB NB NB0 ang / all_lst all_lst_px entname gx_list i pick_date ss_tk suo_str tk+tz tk+tz+jdpt_lst)
    644. (command "undo" "be")
    645. (setq ss_tk (maketukuangxian) ss_tk (quchongfu ss_tk));;自动识别图框画框
    646. (sssetfirst nil ss_tk)
    647. (setq i -1 tk+tz+jdpt_lst '() ALL_lst '())
    648. (while (setq entname (ssname ss_tk (setq i (1+ i))))
    649. (setq tk+tz (ssget "c" (car (enbox entname)) (cadr (enbox entname))));单张图纸选集
    650. (setq tk+tz+jdpt_lst (list tk+tz (car (enbox entname)) entname));;单张图纸选集+左下角点+本图框名 的表
    651. (setq ALL_lst (cons tk+tz+jdpt_lst ALL_lst));;各自小表合并做大表
    652. );while
    653. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    654. (if (= RB_paixuFS 1) (cond ((= H-S 0) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (car (cadr a)) (car (cadr b)))))));;横排时按对象1点的x值小到大排序,得到新表
    655. ((= H-S 1) (setq ALL_lst_px (vl-sort ALL_lst '(lambda (a b) (< (cadr (cadr a)) (cadr (cadr b)))))));;竖排时按对象1点的y值小到大排序,得到新表
    656. );cond
    657. (setq ALL_lst_px (reverse ALL_lst));选择顺序排列
    658. );if
    659. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    660. (if (= cp_xx 0) (DQ_BK ALL_lst_px H-S 9NB) (PL_BK ALL_lst_px H-S NB NB0 ang))
    661. (command "undo" "e")
    662. (if (= LB_TMP 5) (command "ERASE" ss_tk ""))
    663. (princ)
    664. )
    665. ;; 更新增加阵列代码0309 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
    666. (defun zhenlie_PX (lst / zlpx_list);从左到右从上到下排序
    667. (setq ZLPX_list (vl-sort (vl-sort lst '(lambda (s1 s2) (> (cadadr s1) (cadadr s2))))
    668. '(lambda (s3 s4) (if(equal (cadadr s3) (cadadr s4) 0.6)(< (caadr s3) (caadr s4))))
    669. )
    670. )
    671. ZLPX_list
    672. )
    673. (defun zuo>>you_pl (lst pt d flag / ent_pt entname entname1 i);从左到右横向单排子函数
    674. (command "undo" "be")
    675. (setq i -1)
    676. (repeat (length lst)
    677. (cond ((= flag 1) (setq entname (car (nth (setq i (1+ i)) lst)) ent_pt (cadr (nth i lst))))
    678. ((= flag 2) (setq entname (car (nth (setq i (1+ i)) lst)) ent_pt (cadr (nth i lst))))
    679. ((= flag 3) (setq entname (car (nth (setq i (1+ i)) lst)) ent_pt (cadr (nth i lst))) (setq entname1 (caddr (nth i lst))))
    680. );cond
    681. (command "move" entname "" "non" ent_pt "non" pt)
    682. (cond ((= flag 1) (setq pt (polar pt 0 d))) ;中>中
    683. ((= flag 2) (setq pt (polar pt 0 (+ d (- (car (cadr (enbox entname))) (car (car (enbox entname))))) ))) ;边>边(单体)
    684. ((= flag 3) (setq pt (polar pt 0 (+ d (- (car (cadr (enbox entname1))) (car (car (enbox entname1))))) ))) ;边>边(选集)
    685. );cond
    686. )
    687. (command "undo" "e")
    688. )
    689. (defun zhenlie_DT (ZL_w ZL_h ZL_nb JJ_x / all_lst all_lst_px entname entname+jdpt_lst enx gx_list i ii iii p0 pick_date ss ssall x_lst);;单体阵列主程序
    690. (command "undo" "be")
    691. ;==========================================================================
    692. ;单体选择方式处理
    693. (cond ((= LB_TMP 1)
    694. (if (= SX_TMP 1)
    695. (progn (setq pick_date (entget (car (entsel "\n点选源对象:"))) GX_list '())
    696. (if (= (cdr (assoc 0 pick_date)) "INSERT")
    697. (setq GX_list (list (assoc 0 pick_date) (assoc 2 pick_date)));图块类
    698. (progn (setq GX_list (list (assoc 0 pick_date) (assoc 8 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list))));其他类
    699. );;收集共性组码
    700. (prompt "\n选择要处理对象 / 全选<空格>:")
    701. (if (not (setq ssall (ssget GX_list))) (setq ssall (ssget "x" GX_list)));;共性选集(同层、同色)
    702. (sssetfirst nil ssall)
    703. (setq ss ssall)
    704. );progn
    705. (setq ssall (ssget) ss ssall)))
    706. );cond
    707. ;==========================================================================
    708. ;(setq ss (ssget))
    709. (setq i -1 entname+jdpt_lst '() ALL_lst '())
    710. (if (= t_tog_zhongdian 0)
    711. (progn (while (setq entname (ssname ss (setq i (1+ i))))
    712. (setq entname+jdpt_lst (list entname (car (enbox entname))));;单对象名+左下角点 的小表
    713. (setq ALL_lst (cons entname+jdpt_lst ALL_lst));;各自小表合并做大表
    714. );while
    715. (if (= RB_paixuFS 1)
    716. (setq ALL_lst_px (zhenlie_PX ALL_lst));;自动排序后的总表
    717. (setq ALL_lst_px (reverse ALL_lst));选择顺序排序
    718. );if
    719. (setq p0 (getpoint "\n选择阵列起点<退出>: "))
    720. (setq ii -1 iii 0)
    721. (repeat (fix (+ (/ (length ALL_lst_px) (float ZL_nb)) 0.9))
    722. (setq X_lst '())
    723. (repeat ZL_nb
    724. (if (setq enx (nth (setq ii (1+ ii)) ALL_lst_px))
    725. (setq X_lst (cons enx X_lst))
    726. )
    727. );repeat1
    728. (setq X_lst (reverse X_lst))
    729. (cond ((= JJ_x 1) (zuo>>you_pl X_lst p0 ZL_w 1) (setq p0 (polar p0 (* 1.5 pi) ZL_h)));;处理一个小横排再计算下一个小横排基点--中>中 的距离
    730. ((= JJ_x 2) (zuo>>you_pl X_lst p0 ZL_w 2) (if (nth (setq iii (+ iii ZL_nb)) ALL_lst_px) (setq p0 (polar p0 (* 1.5 pi) (+ ZL_h (- (cadr (cadr (enbox (car (nth iii ALL_lst_px))))) (cadr (car (enbox (car (nth iii ALL_lst_px)))))))))));边>边 的距离
    731. );cond
    732. );repeat2
    733. );progn-左下角基点
    734. (progn (while (setq entname (ssname ss (setq i (1+ i))))
    735. (setq ss-9 (ssadd) ss-9 (ssadd entname ss-9))
    736. (setq entname+jdpt_lst (list entname (ss9pt ss-9 5)));;单对象名+中心点 的小表
    737. (setq ALL_lst (cons entname+jdpt_lst ALL_lst));;各自小表合并做大表
    738. );while
    739. (if (= RB_paixuFS 1)
    740. (setq ALL_lst_px (zhenlie_PX ALL_lst));;自动排序后的总表
    741. (setq ALL_lst_px (reverse ALL_lst));选择顺序排序
    742. );if
    743. (setq p0 (getpoint "\n选择阵列起点<退出>: "))
    744. (setq ii -1 iii 0)
    745. (repeat (fix (+ (/ (length ALL_lst_px) (float ZL_nb)) 0.9))
    746. (setq X_lst '() H0 (/ (- (cadr (cadr (enbox (car (nth iii ALL_lst_px))))) (cadr (car (enbox (car (nth iii ALL_lst_px)))))) 2))
    747. (repeat ZL_nb
    748. (if (setq enx (nth (setq ii (1+ ii)) ALL_lst_px))
    749. (setq X_lst (cons enx X_lst))
    750. )
    751. );repeat1
    752. (setq X_lst (reverse X_lst))
    753. (cond ((= JJ_x 1) (zuo>>you_pl X_lst p0 ZL_w 1) (setq p0 (polar p0 (* 1.5 pi) ZL_h)));;处理一个小横排再计算下一个小横排基点--中>中 的距离
    754. ((= JJ_x 2) (zuo>>you_pl X_lst p0 ZL_w 2) (if (nth (setq iii (+ iii ZL_nb)) ALL_lst_px) (setq p0 (polar p0 (* 1.5 pi) (+ (+ ZL_h (/ (- (cadr (cadr (enbox (car (nth iii ALL_lst_px))))) (cadr (car (enbox (car (nth iii ALL_lst_px)))))) 2) ) H0)))));边>边 的距离
    755. );cond
    756. );repeat2
    757. );progn-中心基点
    758. )
    759. (command "undo" "e")
    760. (princ)
    761. )
    762. (defun zhenlie_SS (ZL_w ZL_h ZL_nb JJ_x / all_lst all_lst_px entname enx gx_list i ii iii p0 p1 p2 pick_date rec ss ss_tk tk+tz tk+tz+jdpt_lst tkname x_lst);;选集阵列主程序
    763. (command "undo" "be")
    764. ;==========================================================================
    765. ;分类别选择处理
    766. (cond ((= LB_TMP 2)
    767. (if (= YMK_TMP 0)
    768. (progn (setq tkname (cdr (assoc 2 (entget (setq entname (car (entsel "\n点选图框块:")))))))
    769. (prompt "\n选择要处理对象 / 全选<空格>:")
    770. (if (not (setq ss_tk (ssget (list (cons 0 "INSERT") (cons 2 tkname))))) (setq ss_tk (ssget"x" (list (cons 0 "INSERT") (cons 2 tkname)))));;图框块选集(同名块)
    771. )
    772. (setq ss_tk (ssget (list (cons 0 "INSERT"))));图框块选集(异名块)
    773. );if
    774. (setq ss ss_tk)
    775. (sssetfirst nil ss)
    776. );图块类别
    777. ((= LB_TMP 3)
    778. (if (= BGX_TMP 0)
    779. (progn (setq pick_date (entget (car (entsel "\n点选矩形框:"))) GX_list '() GX_list (list (assoc 0 pick_date) (assoc 8 pick_date) (assoc 70 pick_date))) (if (assoc 62 pick_date) (setq GX_list (cons (assoc 62 pick_date) GX_list)))
    780. (prompt "\n选择要处理对象 / 全选<空格>:")
    781. (if (not (setq ss_tk (ssget GX_list))) (setq ss_tk (ssget "x" GX_list)));;矩形框选集(同层、同色)
    782. )
    783. (setq ss_tk (ssget (list (cons 0 "LWPOLYLINE") (cons 70 1))));矩形框选集(不共性)
    784. );if
    785. (setq ss ss_tk)
    786. (sssetfirst nil ss)
    787. );矩形框类别
    788. ((= LB_TMP 4)
    789. (setq ss_tk (ssadd))
    790. (prompt "\n每框选一次为一张图,右键结束选择:")
    791. (if (= CKB_TMP 0)
    792. (while (setq p1 (getpoint "\n点1:"))
    793. (setq p2 (getcorner p1 "\n点2:"))
    794. (command "RECTANG" "non" p1 "non" p2 "CHANGE" (setq rec (entlast)) "" "p" "c" 224 "")
    795. (setq ss_tk (ssadd rec ss_tk))
    796. );while
    797. (while (setq p1 (getpoint "\n点1:"))
    798. (setq p2 (getcorner p1 "\n点2:"))
    799. (setq ss_tk (ssadd (ckb_rec p1 p2) ss_tk))
    800. )
    801. );if
    802. (setq ss ss_tk)
    803. (sssetfirst nil ss)
    804. );手工框选类别
    805. ((= LB_TMP 5)
    806. ;(maketukuangxian)
    807. (setq ss (maketukuangxian) ss (quchongfu ss))
    808. (sssetfirst nil ss)
    809. );自动识别类别
    810. );cond
    811. ;==========================================================================
    812. ;(setq ss (ssget))
    813. (setq i -1 tk+tz+jdpt_lst '() ALL_lst '())
    814. (while (setq entname (ssname ss (setq i (1+ i))))
    815. (setq tk+tz (ssget "c" (car (enbox entname)) (cadr (enbox entname))));图框,图纸内容选集
    816. (setq tk+tz+jdpt_lst (list tk+tz (car (enbox entname)) entname));;图框,图纸内容选集+左下角点+图框图元名 的单张小表
    817. (setq ALL_lst (cons tk+tz+jdpt_lst ALL_lst));;各自小表合并做大表
    818. );while
    819. (if (= RB_paixuFS 1)
    820. (setq ALL_lst_px (zhenlie_PX ALL_lst));;自动排序后的总表
    821. (setq ALL_lst_px (reverse ALL_lst));选择顺序排序
    822. );if
    823. (setq p0 (getpoint "\n选择阵列起点<退出>: "))
    824. (command "-layer" "u" (setq suo_str (layer_suo_str)) "");开锁
    825. (setq ii -1 iii 0)
    826. (repeat (fix (+ (/ (length ALL_lst_px) (float ZL_nb)) 0.999))
    827. (setq X_lst '())
    828. (repeat ZL_nb
    829. (if (setq enx (nth (setq ii (1+ ii)) ALL_lst_px))
    830. (setq X_lst (cons enx X_lst))
    831. )
    832. );repeat1
    833. (setq X_lst (reverse X_lst))
    834. (cond ((= JJ_x 1) (zuo>>you_pl X_lst p0 ZL_w 1) (setq p0 (polar p0 (* 1.5 pi) ZL_h)));;处理一个小横排再计算下一个小横排基点--中>中 的距离
    835. ((= JJ_x 3) (zuo>>you_pl X_lst p0 ZL_w 3) (if (nth (setq iii (+ iii ZL_nb)) ALL_lst_px) (setq p0 (polar p0 (* 1.5 pi) (+ ZL_h (- (cadr (cadr (enbox (caddr (nth iii ALL_lst_px))))) (cadr (car (enbox (caddr (nth iii ALL_lst_px)))))))))));边>边 的距离
    836. );cond
    837. );repeat2
    838. (command "undo" "e")
    839. (command "-layer" "lo" suo_str "")
    840. (if (= LB_TMP 5) (command "ERASE" ss ""))
    841. (princ)
    842. )
    843. (defun zhenlie_FUZHI (ZL_nby ZL_nbx ZL_h ZL_w / lastent pt0 pt1 ss);;复制阵列主程序
    844. (command "undo" "be")
    845. (setq ss (ssget) pt0 (ss9pt ss 5) pt1 (getpoint "\n选取阵列起点/原位<空格>:"))
    846. (if (= RB_zhenliejianju 2) (setq ZL_h (if (>= ZL_h 0) (+ ZL_h (distance (ss9pt ss 1) (ss9pt ss 7))) (- ZL_h (distance (ss9pt ss 1) (ss9pt ss 7)))) ZL_w (if (>= ZL_w 0) (+ ZL_w (distance (ss9pt ss 1) (ss9pt ss 3))) (- ZL_w (distance (ss9pt ss 1) (ss9pt ss 3))))))
    847. (if pt1 (command "move" ss "" "non" pt0 "non" pt1))
    848. (command "ARRAY" ss "" "r" ZL_nby ZL_nbx ZL_h ZL_w)
    849. (command "undo" "e")
    850. (princ)
    851. )
    852. (defun maketukuangxian (/ bound e entx gx_list i lastent lst pick_date rects ss ss_last);;自动识别图框画矩形框子函数
    853. (if (= zdSX_TMP 0) (progn (setq pick_date (entget (car (entsel "\n点选图框最外边框:"))) GX_list '() GX_list (list (assoc 0 pick_date) (assoc 8 pick_date) ))
    854. (setq ss (ssget GX_list)));progn
    855. (setq ss (ssget '((0 . "LWPOLYLINE,INSERT"))))
    856. );if
    857. (repeat (setq i (sslength ss))
    858. (setq e (ssname ss (setq i (1- i))))
    859. (setq lst (cons (ebox e) lst)) ;_提取边界对角点,不生产矩形
    860. )
    861. (setq lst (vl-sort lst '(lambda (x1 x2) (> (area x1) (area x2))))) ;_按面积大小排序
    862. (while lst
    863. (setq rects (cons (car lst) rects)) ;_矩形对角点集
    864. (setq bound (pt4 (car lst))) ;_矩形边界
    865. (setq lst (vl-remove-if '(lambda (x) (and (PtInPoly (car x) bound) (PtInPoly (cadr x) bound))) (cdr lst))) ;_移除大矩形边界内的小矩形
    866. )
    867. (setq lastent (entlast) ss_last (ssadd))
    868. (mapcar '(lambda (x) (command "rectang" (car x) (cadr x))) rects) ;_批量生成矩形
    869. (while (setq entx (entnext lastent))
    870. (setq ss_last (ssadd entx ss_last) lastent entx)
    871. )
    872. (command "CHANGE" ss_last "" "p" "c" 224 "")
    873. ss_last
    874. )
    875. (defun ebox (e / pa pb)
    876. (and (= 'ename (type e)) (setq e (vlax-ename->vla-object e)))
    877. (vlax-invoke-method e 'GetBoundingBox 'pa 'pb)
    878. (setq pa (trans (vlax-safearray->list pa) 0 1)
    879. pb (trans (vlax-safearray->list pb) 0 1)
    880. )
    881. (list pa pb)
    882. )
    883. (defun area (pts) (apply '* (cdr (reverse (apply 'mapcar (cons '- pts)))))) ;_求面积
    884. (defun pt4 (pt2)
    885. (list (car pt2) (list (caadr pt2) (cadar pt2)) (cadr pt2) (list (caar pt2) (cadadr pt2)))
    886. ) ;_对角点生成四角点
    887. (defun PtInPoly (pt pts)
    888. (equal pi
    889. (abs
    890. (apply '+ (mapcar '(lambda (x y) (rem (- (angle pt x) (angle pt y)) pi)) (cons (last pts) pts) pts))
    891. )
    892. 1e-6
    893. )
    894. ) ;_点是否在凸多边形内(角度法)
    895. (defun quchongfu (ss / ent ent1 i ii pt pt1)
    896. (setq i -1 ss1 (ssadd))
    897. (while (setq ent (ssname ss (setq i (1+ i))))
    898. (setq DJ_lst (ebox ent))
    899. (setq ii i)
    900. (while (setq ent1 (ssname ss (setq ii (1+ ii))))
    901. (setq DJ_lst1 (ebox ent1))
    902. (if (equal DJ_lst DJ_lst1 0.01) (setq ss1 (ssadd ent1 ss1)))
    903. );while
    904. );while
    905. (command "ERASE" ss1 "")
    906. ss
    907. )
    908. ;;;=================================================================*
    909. ;;;生成日期:20200318.175218
    910. ;;;本文件由程序自动生成。 *
    911. ;;;程序生成完成后需将主代码“*.lsp”文件中的语句中的 *
    912. ;;; (load_dialog 双引号*.Dcl双引号)改为(load_dialog (make-dcl)) 方可用 *
    913. ;;;修改后的代码可编辑到主LISP程序后方运行 *
    914. ;;;=================================================================*
    915. ;;;为能让多个有本程序生成的DCL.lsp可以同时使用,生成程序后应将对话框名 (make-dcl)改名 *
    916. ;;;供需修改两处地方,一处为加载的地方(load_dialog (???-make-dcl)) ,另一处为 *
    917. ;;;对话框主程序名(defun ???-make-dcl ,一定要一致 *
    918. ;;;示例:(make-dcl) *
    919. (defun make-dcl-pl (/ lst_str str file f)
    920. (setq lst_str '(
    921. "/*★★★★★ListDCL @ fsxm.mjtd.com★★★★★*/"
    922. ""
    923. "rect01:dialog {"
    924. " label = \"【对齐/排列/图框排版】ST0318\" ;"
    925. " :spacer {}"
    926. " :row {"
    927. " :boxed_column {"
    928. " key = \"k_paixuFS\" ;"
    929. " label = \"排序方式\" ;"
    930. " :radio_button {"
    931. " key = \"k_rb_zidong\" ;"
    932. " label = \"自动\" ;"
    933. " }"
    934. " :radio_button {"
    935. " key = \"k_rb_xuanxu\" ;"
    936. " label = \"选序\" ;"
    937. " }"
    938. " }"
    939. " :boxed_column {"
    940. " label = \"选取方式\" ;"
    941. " :row {"
    942. " key = \"k_no1\" ;"
    943. " :spacer {"
    944. " width = 1.5 ;"
    945. " }"
    946. " :radio_button {"
    947. " key = \"xlb1\" ;"
    948. " label = \"单体\" ;"
    949. " }"
    950. " :spacer {}"
    951. " :radio_button {"
    952. " key = \"xlb2\" ;"
    953. " label = \"块图框\" ;"
    954. " }"
    955. " :spacer {}"
    956. " :radio_button {"
    957. " key = \"xlb3\" ;"
    958. " label = \"矩形框\" ;"
    959. " }"
    960. " :spacer {}"
    961. " :radio_button {"
    962. " key = \"xlb4\" ;"
    963. " label = \"手工选\" ;"
    964. " }"
    965. " :spacer {}"
    966. " :radio_button {"
    967. " key = \"xlb5\" ;"
    968. " label = \"自动\" ;"
    969. " }"
    970. " }"
    971. " :row {"
    972. " key = \"k_no2\" ;"
    973. " :spacer {"
    974. " width = 1.5 ;"
    975. " }"
    976. " :toggle {"
    977. " key = \"toggle_sx\" ;"
    978. " label = \"速选\" ;"
    979. " }"
    980. " :spacer {}"
    981. " :toggle {"
    982. " key = \"toggle_ymk\" ;"
    983. " label = \"异名块\" ;"
    984. " }"
    985. " :spacer {}"
    986. " :toggle {"
    987. " key = \"toggle_bgx\" ;"
    988. " label = \"非共性\" ;"
    989. " }"
    990. " :spacer {}"
    991. " :toggle {"
    992. " key = \"toggle_ckb\" ;"
    993. " label = \"边框比\" ;"
    994. " }"
    995. " :spacer {}"
    996. " :toggle {"
    997. " key = \"toggle_sx2\" ;"
    998. " label = \"速选\" ;"
    999. " }"
    1000. " }"
    1001. " }"
    1002. " }"
    1003. " :image {"
    1004. " color = 1 ;"
    1005. " height = 0.12 ;"
    1006. " }"
    1007. " :spacer {}"
    1008. " :row {"
    1009. " :column {"
    1010. " :row {"
    1011. " :row {"
    1012. " key = \"row_sxdq\" ;"
    1013. " label = \"双向对齐\" ;"
    1014. " :column {"
    1015. " :button {"
    1016. " key = \"dtpl7\" ;"
    1017. " label = \"╔\" ;"
    1018. " }"
    1019. " :button {"
    1020. " key = \"dtpl8\" ;"
    1021. " label = \"╠\" ;"
    1022. " }"
    1023. " :button {"
    1024. " key = \"dtpl9\" ;"
    1025. " label = \"╚\" ;"
    1026. " }"
    1027. " }"
    1028. " :column {"
    1029. " :button {"
    1030. " key = \"dtpl10\" ;"
    1031. " label = \"╦\" ;"
    1032. " }"
    1033. " :button {"
    1034. " key = \"dtpl11\" ;"
    1035. " label = \"╬\" ;"
    1036. " }"
    1037. " :button {"
    1038. " key = \"dtpl12\" ;"
    1039. " label = \"╩\" ;"
    1040. " }"
    1041. " }"
    1042. " :column {"
    1043. " :button {"
    1044. " key = \"dtpl13\" ;"
    1045. " label = \"╗\" ;"
    1046. " }"
    1047. " :button {"
    1048. " key = \"dtpl14\" ;"
    1049. " label = \"╣\" ;"
    1050. " }"
    1051. " :button {"
    1052. " key = \"dtpl15\" ;"
    1053. " label = \"╝\" ;"
    1054. " }"
    1055. " }"
    1056. " }"
    1057. " :column {"
    1058. " key = \"k_shuipingduiqi\" ;"
    1059. " label = \"水平对齐\" ;"
    1060. " :button {"
    1061. " key = \"dtpl1\" ;"
    1062. " label = \"┳\" ;"
    1063. " }"
    1064. " :button {"
    1065. " key = \"dtpl2\" ;"
    1066. " label = \"━\" ;"
    1067. " }"
    1068. " :button {"
    1069. " key = \"dtpl3\" ;"
    1070. " label = \"┻\" ;"
    1071. " }"
    1072. " }"
    1073. " :column {"
    1074. " key = \"k_chuizhiduiqi\" ;"
    1075. " label = \"垂直对齐\" ;"
    1076. " :button {"
    1077. " key = \"dtpl4\" ;"
    1078. " label = \"┣\" ;"
    1079. " }"
    1080. " :button {"
    1081. " key = \"dtpl5\" ;"
    1082. " label = \"┃\" ;"
    1083. " }"
    1084. " :button {"
    1085. " key = \"dtpl6\" ;"
    1086. " label = \"┫\" ;"
    1087. " }"
    1088. " }"
    1089. " }"
    1090. " :spacer {"
    1091. " height = 0.5 ;"
    1092. " }"
    1093. " :row {"
    1094. " height = 1 ;"
    1095. " key = \"k_dengju,dianxuan\" ;"
    1096. " :column {"
    1097. " :toggle {"
    1098. " alignment = centered ;"
    1099. " key = \"cp_x\" ;"
    1100. " label = \"等距重排\" ;"
    1101. " }"
    1102. " }"
    1103. " :column {"
    1104. " :edit_box {"
    1105. " alignment = top ;"
    1106. " key = \"cp_d\" ;"
    1107. " label = \"间距:\" ;"
    1108. " }"
    1109. " }"
    1110. " :column {"
    1111. " :button {"
    1112. " alignment = top ;"
    1113. " key = \"dxjj\" ;"
    1114. " label = \"点选定距\" ;"
    1115. " }"
    1116. " }"
    1117. " :spacer {}"
    1118. " }"
    1119. " }"
    1120. " :column {"
    1121. " :row {"
    1122. " label = \"阵列\" ;"
    1123. " :column {"
    1124. " :row {"
    1125. " :text {"
    1126. " label = \"方式:\" ;"
    1127. " }"
    1128. " :radio_button {"
    1129. " key = \"k_rb_chongpaizhenlie\" ;"
    1130. " label = \"重排阵列\" ;"
    1131. " }"
    1132. " :radio_button {"
    1133. " key = \"k_rb_fuzhizhenlie\" ;"
    1134. " label = \"复制阵列\" ;"
    1135. " }"
    1136. " }"
    1137. " :row {"
    1138. " :edit_box {"
    1139. " key = \"k_hengju\" ;"
    1140. " label = \"横距:\" ;"
    1141. " }"
    1142. " :edit_box {"
    1143. " key = \"k_hengshu\" ;"
    1144. " label = \"个数:\" ;"
    1145. " }"
    1146. " }"
    1147. " :row {"
    1148. " :edit_box {"
    1149. " key = \"k_shuju\" ;"
    1150. " label = \"竖距:\" ;"
    1151. " }"
    1152. " :edit_box {"
    1153. " key = \"k_shushu\" ;"
    1154. " label = \"个数:\" ;"
    1155. " }"
    1156. " }"
    1157. " :spacer {}"
    1158. " :row {"
    1159. " :text {"
    1160. " label = \"算法:\" ;"
    1161. " }"
    1162. " :radio_button {"
    1163. " key = \"k_rb_zhongzhong\" ;"
    1164. " label = \"点<->点\" ;"
    1165. " }"
    1166. " :spacer {}"
    1167. " :radio_button {"
    1168. " key = \"k_rb_bianbian\" ;"
    1169. " label = \"边<->边\" ;"
    1170. " }"
    1171. " :spacer {}"
    1172. " }"
    1173. " :row {"
    1174. " :text {"
    1175. " label = \"基点:\" ;"
    1176. " }"
    1177. " :toggle {"
    1178. " key = \"k_tog_zhongdian\" ;"
    1179. " label = \"中点\" ;"
    1180. " }"
    1181. " :button {"
    1182. " key = \"k_bt_dianxuan\" ;"
    1183. " label = \"选距\" ;"
    1184. " }"
    1185. " :button {"
    1186. " key = \"k_zlqueding\" ;"
    1187. " label = \"确定\" ;"
    1188. " }"
    1189. " }"
    1190. " }"
    1191. " }"
    1192. " }"
    1193. " }"
    1194. " :spacer {}"
    1195. " :column {"
    1196. " label = \"插图框\" ;"
    1197. " :row {"
    1198. " :spacer {}"
    1199. " :radio_button {"
    1200. " key = \"k_moren\" ;"
    1201. " label = \"默认图块\" ;"
    1202. " }"
    1203. " :radio_button {"
    1204. " key = \"k_tuzhong\" ;"
    1205. " label = \"图中选块\" ;"
    1206. " }"
    1207. " :radio_button {"
    1208. " key = \"k_chawenjian\" ;"
    1209. " label = \"插块文件 >>>\" ;"
    1210. " }"
    1211. " :button {"
    1212. " key = \"k_liulan\" ;"
    1213. " label = \"浏览\" ;"
    1214. " }"
    1215. " :button {"
    1216. " alignment = right ;"
    1217. " key = \"k_ctk\" ;"
    1218. " label = \"插图框\" ;"
    1219. " }"
    1220. " }"
    1221. " :text {"
    1222. " alignment = left ;"
    1223. " key = \"k_lujing\" ;"
    1224. " }"
    1225. " :spacer {}"
    1226. " }"
    1227. " :row {"
    1228. " :text {"
    1229. " value = \"注:1,图框不能交叉. 2, 插入的图框文件尺寸:594x420mm.\" ;"
    1230. " }"
    1231. " cancel_button;"
    1232. " }"
    1233. "}"
    1234. )
    1235. )
    1236. (setq file (vl-filename-mktemp "DclTemp.dcl"))
    1237. (setq f (open file "w"))
    1238. (foreach str lst_str
    1239. (princ "\n" f)
    1240. (princ str f)
    1241. )
    1242. (close f)
    1243. ;;返回
    1244. file
    1245. )
    1246. ;;;=================================================================*
    1247. (princ)