本帖最后由 尘缘一生 于 2026-1-10 11:05 编辑

对于表格居中,本坛代码不少,但是满足要求却很难,
那么表格哪,里面可能各种实体,它并不一定仅是文字,表格的画法也不一定是直线,还有可能是多段线,多于两点的多段线,等等,
那么三领哪,力求一种框选表格,实现里面每个格中实体居中的办法,注意:是格中实体作为一个集合居中即可了
一直使用,一直不断修改,似乎完美达到要求,还很漫长的探索......
代码如下:期待高手进一步完善了,
  1. ;;表格实体居中------
  2. (defun sl-bjz (/ wt)
  3.   (if (setq wt (ssget '((0 . "*TEXT,CIRCLE,ARC,ELLIPSE,DIMENSION,LEADER,INSERT,ATTDEF,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,SPLINE"))))
  4.     (ss-bjz wt)
  5.   )
  6. )
  7. ;三领设计功能代码原理展示
  8. ;Modify By SLdesign V3.0 尘缘一生 QQ:15290049
  9. ;;s1 框选(整体表格选择集)居中--注意:需排除了*P*LINE线类选择--(一级)----
  10. (defun ss-bjz (s1 / elis tp n d en p0 p1 p11 p13 pts pls ss nam obj)
  11.   (_undo1)
  12.   (setq elis (ss-enlst s1)) ;选择集转表
  13.   (while (setq en (car elis))
  14.     (setq tp (cdr (assoc 0 (entget en))))
  15.     (cond
  16.       ((= tp "CIRCLE")
  17.         (setq d (/ (vlax-curve-getdistatparam en (vlax-curve-getendparam en)) 30) pts nil n -1)
  18.         (repeat 31
  19.           (setq n (1+ n) pts (cons (vlax-curve-getpointatdist (vlax-ename->vla-object en) (* d n)) pts))
  20.         )
  21.       )
  22.       ((= tp "ELLIPSE")
  23.         (earc->pline en)
  24.         (setq pts (get-pl-pt (entlast)))
  25.       )
  26.       (t
  27.         (setq pts (slget-enbox en))
  28.         (entdel en)
  29.         (if (setq nam (sl-bound (mapcar '(lambda (x y) (* (+ x y) 0.5)) (car pts) (cadr pts))))
  30.           (progn
  31.             (setq pts (get-pl-pt nam))
  32.             (entdel nam)
  33.           )
  34.         )
  35.         (entdel en)
  36.       )
  37.     )
  38.     (if pts
  39.       (progn
  40.         (setq p0 (mapcar '(lambda (x y) (* (+ x y) 0.5)) (apply 'mapcar (cons 'min pts)) (apply 'mapcar (cons 'max pts))))
  41.         (setq ss (ssget "WP" pts))
  42.         (if (and ss (> (sslength ss) 0))
  43.           (progn
  44.             (setq n -1)
  45.             (while (setq nam (ssname ss (setq n (1+ n)))) (if (not (ssmemb nam s1)) (ssdel nam ss)))
  46.             (setq n (sslength ss))
  47.             (cond
  48.               ((= n 1)
  49.                 (setq obj (vlax-ename->vla-object (setq nam (ssname ss 0))))
  50.                 (vla-getboundingbox obj 'p11 'p13)
  51.                 (setq p11 (vlax-safearray->list p11) p13 (vlax-safearray->list p13))
  52.                 (setq p1 (mapcar '(lambda (x y) (* (+ x y) 0.5)) p11 p13))
  53.                 (if (> (distance p1 p0) 0.01) (vla-move obj (vlax-3d-point p1) (vlax-3d-point p0)))
  54.               )
  55.               ((> n 1)
  56.                 (setq pls (get-ssbox ss) p1 (mapcar '(lambda (x y) (* (+ x y) 0.5)) (car pls) (cadr pls))) (if (> (distance p1 p0) 0.01) (sl:move ss p1 p0))
  57.               )
  58.             )
  59.             (setq n -1)
  60.             (while (setq nam (ssname ss (setq n (1+ n))))
  61.               (if (member (cdr (assoc 0 (entget nam))) '("ELLIPSE" "CIRCLE"))
  62.                 (setq elis (append elis (list nam)))
  63.                 (vl-remove nam elis)
  64.               )
  65.             )
  66.           )
  67.         )
  68.       )
  69.     )
  70.     (setq elis (cdr elis))
  71.   )
  72.   (_undo2)
  73. )
SLdesign V3.0  三领设计下载如下:
通过网盘分享的文件:三领设计 V3.0
链接: https://pan.baidu.com/s/1UAWlIANHP1Vb9ICG0ZuPdA?pwd=8tny 提取码: 8tny
GIF不难看出,代码尚有个别区格失败了,^_^


网友答: 赞,这个功能非常不错

网友答: 学习了,线条表格也遇到了这个问题,一直遗留到现在,总算有个领路的了

网友答: 挺好的了,表格用的比较少
  • 上一篇:【Gu_xl】基于方位角计算的拓扑多边形自动构建快
  • 下一篇:没有了