找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 844|回复: 3

[LISP程序]:回路替换-名称:C:HLTH

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-2-12 22:33:00 | 显示全部楼层 |阅读模式

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

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

×
  1. ;;=================================主程序开始=================================
  2. ;;名称:C:HLTH
  3. ;;功能:回路替换
  4. ;;输入:无
  5. ;;返回:无
  6. (defun C:HLTH(/ tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo
  7.                 h_sh1 h_XZHL h_WZYZ h_HLHZ h_LXDD h_WZPD h_LXXZ h_mxwz h_inwi
  8.                 h_comp C_zoom C_ssgl C_xyzb C_ldel C_movt C_movk C_hlin C_slin
  9.                 s_px)
  10.   (setq olderr *error*)
  11.   
  12. ;;=================================子函数开始=================================
  13. ;;名称:*error*(错误处理函数)
  14. ;;功能:当程序发生错误或用户中断时,平静地退出,并还原状态。
  15. ;;输入:无
  16. ;;返回:无
  17. (defun *error* (msg / each)
  18.   (if (= fan 1)(command "_.undo" "_end"))
  19.   (if (= fan 1)(command "_.undo" ""))
  20.   (if (= ucmark 0) (command "_.ucs" "_prev"))
  21.   (xsetin "Hlklib" "Hlkpara" o_para 1)
  22.   (xsetin "Hlklib" "RetHlkMes" o_mes 1)
  23.   (xsetin "Hlklib" "Hlkjj" o_jj 1)
  24.   (if(= lxfs 1)
  25.     (progn(setq i 0)(repeat(sslength slx)(redraw(ssname slx i)4)(setq i(1+ i))))
  26.   )
  27.   (setq dqwn (XScjx))
  28.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  29.   (foreach each
  30.       '(tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo h_sh1 h_xzhl
  31.         h_wzyz h_hlhz h_lxdd h_wzpd h_lxxz h_mxwz h_inwi h_comp C_zoom C_ssgl C_xyzb
  32.         C_ldel C_movt C_movk C_hlin C_slin point1 point2 i ename point3 point4 ss
  33.         elist point5 point6 biao ylist plist l xlist n nylist s_px yy list1 list2 a b
  34.         emx p1 p2 p3 pd1 pd2 pc mxwzt wzt npd1 npd2 es sins first fxhsf hszf pmxd1
  35.         pmxd2 fxhs hsz wzyz ssfah fah pjd fx sshl hlsm kd hll smx mxt len1 ii iii mxmin
  36.         mxmax i4 pcl e pcxl pcyl pcc xzt len2 pds hljj lxl pde hs smxal ls dqw1 wzpdt
  37.         dist data1 data2 sm2 zdist pdmx2 mxkd lll1 ph1 ph2 ttt1 hlxzl lll2 ttt2 ph3 ph4
  38.         slx pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde jj jjn hldata smov zxj
  39.         ysj zxjn ysjn mylist ess fan name laye yanse hlxzl1 pjd1 fx1 kd1 sshl1 hlsm1 pjd2
  40.         fx2 kd2 hlsm2 hlxzl2 pjdn1 pjd1n pjd2n pme smov1 smov2 pmds1 pmds1n pmds2 pmds2n
  41.         pmde1 pmde2 jj1 jj2 sshl2 ss1 ss2 ss3 ylist1 ylist2 plist1 plist2 xlist1 xlist2
  42.         ess1 ess2 point shu xzb)
  43.       (set each nil)
  44.     )
  45.     (setq each nil)
  46.     (setq *error* olderr olderr nil)
  47.     (_resdwg)
  48.     (princ)
  49. )

  50. ;;=================================子函数开始=================================
  51. ;;名称:C_zoom
  52. ;;功能:判断是否zoom
  53. ;;输入:mylist-订货图的角表 zxj-视区左下角 ysj-视区右上角
  54. ;;返回:无
  55. (defun C_zoom(mylist zxjn ysjn / point1 point2)
  56.   (setq point1(car mylist))
  57.   (setq point2(last mylist))
  58.   (if(or(>(car zxjn)(car point2))(<(car ysjn)(car point1))
  59.         (>(cadr zxjn)(cadr point1))(<(cadr ysjn)(cadr point2))
  60.      )
  61.     (command "_.ZOOM" "_w" point1 point2)
  62.   )
  63. )

  64. ;;=================================子函数开始=================================
  65. ;;名称:C_ssgl
  66. ;;功能:过滤选择集
  67. ;;输入:ss1-选择集1 ss2-选择集2
  68. ;;返回:ss1
  69. (defun C_ssgl(ss1 ss2 / i ename)
  70.   (setq i 0)
  71.   (repeat(sslength ss2)
  72.     (setq ename (ssname ss2 i))
  73.     (ssdel ename ss1)
  74.     (setq i (+ i 1))
  75.   )
  76.   ss1
  77. )

  78. ;;=================================子函数开始=================================
  79. ;;名称:C_xyzb
  80. ;;功能:得到所选回路所有横线的Y坐标点集
  81. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长
  82. ;;返回:ylist-所选回路所有横线的Y坐标表
  83. (defun C_xyzb(mylist pjd kd / point1 point2 point3 point4 i ss ename elist
  84.                                    point5 point6 biao ylist)
  85.   (setq ylist '())
  86.   (setq point1(car mylist))
  87.   (setq point2(last mylist))
  88.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  89.   (setq point4(list(+(car point3)kd)(cadr point1)(last point1)))
  90.   (setq ss (ssget "W" point3 point4 '((0 . "LINE")(8 . "GDXT")(62 . 3))))
  91.   (setq i 0)
  92.   (repeat (sslength ss)
  93.     (setq ename (ssname ss i))
  94.     (setq elist (entget ename))
  95.     (setq point5(cdr(assoc 10 elist)))
  96.     (setq point6(cdr(assoc 11 elist)))
  97.     (if (equal(cadr point5)(cadr point6)0.1)
  98.       (progn
  99.         (setq biao(member (cadr point5) ylist))
  100.         (if (not biao)
  101.           (setq ylist(cons (cadr point5) ylist))
  102.         )
  103.       )
  104.     )
  105.     (setq i (+ i 1))
  106.   )
  107.   ylist
  108. )

  109. ;;=================================子函数开始=================================
  110. ;;名称:C_ldel
  111. ;;功能:得到所选回路列的左上角和右下角
  112. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长 sshl-回路选择集
  113. ;;返回:plist-点表(所选回路列的右上角、订货图的右下角和所选回路列的选择集)
  114. (defun C_ldel(mylist pjd kd sshl / point1 point2 point3 point4 point5 ss plist)
  115.   (setq point1(car mylist))
  116.   (setq point2(last mylist))
  117.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  118.   (setq point4(list(+(car pjd)(/ kd 2))(cadr point1)(last point2)))
  119.   (setq ss(ssget "w" point3 point4))
  120.   (setq ss(C_ssgl ss sshl))
  121.   (setq point5(list(car point4)(cadr point2)(last point2)))
  122.   (setq plist (list point5 point1 ss))
  123. )

  124. ;;=================================子函数开始=================================
  125. ;;名称:C_movt
  126. ;;功能:copy回路并移动表格(从当前图中copy或move)
  127. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  128. ;;      sshln-替换回路 pjdf-替换回路的基点 pjd-被替回路的基点 smov-回路选择集
  129. ;;      a-为0时拷贝,为1时移动,为2时插入
  130. ;;返回:xlist-新回路列的x坐标
  131. (defun C_movt(plist kd kdn sshln pjdf pjdn smov a / point1 point2 l point3 point4 xlist ss)
  132.   (setq point1(car plist))
  133.   (setq point2(cadr plist))
  134.   (if(or(= a 0)(= a 1))
  135.     (progn
  136.       (setq l(- kd kdn))
  137.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  138.       (setq ss(ssget "w" point1 point2))
  139.       (if (= a 0)
  140.         (command "_.copy" sshln "" pjdf pjdn)
  141.         (command "_.move" sshln "" pjdf pjdn)
  142.       )
  143.       (if smov
  144.         (progn
  145.           (command "_.move" smov "" point1 point3)
  146.           (setq ss(C_ssgl ss smov))
  147.         )
  148.       )
  149.       (command "_.move" ss "" point1 point3)
  150.       (setq xlist(list(-(car point1)kd)(car point3)))
  151.     )
  152.     (progn
  153.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  154.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  155.       (setq ss (ssget "w" point3 point2))
  156.       (command "_.copy" sshln "" pjdf pjdn)
  157.       (if smov
  158.         (progn
  159.           (command "_.move" smov "" point3 point4)
  160.           (setq ss(C_ssgl ss smov))
  161.         )
  162.       )
  163.       (command "_.move" ss "" point3 point4)
  164.       (setq xlist(list(car point3)(car point4)))
  165.     )
  166.   )
  167.   xlist
  168. )

  169. ;;=================================子函数开始=================================
  170. ;;名称:C_movk
  171. ;;功能:copy回路并移动表格(从图库中取)
  172. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  173. ;;      pjdn-替换回路 fx-回路方向 dist、data1、data2、sm2-调回路库的参数 smov-回路选择集
  174. ;;      a-为时替换回路,为2时插入回路
  175. ;;返回:xlist-新回路列的两个x坐标
  176. (defun C_movk(plist kd kdn pjdn fx dist data1 data2 sm2 smov a / point1 point2 l point3
  177.               point4 xlist ss)
  178.   (setq point1(car plist))
  179.   (setq point2(cadr plist))
  180.   (if (= a 1)
  181.     (progn
  182.       (setq l(- kd kdn))
  183.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  184.       (setq ss(ssget "w" point1 point2))
  185.       (h_hlhz pjdn fx dist data1 data2 sm2)
  186.       (if smov
  187.         (progn
  188.           (command "_.move" smov "" point1 point3)
  189.           (setq ss(C_ssgl ss smov))
  190.         )
  191.       )
  192.       (command "_.move" ss "" point1 point3)
  193.       (setq xlist(list(-(car point1)kd)(car point3)))
  194.     )
  195.     (progn
  196.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  197.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  198.       (setq ss (ssget "w" point3 point2))
  199.       (h_hlhz pjdn fx dist data1 data2 sm2)
  200.       (if smov
  201.         (progn
  202.           (command "_.move" smov "" point3 point4)
  203.           (setq ss(C_ssgl ss smov))
  204.         )
  205.       )
  206.       (command "_.move" ss "" point3 point4)
  207.       (setq xlist(list(car point3)(car point4)))
  208.     )
  209.   )
  210.   xlist
  211. )

  212. ;;=================================子函数开始=================================
  213. ;;名称:C_hlin
  214. ;;功能:画横线
  215. ;;输入:xlist-新订货图的x坐标表 ylist-所选订货图所有横线的Y坐标表 hlsm-回路数目
  216. ;;返回:无
  217. (defun C_hlin(xlist ylist hlsm / point1 point2 i l n)
  218.   (setq i 0)
  219.   (setq l(/(abs(-(car xlist)(last xlist)))hlsm))
  220.   (repeat (length ylist)
  221.     (setq n 0)
  222.     (repeat hlsm
  223.       (setq point1(list(+(car xlist)(* l n))(nth i ylist)0.0))
  224.       (setq point2(list(+(car xlist)(* l (+ n 1)))(nth i ylist)0.0))
  225.       (command "_.line" point1 point2 "")
  226.       (setq n (+ n 1))
  227.     )
  228.     (setq i (+ i 1))
  229.   )
  230. )

  231. ;;=================================子函数开始=================================
  232. ;;名称:s_px
  233. ;;功能:排序(从大到小)
  234. ;;输入:ylist-所选订货图所有横线的Y坐标表
  235. ;;返回:nylist
  236.   (defun s_px(ylist / i nylist yy list1 list2)
  237.     (setq nylist '())
  238.     (while (/= (length ylist) 0)
  239.       (setq i 1)
  240.       (setq yy (nth 0 ylist))
  241.       (repeat (-(length ylist)1)
  242.         (if (> yy (nth i ylist))
  243.           (setq yy (nth i ylist))
  244.         )
  245.         (setq i (+ i 1))
  246.       )
  247.       (setq nylist (cons yy nylist))
  248.       (setq list1 (cdr (member yy ylist)))
  249.       (setq list2 (cdr (member yy (reverse ylist))))
  250.       (setq ylist (append list1 list2))
  251.     )
  252.     nylist
  253.   )

  254. ;;=================================子函数开始=================================
  255. ;;名称:C_slin
  256. ;;功能:画竖线
  257. ;;输入:xzb-x坐标 ylist-所选订货图所有横线的Y坐标表
  258. ;;返回:无
  259. (defun C_slin(xzb ylist / nylist point1 point2 i)
  260.   (setq i 0)
  261.   (setq nylist(s_px ylist))
  262.   (repeat (-(length nylist)1)
  263.     (setq point1(list xzb (nth i nylist)))
  264.     (setq point2(list xzb (nth (+ i 1) nylist)))
  265.     (command "_.line" point1 point2 "")
  266.     (setq i (+ i 1))
  267.   )
  268. )
  269.   
  270. ;;=================================子函数开始=================================
  271. ;;名称:h_comp
  272. ;;功能:计算两值的差(用于排序)
  273. ;;输入:a、b
  274. ;;返回:两值的差
  275.   (defun h_comp (a b)
  276.     (- a b)
  277.   )

  278. ;;=================================子函数开始=================================
  279. ;;名称: h_inwi
  280. ;;功能: 判断p1是否在p2 p3组成的窗口内
  281. ;;输入: p1 p2 p3
  282. ;;返回: 0-在窗口内、1-在窗口外、nil-边界上
  283.   (defun h_inwi (p1 p2 p3)
  284.     (cond
  285.       ((and(< (car p1) (- (max (car p2) (car p3)) tscale))
  286.             (> (car p1) (+ (min (car p2) (car p3)) tscale))
  287.             (< (cadr p1) (- (max (cadr p2) (cadr p3)) tscale))
  288.             (> (cadr p1) (+ (min (cadr p2) (cadr p3)) tscale))
  289.         )
  290.         0
  291.       )
  292.       ((or(> (car p1) (+ (max (car p2) (car p3)) tscale))
  293.            (< (car p1) (- (min (car p2) (car p3)) tscale))
  294.            (> (cadr p1) (+ (max (cadr p2) (cadr p3)) tscale))
  295.            (< (cadr p1) (- (min (cadr p2) (cadr p3)) tscale))
  296.         )
  297.         1
  298.       )
  299.       (t nil)
  300.     )
  301.   )

  302. ;;=================================子函数开始=================================
  303. ;;名称: h_mxwz
  304. ;;功能: 母线位置判断
  305. ;;输入: emx p1 p2
  306. ;;返回: mxwzt
  307.   (defun h_mxwz        (emx p1 p2 / pd1 pd2 pc mxwzt)
  308.     (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  309.           pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  310.     )
  311.     (setq pc (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  312.     (if        (or (> (car pc) (max (car p1) (car p2)))
  313.             (> (cadr pc) (max (cadr p1) (cadr p2)))
  314.             (< (car pc) (min (car p1) (car p2)))
  315.             (< (cadr pc) (min (cadr p1) (cadr p2)))
  316.         )
  317.       (setq mxwzt nil)
  318.       (setq mxwzt pc)
  319.     )
  320.     mxwzt
  321.   )

  322. ;;=================================子函数开始=================================
  323. ;;名称: h_wzpd
  324. ;;功能: 位置判断、判断实体(块-插入点,线-二端点)是否在窗口之内
  325. ;;输入: 实体名 窗口二角点
  326. ;;返回: 在窗口内-中点
  327. ;;      不在窗口内-T
  328. ;;      交叉(线)-nil
  329.   (defun h_wzpd (emx p1 p2 ss / pd1 pd2 pc wzt npd1 npd2 es sins i)
  330.     (cond
  331.       ((= (cdr (assoc 0 (entget emx))) "LWPOLYLINE")
  332.        (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  333.              pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  334.        )
  335.        (setq pc        (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  336.        (setq npd1 (h_inwi pd1 p1 p2)
  337.              npd2 (h_inwi pd2 p1 p2)
  338.        )
  339.        (cond
  340.         ((or(and (= npd1 0) (= npd2 1))(and (= npd2 0) (= npd1 1)))
  341.          (setq wzt nil)
  342.         )
  343.          ((or (= npd1 1) (= npd2 1))
  344.           (setq wzt t)
  345.          )
  346.          (t (setq wzt pc))
  347.        )
  348.       )
  349.       (t
  350.        (setq pc (cdr (assoc 10 (entget emx))))
  351.        (cond
  352.         ((= (h_inwi pc p1 p2) 1)
  353.           (setq wzt t)
  354.          )
  355.          ((null (h_inwi pc p1 p2))
  356.           (if (= (cdr (assoc 0 (entget emx))) "insert")
  357.             (progn
  358.               (setq        sins (ssget "c"
  359.                                     (polar pc (* 0.25 pi) tscale)
  360.                                     (polar pc (* 0.25 pi) tscale)
  361.                                     '((0 . "insert,lwpolyline"))
  362.                              )
  363.                   )
  364.                   (setq        wzt pc
  365.                         i   0
  366.                   )
  367.                   (while (and wzt (< i (sslength sins)))
  368.                     (setq es (ssname sins i))
  369.                     (if        (not (ssmemb es sins))
  370.                       (setq wzt t)
  371.                       (setq i (1+ i))
  372.                     )
  373.                   )
  374.                 )
  375.                 (setq wzt pc)
  376.               )
  377.              )
  378.              (t (setq wzt pc))
  379.        )
  380.       )
  381.     )
  382.     wzt
  383.   )

  384. ;;=================================子函数开始=================================
  385. ;;名称: h_wzyz
  386. ;;功能: 母线位置一致性判断
  387. ;;输入: 母线 循环号 (方向初值 坐标初值)
  388. ;;返回: i=0 (方向 坐标)
  389. ;;      i/=0 位置一致 t
  390. ;;           位置不一致 nil
  391.   (defun h_wzyz        (emx i first / fxhsf hszf pmxd1 pmxd2 fxhs hsz wzyz)
  392.     (setq fxhsf        (car first)
  393.           hszf        (cadr first)
  394.     )
  395.     (setq pmxd1        (append (cdr (assoc 10 (entget emx))) (list 0.0))
  396.           pmxd2        (append        (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  397.     )
  398.     (if(equal (car pmxd1) (car pmxd2) 0.001)
  399.       (setq fxhs 1 hsz (car pmxd1))
  400.       (setq fxhs 0 hsz (cadr pmxd1))
  401.     )
  402.     (if(= i 0)
  403.       (setq wzyz (list fxhs hsz))
  404.       (progn
  405.         (if (or(not (equal fxhs fxhsf 0.01))
  406.                 (not (equal hsz hszf 0.01))
  407.             )
  408.          (setq wzyz nil)
  409.           (setq wzyz t)
  410.         )
  411.       )
  412.     )
  413.     wzyz
  414.   )

  415. ;;=================================子函数开始=================================
  416. ;;名称: h_xzhl
  417. ;;功能: 选择回路
  418. ;;输入: 窗口二角点p1,p2
  419. ;;返回: t-(基点 方向? 宽度 回路选择集 回路数) 方向--0 向下 1 向右 2 向上 3 向左
  420. ;;       NIL-nil
  421.   (defun h_xzhl        (p1    p2    /           ssfah fah   pjd   fx           sshl         hlsm
  422.                  kd    hll   smx   i         mxt   fxhs  hsz   len1         ii
  423.                  emx   iii   pd1   pd2         mxmin mxmax p1           p2         pc
  424.                  ss    i4    pcl   first e     pcxl  pcyl  pcc   xzt
  425.                  len2
  426.                 )
  427.     (setq hll nil)
  428.     (setq smx (ssget "c" p1 p2 '((0 . "lwpolyline") (8 . "mx"))))
  429.     (if        smx
  430.       (progn
  431.         (setq i        0 mxt t)
  432.         (while (and mxt (< i (sslength smx)))
  433.           (setq emx (ssname smx i))
  434.           (if (= i 0)
  435.             (setq first (h_wzyz emx 0 nil))
  436.             (setq mxt (h_wzyz emx i first))
  437.           )
  438.           (setq i (1+ i))
  439.         )                                ;判断母线位置一致性
  440.         (if mxt
  441.           (progn
  442.             (setq fxhs (car first)
  443.                   hsz  (cadr first)
  444.                   ii   0
  445.                   len1 (sslength smx)
  446.             )
  447.             (repeat len1
  448.               (setq emx (ssname smx ii))
  449.               (if (h_mxwz emx p1 p2)
  450.                 (setq ii (1+ ii))
  451.                 (ssdel emx smx)
  452.               )
  453.             )                                ;删除中心在边界外的母线
  454.             (setq hlsm (sslength smx))
  455.             (if        (/= hlsm 0)
  456.               (progn
  457.                 (setq iii 0)
  458.                 (repeat        hlsm
  459.                   (setq emx (ssname smx iii))
  460.                   (setq        pd1 (cdr (assoc 10 (entget emx)))
  461.                         pd2 (cdr (assoc 10 (reverse (entget emx))))
  462.                   )
  463.                   (if (= fxhs 0)
  464.                     (if        (= iii 0)
  465.                       (setq mxmin (min (car pd1) (car pd2))
  466.                             mxmax (max (car pd1) (car pd2))
  467.                       )
  468.                       (progn
  469.                         (if (< (min (car pd1) (car pd2)) mxmin)
  470.                           (setq mxmin (min (car pd1) (car pd2)))
  471.                         )
  472.                         (if (> (max (car pd1) (car pd2)) mxmax)
  473.                           (setq mxmax (max (car pd1) (car pd2)))
  474.                         )
  475.                       )
  476.                     )
  477.                     (if        (= iii 0)
  478.                       (setq mxmin (min (cadr pd1) (cadr pd2))
  479.                             mxmax (max (cadr pd1) (cadr pd2))
  480.                       )
  481.                       (progn
  482.                         (if (< (min (cadr pd1) (cadr pd2)) mxmin)
  483.                           (setq mxmin (min (cadr pd1) (cadr pd2)))
  484.                         )
  485.                         (if (> (max (cadr pd1) (cadr pd2)) mxmax)
  486.                           (setq mxmax (max (cadr pd1) (cadr pd2)))
  487.                         )
  488.                       )
  489.                     )
  490.                   )
  491.                   (setq iii (1+ iii))
  492.                 )
  493.                 (setq kd (- mxmax mxmin))
  494.                 (if (= fxhs 0)
  495.                   (setq        p1  (list mxmin (cadr p1) 0.0)
  496.                         p2  (list mxmax (cadr p2) 0.0)
  497.                         pjd (list (/ (+ mxmin mxmax) 2) hsz 0.0)
  498.                   )
  499.                   (setq        p1  (list (car p1) mxmin 0.0)
  500.                         p2  (list (car p2) mxmax 0.0)
  501.                         pjd (list hsz (/ (+ mxmin mxmax) 2) 0.0)
  502.                   )
  503.                 )                        ;取得母线范围并更新选择集窗口

  504.                 (setq ss (ssget "c" p1 p2 '((8 . "mx,fah,bxt,xhgg,xmdh"))))
  505.                 (setq i4   0
  506.                       pcl  nil
  507.                       len2 (sslength ss)
  508.                       xzt  t
  509.                 )
  510.                 (while (and xzt (< i4 len2))
  511.                   (setq e (ssname ss i4))
  512.                   (if (setq pc (h_wzpd e p1 p2 smx))
  513.                     (progn
  514.                       (if (= pc t)
  515.                         (progn
  516.                           (ssdel e ss)
  517.                           (setq len2 (1- len2))
  518.                         )
  519.                         (progn
  520.                           (setq pcl (cons pc pcl))
  521.                           (setq i4 (1+ i4))
  522.                         )
  523.                       )
  524.                     )
  525.                     (setq xzt nil)
  526.                   )
  527.                 )
  528.                                         ;去掉多余实体,如果交叉结束
  529.                 (if xzt
  530.                   (progn
  531.                     (setq pcxl (mapcar 'car pcl)
  532.                           pcyl (mapcar 'cadr pcl)
  533.                     )
  534.                     (setq pcc (list (/ (apply '+ pcxl) (length pcl))
  535.                                     (/ (apply '+ pcyl) (length pcl))
  536.                                     0.0
  537.                               )
  538.                     )
  539.                     (if        (= fxhs 0)
  540.                       (if (< (cadr pcc) (cadr pjd))
  541.                         (setq fx 0)
  542.                         (setq fx 2)
  543.                       )
  544.                       (if (> (car pcc) (car pjd))
  545.                         (setq fx 1)
  546.                         (setq fx 3)
  547.                       )
  548.                     )
  549.                     (setq hll (list pjd fx kd ss hlsm))
  550.                   )
  551.                   (Xacino "回路选择不完整!" "操作错误" 6)
  552.                 )
  553.               )
  554.             )
  555.           )
  556.           (Xacino "选了其他回路的母线!" "操作错误" 6)
  557.         )
  558.       )
  559.     )
  560.     hll
  561.   )

  562. ;;=================================子函数开始=================================
  563. ;;名称: h_lxdd
  564. ;;功能: 连续母线端点
  565. ;;输入: 端点 方向
  566. ;;返回: 下一端点
  567.   (defun h_lxdd        (pds fx hljj / p1 p2 lxl pde e hs smxal)
  568.     (setq pde nil)
  569.     (setq smxal (ssget "x" '((8 . "mx"))))
  570.     (if(or (= fx 0) (= fx 2))
  571.       (setq lxl (list (car pds)))
  572.       (setq lxl (list (cadr pds)))
  573.     )
  574.     (while (setq e (ssname smxal 0))
  575.       (setq p1 (cdr (assoc 10 (entget e)))
  576.             p2 (cdr (assoc 10 (reverse (entget e))))
  577.       )
  578.       (if (or (= fx 0) (= fx 2))
  579.         (if (and (equal (cadr p1) (cadr pds) 0.001)
  580.                  (equal (cadr p2) (cadr pds) 0.001)
  581.             )
  582.           (if (> (setq hs (max (car p1) (car p2))) (car pds))
  583.             (setq lxl (cons hs lxl))
  584.           )
  585.         )
  586.         (if (and (equal (car p1) (car pds) 0.001)
  587.                  (equal (car p2) (car pds) 0.001)
  588.             )
  589.           (if (> (setq hs (max (cadr p1) (cadr p2))) (cadr pds))
  590.             (setq lxl (cons hs lxl))
  591.           )
  592.         )
  593.       )
  594.       (ssdel e smxal)
  595.     )
  596.     (if(> (length lxl) 1)
  597.       (setq lxl (qsort h_comp lxl))
  598.     )
  599.     (while (and        (> (length lxl) 1)
  600.                 (< (- (cadr lxl) (car lxl)) (* 1.5 hljj))
  601.            )
  602.       (setq lxl (cdr lxl))
  603.       (if (or (= fx 0) (= fx 2))
  604.         (setq pde (list(car lxl)(cadr pds)        0.0))
  605.         (setq pde (list(car pds)(car lxl)        0.0))
  606.       )
  607.     )
  608.     pde
  609.   )

  610. ;;=================================子函数开始=================================
  611. ;;名称: h_lxxz
  612. ;;功能: 连续回路选择,选择由一点开始的所有连续同方向回路
  613. ;;输入: 开始点 结束点 方向
  614. ;;返回: 选择集
  615.   (defun h_lxxz        (pds pde fx / p1 p2 ss i ls emx dqw1 wzpdt)
  616.     (setq ss nil)
  617.     (if        (and pds pde)
  618.       (progn
  619.         (cond
  620.           ((= fx 0)
  621.            (setq p1 (polar pds (* 1.5 pi) (* 90 tscale))
  622.                  p2 (polar pde (* 0.5 pi) (* 2 tscale))
  623.            )
  624.           )
  625.           ((= fx 1)
  626.            (setq p1 (polar pds pi (* 2 tscale))
  627.                  p2 (polar pde 0 (* 90 tscale))
  628.            )
  629.           )
  630.           ((= fx 2)
  631.            (setq p1 (polar pds (* 1.5 pi) (* 2 tscale))
  632.                  p2 (polar pde (* 0.5 pi) (* 90 tscale))
  633.            )
  634.           )
  635.           ((= fx 3)
  636.            (setq p1 (polar pds pi (* 90 tscale))
  637.                  p2 (polar pde 0 (* 2 tscale))
  638.            )
  639.           )
  640.         )
  641.         (setq dqw1 (XScjx))
  642.         (if (or        (= (h_inwi p1 (car dqw1) (cadr dqw1)) 1)
  643.                 (= (h_inwi p2 (car dqw1) (cadr dqw1)) 1)
  644.             )
  645.           (progn
  646.             (command "_.zoom"
  647.                      (list (min (car p1) (caar dqw1))
  648.                            (min (cadr p1) (cadar dqw1))
  649.                      )
  650.                      (list (max (car p2) (caadr dqw1))
  651.                            (max (cadr p2) (cadadr dqw1))
  652.                      )
  653.             )
  654.           )
  655.         )
  656.         (setq ss (ssget "c" p1 p2 '((8 . "mx,bxt,fah,xhgg,xmdh"))))

  657.         (setq i         0
  658.               ls (sslength ss)
  659.         )
  660.         (repeat        ls
  661.           (setq emx (ssname ss i))
  662.           (setq wzpdt (h_wzpd emx p1 p2 ss))
  663.           (if (or (null wzpdt) (= wzpdt t))
  664.             (ssdel emx ss)
  665.             (setq i (1+ i))
  666.           )
  667.         )
  668.       )
  669.     )
  670.     ss
  671.   )

  672. ;;=================================子函数开始=================================
  673. ;;名称: h_hlhz
  674. ;;功能: 回路绘制
  675. ;;输入: 回路起始点 方向 回路间距
  676. ;;返回: 无
  677.   (defun h_hlhz(pjd fx dist data1 data2 sm2 / zdist pds pdmx2 pdmx1 mxkd shu)
  678.     (setq zdist (* sm2 dist))
  679.     (Xsetin "Hlklib" "Hlkjj" (rtos (/ dist tscale) 2 2) 1)
  680.     (shldy pjd fx data1 data2)                ;回路绘制
  681.     (command "_.color" "_green")
  682.     (command "_.Layer" "_m" "mx" "_c" 3 "" "")
  683.     (if        (or (= fx 0) (= fx 2))
  684.       (setq pds (polar pjd 0 (* -0.5 zdist)))
  685.       (setq pds (polar pjd (* 0.5 pi) (* -0.5 zdist)))
  686.     )
  687.     (setq pdmx1 pds)
  688.     (repeat sm2
  689.       (if (or (= fx 0) (= fx 2))
  690.         (setq pdmx2 (polar pdmx1 0 dist))
  691.         (setq pdmx2 (polar pdmx1 (* 0.5 pi) dist))
  692.       )
  693.       (setq mxkd (atof (Xgetin "Hlklib" "Hlkmx" "0.6" 1)))
  694.       (setq mxkd (* mxkd tscale))
  695.       (command "_.pline" pdmx1 "_w" mxkd "" pdmx2 "")
  696.       (setq pdmx1 pdmx2)
  697.     )                                        ;母线绘制
  698.     (setq shu(tblsearch "layer""GDXT"))
  699.     (if shu(command "_.layer" "_set" "GDXT" ""))
  700.   )

  701. ;;=================================子函数开始=================================
  702. ;;名称: h_sh1
  703. ;;功能: 回路替换
  704. ;;输入: 无
  705. ;;返回: 无
  706. (defun h_sh1(/ lll1 ph1 ph2 ttt1 hlxzl pjd fx kd sshl hlsm lll2 ttt2 ph3 ph4
  707.                lxfs slx        pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde jj
  708.                jjn sshl hldata data1 data2 dist sm2 smov zxj ysj zxjn ysjn mylist
  709.                plist xlist ylist ess fan i shu)
  710.   (setq zxj (car(XScjx)))
  711.   (setq ysj (last(XScjx)))
  712.   (setq lll1 t)
  713.   (while lll1
  714.     (command "_.undo" "_group")
  715.     (setq shu(tblsearch "layer""GDXT"))
  716.     (if shu(command "_.layer" "_set" "GDXT" ""))
  717.     (setq fan 1)
  718.     (prompt "\n请用窗口(W)选择被替回路:")
  719.     (setq ph1 1)
  720.     (while (not(listp ph1))
  721.       (initget 128)
  722.       (setq ph1 (getpoint "\n请输入窗口第一点<回车结束>:"))
  723.     )
  724.     (if ph1
  725.       (progn
  726.         (setq ttt1 t)
  727.         (while ttt1
  728.           (setq ph2 1)
  729.           (while (not(listp ph2))
  730.             (initget 128)
  731.             (setq ph2 (getcorner ph1 "\n请输入窗口第二点:"))
  732.           )
  733.           (if ph2
  734.             (progn
  735.               (setq hlxzl (h_xzhl ph1 ph2))
  736.               (if hlxzl
  737.                 (progn
  738.                   (setq ttt1 nil)
  739.                   (setq        pjd  (nth 0 hlxzl)
  740.                         fx   (nth 1 hlxzl)
  741.                         kd   (nth 2 hlxzl)
  742.                         sshl (nth 3 hlxzl)
  743.                         hlsm (nth 4 hlxzl)
  744.                   )
  745.                   (setq i 0)
  746.                   (repeat (sslength sshl)
  747.                     (redraw (ssname sshl i) 3)
  748.                     (setq i (1+ i))
  749.                   )
  750.                   (setq lxfs 1 slx  sshl)
  751.                   (if(=(IfWndVis "hlklibclass") 0)
  752.                     (hlklib 0 1 "s" 0 1 1 0 0)
  753.                     (progn
  754.                       (xsetin "Hlklib" "Hlkpara" "0&1&0&1&1&0&0" 1)
  755.                       (xsetin "Hlklib" "RetHlkMes" "s" 1)
  756.                     )
  757.                   )
  758.                   (setq lll2 t)
  759.                   (while lll2
  760.                     (prompt "\n请用窗口(W)或从图库选择替换回路:")
  761.                     (setq ph3 1)
  762.                     (while (and(/= ph3 "s")(not(listp ph3)))
  763.                       (initget 128 "s")
  764.                       (setq ph3(getpoint"\n请输入窗口第一点或请选取方案<回车结束>:"))
  765.                     )
  766.                     (cond
  767.                       ((and(listp ph3)ph3)
  768.                        (setq ttt2 t)
  769.                        (while ttt2
  770.                          (setq ph4 1)
  771.                          (while(not(listp ph4))
  772.                            (initget 128)
  773.                            (setq ph4(getcorner ph3 "\n请输入窗口第二点:"))
  774.                          )
  775.                          (if ph4
  776.                            (progn
  777.                              (setq hlxzln (h_xzhl ph3 ph4))
  778.                              (if hlxzln
  779.                                (progn
  780.                                  (setq pjdf  (nth 0 hlxzln)
  781.                                        fxn   (nth 1 hlxzln)
  782.                                        kdn   (nth 2 hlxzln)
  783.                                        sshln (nth 3 hlxzln)
  784.                                        hlsmn (nth 4 hlxzln)
  785.                                  )
  786.                                  (setq jj(/ kd hlsm) jjn (/ kdn hlsmn))
  787.                                  (if (and (equal jj jjn 0.01)(= fx fxn))
  788.                                    (progn
  789.                                      (setq ttt2 nil lll2 nil)
  790.                                      (if (or (= fx 0) (= fx 2))
  791.                                        (setq pjdn  (polar pjd 0 (/ (- kdn kd) 2.0))
  792.                                              pmds  (polar pjd 0 (/ kd 2.0))
  793.                                              pmdsn (polar pmds 0(- kdn kd))
  794.                                        )
  795.                                        (setq pjdn  (polar pjd (* 0.5 pi) (/ (- kdn kd) 2.0))
  796.                                              pmds  (polar pjd (* 0.5 pi) (/ kd 2.0))
  797.                                              pmdsn (polar pmds(* 0.5 pi) (- kdn kd))
  798.                                        )
  799.                                      )
  800.                                      (setq pmde (h_lxdd pmds fx jj))
  801.                                      (setq smov (h_lxxz pmds pmde fx))
  802.                                      (setq mylist(Dhtss pjd 2))
  803.                                      (if(and mylist (or(= fx 0)(= fx 2)))
  804.                                        (progn
  805.                                          (setq zxjn (car(XScjx)))
  806.                                          (setq ysjn (last(XScjx)))
  807.                                          (C_zoom mylist zxjn ysjn)
  808.                                          (setq ylist(C_xyzb mylist pjd kd))
  809.                                          (setq plist(C_ldel mylist pjd kd sshl))
  810.                                          (setq xlist(C_movt plist kd kdn sshln pjdf pjdn smov 0))
  811.                                          (setq ess(last plist))
  812.                                          (command "_.erase" ess "")
  813.                                          (command "_.erase" sshl "")
  814.                                          (command "_.layer" "_set" "GDXT" "")
  815.                                          (C_slin (car xlist) ylist)
  816.                                          (C_slin (last xlist) ylist)
  817.                                          (C_hlin xlist ylist hlsmn)
  818.                                          (command "_.zoom" zxj ysj)
  819.                                        )
  820.                                        (progn
  821.                                          (command "_.copy" sshln "" pjdf pjdn)
  822.                                          (if smov(command "_.move" smov "" pmds pmdsn))
  823.                                          (command "_.erase" sshl "")
  824.                                        )
  825.                                      )
  826.                                    )
  827.                                    (progn
  828.                                      (Xacino "所选回路的出线方向或间距不对,请重新选择!" "注意" 6)
  829.                                      (setq ttt2 nil)
  830.                                    )
  831.                                  )
  832.                                )
  833.                                (setq ttt2 nil)
  834.                              )
  835.                            )
  836.                          )
  837.                        )
  838.                       )
  839.                       ((= ph3 "s")
  840.                        (setq lll2 nil)
  841.                        (setq hldata (xgetin "Hlklib" "Hlkdata" "" 1))
  842.                        (setq data1(_getnS hldata 1 "&") data2(_getnS hldata 2 "&"))
  843.                        (setq dist (/ kd hlsm))
  844.                        (setq sm2 (fhlnum data1 data2))
  845.                        (setq kdn (* sm2 dist))
  846.                        (if(or(= fx 0)(= fx 2))
  847.                          (setq pjdn (polar pjd 0 (/ (- kdn kd) 2.0))
  848.                                pmds (polar pjd 0 (/ kd 2.0))
  849.                                pmdsn(polar pmds 0 (- kdn kd))
  850.                          )
  851.                          (setq pjdn (polar pjd(* 0.5 pi)(/ (- kdn kd) 2.0))
  852.                                pmds (polar pjd (* 0.5 pi) (/ kd 2.0))
  853.                                pmdsn(polar pmds (* 0.5 pi) (- kdn kd))
  854.                          )
  855.                        )
  856.                        (setq pmde (h_lxdd pmds fx dist))
  857.                        (setq smov (h_lxxz pmds pmde fx))
  858.                        (setq mylist(dhtss pjd 2))
  859.                        (if (and mylist (or (= fx 0) (= fx 2)))
  860.                          (progn
  861.                            (setq zxjn (car(XScjx)))(setq ysjn (last(XScjx)))
  862.                            (C_zoom mylist zxjn ysjn)
  863.                            (setq ylist (C_xyzb mylist pjd kd))
  864.                            (setq plist (C_ldel mylist pjd kd sshl))
  865.                            (setq xlist (C_movk plist kd kdn pjdn fx dist data1 data2 sm2 smov 1))
  866.                            (setq ess (last plist))
  867.                            (command "_.erase" ess "")
  868.                            (command "_.erase" sshl "")
  869.                            (command "_.layer" "_set" "GDXT" "")
  870.                            (C_slin (car xlist) ylist)
  871.                            (C_slin (last xlist) ylist)
  872.                            (C_hlin xlist ylist sm2)
  873.                            (command "_.zoom" zxj ysj)
  874.                          )
  875.                          (progn
  876.                            (if smov(command "_.move" smov "" pmds pmdsn))
  877.                            (command "_.erase" sshl "")
  878.                            (h_hlhz pjdn fx dist data1 data2 sm2)
  879.                          )
  880.                        )
  881.                       )
  882.                       (t(setq lll2 nil)) ;回车结束
  883.                     )
  884.                   )                              ;替换选取循环
  885.                 )
  886.                 (setq ttt1 nil)
  887.               )
  888.             )
  889.           )
  890.         )
  891.       )
  892.       (setq lll1 nil)
  893.     )                                        ;是否ph1--t
  894.     (if(= lxfs 1)
  895.       (progn
  896.         (setq i 0)
  897.         (repeat (sslength slx)
  898.           (redraw (ssname slx i) 4)
  899.           (setq i (1+ i))
  900.         )
  901.         (setq lxfs 0)
  902.       )
  903.     )
  904.     (command "_.undo" "_end")
  905.     (setq fan 0)
  906.   )                                              ;被替换选取循环
  907. )

  908. ;;================================子函数结束==================================
  909.   (_inidwg)
  910.   (princ "\n*回路替换*=Hlth")
  911.   (setvar "plinetype" 2)
  912.   (setvar "cmdecho" 0)
  913.   (setvar "blipmode" 0)
  914.   (setvar "pickadd" 1)
  915.   (setvar "osmode" 0)
  916.   (setvar "CECOLOR" "green")
  917.   (setq ucmark (getvar "worlducs"))
  918.   (if (= ucmark 0)
  919.     (progn
  920.       (setq ucs_fo (getvar "ucsfollow"))
  921.       (if (= ucs_fo 1)(setvar "ucsfollow" 0))
  922.       (command "_.ucs" "_world")
  923.     )
  924.   )
  925.   (setq lxfs 0 tscale(atof(xrddic "Tabscale" "100")) dqw(XScjx))
  926.   (setq        o_para(xgetin "Hlklib" "Hlkpara" "" 1)
  927.         o_mes(xgetin "Hlklib" "RetHlkMes" "" 1)
  928.         o_jj(xgetin "Hlklib" "Hlkjj" "30" 1)
  929.   )
  930.   (menucmd "s=hd25l")
  931.   (h_sh1)
  932.   (if(= ucmark 0)(command "_.ucs" "_prev"))
  933.   (setvar "highlight" 1)
  934.   (setq dqwn(XScjx))
  935.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  936.   (setq *error* olderr olderr nil)
  937.   (_resdwg)
  938.   (princ)
  939. )

  940. ;;=================================主程序开始=================================
  941. ;;名称:C:HLHH
  942. ;;功能:简版回路编辑-回路互换
  943. ;;输入:无
  944. ;;返回:无
  945. (defun C:HLHH(/ tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo
  946.                 h_sh2 h_XZHL h_WZYZ h_HLHZ h_LXDD h_WZPD h_LXXZ h_mxwz h_inwi
  947.                 h_comp C_zoom C_ssgl C_xyzb C_ldel C_movt C_movk C_hlin C_slin
  948.                 s_px)
  949.   (setq olderr *error*)
  950.   
  951. ;;=================================子函数开始=================================
  952. ;;名称:*error*(错误处理函数)
  953. ;;功能:当程序发生错误或用户中断时,平静地退出,并还原状态。
  954. ;;输入:无
  955. ;;返回:无
  956. (defun *error* (msg / each)
  957.   (if (= fan 1)(command "_.undo" "_end"))
  958.   (if (= fan 1)(command "_.undo" ""))
  959.   (if (= ucmark 0) (command "_.ucs" "_prev"))
  960.   (xsetin "Hlklib" "Hlkpara" o_para 1)
  961.   (xsetin "Hlklib" "RetHlkMes" o_mes 1)
  962.   (xsetin "Hlklib" "Hlkjj" o_jj 1)
  963.   (if(= lxfs 1)
  964.     (progn(setq i 0)(repeat(sslength slx)(redraw(ssname slx i)4)(setq i(1+ i))))
  965.   )
  966.   (setq dqwn (XScjx))
  967.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  968.   (foreach each
  969.       '(tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo h_sh2 h_xzhl
  970.         h_wzyz h_hlhz h_lxdd h_wzpd h_lxxz h_mxwz h_inwi h_comp C_zoom C_ssgl C_xyzb
  971.         C_ldel C_movt C_movk C_hlin C_slin point1 point2 i ename point3 point4 ss
  972.         elist point5 point6 biao ylist plist l xlist n nylist s_px yy list1 list2 a b
  973.         emx p1 p2 p3 pd1 pd2 pc mxwzt wzt npd1 npd2 es sins first fxhsf hszf pmxd1
  974.         pmxd2 fxhs hsz wzyz ssfah fah pjd fx sshl hlsm kd hll smx mxt len1 ii iii mxmin
  975.         mxmax i4 pcl e pcxl pcyl pcc xzt len2 pds hljj lxl pde hs smxal ls dqw1 wzpdt
  976.         dist data1 data2 sm2 zdist pdmx2 mxkd lll1 ph1 ph2 ttt1 hlxzl lll2 ttt2 ph3 ph4
  977.         slx pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde jj jjn hldata smov zxj
  978.         ysj zxjn ysjn mylist ess fan name laye yanse hlxzl1 pjd1 fx1 kd1 sshl1 hlsm1 pjd2
  979.         fx2 kd2 hlsm2 hlxzl2 pjdn1 pjd1n pjd2n pme smov1 smov2 pmds1 pmds1n pmds2 pmds2n
  980.         pmde1 pmde2 jj1 jj2 sshl2 s2_ss3 s2_lsx ss1 ss2 ss3 ylist1 ylist2 plist1 plist2
  981.         xlist1 xlist2 ess1 ess2 point shu xzb)
  982.       (set each nil)
  983.     )
  984.     (setq each nil)
  985.     (setq *error* olderr olderr nil)
  986.     (_resdwg)
  987.     (princ)
  988. )

  989. ;;=================================子函数开始=================================
  990. ;;名称:C_zoom
  991. ;;功能:判断是否zoom
  992. ;;输入:mylist-订货图的角表 zxj-视区左下角 ysj-视区右上角
  993. ;;返回:无
  994. (defun C_zoom(mylist zxjn ysjn / point1 point2)
  995.   (setq point1(car mylist))
  996.   (setq point2(last mylist))
  997.   (if(or(>(car zxjn)(car point2))(<(car ysjn)(car point1))
  998.         (>(cadr zxjn)(cadr point1))(<(cadr ysjn)(cadr point2))
  999.      )
  1000.     (command "_.ZOOM" "_w" point1 point2)
  1001.   )
  1002. )

  1003. ;;=================================子函数开始=================================
  1004. ;;名称:C_ssgl
  1005. ;;功能:过滤选择集
  1006. ;;输入:ss1-选择集1 ss2-选择集2
  1007. ;;返回:ss1
  1008. (defun C_ssgl(ss1 ss2 / i ename)
  1009.   (setq i 0)
  1010.   (repeat(sslength ss2)
  1011.     (setq ename (ssname ss2 i))
  1012.     (ssdel ename ss1)
  1013.     (setq i (+ i 1))
  1014.   )
  1015.   ss1
  1016. )

  1017. ;;=================================子函数开始=================================
  1018. ;;名称:C_xyzb
  1019. ;;功能:得到所选回路所有横线的Y坐标点集
  1020. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长
  1021. ;;返回:ylist-所选回路所有横线的Y坐标表
  1022. (defun C_xyzb(mylist pjd kd / point1 point2 point3 point4 i ss ename elist
  1023.                                    point5 point6 biao ylist)
  1024.   (setq ylist '())
  1025.   (setq point1(car mylist))
  1026.   (setq point2(last mylist))
  1027.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  1028.   (setq point4(list(+(car point3)kd)(cadr point1)(last point1)))
  1029.   (setq ss (ssget "W" point3 point4 '((0 . "LINE")(8 . "GDXT")(62 . 3))))
  1030.   (setq i 0)
  1031.   (repeat (sslength ss)
  1032.     (setq ename (ssname ss i))
  1033.     (setq elist (entget ename))
  1034.     (setq point5(cdr(assoc 10 elist)))
  1035.     (setq point6(cdr(assoc 11 elist)))
  1036.     (if (equal(cadr point5)(cadr point6)0.1)
  1037.       (progn
  1038.         (setq biao(member (cadr point5) ylist))
  1039.         (if (not biao)
  1040.           (setq ylist(cons (cadr point5) ylist))
  1041.         )
  1042.       )
  1043.     )
  1044.     (setq i (+ i 1))
  1045.   )
  1046.   ylist
  1047. )

  1048. ;;=================================子函数开始=================================
  1049. ;;名称:C_ldel
  1050. ;;功能:得到所选回路列的左上角和右下角
  1051. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长 sshl-回路选择集
  1052. ;;返回:plist-点表(所选回路列的右上角、订货图的右下角和所选回路列的选择集)
  1053. (defun C_ldel(mylist pjd kd sshl / point1 point2 point3 point4 point5 ss plist)
  1054.   (setq point1(car mylist))
  1055.   (setq point2(last mylist))
  1056.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  1057.   (setq point4(list(+(car pjd)(/ kd 2))(cadr point1)(last point2)))
  1058.   (setq ss(ssget "w" point3 point4))
  1059.   (setq ss(C_ssgl ss sshl))
  1060.   (setq point5(list(car point4)(cadr point2)(last point2)))
  1061.   (setq plist (list point5 point1 ss))
  1062. )

  1063. ;;=================================子函数开始=================================
  1064. ;;名称:C_movt
  1065. ;;功能:copy回路并移动表格(从当前图中copy或move)
  1066. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  1067. ;;      sshln-替换回路 pjdf-替换回路的基点 pjd-被替回路的基点 smov-回路选择集
  1068. ;;      a-为0时拷贝,为1时移动,为2时插入
  1069. ;;返回:xlist-新回路列的x坐标
  1070. (defun C_movt(plist kd kdn sshln pjdf pjdn smov a / point1 point2 l point3 point4 xlist ss)
  1071.   (setq point1(car plist))
  1072.   (setq point2(cadr plist))
  1073.   (if(or(= a 0)(= a 1))
  1074.     (progn
  1075.       (setq l(- kd kdn))
  1076.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  1077.       (setq ss(ssget "w" point1 point2))
  1078.       (if (= a 0)
  1079.         (command "_.copy" sshln "" pjdf pjdn)
  1080.         (command "_.move" sshln "" pjdf pjdn)
  1081.       )
  1082.       (if smov
  1083.         (progn
  1084.           (command "_.move" smov "" point1 point3)
  1085.           (setq ss(C_ssgl ss smov))
  1086.         )
  1087.       )
  1088.       (command "_.move" ss "" point1 point3)
  1089.       (setq xlist(list(-(car point1)kd)(car point3)))
  1090.     )
  1091.     (progn
  1092.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  1093.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  1094.       (setq ss (ssget "w" point3 point2))
  1095.       (command "_.copy" sshln "" pjdf pjdn)
  1096.       (if smov
  1097.         (progn
  1098.           (command "_.move" smov "" point3 point4)
  1099.           (setq ss(C_ssgl ss smov))
  1100.         )
  1101.       )
  1102.       (command "_.move" ss "" point3 point4)
  1103.       (setq xlist(list(car point3)(car point4)))
  1104.     )
  1105.   )
  1106.   xlist
  1107. )

  1108. ;;=================================子函数开始=================================
  1109. ;;名称:C_movk
  1110. ;;功能:copy回路并移动表格(从图库中取)
  1111. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  1112. ;;      pjdn-替换回路 fx-回路方向 dist、data1、data2、sm2-调回路库的参数 smov-回路选择集
  1113. ;;      a-为时替换回路,为2时插入回路
  1114. ;;返回:xlist-新回路列的两个x坐标
  1115. (defun C_movk(plist kd kdn pjdn fx dist data1 data2 sm2 smov a / point1 point2 l point3
  1116.               point4 xlist ss)
  1117.   (setq point1(car plist))
  1118.   (setq point2(cadr plist))
  1119.   (if (= a 1)
  1120.     (progn
  1121.       (setq l(- kd kdn))
  1122.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  1123.       (setq ss(ssget "w" point1 point2))
  1124.       (h_hlhz pjdn fx dist data1 data2 sm2)
  1125.       (if smov
  1126.         (progn
  1127.           (command "_.move" smov "" point1 point3)
  1128.           (setq ss(C_ssgl ss smov))
  1129.         )
  1130.       )
  1131.       (command "_.move" ss "" point1 point3)
  1132.       (setq xlist(list(-(car point1)kd)(car point3)))
  1133.     )
  1134.     (progn
  1135.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  1136.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  1137.       (setq ss (ssget "w" point3 point2))
  1138.       (h_hlhz pjdn fx dist data1 data2 sm2)
  1139.       (if smov
  1140.         (progn
  1141.           (command "_.move" smov "" point3 point4)
  1142.           (setq ss(C_ssgl ss smov))
  1143.         )
  1144.       )
  1145.       (command "_.move" ss "" point3 point4)
  1146.       (setq xlist(list(car point3)(car point4)))
  1147.     )
  1148.   )
  1149.   xlist
  1150. )

  1151. ;;=================================子函数开始=================================
  1152. ;;名称:C_hlin
  1153. ;;功能:画横线
  1154. ;;输入:xlist-新订货图的x坐标表 ylist-所选订货图所有横线的Y坐标表 hlsm-回路数目
  1155. ;;返回:无
  1156. (defun C_hlin(xlist ylist hlsm / point1 point2 i l n)
  1157.   (setq i 0)
  1158.   (setq l(/(abs(-(car xlist)(last xlist)))hlsm))
  1159.   (repeat (length ylist)
  1160.     (setq n 0)
  1161.     (repeat hlsm
  1162.       (setq point1(list(+(car xlist)(* l n))(nth i ylist)0.0))
  1163.       (setq point2(list(+(car xlist)(* l (+ n 1)))(nth i ylist)0.0))
  1164.       (command "_.line" point1 point2 "")
  1165.       (setq n (+ n 1))
  1166.     )
  1167.     (setq i (+ i 1))
  1168.   )
  1169. )

  1170. ;;=================================子函数开始=================================
  1171. ;;名称:s_px
  1172. ;;功能:排序(从大到小)
  1173. ;;输入:ylist-所选订货图所有横线的Y坐标表
  1174. ;;返回:nylist
  1175.   (defun s_px(ylist / i nylist yy list1 list2)
  1176.     (setq nylist '())
  1177.     (while (/= (length ylist) 0)
  1178.       (setq i 1)
  1179.       (setq yy (nth 0 ylist))
  1180.       (repeat (-(length ylist)1)
  1181.         (if (> yy (nth i ylist))
  1182.           (setq yy (nth i ylist))
  1183.         )
  1184.         (setq i (+ i 1))
  1185.       )
  1186.       (setq nylist (cons yy nylist))
  1187.       (setq list1 (cdr (member yy ylist)))
  1188.       (setq list2 (cdr (member yy (reverse ylist))))
  1189.       (setq ylist (append list1 list2))
  1190.     )
  1191.     nylist
  1192.   )

  1193. ;;=================================子函数开始=================================
  1194. ;;名称:C_slin
  1195. ;;功能:画竖线
  1196. ;;输入:xzb-x坐标 ylist-所选订货图所有横线的Y坐标表
  1197. ;;返回:无
  1198. (defun C_slin(xzb ylist / nylist point1 point2 i)
  1199.   (setq i 0)
  1200.   (setq nylist(s_px ylist))
  1201.   (repeat (-(length nylist)1)
  1202.     (setq point1(list xzb (nth i nylist)))
  1203.     (setq point2(list xzb (nth (+ i 1) nylist)))
  1204.     (command "_.line" point1 point2 "")
  1205.     (setq i (+ i 1))
  1206.   )
  1207. )
  1208.   
  1209. ;;=================================子函数开始=================================
  1210. ;;名称:h_comp
  1211. ;;功能:计算两值的差(用于排序)
  1212. ;;输入:a、b
  1213. ;;返回:两值的差
  1214.   (defun h_comp (a b)
  1215.     (- a b)
  1216.   )

  1217. ;;=================================子函数开始=================================
  1218. ;;名称: h_inwi
  1219. ;;功能: 判断p1是否在p2 p3组成的窗口内
  1220. ;;输入: p1 p2 p3
  1221. ;;返回: 0-在窗口内、1-在窗口外、nil-边界上
  1222.   (defun h_inwi (p1 p2 p3)
  1223.     (cond
  1224.       ((and(< (car p1) (- (max (car p2) (car p3)) tscale))
  1225.             (> (car p1) (+ (min (car p2) (car p3)) tscale))
  1226.             (< (cadr p1) (- (max (cadr p2) (cadr p3)) tscale))
  1227.             (> (cadr p1) (+ (min (cadr p2) (cadr p3)) tscale))
  1228.         )
  1229.         0
  1230.       )
  1231.       ((or(> (car p1) (+ (max (car p2) (car p3)) tscale))
  1232.            (< (car p1) (- (min (car p2) (car p3)) tscale))
  1233.            (> (cadr p1) (+ (max (cadr p2) (cadr p3)) tscale))
  1234.            (< (cadr p1) (- (min (cadr p2) (cadr p3)) tscale))
  1235.         )
  1236.         1
  1237.       )
  1238.       (t nil)
  1239.     )
  1240.   )

  1241. ;;=================================子函数开始=================================
  1242. ;;名称: h_mxwz
  1243. ;;功能: 母线位置判断
  1244. ;;输入: emx p1 p2
  1245. ;;返回: mxwzt
  1246.   (defun h_mxwz        (emx p1 p2 / pd1 pd2 pc mxwzt)
  1247.     (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  1248.           pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  1249.     )
  1250.     (setq pc (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  1251.     (if        (or (> (car pc) (max (car p1) (car p2)))
  1252.             (> (cadr pc) (max (cadr p1) (cadr p2)))
  1253.             (< (car pc) (min (car p1) (car p2)))
  1254.             (< (cadr pc) (min (cadr p1) (cadr p2)))
  1255.         )
  1256.       (setq mxwzt nil)
  1257.       (setq mxwzt pc)
  1258.     )
  1259.     mxwzt
  1260.   )

  1261. ;;=================================子函数开始=================================
  1262. ;;名称: h_wzpd
  1263. ;;功能: 位置判断、判断实体(块-插入点,线-二端点)是否在窗口之内
  1264. ;;输入: 实体名 窗口二角点
  1265. ;;返回: 在窗口内-中点
  1266. ;;      不在窗口内-T
  1267. ;;      交叉(线)-nil
  1268.   (defun h_wzpd (emx p1 p2 ss / pd1 pd2 pc wzt npd1 npd2 es sins i)
  1269.     (cond
  1270.       ((= (cdr (assoc 0 (entget emx))) "LWPOLYLINE")
  1271.        (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  1272.              pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  1273.        )
  1274.        (setq pc        (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  1275.        (setq npd1 (h_inwi pd1 p1 p2)
  1276.              npd2 (h_inwi pd2 p1 p2)
  1277.        )
  1278.        (cond
  1279.         ((or(and (= npd1 0) (= npd2 1))(and (= npd2 0) (= npd1 1)))
  1280.          (setq wzt nil)
  1281.         )
  1282.          ((or (= npd1 1) (= npd2 1))
  1283.           (setq wzt t)
  1284.          )
  1285.          (t (setq wzt pc))
  1286.        )
  1287.       )
  1288.       (t
  1289.        (setq pc (cdr (assoc 10 (entget emx))))
  1290.        (cond
  1291.         ((= (h_inwi pc p1 p2) 1)
  1292.           (setq wzt t)
  1293.          )
  1294.          ((null (h_inwi pc p1 p2))
  1295.           (if (= (cdr (assoc 0 (entget emx))) "insert")
  1296.             (progn
  1297.               (setq        sins (ssget "c"
  1298.                                     (polar pc (* 0.25 pi) tscale)
  1299.                                     (polar pc (* 0.25 pi) tscale)
  1300.                                     '((0 . "insert,lwpolyline"))
  1301.                              )
  1302.                   )
  1303.                   (setq        wzt pc
  1304.                         i   0
  1305.                   )
  1306.                   (while (and wzt (< i (sslength sins)))
  1307.                     (setq es (ssname sins i))
  1308.                     (if        (not (ssmemb es sins))
  1309.                       (setq wzt t)
  1310.                       (setq i (1+ i))
  1311.                     )
  1312.                   )
  1313.                 )
  1314.                 (setq wzt pc)
  1315.               )
  1316.              )
  1317.              (t (setq wzt pc))
  1318.        )
  1319.       )
  1320.     )
  1321.     wzt
  1322.   )

  1323. ;;=================================子函数开始=================================
  1324. ;;名称: h_wzyz
  1325. ;;功能: 母线位置一致性判断
  1326. ;;输入: 母线 循环号 (方向初值 坐标初值)
  1327. ;;返回: i=0 (方向 坐标)
  1328. ;;      i/=0 位置一致 t
  1329. ;;           位置不一致 nil
  1330.   (defun h_wzyz        (emx i first / fxhsf hszf pmxd1 pmxd2 fxhs hsz wzyz)
  1331.     (setq fxhsf        (car first)
  1332.           hszf        (cadr first)
  1333.     )
  1334.     (setq pmxd1        (append (cdr (assoc 10 (entget emx))) (list 0.0))
  1335.           pmxd2        (append        (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  1336.     )
  1337.     (if(equal (car pmxd1) (car pmxd2) 0.001)
  1338.       (setq fxhs 1 hsz (car pmxd1))
  1339.       (setq fxhs 0 hsz (cadr pmxd1))
  1340.     )
  1341.     (if(= i 0)
  1342.       (setq wzyz (list fxhs hsz))
  1343.       (progn
  1344.         (if (or(not (equal fxhs fxhsf 0.01))
  1345.                 (not (equal hsz hszf 0.01))
  1346.             )
  1347.          (setq wzyz nil)
  1348.           (setq wzyz t)
  1349.         )
  1350.       )
  1351.     )
  1352.     wzyz
  1353.   )

  1354. ;;=================================子函数开始=================================
  1355. ;;名称: h_xzhl
  1356. ;;功能: 选择回路
  1357. ;;输入: 窗口二角点p1,p2
  1358. ;;返回: t-(基点 方向? 宽度 回路选择集 回路数) 方向--0 向下 1 向右 2 向上 3 向左
  1359. ;;       NIL-nil
  1360.   (defun h_xzhl        (p1    p2    /           ssfah fah   pjd   fx           sshl         hlsm
  1361.                  kd    hll   smx   i         mxt   fxhs  hsz   len1         ii
  1362.                  emx   iii   pd1   pd2         mxmin mxmax p1           p2         pc
  1363.                  ss    i4    pcl   first e     pcxl  pcyl  pcc   xzt
  1364.                  len2
  1365.                 )
  1366.     (setq hll nil)
  1367.     (setq smx (ssget "c" p1 p2 '((0 . "lwpolyline") (8 . "mx"))))
  1368.     (if        smx
  1369.       (progn
  1370.         (setq i        0 mxt t)
  1371.         (while (and mxt (< i (sslength smx)))
  1372.           (setq emx (ssname smx i))
  1373.           (if (= i 0)
  1374.             (setq first (h_wzyz emx 0 nil))
  1375.             (setq mxt (h_wzyz emx i first))
  1376.           )
  1377.           (setq i (1+ i))
  1378.         )                                ;判断母线位置一致性
  1379.         (if mxt
  1380.           (progn
  1381.             (setq fxhs (car first)
  1382.                   hsz  (cadr first)
  1383.                   ii   0
  1384.                   len1 (sslength smx)
  1385.             )
  1386.             (repeat len1
  1387.               (setq emx (ssname smx ii))
  1388.               (if (h_mxwz emx p1 p2)
  1389.                 (setq ii (1+ ii))
  1390.                 (ssdel emx smx)
  1391.               )
  1392.             )                                ;删除中心在边界外的母线
  1393.             (setq hlsm (sslength smx))
  1394.             (if        (/= hlsm 0)
  1395.               (progn
  1396.                 (setq iii 0)
  1397.                 (repeat        hlsm
  1398.                   (setq emx (ssname smx iii))
  1399.                   (setq        pd1 (cdr (assoc 10 (entget emx)))
  1400.                         pd2 (cdr (assoc 10 (reverse (entget emx))))
  1401.                   )
  1402.                   (if (= fxhs 0)
  1403.                     (if        (= iii 0)
  1404.                       (setq mxmin (min (car pd1) (car pd2))
  1405.                             mxmax (max (car pd1) (car pd2))
  1406.                       )
  1407.                       (progn
  1408.                         (if (< (min (car pd1) (car pd2)) mxmin)
  1409.                           (setq mxmin (min (car pd1) (car pd2)))
  1410.                         )
  1411.                         (if (> (max (car pd1) (car pd2)) mxmax)
  1412.                           (setq mxmax (max (car pd1) (car pd2)))
  1413.                         )
  1414.                       )
  1415.                     )
  1416.                     (if        (= iii 0)
  1417.                       (setq mxmin (min (cadr pd1) (cadr pd2))
  1418.                             mxmax (max (cadr pd1) (cadr pd2))
  1419.                       )
  1420.                       (progn
  1421.                         (if (< (min (cadr pd1) (cadr pd2)) mxmin)
  1422.                           (setq mxmin (min (cadr pd1) (cadr pd2)))
  1423.                         )
  1424.                         (if (> (max (cadr pd1) (cadr pd2)) mxmax)
  1425.                           (setq mxmax (max (cadr pd1) (cadr pd2)))
  1426.                         )
  1427.                       )
  1428.                     )
  1429.                   )
  1430.                   (setq iii (1+ iii))
  1431.                 )
  1432.                 (setq kd (- mxmax mxmin))
  1433.                 (if (= fxhs 0)
  1434.                   (setq        p1  (list mxmin (cadr p1) 0.0)
  1435.                         p2  (list mxmax (cadr p2) 0.0)
  1436.                         pjd (list (/ (+ mxmin mxmax) 2) hsz 0.0)
  1437.                   )
  1438.                   (setq        p1  (list (car p1) mxmin 0.0)
  1439.                         p2  (list (car p2) mxmax 0.0)
  1440.                         pjd (list hsz (/ (+ mxmin mxmax) 2) 0.0)
  1441.                   )
  1442.                 )                        ;取得母线范围并更新选择集窗口

  1443.                 (setq ss (ssget "c" p1 p2 '((8 . "mx,fah,bxt,xhgg,xmdh"))))
  1444.                 (setq i4   0
  1445.                       pcl  nil
  1446.                       len2 (sslength ss)
  1447.                       xzt  t
  1448.                 )
  1449.                 (while (and xzt (< i4 len2))
  1450.                   (setq e (ssname ss i4))
  1451.                   (if (setq pc (h_wzpd e p1 p2 smx))
  1452.                     (progn
  1453.                       (if (= pc t)
  1454.                         (progn
  1455.                           (ssdel e ss)
  1456.                           (setq len2 (1- len2))
  1457.                         )
  1458.                         (progn
  1459.                           (setq pcl (cons pc pcl))
  1460.                           (setq i4 (1+ i4))
  1461.                         )
  1462.                       )
  1463.                     )
  1464.                     (setq xzt nil)
  1465.                   )
  1466.                 )
  1467.                                         ;去掉多余实体,如果交叉结束
  1468.                 (if xzt
  1469.                   (progn
  1470.                     (setq pcxl (mapcar 'car pcl)
  1471.                           pcyl (mapcar 'cadr pcl)
  1472.                     )
  1473.                     (setq pcc (list (/ (apply '+ pcxl) (length pcl))
  1474.                                     (/ (apply '+ pcyl) (length pcl))
  1475.                                     0.0
  1476.                               )
  1477.                     )
  1478.                     (if        (= fxhs 0)
  1479.                       (if (< (cadr pcc) (cadr pjd))
  1480.                         (setq fx 0)
  1481.                         (setq fx 2)
  1482.                       )
  1483.                       (if (> (car pcc) (car pjd))
  1484.                         (setq fx 1)
  1485.                         (setq fx 3)
  1486.                       )
  1487.                     )
  1488.                     (setq hll (list pjd fx kd ss hlsm))
  1489.                   )
  1490.                   (Xacino "回路选择不完整!" "操作错误" 6)
  1491.                 )
  1492.               )
  1493.             )
  1494.           )
  1495.           (Xacino "选了其他回路的母线!" "操作错误" 6)
  1496.         )
  1497.       )
  1498.     )
  1499.     hll
  1500.   )

  1501. ;;=================================子函数开始=================================
  1502. ;;名称: h_lxdd
  1503. ;;功能: 连续母线端点
  1504. ;;输入: 端点 方向
  1505. ;;返回: 下一端点
  1506.   (defun h_lxdd        (pds fx hljj / p1 p2 lxl pde e hs smxal)
  1507.     (setq pde nil)
  1508.     (setq smxal (ssget "x" '((8 . "mx"))))
  1509.     (if(or (= fx 0) (= fx 2))
  1510.       (setq lxl (list (car pds)))
  1511.       (setq lxl (list (cadr pds)))
  1512.     )
  1513.     (while (setq e (ssname smxal 0))
  1514.       (setq p1 (cdr (assoc 10 (entget e)))
  1515.             p2 (cdr (assoc 10 (reverse (entget e))))
  1516.       )
  1517.       (if (or (= fx 0) (= fx 2))
  1518.         (if (and (equal (cadr p1) (cadr pds) 0.001)
  1519.                  (equal (cadr p2) (cadr pds) 0.001)
  1520.             )
  1521.           (if (> (setq hs (max (car p1) (car p2))) (car pds))
  1522.             (setq lxl (cons hs lxl))
  1523.           )
  1524.         )
  1525.         (if (and (equal (car p1) (car pds) 0.001)
  1526.                  (equal (car p2) (car pds) 0.001)
  1527.             )
  1528.           (if (> (setq hs (max (cadr p1) (cadr p2))) (cadr pds))
  1529.             (setq lxl (cons hs lxl))
  1530.           )
  1531.         )
  1532.       )
  1533.       (ssdel e smxal)
  1534.     )
  1535.     (if(> (length lxl) 1)
  1536.       (setq lxl (qsort h_comp lxl))
  1537.     )
  1538.     (while (and        (> (length lxl) 1)
  1539.                 (< (- (cadr lxl) (car lxl)) (* 1.5 hljj))
  1540.            )
  1541.       (setq lxl (cdr lxl))
  1542.       (if (or (= fx 0) (= fx 2))
  1543.         (setq pde (list(car lxl)(cadr pds)        0.0))
  1544.         (setq pde (list(car pds)(car lxl)        0.0))
  1545.       )
  1546.     )
  1547.     pde
  1548.   )

  1549. ;;=================================子函数开始=================================
  1550. ;;名称: h_lxxz
  1551. ;;功能: 连续回路选择,选择由一点开始的所有连续同方向回路
  1552. ;;输入: 开始点 结束点 方向
  1553. ;;返回: 选择集
  1554.   (defun h_lxxz        (pds pde fx / p1 p2 ss i ls emx dqw1 wzpdt)
  1555.     (setq ss nil)
  1556.     (if        (and pds pde)
  1557.       (progn
  1558.         (cond
  1559.           ((= fx 0)
  1560.            (setq p1 (polar pds (* 1.5 pi) (* 90 tscale))
  1561.                  p2 (polar pde (* 0.5 pi) (* 2 tscale))
  1562.            )
  1563.           )
  1564.           ((= fx 1)
  1565.            (setq p1 (polar pds pi (* 2 tscale))
  1566.                  p2 (polar pde 0 (* 90 tscale))
  1567.            )
  1568.           )
  1569.           ((= fx 2)
  1570.            (setq p1 (polar pds (* 1.5 pi) (* 2 tscale))
  1571.                  p2 (polar pde (* 0.5 pi) (* 90 tscale))
  1572.            )
  1573.           )
  1574.           ((= fx 3)
  1575.            (setq p1 (polar pds pi (* 90 tscale))
  1576.                  p2 (polar pde 0 (* 2 tscale))
  1577.            )
  1578.           )
  1579.         )
  1580.         (setq dqw1 (XScjx))
  1581.         (if (or        (= (h_inwi p1 (car dqw1) (cadr dqw1)) 1)
  1582.                 (= (h_inwi p2 (car dqw1) (cadr dqw1)) 1)
  1583.             )
  1584.           (progn
  1585.             (command "_.zoom"
  1586.                      (list (min (car p1) (caar dqw1))
  1587.                            (min (cadr p1) (cadar dqw1))
  1588.                      )
  1589.                      (list (max (car p2) (caadr dqw1))
  1590.                            (max (cadr p2) (cadadr dqw1))
  1591.                      )
  1592.             )
  1593.           )
  1594.         )
  1595.         (setq ss (ssget "c" p1 p2 '((8 . "mx,bxt,fah,xhgg,xmdh"))))

  1596.         (setq i         0
  1597.               ls (sslength ss)
  1598.         )
  1599.         (repeat        ls
  1600.           (setq emx (ssname ss i))
  1601.           (setq wzpdt (h_wzpd emx p1 p2 ss))
  1602.           (if (or (null wzpdt) (= wzpdt t))
  1603.             (ssdel emx ss)
  1604.             (setq i (1+ i))
  1605.           )
  1606.         )
  1607.       )
  1608.     )
  1609.     ss
  1610.   )

  1611. ;;=================================子函数开始=================================
  1612. ;;名称: h_hlhz
  1613. ;;功能: 回路绘制
  1614. ;;输入: 回路起始点 方向 回路间距
  1615. ;;返回: 无
  1616.   (defun h_hlhz(pjd fx dist data1 data2 sm2 / zdist pds pdmx2 pdmx1 mxkd shu)
  1617.     (setq zdist (* sm2 dist))
  1618.     (Xsetin "Hlklib" "Hlkjj" (rtos (/ dist tscale) 2 2) 1)
  1619.     (shldy pjd fx data1 data2)                ;回路绘制
  1620.     (command "_.color" "_green")
  1621.     (command "_.Layer" "_m" "mx" "_c" 3 "" "")
  1622.     (if        (or (= fx 0) (= fx 2))
  1623.       (setq pds (polar pjd 0 (* -0.5 zdist)))
  1624.       (setq pds (polar pjd (* 0.5 pi) (* -0.5 zdist)))
  1625.     )
  1626.     (setq pdmx1 pds)
  1627.     (repeat sm2
  1628.       (if (or (= fx 0) (= fx 2))
  1629.         (setq pdmx2 (polar pdmx1 0 dist))
  1630.         (setq pdmx2 (polar pdmx1 (* 0.5 pi) dist))
  1631.       )
  1632.       (setq mxkd (atof (Xgetin "Hlklib" "Hlkmx" "0.6" 1)))
  1633.       (setq mxkd (* mxkd tscale))
  1634.       (command "_.pline" pdmx1 "_w" mxkd "" pdmx2 "")
  1635.       (setq pdmx1 pdmx2)
  1636.     )                                        ;母线绘制
  1637.     (setq shu(tblsearch "layer""GDXT"))
  1638.     (if shu(command "_.layer" "_set" "GDXT" ""))
  1639.   )

  1640. ;;=================================子函数开始=================================
  1641. ;;名称: h_sh2
  1642. ;;功能: 回路互换
  1643. ;;输入: 无
  1644. ;;返回: 无
  1645. (defun h_sh2 (/ lll1 ph1 ph2 ttt1 hlxzl1 pjd1 fx1 kd1 sshl1 hlsm1 lll2 ttt2 pjd2
  1646.                 fx2 kd2 hlsm2 hlxzl2 ph3 ph4 lxfs slx pjdn1 pjd1n pjd2n e pme
  1647.                 smov1 smov2 smov pmds1 pmds1n pmds2 pmds2n pmde1 pmde2 jj1 jj2
  1648.                 sshl2 dist zxj ysj zxjn ysjn s2_ss3 s2_lsx mylist ss1 ss2 ss3
  1649.                 list1 list2 ylist1 ylist2 plist1 plist2 xlist1 xlist2 ess1 ess2
  1650.                 fan i fx shu)

  1651. ;;=================================子函数开始=================================
  1652. ;;名称: s2_ss3
  1653. ;;功能: 同一回路中的元件互换时,所选两回路间的定货图
  1654. ;;输入: pmds1 pme mylist
  1655. ;;返回: ss
  1656. (defun s2_ss3(pmds1 pme mylist / ss point1 point2 point3 point4)
  1657.   (setq point1(car mylist))
  1658.   (setq point2(last mylist))
  1659.   (setq point3(list(car pmds1)(cadr point1)(last point1)))
  1660.   (setq point4(list(car pme)(cadr point2)(last point2)))
  1661.   (setq ss(ssget "w" point3 point4))
  1662. )

  1663. ;;=================================子函数开始=================================
  1664. ;;名称: s2_lsx
  1665. ;;功能: 滤表格线
  1666. ;;输入: ss
  1667. ;;返回: ss
  1668. (defun s2_lsx(ss / ename point1 point2 i elist name laye yanse ss1)
  1669.   (setq i 0)
  1670.   (setq ss1 (ssadd))
  1671.   (repeat (sslength ss)
  1672.     (setq ename(ssname ss i))
  1673.     (setq elist(entget ename))
  1674.     (setq name(cdr(assoc 0 elist)))
  1675.     (setq laye(cdr(assoc 8 elist)))
  1676.     (setq yanse(cdr(assoc 62 elist)))
  1677.     (if(and(= name "LINE")(= laye "GDXT")(= yanse 3))(ssadd ename ss1))
  1678.     (setq i(+ i 1))
  1679.   )
  1680.   (if(/=(sslength ss1)0)(setq ss(C_ssgl ss ss1)))
  1681.   ss
  1682. )
  1683. ;;h_sh2主函数开始
  1684.   (setq zxj(car(XScjx)))
  1685.   (setq ysj(last(XScjx)))
  1686.   (setq lll1 t)
  1687.   (while lll1
  1688.     (command "_.undo" "_group")
  1689.     (setq shu(tblsearch "layer""GDXT"))
  1690.     (if shu(command "_.layer" "_set" "GDXT" ""))
  1691.     (setq fan 1)
  1692.     (prompt "\n请用窗口(W)选择互换回路(1):")
  1693.     (setq ph1 1)
  1694.     (while(not(listp ph1))
  1695.       (initget 128)
  1696.       (setq ph1 (getpoint "\n请输入窗口第一点<回车结束>:"))
  1697.     )
  1698.     (if ph1
  1699.       (progn
  1700.         (setq ttt1 t)
  1701.         (while ttt1
  1702.           (setq ph2 1)
  1703.           (while(not(listp ph2))
  1704.             (initget 128)
  1705.             (setq ph2 (getcorner ph1 "\n请输入窗口第二点:"))
  1706.           )
  1707.           (if ph2
  1708.             (progn
  1709.               (setq hlxzl1 (h_xzhl ph1 ph2))
  1710.               (if hlxzl1
  1711.                 (progn
  1712.                   (setq ttt1 nil)
  1713.                   (setq pjd1(nth 0 hlxzl1) fx1(nth 1 hlxzl1) kd1(nth 2 hlxzl1)
  1714.                         sshl1(nth 3 hlxzl1) hlsm1(nth 4 hlxzl1))
  1715.                   (setq i 0)
  1716.                   (repeat(sslength sshl1)(redraw(ssname sshl1 i)3)(setq i (1+ i)))
  1717.                   (setq lxfs 1 slx  sshl1)
  1718.                   (setq lll2 t)
  1719.                   (while lll2
  1720.                     (prompt "\n请用窗口(W)选择互换回路(2):")
  1721.                     (setq ph3 1)
  1722.                     (while(not(listp ph3))
  1723.                       (initget 128)
  1724.                       (setq ph3 (getpoint "\n请输入窗口第一点<回车结束>:"))
  1725.                     )
  1726.                     (if ph3
  1727.                       (progn
  1728.                         (setq ttt2 t)
  1729.                         (while ttt2
  1730.                           (setq ph4 1)
  1731.                           (while (not(listp ph4))
  1732.                             (initget 128)
  1733.                             (setq ph4(getcorner ph3 "\n请输入窗口第二点:"))
  1734.                           )
  1735.                           (if ph4
  1736.                             (progn
  1737.                               (setq hlxzl2 (h_xzhl ph3 ph4))
  1738.                               (if hlxzl2
  1739.                                 (progn
  1740.                                   (setq pjd2(nth 0 hlxzl2) fx2(nth 1 hlxzl2) kd2(nth 2 hlxzl2)
  1741.                                         sshl2(nth 3 hlxzl2) hlsm2(nth 4 hlxzl2))
  1742.                                   (setq jj1(/ kd1 hlsm1) jj2(/ kd2 hlsm2))
  1743.                                   (if(and(equal jj1 jj2 0.01)(= fx1 fx2))
  1744.                                     (progn
  1745.                                       (setq ttt2 nil lll2 nil)
  1746.                                       (setq fx fx1)
  1747.                                       (if(or(= fx 0)(= fx 2))
  1748.                                         (setq pmds1(polar pjd1 0 (/ kd1 2.0))
  1749.                                               pmds2(polar pjd2 0 (/ kd2 2.0))
  1750.                                         )
  1751.                                         (setq pmds1(polar pjd1(* 0.5 pi)(/ kd1 2.0))
  1752.                                               pmds2(polar pjd2(* 0.5 pi)(/ kd2 2.0))
  1753.                                         )
  1754.                                       )
  1755.                                       (setq pmde1(h_lxdd pmds1 fx jj1)
  1756.                                             pmde2(h_lxdd pmds2 fx jj1)
  1757.                                       )
  1758.                                       (cond
  1759.                                         ((or(and(null pmde2)(equal pmde1 pmds2 0.01))
  1760.                                             (and pmde1(equal pmde1 pmde2 0.01)
  1761.                                                  (>(distance2p pmds1 pmde1)
  1762.                                                    (distance2p pmds2 pmde2)
  1763.                                                  )
  1764.                                             )
  1765.                                          )
  1766.                                          (if(or(= fx 0)(= fx 2))
  1767.                                            (setq pjd1n (polar pjd1 0 (/ (- kd2 kd1) 2.0))
  1768.                                                  pjd2n (polar pjd2 0 (/ (- kd2 kd1) 2.0))
  1769.                                                  pmds1n (polar pmds1 0 (- kd2 kd1))
  1770.                                                  pme          (polar pjd2 0 (* -0.5 kd2))
  1771.                                            )
  1772.                                            (setq pjd1n(polar pjd1(* 0.5 pi)(/(- kd2 kd1)2.0))
  1773.                                                  pjd2n(polar pjd2(* 0.5 pi)(/(- kd2 kd1)2.0))
  1774.                                                  pmds1n(polar pmds1(* 0.5 pi)(- kd2 kd1))
  1775.                                                  pme(polar pjd2(* 0.5 pi)(* -0.5 kd2))
  1776.                                            )
  1777.                                          )
  1778.                                          (if(or(>(distance2p pmds1 pmde1)(+(distance2p pmds2 pmde1)kd2))
  1779.                                                (equal(distance2p pmds1 pmde1)
  1780.                                                      (+(distance2p pmds2 pmde1)kd2)5)
  1781.                                             )
  1782.                                            (progn
  1783.                                              (setq mylist (dhtss pjd1 2))
  1784.                                              (if (and mylist(or (= fx1 0)(= fx1 2)))
  1785.                                                (progn
  1786.                                                  (setq zxjn(car (XScjx)))
  1787.                                                  (setq ysjn(last (XScjx)))
  1788.                                                  (C_zoom mylist zxjn ysjn)
  1789.                                                  (setq ss1(last(C_ldel mylist pjd1 kd1 sshl1)))
  1790.                                                  (setq ss1(s2_lsx ss1))
  1791.                                                  (setq ss2(last(C_ldel mylist pjd2 kd2 sshl2)))
  1792.                                                  (setq ss2(s2_lsx ss2))
  1793.                                                  (if(not (equal pmds1 pme 0.01))
  1794.                                                    (progn
  1795.                                                      (setq smov(h_lxxz pmds1 pme fx))
  1796.                                                      (setq ss3(s2_ss3 pmds1 pme mylist))
  1797.                                                      (setq ss3(C_ssgl ss3 smov))
  1798.                                                      (setq ss3(s2_lsx ss3))
  1799.                                                      (if smove(command "_.move" smov "" pmds1 pmds1n))
  1800.                                                      (if ss3(command "_.move" ss3 "" pmds1 pmds1n))
  1801.                                                    )
  1802.                                                  )
  1803.                                                  (if sshl1(command "_.move" sshl1 "" pjd1 pjd2n))
  1804.                                                  (if ss1(command "_.move" ss1 "" pjd1 pjd2n))
  1805.                                                  (if sshl2(command "_.move" sshl2 "" pjd2 pjd1n))
  1806.                                                  (if ss2(command "_.move" ss2 "" pjd2 pjd1n))
  1807.                                                  (command "_.zoom" zxjn ysjn)
  1808.                                                )
  1809.                                                (progn
  1810.                                                  (if(not (equal pmds1 pme 0.01))
  1811.                                                    (progn
  1812.                                                      (setq smov(h_lxxz pmds1 pme fx))
  1813.                                                      (if smov(command "_.move" smov "" pmds1 pmds1n))
  1814.                                                    )
  1815.                                                  )
  1816.                                                  (if sshl1(command "_.move" sshl1 "" pjd1 pjd2n))
  1817.                                                  (if sshl2(command "_.move" sshl2 "" pjd2 pjd1n))
  1818.                                                )
  1819.                                              )
  1820.                                            )
  1821.                                            (Xacino "回路有交叉!" "操作错误" 6)
  1822.                                          )
  1823.                                         )
  1824.                                         ((or(and(null pmde1)(null pmde2)(equal pmds1 pmds2 0.01))
  1825.                                             (and pmde1(equal pmde1 pmde2 0.01)
  1826.                                                   (equal pmds1 pmds2 0.01))
  1827.                                          )
  1828.                                          (Xacino "回路有交叉!" "操作错误" 6)
  1829.                                         )
  1830.                                         ((or(and(null pmde1)(equal pmde2 pmds1 0.01))
  1831.                                             (and pmde1(equal pmde1 pmde2 0.01)
  1832.                                                  (<(distance2p pmds1 pmde1)
  1833.                                                    (distance2p pmds2 pmde2))
  1834.                                             )
  1835.                                          )
  1836.                                          (if(or(= fx 0)(= fx 2))
  1837.                                            (setq pjd1n (polar pjd1 0 (/ (- kd1 kd2) 2.0))
  1838.                                                  pjd2n (polar pjd2 0 (/ (- kd1 kd2) 2.0))
  1839.                                                  pmds1n(polar pmds1 0 (- kd1 kd2))
  1840.                                                  pme   (polar pjd1 0 (* -0.5 kd1))
  1841.                                            )
  1842.                                            (setq pjd1n (polar pjd1(* 0.5 pi)(/(- kd1 kd2)2.0))
  1843.                                                  pjd2n (polar pjd2(* 0.5 pi)(/(- kd1 kd2)2.0))
  1844.                                                  pmds1n(polar pmds1(* 0.5 pi)(- kd1 kd2))
  1845.                                                  pme         (polar pjd1(* 0.5 pi)(* -0.5 kd1))
  1846.                                            )
  1847.                                          )
  1848.                                          (if(or(<(+(distance2p pmds1 pmde2)kd1)
  1849.                                                  (distance2p pmds2 pmde2))
  1850.                                                (equal(+ (distance2p pmds1 pmde2)kd1)
  1851.                                                      (distance2p pmds2 pmde2)5)
  1852.                                            )
  1853.                                            (progn
  1854.                                              (setq mylist(dhtss pjd1 2))
  1855.                                              (if (and mylist(or (= fx1 0)(= fx1 2)))
  1856.                                                (progn
  1857.                                                  (setq zxjn(car (XScjx)))
  1858.                                                  (setq ysjn(last (XScjx)))
  1859.                                                  (C_zoom mylist zxjn ysjn)
  1860.                                                  (setq ss1(last(C_ldel mylist pjd1 kd1 sshl1)))
  1861.                                                  (setq ss1(s2_lsx ss1))
  1862.                                                  (setq ss2(last(C_ldel mylist pjd2 kd2 sshl2)))
  1863.                                                  (setq ss2(s2_lsx ss2))
  1864.                                                  (if(not (equal pmds2 pme 0.01))
  1865.                                                    (progn
  1866.                                                      (setq smov(h_lxxz pmds2 pme fx))
  1867.                                                      (setq ss3(s2_ss3 pmds2 pme mylist))
  1868.                                                      (setq ss3(C_ssgl ss3 smov))
  1869.                                                      (setq ss3(s2_lsx ss3))
  1870.                                                      (if smov(command "_.move" smov "" pmds1 pmds1n))
  1871.                                                      (if ss3(command "_.move" ss3 "" pmds1 pmds1n))
  1872.                                                    )
  1873.                                                  )
  1874.                                                  (if sshl1(command "_.move" sshl1 "" pjd1 pjd2n))
  1875.                                                  (if ss1(command "_.move" ss1 "" pjd1 pjd2n))
  1876.                                                  (if sshl2(command "_.move" sshl2 "" pjd2 pjd1n))
  1877.                                                  (if ss2(command "_.move" ss2 "" pjd2 pjd1n))
  1878.                                                  (command "_.zoom" zxjn ysjn)
  1879.                                                )
  1880.                                                (progn
  1881.                                                  (if(not (equal pmds2 pme 0.01))
  1882.                                                    (progn
  1883.                                                      (setq smov(h_lxxz pmds2 pme fx))
  1884.                                                      (if smov(command "_.move" smov "" pmds1 pmds1n))
  1885.                                                    )
  1886.                                                  )
  1887.                                                  (if sshl1(command "_.move" sshl1 "" pjd1 pjd2n))
  1888.                                                  (if sshl2(command "_.move" sshl2 "" pjd2 pjd1n))
  1889.                                                )
  1890.                                              )
  1891.                                            )
  1892.                                            (Xacino "回路有交叉!" "操作错误" 6)
  1893.                                          )
  1894.                                         )
  1895.                                         (t
  1896.                                          (if (or (= fx 0) (= fx 2))
  1897.                                            (setq pjd1n (polar pjd1 0 (/ (- kd2 kd1)2.0))
  1898.                                                  pjd2n (polar pjd2 0 (/ (- kd1 kd2)2.0))
  1899.                                                  pmds1 (polar pjd1 0 (* 0.5 kd1))
  1900.                                                  pmds1n(polar pmds1 0(- kd2 kd1))
  1901.                                                  pmds2 (polar pjd2 0 (* 0.5 kd2))
  1902.                                                  pmds2n(polar pmds2 0(- kd1 kd2))
  1903.                                            )
  1904.                                            (setq pjd1n (polar pjd1(* 0.5 pi)(/(- kd2 kd1)2.0))
  1905.                                                  pjd2n (polar pjd2(* 0.5 pi)(/(- kd1 kd2)2.0))
  1906.                                                  pmds1 (polar pjd1(* 0.5 pi)(* 0.5 kd1))
  1907.                                                  pmds1n(polar pmds1(* 0.5 pi)(- kd2 kd1))
  1908.                                                  pmds2 (polar pjd2(* 0.5 pi)(* 0.5 kd2))
  1909.                                                  pmds2n(polar pmds2(* 0.5 pi)(- kd1 kd2))
  1910.                                            )
  1911.                                          )
  1912.                                          (setq pmde1 (h_lxdd pmds1 fx jj1))
  1913.                                          (setq smov1 (h_lxxz pmds1 pmde1 fx))
  1914.                                          (setq pmde2 (h_lxdd pmds2 fx jj1))
  1915.                                          (setq smov2 (h_lxxz pmds2 pmde2 fx))
  1916.                                          (setq list1 (dhtss pjd1 2))
  1917.                                          (setq list2 (dhtss pjd2 2))
  1918.                                          (cond
  1919.                                            ((and(or(= fx 0)(= fx 2))list1(null list2))
  1920.                                             (setq zxjn(car (XScjx)))
  1921.                                             (setq ysjn(last (XScjx)))
  1922.                                             (C_zoom list1 zxjn ysjn)
  1923.                                             (setq ylist1(C_xyzb list1 pjd1 kd1))
  1924.                                             (setq plist1(C_ldel list1 pjd1 kd1 sshl1))
  1925.                                             (setq xlist1(C_movt plist1 kd1 kd2 sshl2 pjd2 pjd1n smov1 1))
  1926.                                             (setq ess1 (last plist1))
  1927.                                             (if ess1(command "_.erase" ess1 ""))
  1928.                                             (if sshl1(command        "_.move" sshl1 "" pjd1 pjd2n))
  1929.                                             (if smov2(command "_.move" smov2 "" pmds2 pmds2n))
  1930.                                             (C_slin (car xlist1) ylist1)
  1931.                                             (C_slin (last xlist1) ylist1)
  1932.                                             (C_hlin xlist1 ylist1 hlsm2)
  1933.                                             (command "_.zoom" zxjn ysjn)
  1934.                                           )
  1935.                                            ((and(or(= fx 0)(= fx 2))list2(null list1))
  1936.                                             (setq zxjn(car (XScjx)))
  1937.                                             (setq ysjn(last (XScjx)))
  1938.                                             (C_zoom list2 zxjn ysjn)
  1939.                                             (setq ylist2(C_xyzb list2 pjd2 kd2))
  1940.                                             (setq plist2(C_ldel list2 pjd2 kd2 sshl2))
  1941.                                             (setq xlist2(C_movt plist2 kd2 kd1 sshl1 pjd1 pjd2n smov2 1))
  1942.                                             (setq ess2 (last plist2))
  1943.                                             (if ess2(command "_.erase" ess2 ""))
  1944.                                             (if sshl2(command        "_.move" sshl2 "" pjd2 pjd1n))
  1945.                                             (if smov1(command "_.move" smov1 "" pmds1 pmds1n))
  1946.                                             (C_slin (car xlist2) ylist2)
  1947.                                             (C_slin (last xlist2) ylist2)
  1948.                                             (C_hlin xlist2 ylist2 hlsm1)
  1949.                                             (command "_.zoom" zxjn ysjn)
  1950.                                            )
  1951.                                            ((and(or(= fx 0)(= fx 2))list1 list2)
  1952.                                             (setq zxjn(car (XScjx)))
  1953.                                             (setq ysjn(last (XScjx)))
  1954.                                             (C_zoom list2 zxjn ysjn)
  1955.                                             (setq ylist2(C_xyzb list2 pjd2 kd2))
  1956.                                             (setq plist2(C_ldel list2 pjd2 kd2 sshl2))
  1957.                                             (setq xlist2(C_movt plist2 kd2 kd1 sshl1 pjd1 pjd2n smov2 1))
  1958.                                             (C_zoom list1 zxjn ysjn)
  1959.                                             (setq ylist1(C_xyzb list1 pjd1 kd1))
  1960.                                             (setq plist1(C_ldel list1 pjd1 kd1 sshl1))
  1961.                                             (setq xlist1(C_movt plist1 kd1 kd2 sshl2 pjd2 pjd1n smov1 1))
  1962.                                             (setq ess2 (last plist2))
  1963.                                             (setq ess1 (last plist1))
  1964.                                             (if ess2(command "_.erase" ess2 ""))
  1965.                                             (if ess1(command "_.erase" ess1 ""))
  1966.                                             (C_slin (car xlist2) ylist2)
  1967.                                             (C_slin (last xlist2) ylist2)
  1968.                                             (C_hlin xlist2 ylist2 hlsm1)
  1969.                                             (C_slin (car xlist1) ylist1)
  1970.                                             (C_slin (last xlist1) ylist1)
  1971.                                             (C_hlin xlist1 ylist1 hlsm2)
  1972.                                             (command "_.zoom" zxjn ysjn)
  1973.                                            )
  1974.                                            (t
  1975.                                             (if sshl1(command "_.move" sshl1 "" pjd1 pjd2n))
  1976.                                             (if sshl2(command "_.move" sshl2 "" pjd2 Pjd1n))
  1977.                                             (if smov1(command "_.move" smov1 "" pmds1 pmds1n))
  1978.                                             (if smov2(command "_.move" smov2 "" pmds2 pmds2n))
  1979.                                            )
  1980.                                          )
  1981.                                         )
  1982.                                       )
  1983.                                     )
  1984.                                     (progn
  1985.                                       (Xacino "所选回路的出线方向或间距不对,请重新选择!" "注意" 6)
  1986.                                       (setq ttt2 nil)
  1987.                                     )
  1988.                                   )
  1989.                                 )
  1990.                                 (setq ttt2 nil)
  1991.                               )
  1992.                             )
  1993.                           )
  1994.                         )
  1995.                       )
  1996.                       (setq lll2 nil)
  1997.                     )
  1998.                   )
  1999.                 )
  2000.                 (setq ttt1 nil)
  2001.               )
  2002.             )
  2003.           )
  2004.         )
  2005.       )
  2006.       (setq lll1 nil)
  2007.     )
  2008.     (if(= lxfs 1)
  2009.       (progn
  2010.         (setq i 0)
  2011.         (repeat(sslength slx)(redraw(ssname slx i)4)(setq i(1+ i)))
  2012.         (setq lxfs 0)
  2013.       )
  2014.     )
  2015.     (command "_.undo" "_end")
  2016.     (setq fan 0)
  2017.   )
  2018. )
  2019.   
  2020. ;;================================子函数结束==================================
  2021.   (_inidwg)
  2022.   (princ "\n*回路互换*=Hlhh")
  2023.   (setvar "plinetype" 2)
  2024.   (setvar "cmdecho" 0)
  2025.   (setvar "blipmode" 0)
  2026.   (setvar "pickadd" 1)
  2027.   (setvar "osmode" 0)
  2028.   (setvar "CECOLOR" "green")
  2029.   (setq ucmark (getvar "worlducs"))
  2030.   (if (= ucmark 0)
  2031.     (progn
  2032.       (setq ucs_fo (getvar "ucsfollow"))
  2033.       (if (= ucs_fo 1)(setvar "ucsfollow" 0))
  2034.       (command "_.ucs" "_world")
  2035.     )
  2036.   )
  2037.   (setq lxfs 0 tscale(atof(xrddic "Tabscale" "100")) dqw(XScjx))
  2038.   (setq        o_para(xgetin "Hlklib" "Hlkpara" "" 1)
  2039.         o_mes(xgetin "Hlklib" "RetHlkMes" "" 1)
  2040.         o_jj(xgetin "Hlklib" "Hlkjj" "30" 1)
  2041.   )
  2042.   (menucmd "s=hd25l")
  2043.   (h_sh2)
  2044.   (if(= ucmark 0)(command "_.ucs" "_prev"))
  2045.   (setvar "highlight" 1)
  2046.   (setq dqwn(XScjx))
  2047.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  2048.   (setq *error* olderr olderr nil)
  2049.   (_resdwg)
  2050.   (princ)
  2051. )

  2052. ;;=================================主程序开始=================================
  2053. ;;名称:C:HLINS
  2054. ;;功能:简版回路编辑-回路插入
  2055. ;;输入:无
  2056. ;;返回:无
  2057. (defun C:HLINS(/ tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo
  2058.                 h_sh3 h_XZHL h_WZYZ h_HLHZ h_LXDD h_WZPD h_LXXZ h_mxwz h_inwi
  2059.                 h_comp C_zoom C_ssgl C_xyzb C_ldel C_movt C_movk C_hlin C_slin
  2060.                 s_px)
  2061.   (setq olderr *error*)
  2062.   
  2063. ;;=================================子函数开始=================================
  2064. ;;名称:*error*(错误处理函数)
  2065. ;;功能:当程序发生错误或用户中断时,平静地退出,并还原状态。
  2066. ;;输入:无
  2067. ;;返回:无
  2068. (defun *error* (msg / each)
  2069.   (if (= fan 1)(command "_.undo" "_end"))
  2070.   (if (= fan 1)(command "_.undo" ""))
  2071.   (if (= ucmark 0) (command "_.ucs" "_prev"))
  2072.   (xsetin "Hlklib" "Hlkpara" o_para 1)
  2073.   (xsetin "Hlklib" "RetHlkMes" o_mes 1)
  2074.   (xsetin "Hlklib" "Hlkjj" o_jj 1)
  2075.   (if(= lxfs 1)
  2076.     (progn(setq i 0)(repeat(sslength slx)(redraw(ssname slx i)4)(setq i(1+ i))))
  2077.   )
  2078.   (setq dqwn (XScjx))
  2079.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  2080.   (foreach each
  2081.       '(tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo h_sh3 h_xzhl
  2082.         h_wzyz h_hlhz h_lxdd h_wzpd h_lxxz h_mxwz h_inwi h_comp C_zoom C_ssgl C_xyzb
  2083.         C_ldel C_movt C_movk C_hlin C_slin point1 point2 i ename point3 point4 ss
  2084.         elist point5 point6 biao ylist plist l xlist n nylist s_px yy list1 list2 a b
  2085.         emx p1 p2 p3 pd1 pd2 pc mxwzt wzt npd1 npd2 es sins first fxhsf hszf pmxd1
  2086.         pmxd2 fxhs hsz wzyz ssfah fah pjd fx sshl hlsm kd hll smx mxt len1 ii iii mxmin
  2087.         mxmax i4 pcl e pcxl pcyl pcc xzt len2 pds hljj lxl pde hs smxal ls dqw1 wzpdt
  2088.         dist data1 data2 sm2 zdist pdmx2 mxkd lll1 ph1 ph2 ttt1 hlxzl lll2 ttt2 ph3 ph4
  2089.         slx pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde jj jjn hldata smov zxj
  2090.         ysj zxjn ysjn mylist ess fan name laye yanse hlxzl1 pjd1 fx1 kd1 sshl1 hlsm1 pjd2
  2091.         fx2 kd2 hlsm2 hlxzl2 pjdn1 pjd1n pjd2n pme smov1 smov2 pmds1 pmds1n pmds2 pmds2n
  2092.         pmde1 pmde2 jj1 jj2 sshl2 ss1 ss2 ss3 ylist1 ylist2 plist1 plist2 xlist1 xlist2
  2093.         ess1 ess2 point shu xzb)
  2094.       (set each nil)
  2095.     )
  2096.     (setq each nil)
  2097.     (setq *error* olderr olderr nil)
  2098.     (_resdwg)
  2099.     (princ)
  2100. )

  2101. ;;=================================子函数开始=================================
  2102. ;;名称:C_zoom
  2103. ;;功能:判断是否zoom
  2104. ;;输入:mylist-订货图的角表 zxj-视区左下角 ysj-视区右上角
  2105. ;;返回:无
  2106. (defun C_zoom(mylist zxjn ysjn / point1 point2)
  2107.   (setq point1(car mylist))
  2108.   (setq point2(last mylist))
  2109.   (if(or(>(car zxjn)(car point2))(<(car ysjn)(car point1))
  2110.         (>(cadr zxjn)(cadr point1))(<(cadr ysjn)(cadr point2))
  2111.      )
  2112.     (command "_.ZOOM" "_w" point1 point2)
  2113.   )
  2114. )

  2115. ;;=================================子函数开始=================================
  2116. ;;名称:C_ssgl
  2117. ;;功能:过滤选择集
  2118. ;;输入:ss1-选择集1 ss2-选择集2
  2119. ;;返回:ss1
  2120. (defun C_ssgl(ss1 ss2 / i ename)
  2121.   (setq i 0)
  2122.   (repeat(sslength ss2)
  2123.     (setq ename (ssname ss2 i))
  2124.     (ssdel ename ss1)
  2125.     (setq i (+ i 1))
  2126.   )
  2127.   ss1
  2128. )

  2129. ;;=================================子函数开始=================================
  2130. ;;名称:C_xyzb
  2131. ;;功能:得到所选回路所有横线的Y坐标点集
  2132. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长
  2133. ;;返回:ylist-所选回路所有横线的Y坐标表
  2134. (defun C_xyzb(mylist pjd kd / point1 point2 point3 point4 i ss ename elist
  2135.                                    point5 point6 biao ylist)
  2136.   (setq ylist '())
  2137.   (setq point1(car mylist))
  2138.   (setq point2(last mylist))
  2139.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  2140.   (setq point4(list(+(car point3)kd)(cadr point1)(last point1)))
  2141.   (setq ss (ssget "W" point3 point4 '((0 . "LINE")(8 . "GDXT")(62 . 3))))
  2142.   (setq i 0)
  2143.   (repeat (sslength ss)
  2144.     (setq ename (ssname ss i))
  2145.     (setq elist (entget ename))
  2146.     (setq point5(cdr(assoc 10 elist)))
  2147.     (setq point6(cdr(assoc 11 elist)))
  2148.     (if (equal(cadr point5)(cadr point6)0.1)
  2149.       (progn
  2150.         (setq biao(member (cadr point5) ylist))
  2151.         (if (not biao)
  2152.           (setq ylist(cons (cadr point5) ylist))
  2153.         )
  2154.       )
  2155.     )
  2156.     (setq i (+ i 1))
  2157.   )
  2158.   ylist
  2159. )

  2160. ;;=================================子函数开始=================================
  2161. ;;名称:C_ldel
  2162. ;;功能:得到所选回路列的左上角和右下角
  2163. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长 sshl-回路选择集
  2164. ;;返回:plist-点表(所选回路列的右上角、订货图的右下角和所选回路列的选择集)
  2165. (defun C_ldel(mylist pjd kd sshl / point1 point2 point3 point4 point5 ss plist)
  2166.   (setq point1(car mylist))
  2167.   (setq point2(last mylist))
  2168.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  2169.   (setq point4(list(+(car pjd)(/ kd 2))(cadr point1)(last point2)))
  2170.   (setq ss(ssget "w" point3 point4))
  2171.   (setq ss(C_ssgl ss sshl))
  2172.   (setq point5(list(car point4)(cadr point2)(last point2)))
  2173.   (setq plist (list point5 point1 ss))
  2174. )

  2175. ;;=================================子函数开始=================================
  2176. ;;名称:C_movt
  2177. ;;功能:copy回路并移动表格(从当前图中copy或move)
  2178. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  2179. ;;      sshln-替换回路 pjdf-替换回路的基点 pjd-被替回路的基点 smov-回路选择集
  2180. ;;      a-为0时拷贝,为1时移动,为2时插入
  2181. ;;返回:xlist-新回路列的x坐标
  2182. (defun C_movt(plist kd kdn sshln pjdf pjdn smov a / point1 point2 l point3 point4 xlist ss)
  2183.   (setq point1(car plist))
  2184.   (setq point2(cadr plist))
  2185.   (if(or(= a 0)(= a 1))
  2186.     (progn
  2187.       (setq l(- kd kdn))
  2188.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  2189.       (setq ss(ssget "w" point1 point2))
  2190.       (if (= a 0)
  2191.         (command "_.copy" sshln "" pjdf pjdn)
  2192.         (command "_.move" sshln "" pjdf pjdn)
  2193.       )
  2194.       (if smov
  2195.         (progn
  2196.           (command "_.move" smov "" point1 point3)
  2197.           (setq ss(C_ssgl ss smov))
  2198.         )
  2199.       )
  2200.       (command "_.move" ss "" point1 point3)
  2201.       (setq xlist(list(-(car point1)kd)(car point3)))
  2202.     )
  2203.     (progn
  2204.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  2205.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  2206.       (setq ss (ssget "w" point3 point2))
  2207.       (command "_.copy" sshln "" pjdf pjdn)
  2208.       (if smov
  2209.         (progn
  2210.           (command "_.move" smov "" point3 point4)
  2211.           (setq ss(C_ssgl ss smov))
  2212.         )
  2213.       )
  2214.       (command "_.move" ss "" point3 point4)
  2215.       (setq xlist(list(car point3)(car point4)))
  2216.     )
  2217.   )
  2218.   xlist
  2219. )

  2220. ;;=================================子函数开始=================================
  2221. ;;名称:C_movk
  2222. ;;功能:copy回路并移动表格(从图库中取)
  2223. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  2224. ;;      pjdn-替换回路 fx-回路方向 dist、data1、data2、sm2-调回路库的参数 smov-回路选择集
  2225. ;;      a-为时替换回路,为2时插入回路
  2226. ;;返回:xlist-新回路列的两个x坐标
  2227. (defun C_movk(plist kd kdn pjdn fx dist data1 data2 sm2 smov a / point1 point2 l point3
  2228.               point4 xlist ss)
  2229.   (setq point1(car plist))
  2230.   (setq point2(cadr plist))
  2231.   (if (= a 1)
  2232.     (progn
  2233.       (setq l(- kd kdn))
  2234.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  2235.       (setq ss(ssget "w" point1 point2))
  2236.       (h_hlhz pjdn fx dist data1 data2 sm2)
  2237.       (if smov
  2238.         (progn
  2239.           (command "_.move" smov "" point1 point3)
  2240.           (setq ss(C_ssgl ss smov))
  2241.         )
  2242.       )
  2243.       (command "_.move" ss "" point1 point3)
  2244.       (setq xlist(list(-(car point1)kd)(car point3)))
  2245.     )
  2246.     (progn
  2247.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  2248.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  2249.       (setq ss (ssget "w" point3 point2))
  2250.       (h_hlhz pjdn fx dist data1 data2 sm2)
  2251.       (if smov
  2252.         (progn
  2253.           (command "_.move" smov "" point3 point4)
  2254.           (setq ss(C_ssgl ss smov))
  2255.         )
  2256.       )
  2257.       (command "_.move" ss "" point3 point4)
  2258.       (setq xlist(list(car point3)(car point4)))
  2259.     )
  2260.   )
  2261.   xlist
  2262. )

  2263. ;;=================================子函数开始=================================
  2264. ;;名称:C_hlin
  2265. ;;功能:画横线
  2266. ;;输入:xlist-新订货图的x坐标表 ylist-所选订货图所有横线的Y坐标表 hlsm-回路数目
  2267. ;;返回:无
  2268. (defun C_hlin(xlist ylist hlsm / point1 point2 i l n)
  2269.   (setq i 0)
  2270.   (setq l(/(abs(-(car xlist)(last xlist)))hlsm))
  2271.   (repeat (length ylist)
  2272.     (setq n 0)
  2273.     (repeat hlsm
  2274.       (setq point1(list(+(car xlist)(* l n))(nth i ylist)0.0))
  2275.       (setq point2(list(+(car xlist)(* l (+ n 1)))(nth i ylist)0.0))
  2276.       (command "_.line" point1 point2 "")
  2277.       (setq n (+ n 1))
  2278.     )
  2279.     (setq i (+ i 1))
  2280.   )
  2281. )

  2282. ;;=================================子函数开始=================================
  2283. ;;名称:s_px
  2284. ;;功能:排序(从大到小)
  2285. ;;输入:ylist-所选订货图所有横线的Y坐标表
  2286. ;;返回:nylist
  2287.   (defun s_px(ylist / i nylist yy list1 list2)
  2288.     (setq nylist '())
  2289.     (while (/= (length ylist) 0)
  2290.       (setq i 1)
  2291.       (setq yy (nth 0 ylist))
  2292.       (repeat (-(length ylist)1)
  2293.         (if (> yy (nth i ylist))
  2294.           (setq yy (nth i ylist))
  2295.         )
  2296.         (setq i (+ i 1))
  2297.       )
  2298.       (setq nylist (cons yy nylist))
  2299.       (setq list1 (cdr (member yy ylist)))
  2300.       (setq list2 (cdr (member yy (reverse ylist))))
  2301.       (setq ylist (append list1 list2))
  2302.     )
  2303.     nylist
  2304.   )

  2305. ;;=================================子函数开始=================================
  2306. ;;名称:C_slin
  2307. ;;功能:画竖线
  2308. ;;输入:xzb-x坐标 ylist-所选订货图所有横线的Y坐标表
  2309. ;;返回:无
  2310. (defun C_slin(xzb ylist / nylist point1 point2 i)
  2311.   (setq i 0)
  2312.   (setq nylist(s_px ylist))
  2313.   (repeat (-(length nylist)1)
  2314.     (setq point1(list xzb (nth i nylist)))
  2315.     (setq point2(list xzb (nth (+ i 1) nylist)))
  2316.     (command "_.line" point1 point2 "")
  2317.     (setq i (+ i 1))
  2318.   )
  2319. )
  2320.   
  2321. ;;=================================子函数开始=================================
  2322. ;;名称:h_comp
  2323. ;;功能:计算两值的差(用于排序)
  2324. ;;输入:a、b
  2325. ;;返回:两值的差
  2326.   (defun h_comp (a b)
  2327.     (- a b)
  2328.   )

  2329. ;;=================================子函数开始=================================
  2330. ;;名称: h_inwi
  2331. ;;功能: 判断p1是否在p2 p3组成的窗口内
  2332. ;;输入: p1 p2 p3
  2333. ;;返回: 0-在窗口内、1-在窗口外、nil-边界上
  2334.   (defun h_inwi (p1 p2 p3)
  2335.     (cond
  2336.       ((and(< (car p1) (- (max (car p2) (car p3)) tscale))
  2337.             (> (car p1) (+ (min (car p2) (car p3)) tscale))
  2338.             (< (cadr p1) (- (max (cadr p2) (cadr p3)) tscale))
  2339.             (> (cadr p1) (+ (min (cadr p2) (cadr p3)) tscale))
  2340.         )
  2341.         0
  2342.       )
  2343.       ((or(> (car p1) (+ (max (car p2) (car p3)) tscale))
  2344.            (< (car p1) (- (min (car p2) (car p3)) tscale))
  2345.            (> (cadr p1) (+ (max (cadr p2) (cadr p3)) tscale))
  2346.            (< (cadr p1) (- (min (cadr p2) (cadr p3)) tscale))
  2347.         )
  2348.         1
  2349.       )
  2350.       (t nil)
  2351.     )
  2352.   )

  2353. ;;=================================子函数开始=================================
  2354. ;;名称: h_mxwz
  2355. ;;功能: 母线位置判断
  2356. ;;输入: emx p1 p2
  2357. ;;返回: mxwzt
  2358.   (defun h_mxwz        (emx p1 p2 / pd1 pd2 pc mxwzt)
  2359.     (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  2360.           pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  2361.     )
  2362.     (setq pc (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  2363.     (if        (or (> (car pc) (max (car p1) (car p2)))
  2364.             (> (cadr pc) (max (cadr p1) (cadr p2)))
  2365.             (< (car pc) (min (car p1) (car p2)))
  2366.             (< (cadr pc) (min (cadr p1) (cadr p2)))
  2367.         )
  2368.       (setq mxwzt nil)
  2369.       (setq mxwzt pc)
  2370.     )
  2371.     mxwzt
  2372.   )

  2373. ;;=================================子函数开始=================================
  2374. ;;名称: h_wzpd
  2375. ;;功能: 位置判断、判断实体(块-插入点,线-二端点)是否在窗口之内
  2376. ;;输入: 实体名 窗口二角点
  2377. ;;返回: 在窗口内-中点
  2378. ;;      不在窗口内-T
  2379. ;;      交叉(线)-nil
  2380.   (defun h_wzpd (emx p1 p2 ss / pd1 pd2 pc wzt npd1 npd2 es sins i)
  2381.     (cond
  2382.       ((= (cdr (assoc 0 (entget emx))) "LWPOLYLINE")
  2383.        (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  2384.              pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  2385.        )
  2386.        (setq pc        (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  2387.        (setq npd1 (h_inwi pd1 p1 p2)
  2388.              npd2 (h_inwi pd2 p1 p2)
  2389.        )
  2390.        (cond
  2391.         ((or(and (= npd1 0) (= npd2 1))(and (= npd2 0) (= npd1 1)))
  2392.          (setq wzt nil)
  2393.         )
  2394.          ((or (= npd1 1) (= npd2 1))
  2395.           (setq wzt t)
  2396.          )
  2397.          (t (setq wzt pc))
  2398.        )
  2399.       )
  2400.       (t
  2401.        (setq pc (cdr (assoc 10 (entget emx))))
  2402.        (cond
  2403.         ((= (h_inwi pc p1 p2) 1)
  2404.           (setq wzt t)
  2405.          )
  2406.          ((null (h_inwi pc p1 p2))
  2407.           (if (= (cdr (assoc 0 (entget emx))) "insert")
  2408.             (progn
  2409.               (setq        sins (ssget "c"
  2410.                                     (polar pc (* 0.25 pi) tscale)
  2411.                                     (polar pc (* 0.25 pi) tscale)
  2412.                                     '((0 . "insert,lwpolyline"))
  2413.                              )
  2414.                   )
  2415.                   (setq        wzt pc
  2416.                         i   0
  2417.                   )
  2418.                   (while (and wzt (< i (sslength sins)))
  2419.                     (setq es (ssname sins i))
  2420.                     (if        (not (ssmemb es sins))
  2421.                       (setq wzt t)
  2422.                       (setq i (1+ i))
  2423.                     )
  2424.                   )
  2425.                 )
  2426.                 (setq wzt pc)
  2427.               )
  2428.              )
  2429.              (t (setq wzt pc))
  2430.        )
  2431.       )
  2432.     )
  2433.     wzt
  2434.   )

  2435. ;;=================================子函数开始=================================
  2436. ;;名称: h_wzyz
  2437. ;;功能: 母线位置一致性判断
  2438. ;;输入: 母线 循环号 (方向初值 坐标初值)
  2439. ;;返回: i=0 (方向 坐标)
  2440. ;;      i/=0 位置一致 t
  2441. ;;           位置不一致 nil
  2442.   (defun h_wzyz        (emx i first / fxhsf hszf pmxd1 pmxd2 fxhs hsz wzyz)
  2443.     (setq fxhsf        (car first)
  2444.           hszf        (cadr first)
  2445.     )
  2446.     (setq pmxd1        (append (cdr (assoc 10 (entget emx))) (list 0.0))
  2447.           pmxd2        (append        (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  2448.     )
  2449.     (if(equal (car pmxd1) (car pmxd2) 0.001)
  2450.       (setq fxhs 1 hsz (car pmxd1))
  2451.       (setq fxhs 0 hsz (cadr pmxd1))
  2452.     )
  2453.     (if(= i 0)
  2454.       (setq wzyz (list fxhs hsz))
  2455.       (progn
  2456.         (if (or(not (equal fxhs fxhsf 0.01))
  2457.                 (not (equal hsz hszf 0.01))
  2458.             )
  2459.          (setq wzyz nil)
  2460.           (setq wzyz t)
  2461.         )
  2462.       )
  2463.     )
  2464.     wzyz
  2465.   )

  2466. ;;=================================子函数开始=================================
  2467. ;;名称: h_xzhl
  2468. ;;功能: 选择回路
  2469. ;;输入: 窗口二角点p1,p2
  2470. ;;返回: t-(基点 方向? 宽度 回路选择集 回路数) 方向--0 向下 1 向右 2 向上 3 向左
  2471. ;;       NIL-nil
  2472.   (defun h_xzhl        (p1    p2    /           ssfah fah   pjd   fx           sshl         hlsm
  2473.                  kd    hll   smx   i         mxt   fxhs  hsz   len1         ii
  2474.                  emx   iii   pd1   pd2         mxmin mxmax p1           p2         pc
  2475.                  ss    i4    pcl   first e     pcxl  pcyl  pcc   xzt
  2476.                  len2
  2477.                 )
  2478.     (setq hll nil)
  2479.     (setq smx (ssget "c" p1 p2 '((0 . "lwpolyline") (8 . "mx"))))
  2480.     (if        smx
  2481.       (progn
  2482.         (setq i        0 mxt t)
  2483.         (while (and mxt (< i (sslength smx)))
  2484.           (setq emx (ssname smx i))
  2485.           (if (= i 0)
  2486.             (setq first (h_wzyz emx 0 nil))
  2487.             (setq mxt (h_wzyz emx i first))
  2488.           )
  2489.           (setq i (1+ i))
  2490.         )                                ;判断母线位置一致性
  2491.         (if mxt
  2492.           (progn
  2493.             (setq fxhs (car first)
  2494.                   hsz  (cadr first)
  2495.                   ii   0
  2496.                   len1 (sslength smx)
  2497.             )
  2498.             (repeat len1
  2499.               (setq emx (ssname smx ii))
  2500.               (if (h_mxwz emx p1 p2)
  2501.                 (setq ii (1+ ii))
  2502.                 (ssdel emx smx)
  2503.               )
  2504.             )                                ;删除中心在边界外的母线
  2505.             (setq hlsm (sslength smx))
  2506.             (if        (/= hlsm 0)
  2507.               (progn
  2508.                 (setq iii 0)
  2509.                 (repeat        hlsm
  2510.                   (setq emx (ssname smx iii))
  2511.                   (setq        pd1 (cdr (assoc 10 (entget emx)))
  2512.                         pd2 (cdr (assoc 10 (reverse (entget emx))))
  2513.                   )
  2514.                   (if (= fxhs 0)
  2515.                     (if        (= iii 0)
  2516.                       (setq mxmin (min (car pd1) (car pd2))
  2517.                             mxmax (max (car pd1) (car pd2))
  2518.                       )
  2519.                       (progn
  2520.                         (if (< (min (car pd1) (car pd2)) mxmin)
  2521.                           (setq mxmin (min (car pd1) (car pd2)))
  2522.                         )
  2523.                         (if (> (max (car pd1) (car pd2)) mxmax)
  2524.                           (setq mxmax (max (car pd1) (car pd2)))
  2525.                         )
  2526.                       )
  2527.                     )
  2528.                     (if        (= iii 0)
  2529.                       (setq mxmin (min (cadr pd1) (cadr pd2))
  2530.                             mxmax (max (cadr pd1) (cadr pd2))
  2531.                       )
  2532.                       (progn
  2533.                         (if (< (min (cadr pd1) (cadr pd2)) mxmin)
  2534.                           (setq mxmin (min (cadr pd1) (cadr pd2)))
  2535.                         )
  2536.                         (if (> (max (cadr pd1) (cadr pd2)) mxmax)
  2537.                           (setq mxmax (max (cadr pd1) (cadr pd2)))
  2538.                         )
  2539.                       )
  2540.                     )
  2541.                   )
  2542.                   (setq iii (1+ iii))
  2543.                 )
  2544.                 (setq kd (- mxmax mxmin))
  2545.                 (if (= fxhs 0)
  2546.                   (setq        p1  (list mxmin (cadr p1) 0.0)
  2547.                         p2  (list mxmax (cadr p2) 0.0)
  2548.                         pjd (list (/ (+ mxmin mxmax) 2) hsz 0.0)
  2549.                   )
  2550.                   (setq        p1  (list (car p1) mxmin 0.0)
  2551.                         p2  (list (car p2) mxmax 0.0)
  2552.                         pjd (list hsz (/ (+ mxmin mxmax) 2) 0.0)
  2553.                   )
  2554.                 )                        ;取得母线范围并更新选择集窗口

  2555.                 (setq ss (ssget "c" p1 p2 '((8 . "mx,fah,bxt,xhgg,xmdh"))))
  2556.                 (setq i4   0
  2557.                       pcl  nil
  2558.                       len2 (sslength ss)
  2559.                       xzt  t
  2560.                 )
  2561.                 (while (and xzt (< i4 len2))
  2562.                   (setq e (ssname ss i4))
  2563.                   (if (setq pc (h_wzpd e p1 p2 smx))
  2564.                     (progn
  2565.                       (if (= pc t)
  2566.                         (progn
  2567.                           (ssdel e ss)
  2568.                           (setq len2 (1- len2))
  2569.                         )
  2570.                         (progn
  2571.                           (setq pcl (cons pc pcl))
  2572.                           (setq i4 (1+ i4))
  2573.                         )
  2574.                       )
  2575.                     )
  2576.                     (setq xzt nil)
  2577.                   )
  2578.                 )
  2579.                                         ;去掉多余实体,如果交叉结束
  2580.                 (if xzt
  2581.                   (progn
  2582.                     (setq pcxl (mapcar 'car pcl)
  2583.                           pcyl (mapcar 'cadr pcl)
  2584.                     )
  2585.                     (setq pcc (list (/ (apply '+ pcxl) (length pcl))
  2586.                                     (/ (apply '+ pcyl) (length pcl))
  2587.                                     0.0
  2588.                               )
  2589.                     )
  2590.                     (if        (= fxhs 0)
  2591.                       (if (< (cadr pcc) (cadr pjd))
  2592.                         (setq fx 0)
  2593.                         (setq fx 2)
  2594.                       )
  2595.                       (if (> (car pcc) (car pjd))
  2596.                         (setq fx 1)
  2597.                         (setq fx 3)
  2598.                       )
  2599.                     )
  2600.                     (setq hll (list pjd fx kd ss hlsm))
  2601.                   )
  2602.                   (Xacino "回路选择不完整!" "操作错误" 6)
  2603.                 )
  2604.               )
  2605.             )
  2606.           )
  2607.           (Xacino "选了其他回路的母线!" "操作错误" 6)
  2608.         )
  2609.       )
  2610.     )
  2611.     hll
  2612.   )

  2613. ;;=================================子函数开始=================================
  2614. ;;名称: h_lxdd
  2615. ;;功能: 连续母线端点
  2616. ;;输入: 端点 方向
  2617. ;;返回: 下一端点
  2618.   (defun h_lxdd        (pds fx hljj / p1 p2 lxl pde e hs smxal)
  2619.     (setq pde nil)
  2620.     (setq smxal (ssget "x" '((8 . "mx"))))
  2621.     (if(or (= fx 0) (= fx 2))
  2622.       (setq lxl (list (car pds)))
  2623.       (setq lxl (list (cadr pds)))
  2624.     )
  2625.     (while (setq e (ssname smxal 0))
  2626.       (setq p1 (cdr (assoc 10 (entget e)))
  2627.             p2 (cdr (assoc 10 (reverse (entget e))))
  2628.       )
  2629.       (if (or (= fx 0) (= fx 2))
  2630.         (if (and (equal (cadr p1) (cadr pds) 0.001)
  2631.                  (equal (cadr p2) (cadr pds) 0.001)
  2632.             )
  2633.           (if (> (setq hs (max (car p1) (car p2))) (car pds))
  2634.             (setq lxl (cons hs lxl))
  2635.           )
  2636.         )
  2637.         (if (and (equal (car p1) (car pds) 0.001)
  2638.                  (equal (car p2) (car pds) 0.001)
  2639.             )
  2640.           (if (> (setq hs (max (cadr p1) (cadr p2))) (cadr pds))
  2641.             (setq lxl (cons hs lxl))
  2642.           )
  2643.         )
  2644.       )
  2645.       (ssdel e smxal)
  2646.     )
  2647.     (if(> (length lxl) 1)
  2648.       (setq lxl (qsort h_comp lxl))
  2649.     )
  2650.     (while (and        (> (length lxl) 1)
  2651.                 (< (- (cadr lxl) (car lxl)) (* 1.5 hljj))
  2652.            )
  2653.       (setq lxl (cdr lxl))
  2654.       (if (or (= fx 0) (= fx 2))
  2655.         (setq pde (list(car lxl)(cadr pds)        0.0))
  2656.         (setq pde (list(car pds)(car lxl)        0.0))
  2657.       )
  2658.     )
  2659.     pde
  2660.   )

  2661. ;;=================================子函数开始=================================
  2662. ;;名称: h_lxxz
  2663. ;;功能: 连续回路选择,选择由一点开始的所有连续同方向回路
  2664. ;;输入: 开始点 结束点 方向
  2665. ;;返回: 选择集
  2666.   (defun h_lxxz        (pds pde fx / p1 p2 ss i ls emx dqw1 wzpdt)
  2667.     (setq ss nil)
  2668.     (if        (and pds pde)
  2669.       (progn
  2670.         (cond
  2671.           ((= fx 0)
  2672.            (setq p1 (polar pds (* 1.5 pi) (* 90 tscale))
  2673.                  p2 (polar pde (* 0.5 pi) (* 2 tscale))
  2674.            )
  2675.           )
  2676.           ((= fx 1)
  2677.            (setq p1 (polar pds pi (* 2 tscale))
  2678.                  p2 (polar pde 0 (* 90 tscale))
  2679.            )
  2680.           )
  2681.           ((= fx 2)
  2682.            (setq p1 (polar pds (* 1.5 pi) (* 2 tscale))
  2683.                  p2 (polar pde (* 0.5 pi) (* 90 tscale))
  2684.            )
  2685.           )
  2686.           ((= fx 3)
  2687.            (setq p1 (polar pds pi (* 90 tscale))
  2688.                  p2 (polar pde 0 (* 2 tscale))
  2689.            )
  2690.           )
  2691.         )
  2692.         (setq dqw1 (XScjx))
  2693.         (if (or        (= (h_inwi p1 (car dqw1) (cadr dqw1)) 1)
  2694.                 (= (h_inwi p2 (car dqw1) (cadr dqw1)) 1)
  2695.             )
  2696.           (progn
  2697.             (command "_.zoom"
  2698.                      (list (min (car p1) (caar dqw1))
  2699.                            (min (cadr p1) (cadar dqw1))
  2700.                      )
  2701.                      (list (max (car p2) (caadr dqw1))
  2702.                            (max (cadr p2) (cadadr dqw1))
  2703.                      )
  2704.             )
  2705.           )
  2706.         )
  2707.         (setq ss (ssget "c" p1 p2 '((8 . "mx,bxt,fah,xhgg,xmdh"))))

  2708.         (setq i         0
  2709.               ls (sslength ss)
  2710.         )
  2711.         (repeat        ls
  2712.           (setq emx (ssname ss i))
  2713.           (setq wzpdt (h_wzpd emx p1 p2 ss))
  2714.           (if (or (null wzpdt) (= wzpdt t))
  2715.             (ssdel emx ss)
  2716.             (setq i (1+ i))
  2717.           )
  2718.         )
  2719.       )
  2720.     )
  2721.     ss
  2722.   )

  2723. ;;=================================子函数开始=================================
  2724. ;;名称: h_hlhz
  2725. ;;功能: 回路绘制
  2726. ;;输入: 回路起始点 方向 回路间距
  2727. ;;返回: 无
  2728.   (defun h_hlhz(pjd fx dist data1 data2 sm2 / zdist pds pdmx2 pdmx1 mxkd shu)
  2729.     (setq zdist (* sm2 dist))
  2730.     (Xsetin "Hlklib" "Hlkjj" (rtos (/ dist tscale) 2 2) 1)
  2731.     (shldy pjd fx data1 data2)                ;回路绘制
  2732.     (command "_.color" "_green")
  2733.     (command "_.Layer" "_m" "mx" "_c" 3 "" "")
  2734.     (if        (or (= fx 0) (= fx 2))
  2735.       (setq pds (polar pjd 0 (* -0.5 zdist)))
  2736.       (setq pds (polar pjd (* 0.5 pi) (* -0.5 zdist)))
  2737.     )
  2738.     (setq pdmx1 pds)
  2739.     (repeat sm2
  2740.       (if (or (= fx 0) (= fx 2))
  2741.         (setq pdmx2 (polar pdmx1 0 dist))
  2742.         (setq pdmx2 (polar pdmx1 (* 0.5 pi) dist))
  2743.       )
  2744.       (setq mxkd (atof (Xgetin "Hlklib" "Hlkmx" "0.6" 1)))
  2745.       (setq mxkd (* mxkd tscale))
  2746.       (command "_.pline" pdmx1 "_w" mxkd "" pdmx2 "")
  2747.       (setq pdmx1 pdmx2)
  2748.     )                                        ;母线绘制
  2749.     (setq shu(tblsearch "layer""GDXT"))
  2750.     (if shu(command "_.layer" "_set" "GDXT" ""))
  2751.   )

  2752. ;;=================================子函数开始=================================
  2753. ;;名称: h_sh3
  2754. ;;功能: 回路插入
  2755. ;;输入: 无
  2756. ;;返回: 无
  2757. (defun h_sh3(/ lll1 ph1        ph2 ttt1 hlxzl pjd fx kd sshl hlsm lll2 ttt2 ph3 ph4
  2758.                lxfs slx        pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde
  2759.                jj jjn sshl hldata i data1 data2 dist sm2 smov zxj ysj zxjn ysjn
  2760.                mylist ylist plist xlist fan shu)
  2761.   (setq zxj(car(XScjx)))
  2762.   (setq ysj(last(XScjx)))
  2763.   (setq lll1 t)
  2764.   (while lll1
  2765.     (command "_.undo" "_group")
  2766.     (setq shu(tblsearch "layer""GDXT"))
  2767.     (if shu(command "_.layer" "_set" "GDXT" ""))
  2768.     (setq fan 1)
  2769.     (prompt"\n请用窗口(W)选择回路(在所选回路的左边或下边插入):")
  2770.     (setq ph1 1)
  2771.     (while(not(listp ph1))
  2772.       (initget 128)
  2773.       (setq ph1 (getpoint "\n请输入窗口第一点<回车结束>:"))
  2774.     )
  2775.     (if ph1
  2776.       (progn
  2777.         (setq ttt1 t)
  2778.         (while ttt1
  2779.           (setq ph2 1)
  2780.           (while(not(listp ph2))
  2781.             (initget 128)
  2782.             (setq ph2 (getcorner ph1 "\n请输入窗口第二点:"))
  2783.           )
  2784.           (if ph2
  2785.             (progn
  2786.               (setq hlxzl (h_xzhl ph1 ph2))
  2787.               (if hlxzl
  2788.                 (progn
  2789.                   (setq ttt1 nil i 0)
  2790.                   (setq pjd  (nth 0 hlxzl)
  2791.                         fx   (nth 1 hlxzl)
  2792.                         kd   (nth 2 hlxzl)
  2793.                         sshl (nth 3 hlxzl)
  2794.                         hlsm (nth 4 hlxzl)
  2795.                   )
  2796.                   (repeat(sslength sshl)(redraw(ssname sshl i)3)(setq i(1+ i)))
  2797.                   (setq lxfs 1 slx  sshl)
  2798.                   (if(=(IfWndVis "hlklibclass") 0)
  2799.                     (hlklib 0 1 "s" 0 1 1 0 0)
  2800.                     (progn
  2801.                       (xsetin "Hlklib" "Hlkpara" "0&1&0&1&1&0&0" 1)
  2802.                       (xsetin "Hlklib" "RetHlkMes" "s" 1)
  2803.                     )
  2804.                   )
  2805.                   (setq lll2 t)
  2806.                   (while lll2
  2807.                     (prompt "\n请用窗口(W)或从图库选择插入回路:")
  2808.                     (setq ph3 1)
  2809.                     (while(and(/= ph3 "s")(not(listp ph3)))
  2810.                       (initget 128 "s")
  2811.                       (setq ph3(getpoint"\n请输入窗口第一点或请选取方案<回车结束>:"))
  2812.                     )
  2813.                     (cond
  2814.                       ((and ph3 (listp ph3))
  2815.                        (setq ttt2 t)
  2816.                        (while        ttt2
  2817.                          (setq ph4 1)
  2818.                          (while(not(listp ph4))
  2819.                            (initget 128)
  2820.                            (setq ph4 (getcorner ph3 "\n请输入窗口第二点:"))
  2821.                          )
  2822.                          (if ph4
  2823.                            (progn
  2824.                              (setq hlxzln (h_xzhl ph3 ph4))
  2825.                              (if hlxzln
  2826.                                (progn
  2827.                                  (setq pjdf(nth 0 hlxzln) fxn(nth 1 hlxzln) kdn(nth 2 hlxzln)
  2828.                                        sshln(nth 3 hlxzln) hlsmn(nth 4 hlxzln))
  2829.                                  (setq jj(/ kd hlsm) jjn(/ kdn hlsmn))
  2830.                                  (if(and(equal jj jjn 0.01)(= fx fxn))
  2831.                                    (progn
  2832.                                      (setq ttt2 nil lll2 nil)
  2833.                                      (if(or(= fx 0)(= fx 2))
  2834.                                        (setq pjdn(polar pjd 0(/(- kdn kd)2.0))
  2835.                                              pmds(polar pjd 0(/ kd -2.0))
  2836.                                              pmdsn(polar pmds 0 kdn)
  2837.                                        )
  2838.                                        (setq pjdn(polar pjd (* 0.5 pi)(/(- kdn kd)2.0))
  2839.                                              pmds(polar pjd(* 0.5 pi)(/ kd -2.0))
  2840.                                              pmdsn(polar pmds(* 0.5 pi) kdn)
  2841.                                        )
  2842.                                      )
  2843.                                      (setq pmde (h_lxdd pmds fx jj))
  2844.                                      (setq smov (h_lxxz pmds pmde fx))
  2845.                                      (setq mylist(dhtss pjd 2))
  2846.                                      (if(and mylist(or(= fx 0)(= fx 2)))
  2847.                                        (progn
  2848.                                          (setq zxjn(car(XScjx)))
  2849.                                          (setq ysjn(last(XScjx)))
  2850.                                          (C_zoom mylist zxjn ysjn)
  2851.                                          (setq ylist(C_xyzb mylist pjd kd))
  2852.                                          (setq plist(C_ldel mylist pjd kd sshl))
  2853.                                          (setq xlist(C_movt plist kd kdn sshln pjdf pjdn smov 2))
  2854.                                          (C_slin (car xlist) ylist)
  2855.                                          (C_hlin xlist ylist hlsmn)
  2856.                                          (command "_.zoom" zxj ysj)
  2857.                                        )
  2858.                                        (progn
  2859.                                          (command "_.copy" sshln "" pjdf pjdn)
  2860.                                          (if smov(command "_.move" smov "" pmds pmdsn))
  2861.                                        )
  2862.                                      )
  2863.                                    )
  2864.                                    (progn
  2865.                                      (Xacino "所选回路的出线方向或间距不对,请重新选择!" "注意" 6)
  2866.                                      (setq ttt2 nil)
  2867.                                    )
  2868.                                  )
  2869.                                )
  2870.                                (setq ttt2 nil)
  2871.                              )
  2872.                            )
  2873.                          )
  2874.                        )
  2875.                       )
  2876.                       ((= ph3 "s")
  2877.                        (setq lll2 nil)
  2878.                        (setq hldata (xgetin "Hlklib" "Hlkdata" "" 1))
  2879.                        (setq data1(_getnS hldata 1 "&") data2(_getnS hldata 2 "&"))
  2880.                        (setq dist (/ kd hlsm))
  2881.                        (setq sm2 (fhlnum data1 data2))
  2882.                        (setq kdn (* sm2 dist))
  2883.                        (if (or (= fx 0) (= fx 2))
  2884.                          (setq pjdn  (polar pjd 0 (/ (- kdn kd) 2.0))
  2885.                                pmds  (polar pjd 0 (/ kd -2.0))
  2886.                                pmdsn (polar pmds 0 kdn)
  2887.                          )
  2888.                          (setq pjdn  (polar pjd (* 0.5 pi) (/ (- kdn kd) 2.0))
  2889.                                pmds  (polar pjd (* 0.5 pi) (/ kd -2.0))
  2890.                                pmdsn (polar pmds (* 0.5 pi) kdn)
  2891.                          )
  2892.                        )
  2893.                        (setq pmde (h_lxdd pmds fx dist))
  2894.                        (setq smov (h_lxxz pmds pmde fx))
  2895.                        (setq mylist(dhtss pjd 2))
  2896.                        (if(and mylist (or (= fx 0) (= fx 2)))
  2897.                          (progn
  2898.                            (setq zxjn(car(XScjx)))
  2899.                            (setq ysjn(last(XScjx)))
  2900.                            (C_zoom mylist zxjn ysjn)
  2901.                            (setq ylist(C_xyzb mylist pjd kd))
  2902.                            (setq plist(C_ldel mylist pjd kd sshl))
  2903.                            (setq xlist(C_movk plist kd kdn pjdn fx dist        data1 data2 sm2 smov 2))
  2904.                            (C_slin (car xlist) ylist)
  2905.                            (C_hlin xlist ylist sm2)
  2906.                            (command "_.zoom" zxj ysj)
  2907.                          )
  2908.                          (progn
  2909.                            (if smov (command "_.move" smov "" pmds pmdsn))
  2910.                            (h_hlhz pjdn fx dist data1 data2 sm2)
  2911.                          )
  2912.                        )
  2913.                       )
  2914.                       (t (setq lll2 nil)) ;回车返回
  2915.                     )
  2916.                   )                        ;替换选取循环
  2917.                 )
  2918.                 (setq ttt1 nil)
  2919.               )
  2920.             )
  2921.           )
  2922.         )
  2923.       )
  2924.       (setq lll1 nil)
  2925.     )                                 ;是否ph1--t
  2926.     (if(= lxfs 1)
  2927.       (progn
  2928.         (setq i 0)
  2929.         (repeat (sslength slx)
  2930.           (redraw (ssname slx i) 4)
  2931.           (setq i (1+ i))
  2932.         )
  2933.         (setq lxfs 0)
  2934.       )
  2935.     )
  2936.     (command "_.undo" "_end")
  2937.     (setq fan 0)
  2938.   )                                        ;被替换选取循环
  2939. )
  2940.   
  2941. ;;================================子函数结束==================================
  2942.   (_inidwg)
  2943.   (princ "\n*回路插入*=Hlins")
  2944.   (setvar "plinetype" 2)
  2945.   (setvar "cmdecho" 0)
  2946.   (setvar "blipmode" 0)
  2947.   (setvar "pickadd" 1)
  2948.   (setvar "osmode" 0)
  2949.   (setvar "CECOLOR" "green")
  2950.   (setq ucmark (getvar "worlducs"))
  2951.   (if (= ucmark 0)
  2952.     (progn
  2953.       (setq ucs_fo (getvar "ucsfollow"))
  2954.       (if (= ucs_fo 1)(setvar "ucsfollow" 0))
  2955.       (command "_.ucs" "_world")
  2956.     )
  2957.   )
  2958.   (setq lxfs 0 tscale(atof(xrddic "Tabscale" "100")) dqw(XScjx))
  2959.   (setq        o_para(xgetin "Hlklib" "Hlkpara" "" 1)
  2960.         o_mes(xgetin "Hlklib" "RetHlkMes" "" 1)
  2961.         o_jj(xgetin "Hlklib" "Hlkjj" "30" 1)
  2962.   )
  2963.   (menucmd "s=hd25l")
  2964.   (h_sh3)
  2965.   (if(= ucmark 0)(command "_.ucs" "_prev"))
  2966.   (setvar "highlight" 1)
  2967.   (setq dqwn(XScjx))
  2968.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  2969.   (setq *error* olderr olderr nil)
  2970.   (_resdwg)
  2971.   (princ)
  2972. )

  2973. ;;=================================主程序开始=================================
  2974. ;;名称:C:HLDEL
  2975. ;;功能:简版回路编辑-回路删除
  2976. ;;输入:无
  2977. ;;返回:无
  2978. (defun C:HLDEL(/ tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo
  2979.                 h_sh4 h_XZHL h_WZYZ h_HLHZ h_LXDD h_WZPD h_LXXZ h_mxwz h_inwi
  2980.                 h_comp C_zoom C_ssgl C_xyzb C_ldel C_movt C_movk C_hlin C_slin
  2981.                 s_px)
  2982.   (setq olderr *error*)
  2983.   
  2984. ;;=================================子函数开始=================================
  2985. ;;名称:*error*(错误处理函数)
  2986. ;;功能:当程序发生错误或用户中断时,平静地退出,并还原状态。
  2987. ;;输入:无
  2988. ;;返回:无
  2989. (defun *error* (msg / each)
  2990.   (if (= fan 1)(command "_.undo" "_end"))
  2991.   (if (= fan 1)(command "_.undo" ""))
  2992.   (if (= ucmark 0) (command "_.ucs" "_prev"))
  2993.   (xsetin "Hlklib" "Hlkpara" o_para 1)
  2994.   (xsetin "Hlklib" "RetHlkMes" o_mes 1)
  2995.   (xsetin "Hlklib" "Hlkjj" o_jj 1)
  2996.   (if(= lxfs 1)
  2997.     (progn(setq i 0)(repeat(sslength slx)(redraw(ssname slx i)4)(setq i(1+ i))))
  2998.   )
  2999.   (setq dqwn (XScjx))
  3000.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  3001.   (foreach each
  3002.       '(tscale lxfs dqw dqwn o_para o_mes o_jj kword ucmark ucs_fo h_sh4 h_xzhl
  3003.         h_wzyz h_hlhz h_lxdd h_wzpd h_lxxz h_mxwz h_inwi h_comp C_zoom C_ssgl C_xyzb
  3004.         C_ldel C_movt C_movk C_hlin C_slin point1 point2 i ename point3 point4 ss
  3005.         elist point5 point6 biao ylist plist l xlist n nylist s_px yy list1 list2 a b
  3006.         emx p1 p2 p3 pd1 pd2 pc mxwzt wzt npd1 npd2 es sins first fxhsf hszf pmxd1
  3007.         pmxd2 fxhs hsz wzyz ssfah fah pjd fx sshl hlsm kd hll smx mxt len1 ii iii mxmin
  3008.         mxmax i4 pcl e pcxl pcyl pcc xzt len2 pds hljj lxl pde hs smxal ls dqw1 wzpdt
  3009.         dist data1 data2 sm2 zdist pdmx2 mxkd lll1 ph1 ph2 ttt1 hlxzl lll2 ttt2 ph3 ph4
  3010.         slx pjdf pjdn fxn kdn sshln hlsmn hlxzln pmds pmdsn pmde jj jjn hldata smov zxj
  3011.         ysj zxjn ysjn mylist ess fan name laye yanse hlxzl1 pjd1 fx1 kd1 sshl1 hlsm1 pjd2
  3012.         fx2 kd2 hlsm2 hlxzl2 pjdn1 pjd1n pjd2n pme smov1 smov2 pmds1 pmds1n pmds2 pmds2n
  3013.         pmde1 pmde2 jj1 jj2 sshl2 ss1 ss2 ss3 ylist1 ylist2 plist1 plist2 xlist1 xlist2
  3014.         ess1 ess2 point s4_xc s4_glx shu xzb)
  3015.       (set each nil)
  3016.     )
  3017.     (setq each nil)
  3018.     (setq *error* olderr olderr nil)
  3019.     (_resdwg)
  3020.     (princ)
  3021. )

  3022. ;;=================================子函数开始=================================
  3023. ;;名称:C_zoom
  3024. ;;功能:判断是否zoom
  3025. ;;输入:mylist-订货图的角表 zxj-视区左下角 ysj-视区右上角
  3026. ;;返回:无
  3027. (defun C_zoom(mylist zxjn ysjn / point1 point2)
  3028.   (setq point1(car mylist))
  3029.   (setq point2(last mylist))
  3030.   (if(or(>(car zxjn)(car point2))(<(car ysjn)(car point1))
  3031.         (>(cadr zxjn)(cadr point1))(<(cadr ysjn)(cadr point2))
  3032.      )
  3033.     (command "_.ZOOM" "_w" point1 point2)
  3034.   )
  3035. )

  3036. ;;=================================子函数开始=================================
  3037. ;;名称:C_ssgl
  3038. ;;功能:过滤选择集
  3039. ;;输入:ss1-选择集1 ss2-选择集2
  3040. ;;返回:ss1
  3041. (defun C_ssgl(ss1 ss2 / i ename)
  3042.   (setq i 0)
  3043.   (repeat(sslength ss2)
  3044.     (setq ename (ssname ss2 i))
  3045.     (ssdel ename ss1)
  3046.     (setq i (+ i 1))
  3047.   )
  3048.   ss1
  3049. )

  3050. ;;=================================子函数开始=================================
  3051. ;;名称:C_xyzb
  3052. ;;功能:得到所选回路所有横线的Y坐标点集
  3053. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长
  3054. ;;返回:ylist-所选回路所有横线的Y坐标表
  3055. (defun C_xyzb(mylist pjd kd / point1 point2 point3 point4 i ss ename elist
  3056.                                    point5 point6 biao ylist)
  3057.   (setq ylist '())
  3058.   (setq point1(car mylist))
  3059.   (setq point2(last mylist))
  3060.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  3061.   (setq point4(list(+(car point3)kd)(cadr point1)(last point1)))
  3062.   (setq ss (ssget "C" point3 point4 '((0 . "LINE")(8 . "GDXT")(62 . 3))))
  3063.   (setq i 0)
  3064.   (repeat (sslength ss)
  3065.     (setq ename (ssname ss i))
  3066.     (setq elist (entget ename))
  3067.     (setq point5(cdr(assoc 10 elist)))
  3068.     (setq point6(cdr(assoc 11 elist)))
  3069.     (if (equal(cadr point5)(cadr point6)0.1)
  3070.       (progn
  3071.         (setq biao(member (cadr point5) ylist))
  3072.         (if (not biao)
  3073.           (setq ylist(cons (cadr point5) ylist))
  3074.         )
  3075.       )
  3076.     )
  3077.     (setq i (+ i 1))
  3078.   )
  3079.   ylist
  3080. )

  3081. ;;=================================子函数开始=================================
  3082. ;;名称:C_ldel
  3083. ;;功能:得到所选回路列的左上角和右下角
  3084. ;;输入:mylist-订货图的角表 pjd-母线基点 kd-母线长 sshl-回路选择集
  3085. ;;返回:plist-点表(所选回路列的右上角、订货图的右下角和所选回路列的选择集)
  3086. (defun C_ldel(mylist pjd kd sshl / point1 point2 point3 point4 point5 ss plist)
  3087.   (setq point1(car mylist))
  3088.   (setq point2(last mylist))
  3089.   (setq point3(list(-(car pjd)(/ kd 2))(cadr point2)(last point2)))
  3090.   (setq point4(list(+(car pjd)(/ kd 2))(cadr point1)(last point2)))
  3091.   (setq ss(ssget "w" point3 point4))
  3092.   (setq ss(C_ssgl ss sshl))
  3093.   (setq point5(list(car point4)(cadr point2)(last point2)))
  3094.   (setq plist (list point5 point1 ss))
  3095. )

  3096. ;;=================================子函数开始=================================
  3097. ;;名称:C_movt
  3098. ;;功能:copy回路并移动表格(从当前图中copy或move)
  3099. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  3100. ;;      sshln-替换回路 pjdf-替换回路的基点 pjd-被替回路的基点 smov-回路选择集
  3101. ;;      a-为0时拷贝,为1时移动,为2时插入
  3102. ;;返回:xlist-新回路列的x坐标
  3103. (defun C_movt(plist kd kdn sshln pjdf pjdn smov a / point1 point2 l point3 point4 xlist ss)
  3104.   (setq point1(car plist))
  3105.   (setq point2(cadr plist))
  3106.   (if(or(= a 0)(= a 1))
  3107.     (progn
  3108.       (setq l(- kd kdn))
  3109.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  3110.       (setq ss(ssget "w" point1 point2))
  3111.       (if (= a 0)
  3112.         (command "_.copy" sshln "" pjdf pjdn)
  3113.         (command "_.move" sshln "" pjdf pjdn)
  3114.       )
  3115.       (if smov
  3116.         (progn
  3117.           (command "_.move" smov "" point1 point3)
  3118.           (setq ss(C_ssgl ss smov))
  3119.         )
  3120.       )
  3121.       (command "_.move" ss "" point1 point3)
  3122.       (setq xlist(list(-(car point1)kd)(car point3)))
  3123.     )
  3124.     (progn
  3125.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  3126.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  3127.       (setq ss (ssget "w" point3 point2))
  3128.       (command "_.copy" sshln "" pjdf pjdn)
  3129.       (if smov
  3130.         (progn
  3131.           (command "_.move" smov "" point3 point4)
  3132.           (setq ss(C_ssgl ss smov))
  3133.         )
  3134.       )
  3135.       (command "_.move" ss "" point3 point4)
  3136.       (setq xlist(list(car point3)(car point4)))
  3137.     )
  3138.   )
  3139.   xlist
  3140. )

  3141. ;;=================================子函数开始=================================
  3142. ;;名称:C_movk
  3143. ;;功能:copy回路并移动表格(从图库中取)
  3144. ;;输入:plist-点表(所选订货图列的右上角和订货图的右下角) kd-旧回路的宽度 kdn-新回路的宽度
  3145. ;;      pjdn-替换回路 fx-回路方向 dist、data1、data2、sm2-调回路库的参数 smov-回路选择集
  3146. ;;      a-为时替换回路,为2时插入回路
  3147. ;;返回:xlist-新回路列的两个x坐标
  3148. (defun C_movk(plist kd kdn pjdn fx dist data1 data2 sm2 smov a / point1 point2 l point3
  3149.               point4 xlist ss)
  3150.   (setq point1(car plist))
  3151.   (setq point2(cadr plist))
  3152.   (if (= a 1)
  3153.     (progn
  3154.       (setq l(- kd kdn))
  3155.       (setq point3(list(-(car point1)l)(cadr point1)(last point1)))
  3156.       (setq ss(ssget "w" point1 point2))
  3157.       (h_hlhz pjdn fx dist data1 data2 sm2)
  3158.       (if smov
  3159.         (progn
  3160.           (command "_.move" smov "" point1 point3)
  3161.           (setq ss(C_ssgl ss smov))
  3162.         )
  3163.       )
  3164.       (command "_.move" ss "" point1 point3)
  3165.       (setq xlist(list(-(car point1)kd)(car point3)))
  3166.     )
  3167.     (progn
  3168.       (setq point3(list(-(car point1)kd)(cadr point1)(last point1)))
  3169.       (setq point4(list(+(car point3)kdn)(cadr point3)(last point3)))
  3170.       (setq ss (ssget "w" point3 point2))
  3171.       (h_hlhz pjdn fx dist data1 data2 sm2)
  3172.       (if smov
  3173.         (progn
  3174.           (command "_.move" smov "" point3 point4)
  3175.           (setq ss(C_ssgl ss smov))
  3176.         )
  3177.       )
  3178.       (command "_.move" ss "" point3 point4)
  3179.       (setq xlist(list(car point3)(car point4)))
  3180.     )
  3181.   )
  3182.   xlist
  3183. )

  3184. ;;=================================子函数开始=================================
  3185. ;;名称:C_hlin
  3186. ;;功能:画横线
  3187. ;;输入:xlist-新订货图的x坐标表 ylist-所选订货图所有横线的Y坐标表 hlsm-回路数目
  3188. ;;返回:无
  3189. (defun C_hlin(xlist ylist hlsm / point1 point2 i l n)
  3190.   (setq i 0)
  3191.   (setq l(/(abs(-(car xlist)(last xlist)))hlsm))
  3192.   (repeat (length ylist)
  3193.     (setq n 0)
  3194.     (repeat hlsm
  3195.       (setq point1(list(+(car xlist)(* l n))(nth i ylist)0.0))
  3196.       (setq point2(list(+(car xlist)(* l (+ n 1)))(nth i ylist)0.0))
  3197.       (command "_.line" point1 point2 "")
  3198.       (setq n (+ n 1))
  3199.     )
  3200.     (setq i (+ i 1))
  3201.   )
  3202. )

  3203. ;;=================================子函数开始=================================
  3204. ;;名称:s_px
  3205. ;;功能:排序(从大到小)
  3206. ;;输入:ylist-所选订货图所有横线的Y坐标表
  3207. ;;返回:nylist
  3208.   (defun s_px(ylist / i nylist yy list1 list2)
  3209.     (setq nylist '())
  3210.     (while (/= (length ylist) 0)
  3211.       (setq i 1)
  3212.       (setq yy (nth 0 ylist))
  3213.       (repeat (-(length ylist)1)
  3214.         (if (> yy (nth i ylist))
  3215.           (setq yy (nth i ylist))
  3216.         )
  3217.         (setq i (+ i 1))
  3218.       )
  3219.       (setq nylist (cons yy nylist))
  3220.       (setq list1 (cdr (member yy ylist)))
  3221.       (setq list2 (cdr (member yy (reverse ylist))))
  3222.       (setq ylist (append list1 list2))
  3223.     )
  3224.     nylist
  3225.   )

  3226. ;;=================================子函数开始=================================
  3227. ;;名称:C_slin
  3228. ;;功能:画竖线
  3229. ;;输入:xzb-x坐标 ylist-所选订货图所有横线的Y坐标表
  3230. ;;返回:无
  3231. (defun C_slin(xzb ylist / nylist point1 point2 i)
  3232.   (setq i 0)
  3233.   (setq nylist(s_px ylist))
  3234.   (repeat (-(length nylist)1)
  3235.     (setq point1(list xzb (nth i nylist)))
  3236.     (setq point2(list xzb (nth (+ i 1) nylist)))
  3237.     (command "_.line" point1 point2 "")
  3238.     (setq i (+ i 1))
  3239.   )
  3240. )
  3241.   
  3242. ;;=================================子函数开始=================================
  3243. ;;名称:h_comp
  3244. ;;功能:计算两值的差(用于排序)
  3245. ;;输入:a、b
  3246. ;;返回:两值的差
  3247.   (defun h_comp (a b)
  3248.     (- a b)
  3249.   )

  3250. ;;=================================子函数开始=================================
  3251. ;;名称: h_inwi
  3252. ;;功能: 判断p1是否在p2 p3组成的窗口内
  3253. ;;输入: p1 p2 p3
  3254. ;;返回: 0-在窗口内、1-在窗口外、nil-边界上
  3255.   (defun h_inwi (p1 p2 p3)
  3256.     (cond
  3257.       ((and(< (car p1) (- (max (car p2) (car p3)) tscale))
  3258.             (> (car p1) (+ (min (car p2) (car p3)) tscale))
  3259.             (< (cadr p1) (- (max (cadr p2) (cadr p3)) tscale))
  3260.             (> (cadr p1) (+ (min (cadr p2) (cadr p3)) tscale))
  3261.         )
  3262.         0
  3263.       )
  3264.       ((or(> (car p1) (+ (max (car p2) (car p3)) tscale))
  3265.            (< (car p1) (- (min (car p2) (car p3)) tscale))
  3266.            (> (cadr p1) (+ (max (cadr p2) (cadr p3)) tscale))
  3267.            (< (cadr p1) (- (min (cadr p2) (cadr p3)) tscale))
  3268.         )
  3269.         1
  3270.       )
  3271.       (t nil)
  3272.     )
  3273.   )

  3274. ;;=================================子函数开始=================================
  3275. ;;名称: h_mxwz
  3276. ;;功能: 母线位置判断
  3277. ;;输入: emx p1 p2
  3278. ;;返回: mxwzt
  3279.   (defun h_mxwz        (emx p1 p2 / pd1 pd2 pc mxwzt)
  3280.     (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  3281.           pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  3282.     )
  3283.     (setq pc (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  3284.     (if        (or (> (car pc) (max (car p1) (car p2)))
  3285.             (> (cadr pc) (max (cadr p1) (cadr p2)))
  3286.             (< (car pc) (min (car p1) (car p2)))
  3287.             (< (cadr pc) (min (cadr p1) (cadr p2)))
  3288.         )
  3289.       (setq mxwzt nil)
  3290.       (setq mxwzt pc)
  3291.     )
  3292.     mxwzt
  3293.   )

  3294. ;;=================================子函数开始=================================
  3295. ;;名称: h_wzpd
  3296. ;;功能: 位置判断、判断实体(块-插入点,线-二端点)是否在窗口之内
  3297. ;;输入: 实体名 窗口二角点
  3298. ;;返回: 在窗口内-中点
  3299. ;;      不在窗口内-T
  3300. ;;      交叉(线)-nil
  3301.   (defun h_wzpd (emx p1 p2 ss / pd1 pd2 pc wzt npd1 npd2 es sins i)
  3302.     (cond
  3303.       ((= (cdr (assoc 0 (entget emx))) "LWPOLYLINE")
  3304.        (setq pd1 (append (cdr (assoc 10 (entget emx))) (list 0.0))
  3305.              pd2 (append (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  3306.        )
  3307.        (setq pc        (polar pd1 (angle pd1 pd2)(/ (distance2p pd1 pd2) 2.0)))
  3308.        (setq npd1 (h_inwi pd1 p1 p2)
  3309.              npd2 (h_inwi pd2 p1 p2)
  3310.        )
  3311.        (cond
  3312.         ((or(and (= npd1 0) (= npd2 1))(and (= npd2 0) (= npd1 1)))
  3313.          (setq wzt nil)
  3314.         )
  3315.          ((or (= npd1 1) (= npd2 1))
  3316.           (setq wzt t)
  3317.          )
  3318.          (t (setq wzt pc))
  3319.        )
  3320.       )
  3321.       (t
  3322.        (setq pc (cdr (assoc 10 (entget emx))))
  3323.        (cond
  3324.         ((= (h_inwi pc p1 p2) 1)
  3325.           (setq wzt t)
  3326.          )
  3327.          ((null (h_inwi pc p1 p2))
  3328.           (if (= (cdr (assoc 0 (entget emx))) "insert")
  3329.             (progn
  3330.               (setq        sins (ssget "c"
  3331.                                     (polar pc (* 0.25 pi) tscale)
  3332.                                     (polar pc (* 0.25 pi) tscale)
  3333.                                     '((0 . "insert,lwpolyline"))
  3334.                              )
  3335.                   )
  3336.                   (setq        wzt pc
  3337.                         i   0
  3338.                   )
  3339.                   (while (and wzt (< i (sslength sins)))
  3340.                     (setq es (ssname sins i))
  3341.                     (if        (not (ssmemb es sins))
  3342.                       (setq wzt t)
  3343.                       (setq i (1+ i))
  3344.                     )
  3345.                   )
  3346.                 )
  3347.                 (setq wzt pc)
  3348.               )
  3349.              )
  3350.              (t (setq wzt pc))
  3351.        )
  3352.       )
  3353.     )
  3354.     wzt
  3355.   )

  3356. ;;=================================子函数开始=================================
  3357. ;;名称: h_wzyz
  3358. ;;功能: 母线位置一致性判断
  3359. ;;输入: 母线 循环号 (方向初值 坐标初值)
  3360. ;;返回: i=0 (方向 坐标)
  3361. ;;      i/=0 位置一致 t
  3362. ;;           位置不一致 nil
  3363.   (defun h_wzyz        (emx i first / fxhsf hszf pmxd1 pmxd2 fxhs hsz wzyz)
  3364.     (setq fxhsf        (car first)
  3365.           hszf        (cadr first)
  3366.     )
  3367.     (setq pmxd1        (append (cdr (assoc 10 (entget emx))) (list 0.0))
  3368.           pmxd2        (append        (cdr (assoc 10 (reverse (entget emx))))(list 0.0))
  3369.     )
  3370.     (if(equal (car pmxd1) (car pmxd2) 0.001)
  3371.       (setq fxhs 1 hsz (car pmxd1))
  3372.       (setq fxhs 0 hsz (cadr pmxd1))
  3373.     )
  3374.     (if(= i 0)
  3375.       (setq wzyz (list fxhs hsz))
  3376.       (progn
  3377.         (if (or(not (equal fxhs fxhsf 0.01))
  3378.                 (not (equal hsz hszf 0.01))
  3379.             )
  3380.          (setq wzyz nil)
  3381.           (setq wzyz t)
  3382.         )
  3383.       )
  3384.     )
  3385.     wzyz
  3386.   )

  3387. ;;=================================子函数开始=================================
  3388. ;;名称: h_xzhl
  3389. ;;功能: 选择回路
  3390. ;;输入: 窗口二角点p1,p2
  3391. ;;返回: t-(基点 方向? 宽度 回路选择集 回路数) 方向--0 向下 1 向右 2 向上 3 向左
  3392. ;;       NIL-nil
  3393.   (defun h_xzhl        (p1    p2    /           ssfah fah   pjd   fx           sshl         hlsm
  3394.                  kd    hll   smx   i         mxt   fxhs  hsz   len1         ii
  3395.                  emx   iii   pd1   pd2         mxmin mxmax p1           p2         pc
  3396.                  ss    i4    pcl   first e     pcxl  pcyl  pcc   xzt
  3397.                  len2
  3398.                 )
  3399.     (setq hll nil)
  3400.     (setq smx (ssget "c" p1 p2 '((0 . "lwpolyline") (8 . "mx"))))
  3401.     (if        smx
  3402.       (progn
  3403.         (setq i        0 mxt t)
  3404.         (while (and mxt (< i (sslength smx)))
  3405.           (setq emx (ssname smx i))
  3406.           (if (= i 0)
  3407.             (setq first (h_wzyz emx 0 nil))
  3408.             (setq mxt (h_wzyz emx i first))
  3409.           )
  3410.           (setq i (1+ i))
  3411.         )                                ;判断母线位置一致性
  3412.         (if mxt
  3413.           (progn
  3414.             (setq fxhs (car first)
  3415.                   hsz  (cadr first)
  3416.                   ii   0
  3417.                   len1 (sslength smx)
  3418.             )
  3419.             (repeat len1
  3420.               (setq emx (ssname smx ii))
  3421.               (if (h_mxwz emx p1 p2)
  3422.                 (setq ii (1+ ii))
  3423.                 (ssdel emx smx)
  3424.               )
  3425.             )                                ;删除中心在边界外的母线
  3426.             (setq hlsm (sslength smx))
  3427.             (if        (/= hlsm 0)
  3428.               (progn
  3429.                 (setq iii 0)
  3430.                 (repeat        hlsm
  3431.                   (setq emx (ssname smx iii))
  3432.                   (setq        pd1 (cdr (assoc 10 (entget emx)))
  3433.                         pd2 (cdr (assoc 10 (reverse (entget emx))))
  3434.                   )
  3435.                   (if (= fxhs 0)
  3436.                     (if        (= iii 0)
  3437.                       (setq mxmin (min (car pd1) (car pd2))
  3438.                             mxmax (max (car pd1) (car pd2))
  3439.                       )
  3440.                       (progn
  3441.                         (if (< (min (car pd1) (car pd2)) mxmin)
  3442.                           (setq mxmin (min (car pd1) (car pd2)))
  3443.                         )
  3444.                         (if (> (max (car pd1) (car pd2)) mxmax)
  3445.                           (setq mxmax (max (car pd1) (car pd2)))
  3446.                         )
  3447.                       )
  3448.                     )
  3449.                     (if        (= iii 0)
  3450.                       (setq mxmin (min (cadr pd1) (cadr pd2))
  3451.                             mxmax (max (cadr pd1) (cadr pd2))
  3452.                       )
  3453.                       (progn
  3454.                         (if (< (min (cadr pd1) (cadr pd2)) mxmin)
  3455.                           (setq mxmin (min (cadr pd1) (cadr pd2)))
  3456.                         )
  3457.                         (if (> (max (cadr pd1) (cadr pd2)) mxmax)
  3458.                           (setq mxmax (max (cadr pd1) (cadr pd2)))
  3459.                         )
  3460.                       )
  3461.                     )
  3462.                   )
  3463.                   (setq iii (1+ iii))
  3464.                 )
  3465.                 (setq kd (- mxmax mxmin))
  3466.                 (if (= fxhs 0)
  3467.                   (setq        p1  (list mxmin (cadr p1) 0.0)
  3468.                         p2  (list mxmax (cadr p2) 0.0)
  3469.                         pjd (list (/ (+ mxmin mxmax) 2) hsz 0.0)
  3470.                   )
  3471.                   (setq        p1  (list (car p1) mxmin 0.0)
  3472.                         p2  (list (car p2) mxmax 0.0)
  3473.                         pjd (list hsz (/ (+ mxmin mxmax) 2) 0.0)
  3474.                   )
  3475.                 )                        ;取得母线范围并更新选择集窗口

  3476.                 (setq ss (ssget "c" p1 p2 '((8 . "mx,fah,bxt,xhgg,xmdh"))))
  3477.                 (setq i4   0
  3478.                       pcl  nil
  3479.                       len2 (sslength ss)
  3480.                       xzt  t
  3481.                 )
  3482.                 (while (and xzt (< i4 len2))
  3483.                   (setq e (ssname ss i4))
  3484.                   (if (setq pc (h_wzpd e p1 p2 smx))
  3485.                     (progn
  3486.                       (if (= pc t)
  3487.                         (progn
  3488.                           (ssdel e ss)
  3489.                           (setq len2 (1- len2))
  3490.                         )
  3491.                         (progn
  3492.                           (setq pcl (cons pc pcl))
  3493.                           (setq i4 (1+ i4))
  3494.                         )
  3495.                       )
  3496.                     )
  3497.                     (setq xzt nil)
  3498.                   )
  3499.                 )
  3500.                                         ;去掉多余实体,如果交叉结束
  3501.                 (if xzt
  3502.                   (progn
  3503.                     (setq pcxl (mapcar 'car pcl)
  3504.                           pcyl (mapcar 'cadr pcl)
  3505.                     )
  3506.                     (setq pcc (list (/ (apply '+ pcxl) (length pcl))
  3507.                                     (/ (apply '+ pcyl) (length pcl))
  3508.                                     0.0
  3509.                               )
  3510.                     )
  3511.                     (if        (= fxhs 0)
  3512.                       (if (< (cadr pcc) (cadr pjd))
  3513.                         (setq fx 0)
  3514.                         (setq fx 2)
  3515.                       )
  3516.                       (if (> (car pcc) (car pjd))
  3517.                         (setq fx 1)
  3518.                         (setq fx 3)
  3519.                       )
  3520.                     )
  3521.                     (setq hll (list pjd fx kd ss hlsm))
  3522.                   )
  3523.                   (Xacino "回路选择不完整!" "操作错误" 6)
  3524.                 )
  3525.               )
  3526.             )
  3527.           )
  3528.           (Xacino "选了其他回路的母线!" "操作错误" 6)
  3529.         )
  3530.       )
  3531.     )
  3532.     hll
  3533.   )

  3534. ;;=================================子函数开始=================================
  3535. ;;名称: h_lxdd
  3536. ;;功能: 连续母线端点
  3537. ;;输入: 端点 方向
  3538. ;;返回: 下一端点
  3539.   (defun h_lxdd        (pds fx hljj / p1 p2 lxl pde e hs smxal)
  3540.     (setq pde nil)
  3541.     (setq smxal (ssget "x" '((8 . "mx"))))
  3542.     (if(or (= fx 0) (= fx 2))
  3543.       (setq lxl (list (car pds)))
  3544.       (setq lxl (list (cadr pds)))
  3545.     )
  3546.     (while (setq e (ssname smxal 0))
  3547.       (setq p1 (cdr (assoc 10 (entget e)))
  3548.             p2 (cdr (assoc 10 (reverse (entget e))))
  3549.       )
  3550.       (if (or (= fx 0) (= fx 2))
  3551.         (if (and (equal (cadr p1) (cadr pds) 0.001)
  3552.                  (equal (cadr p2) (cadr pds) 0.001)
  3553.             )
  3554.           (if (> (setq hs (max (car p1) (car p2))) (car pds))
  3555.             (setq lxl (cons hs lxl))
  3556.           )
  3557.         )
  3558.         (if (and (equal (car p1) (car pds) 0.001)
  3559.                  (equal (car p2) (car pds) 0.001)
  3560.             )
  3561.           (if (> (setq hs (max (cadr p1) (cadr p2))) (cadr pds))
  3562.             (setq lxl (cons hs lxl))
  3563.           )
  3564.         )
  3565.       )
  3566.       (ssdel e smxal)
  3567.     )
  3568.     (if(> (length lxl) 1)
  3569.       (setq lxl (qsort h_comp lxl))
  3570.     )
  3571.     (while (and        (> (length lxl) 1)
  3572.                 (< (- (cadr lxl) (car lxl)) (* 1.5 hljj))
  3573.            )
  3574.       (setq lxl (cdr lxl))
  3575.       (if (or (= fx 0) (= fx 2))
  3576.         (setq pde (list(car lxl)(cadr pds)        0.0))
  3577.         (setq pde (list(car pds)(car lxl)        0.0))
  3578.       )
  3579.     )
  3580.     pde
  3581.   )

  3582. ;;=================================子函数开始=================================
  3583. ;;名称: h_lxxz
  3584. ;;功能: 连续回路选择,选择由一点开始的所有连续同方向回路
  3585. ;;输入: 开始点 结束点 方向
  3586. ;;返回: 选择集
  3587.   (defun h_lxxz        (pds pde fx / p1 p2 ss i ls emx dqw1 wzpdt)
  3588.     (setq ss nil)
  3589.     (if        (and pds pde)
  3590.       (progn
  3591.         (cond
  3592.           ((= fx 0)
  3593.            (setq p1 (polar pds (* 1.5 pi) (* 90 tscale))
  3594.                  p2 (polar pde (* 0.5 pi) (* 2 tscale))
  3595.            )
  3596.           )
  3597.           ((= fx 1)
  3598.            (setq p1 (polar pds pi (* 2 tscale))
  3599.                  p2 (polar pde 0 (* 90 tscale))
  3600.            )
  3601.           )
  3602.           ((= fx 2)
  3603.            (setq p1 (polar pds (* 1.5 pi) (* 2 tscale))
  3604.                  p2 (polar pde (* 0.5 pi) (* 90 tscale))
  3605.            )
  3606.           )
  3607.           ((= fx 3)
  3608.            (setq p1 (polar pds pi (* 90 tscale))
  3609.                  p2 (polar pde 0 (* 2 tscale))
  3610.            )
  3611.           )
  3612.         )
  3613.         (setq dqw1 (XScjx))
  3614.         (if (or        (= (h_inwi p1 (car dqw1) (cadr dqw1)) 1)
  3615.                 (= (h_inwi p2 (car dqw1) (cadr dqw1)) 1)
  3616.             )
  3617.           (progn
  3618.             (command "_.zoom"
  3619.                      (list (min (car p1) (caar dqw1))
  3620.                            (min (cadr p1) (cadar dqw1))
  3621.                      )
  3622.                      (list (max (car p2) (caadr dqw1))
  3623.                            (max (cadr p2) (cadadr dqw1))
  3624.                      )
  3625.             )
  3626.           )
  3627.         )
  3628.         (setq ss (ssget "c" p1 p2 '((8 . "mx,bxt,fah,xhgg,xmdh"))))

  3629.         (setq i         0
  3630.               ls (sslength ss)
  3631.         )
  3632.         (repeat        ls
  3633.           (setq emx (ssname ss i))
  3634.           (setq wzpdt (h_wzpd emx p1 p2 ss))
  3635.           (if (or (null wzpdt) (= wzpdt t))
  3636.             (ssdel emx ss)
  3637.             (setq i (1+ i))
  3638.           )
  3639.         )
  3640.       )
  3641.     )
  3642.     ss
  3643.   )

  3644. ;;=================================子函数开始=================================
  3645. ;;名称: h_hlhz
  3646. ;;功能: 回路绘制
  3647. ;;输入: 回路起始点 方向 回路间距
  3648. ;;返回: 无
  3649.   (defun h_hlhz(pjd fx dist data1 data2 sm2 / zdist pds pdmx2 pdmx1 mxkd shu)
  3650.     (setq zdist (* sm2 dist))
  3651.     (Xsetin "Hlklib" "Hlkjj" (rtos (/ dist tscale) 2 2) 1)
  3652.     (shldy pjd fx data1 data2)                ;回路绘制
  3653.     (command "_.color" "_green")
  3654.     (command "_.Layer" "_m" "mx" "_c" 3 "" "")
  3655.     (if        (or (= fx 0) (= fx 2))
  3656.       (setq pds (polar pjd 0 (* -0.5 zdist)))
  3657.       (setq pds (polar pjd (* 0.5 pi) (* -0.5 zdist)))
  3658.     )
  3659.     (setq pdmx1 pds)
  3660.     (repeat sm2
  3661.       (if (or (= fx 0) (= fx 2))
  3662.         (setq pdmx2 (polar pdmx1 0 dist))
  3663.         (setq pdmx2 (polar pdmx1 (* 0.5 pi) dist))
  3664.       )
  3665.       (setq mxkd (atof (Xgetin "Hlklib" "Hlkmx" "0.6" 1)))
  3666.       (setq mxkd (* mxkd tscale))
  3667.       (command "_.pline" pdmx1 "_w" mxkd "" pdmx2 "")
  3668.       (setq pdmx1 pdmx2)
  3669.     )                                        ;母线绘制
  3670.     (setq shu(tblsearch "layer""GDXT"))
  3671.     (if shu(command "_.layer" "_set" "GDXT" ""))
  3672.   )

  3673. ;;=================================子函数开始=================================
  3674. ;;名称: h_sh4
  3675. ;;功能: 回路删除
  3676. ;;输入: 无
  3677. ;;返回: 无
  3678. (defun h_sh4 (/ lll1 ph1 ph2 ttt1 hlxzl pjd fx kd sshl hlsm pmde jj dist pmds
  3679.                 sm2 smov zxj ysj mylist plist pmdsn ss1 ss2 ylist xlist fan s4_xc
  3680.                 s4_glx shu)

  3681. ;;=================================子函数开始=================================
  3682. ;;名称: s4_glx
  3683. ;;功能: 过滤x坐标一定的所有竖线
  3684. ;;输入: ss-选择集 xlist-x坐标 mylist-定货图的两个角点
  3685. ;;返回: ss
  3686. (defun s4_glx(ss xlist mylist / point1 point2 point3 point4 ss1 ss2)
  3687.   (setq point1(list (car xlist)(cadr(car mylist))))
  3688.   (setq point2(list (car xlist)(cadr(cadr mylist))))
  3689.   (setq point3(list (last xlist)(cadr(car mylist))))
  3690.   (setq point4(list (last xlist)(cadr(cadr mylist))))
  3691.   (setq ss1(ssget "W" point1 point2 '((0 . "LINE")(8 . "GDXT"))))
  3692.   (setq ss2(ssget "W" point3 point4 '((0 . "LINE")(8 . "GDXT"))))
  3693.   (if ss1 (setq ss(C_ssgl ss ss1)))
  3694.   (if ss2 (setq ss(C_ssgl ss ss2)))
  3695.   ss
  3696. )

  3697. ;;=================================子函数开始=================================
  3698. ;;名称: s4_xc
  3699. ;;功能: 消重直线
  3700. ;;输入: xlist-x坐标 mylist-定货图的两个角点 ylist-y坐标表
  3701. ;;返回: 无
  3702. (defun s4_xc(xlist mylist ylist pjd / point point1 point2 point3 point4 ss1 ss2)
  3703.   (setq point(list(last xlist)(cadr pjd)(last pjd)))
  3704.   (setq point1(list(last xlist)(cadr(cadr mylist))))
  3705.   (setq point2(list(last xlist)(cadr(car mylist))))
  3706.   (setq point3(list(-(car point)10)(+(cadr point)10)))
  3707.   (setq point4(list(+(car point)10)(-(cadr point)10)))
  3708.   (setq ss1(ssget "W" point1 point2 '((0 . "LINE")(8 . "GDXT"))))
  3709.   (setq ss2(ssget "C" point3 point4 '((0 . "LINE")(8 . "GDXT")(62 . 3))))
  3710.   (if ss2(progn(C_slin (last xlist) ylist)(command "_.erase" ss1 "")))
  3711. )
  3712. ;;h_sh4主函数开始
  3713.   (setq zxj(car(XScjx)))
  3714.   (setq ysj(last(XScjx)))
  3715.   (setq lll1 t)
  3716.   (while lll1
  3717.     (command "_.undo" "_group")
  3718.     (setq shu(tblsearch "layer""GDXT"))
  3719.     (if shu(command "_.layer" "_set" "GDXT" ""))
  3720.     (setq fan 1)
  3721.     (prompt "\n请用窗口(W)选择删除回路:")
  3722.     (setq ph1 1)
  3723.     (while(not(listp ph1))
  3724.       (initget 128)
  3725.       (setq ph1 (getpoint "\n请输入窗口第一点<回车结束>:"))
  3726.     )
  3727.     (if ph1
  3728.       (progn
  3729.         (setq ttt1 t)
  3730.         (while ttt1
  3731.           (setq ph2 1)
  3732.           (while(not(listp ph2))
  3733.             (initget 128)
  3734.             (setq ph2 (getcorner ph1 "\n请输入窗口第二点:"))
  3735.           )
  3736.           (if ph2
  3737.             (progn
  3738.               (setq hlxzl(h_xzhl ph1 ph2))
  3739.               (if hlxzl
  3740.                 (progn
  3741.                   (setq ttt1 nil)
  3742.                   (setq pjd  (nth 0 hlxzl)
  3743.                         fx   (nth 1 hlxzl)
  3744.                         kd   (nth 2 hlxzl)
  3745.                         sshl (nth 3 hlxzl)
  3746.                         hlsm (nth 4 hlxzl)
  3747.                   )
  3748.                   (setq jj(/ kd hlsm))
  3749.                   (if(or(= fx 0)(= fx 2))
  3750.                     (setq pmds(polar pjd 0(/ kd 2.0)) pmdsn(polar pjd 0(/ kd -2.0)))
  3751.                     (setq pmds(polar pjd(* 0.5 pi)(/ kd 2.0))
  3752.                           pmdsn (polar pjd(* 0.5 pi)(/ kd -2.0))
  3753.                     )
  3754.                   )
  3755.                   (setq pmde (h_lxdd pmds fx jj))
  3756.                   (setq smov (h_lxxz pmds pmde fx))
  3757.                   (setq mylist(dhtss pmds 2))
  3758.                   (if(and(or(= fx 0)(= fx 2))mylist)
  3759.                     (progn
  3760.                       (C_zoom mylist zxj ysj)
  3761.                       (setq ylist (C_xyzb mylist pjd kd))
  3762.                       (setq plist (C_ldel mylist pjd kd sshl))
  3763.                       (setq ss1 (ssget "w" (car plist)(cadr plist)))
  3764.                       (setq ss2 (last plist))
  3765.                       (setq xlist(list(car pmds)(car pmdsn)))
  3766.                       (setq ss2 (s4_glx ss2 xlist mylist))
  3767.                       (command "_.erase" sshl "")
  3768.                       (command "_.erase" ss2 "")
  3769.                       (if smov
  3770.                         (progn
  3771.                           (command "_.move" smov "" pmds pmdsn)
  3772.                           (setq ss1 (C_ssgl ss1 smov))
  3773.                         )
  3774.                       )
  3775.                       (command "_.move" ss1 "" pmds pmdsn)
  3776.                       (s4_xc xlist mylist ylist pjd)
  3777.                       (Command "_.zoom" zxj ysj)
  3778.                     )
  3779.                     (progn
  3780.                       (if smov (command "_.move" smov "" pmds pmdsn))
  3781.                       (command "_.erase" sshl "")
  3782.                     )
  3783.                   )
  3784.                 )
  3785.                 (setq ttt1 nil)
  3786.               )
  3787.             )
  3788.           )
  3789.         )
  3790.       )
  3791.       (setq lll1 nil)
  3792.     )
  3793.     (command "_.undo" "_end")
  3794.     (setq fan 0)
  3795.   )
  3796. )
  3797.   
  3798. ;;================================子函数结束==================================
  3799.   (_inidwg)
  3800.   (princ "\n*回路删除*=Hldel")
  3801.   (setvar "plinetype" 2)
  3802.   (setvar "cmdecho" 0)
  3803.   (setvar "blipmode" 0)
  3804.   (setvar "pickadd" 1)
  3805.   (setvar "osmode" 0)
  3806.   (setvar "CECOLOR" "green")
  3807.   (setq ucmark (getvar "worlducs"))
  3808.   (if (= ucmark 0)
  3809.     (progn
  3810.       (setq ucs_fo (getvar "ucsfollow"))
  3811.       (if (= ucs_fo 1)(setvar "ucsfollow" 0))
  3812.       (command "_.ucs" "_world")
  3813.     )
  3814.   )
  3815.   (setq lxfs 0 tscale(atof(xrddic "Tabscale" "100")) dqw(XScjx))
  3816.   (setq        o_para(xgetin "Hlklib" "Hlkpara" "" 1)
  3817.         o_mes(xgetin "Hlklib" "RetHlkMes" "" 1)
  3818.         o_jj(xgetin "Hlklib" "Hlkjj" "30" 1)
  3819.   )
  3820.   (menucmd "s=hd25l")
  3821.   (h_sh4)
  3822.   (if(= ucmark 0)(command "_.ucs" "_prev"))
  3823.   (setvar "highlight" 1)
  3824.   (setq dqwn(XScjx))
  3825.   (if(not(equal dqw dqwn(* 0.1 tscale)))(command "_.zoom" (car dqw) (cadr dqw)))
  3826.   (setq *error* olderr olderr nil)
  3827.   (_resdwg)
  3828.   (princ)
  3829. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-2-13 08:25:40 | 显示全部楼层
这个是什么软件里面的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 13:03 , Processed in 0.251448 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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