明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1479|回复: 12

表格内实体居中-讨论探讨

[复制链接]
发表于 2022-8-10 12:53:28 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2022-8-11 20:04 编辑

本坛有不少这方面代码,然而,对其深入写代码起来时候,觉得实在力不从心,总做不到完美,下面贴上两个中间代码。

  • ;;表格实体居中------------
  • (defun sl-bjz (/ wt)
  •   (setq wt (ssget '((0 . "*TEXT,CIRCLE,ARC,ELLIPSE,DIMENSION,LEADER,INSERT,ATTDEF,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,SPLINE"))))
  •   (ss-bjz wt)
  • )
  • ;;wt 表选择集居中   支持所有实体--(一级)----
  • (defun ss-bjz (wt / nam plis plis1 ss n en ent pt0 p0 p01 dis pts tp a b c d)
  •   (defun en-bjz (en) ;en 实体居中
  •     (setq ent (entget en) tp (dxf1 en 0))
  •     (setq plis (e-box4 en t) a (car plis) b (cadr plis) c (caddr plis) d (nth 3 plis))
  •     (setq dis (* 0.05 (distance a d)))
  •     (setq p01 (trans (polar (sl:mid d c) (angle a d) dis) 1 0));包容盒外一点
  •     (setq pt0 (sl:mid a c)) ;实体中心
  •     (if (member tp '("ELLIPSE" "CIRCLE"))  ;先删除  
  •       (progn
  •         (entdel en)
  •         (ssdel en wt)
  •       )
  •     )
  •     (if (setq nam (sl-bound p01 nil)) ; 边界形成
  •       (progn
  •         (if (member tp '("ELLIPSE" "CIRCLE")) (entmake ent))
  •         (setq plis1 (e-box4 nam t) a (car plis1) c (caddr plis1))
  •         (setq p0 (trans (sl:mid a c) 1 0)) ;单元格中心
  •         (entdel nam)  
  •         (setq n (sslength (setq ss (ssget "W" a c))))
  •         (if (> n 0)
  •           (if (= n 1)
  •             (vla-move (en2obj (ssname ss 0)) (vlax-3d-point pt0) (vlax-3d-point p0))
  •             (progn
  •               (setq pts (get-box ss) pt0 (sl:mid (car pts) (cadr pts)))
  •               (command "MOVE" ss "" pt0 p0)
  •             )
  •           )
  •         )
  •         (setq wt (ssdiff wt ss)) ;;差集
  •       )
  •     )
  •   )
  •   ;-----------------------------------
  •   (_undo1)  
  •   (repeat (setq n (sslength wt))  
  •     (setq en (ssname wt (setq n (1- n))) tp (dxf1 en 0))
  •     (if (member tp '("ELLIPSE" "CIRCLE")) (en-bjz en))
  •   )
  •   (repeat (setq n (sslength wt))  
  •     (setq en (ssname wt (setq n (1- n))))
  •     (en-bjz en)
  •   )
  •   (_undo2)
  • )


  • ;;三领boundary----(一级)-----
  • ;;k 误差值 nil slbl
  • (defun sl-bound (p0 k / e_lst ft en en1 en2 en3)
  •   (setq ft
  •     (vl-catch-all-apply
  •       (function
  •         (lambda ()
  •           (setq e_lst (sysvar '("osmode" "cmdecho" "ORTHOMODE" "HPGAPTOL" "HPBOUND" "HPBOUNDRETAIN")))
  •           (setvar "cmdecho" 0)
  •           (setvar "OSMODE" 0)
  •           (setvar "ORTHOMODE" 0)
  •           (setvar "HPBOUND" 1) ;创建多段线 0创建面域
  •           (setvar "HPBOUNDRETAIN" 1) ;根据 HPBOUND 系统变量创建边界对象 0不创建
  •           (if (= k nil) (setq k slbl))
  •           (setvar "HPGAPTOL" k)
  •           (setq en1 (entlast))
  •           (vl-cmdf "-boundary" "a" "o" "p" "" p0 "");生成多段线
  •           (while (> (getvar "cmdactive") 0) (command "n"))
  •           (setq en2 (entlast))
  •           (bpoly p0)
  •           (setq en3 (entlast))
  •           (cond
  •             ((and (equal en2 en1) (equal en3 en1))
  •               (setq en nil)
  •             )
  •             ((and (not (equal en2 en1)) (equal en3 en1))
  •               (setq en en2)
  •             )
  •             ((and (not (equal en3 en1)) (equal en2 en1))
  •               (setq en en3)
  •             )
  •             ((and (not (equal en3 en1))
  •                (not (equal en2 en1))
  •              )
  •               (setq en en2)
  •               (entdel en3)
  •             )
  •           )
  •         )
  •       )
  •     )
  •   )
  •   (mapcar 'eval e_lst)
  •   (if (vl-catch-all-error-p ft) (setq en nil))
  •   en
  • )
以上代码的基础,就是,采用 "-boundary" “poly” 做法,对表格不完全闭合情况,不甚完美

  • ;;表格实体居中------------
  • (defun sl-bjz (/ wt en lis)
  •   (setq wt (ssget '((0 . "*TEXT,CIRCLE,ARC,ELLIPSE,DIMENSION,LEADER,INSERT,ATTDEF,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,SPLINE"))))
  •   (ss-bjz wt)
  • )
  • ;;从一个点求到某个方向最近线的距离---(一级)----
  • (defun snearlin (pt ang / dis ss n obj lst)
  •   (if  (setq ss (ssget "f" (list pt (polar pt ang (getvar "viewsize"))) '((0 . "LINE,*P*LINE"))))
  •     (progn
  •       (repeat (setq n (sslength ss))
  •         (setq  obj (en2obj (ssname ss (setq n (1- n))))
  •           dis (distance pt (vlax-curve-getclosestpointto obj pt t))
  •           lst (cons dis lst)
  •         )
  •       )  
  •       (apply 'min lst)
  •     )
  •   )
  • )
  • ;;实体四周线格包容四角点、实体中点表----(一级)----
  • ;;返回 (单元格左下 单元格右下 单元格右上 单元格左上  实体中心))
  • (defun enear4p (enam / plis p0 pz py ps px p1 p2 p3 p4)
  •   (setq plis (ebox4 enam))
  •   (setq p0 (sl:mid (car plis) (caddr plis)))
  •   (setq pz (polar p0 pi (snearlin p0 pi))
  •     py (polar p0 0 (snearlin p0 0))
  •     ps (polar p0 pi2 (snearlin p0 pi2))
  •     px (polar p0 3pi2 (snearlin p0 3pi2))
  •     p1 (list (car pz) (cadr px) 0)
  •     p2 (list (car py) (cadr px) 0)
  •     p3 (list (car py) (cadr ps) 0)
  •     p4 (list (car pz) (cadr ps) 0)
  •   )
  •   (list p1 p2 p3 p4 p0)
  • )
  • ;;wt 表选择集居中   支持所有实体--(一级)----
  • (defun ss-bjz (wt / ss n i en pt0 p0 pts a c)
  •   (_undo1)  
  •   (repeat (setq n (sslength wt))  
  •     (setq en (ssname wt (setq n (1- n))))
  •     (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (setq pts (enear4p en))))))
  •       (progn
  •         (setq a (car pts) c (caddr pts))
  •         (setq pt0 (nth 4 pts));实体中心
  •         (setq p0 (sl:mid a c)) ;单元格中心
  •         (setq i (sslength (setq ss (ssget "W" a c))))
  •         (if (> i 0)
  •           (progn
  •             (if (= i 1)
  •               (vla-move (en2obj (ssname ss 0)) (vlax-3d-point pt0) (vlax-3d-point p0))
  •               (progn
  •                 (setq pts (get-box ss) pt0 (sl:mid (car pts) (cadr pts)))
  •                 (command "MOVE" ss "" pt0 p0)
  •               )
  •             )
  •             (setq wt (ssdiff wt ss))
  •           )
  •         )
  •       )
  •     )
  •   )
  •   (_undo2)
  • )

以上这段代码另辟蹊径,然而,测试发现,也不是太完美。这种方式的缺点就是:表格线不能是连续拐弯方式。

需要说明一点,由于涉及其他,这代码不能独立运行,相信高手们一看就知道函数的作用,本坛也能搜索到。

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

发表于 2022-8-11 18:27:04 | 显示全部楼层

本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +50 收起 理由
尘缘一生 + 50 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-10 14:51:55 | 显示全部楼层
http://bbs.mjtd.com/thread-181585-1-1.html
这个帖子的跟帖的那个居中还可以
 楼主| 发表于 2022-8-10 16:01:55 | 显示全部楼层
lxl217114 发表于 2022-8-10 14:51
http://bbs.mjtd.com/thread-181585-1-1.html
这个帖子的跟帖的那个居中还可以

我仔细看过这个帖子,贴出来的代码都不行,贴出来的动画是可以的,但是,贴出来动画的,是没有放出源码的。

用我第二种方式,基本达到动画效果了。
发表于 2022-8-10 16:31:04 | 显示全部楼层
尘缘一生 发表于 2022-8-10 16:01
我仔细看过这个帖子,贴出来的代码都不行,贴出来的动画是可以的,但是,贴出来动画的,是没有放出源码的 ...

跟帖的  意思是2楼3楼  不是楼主的意思。

点评

对,哪些几段代码还是达不到要求。,  发表于 2022-8-10 16:35
发表于 2022-8-10 22:45:56 | 显示全部楼层
请问动图中对应的代码是哪一段哦?看着效果已经很完美了。
 楼主| 发表于 2022-8-10 23:15:25 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-8-10 23:19 编辑
20060510412 发表于 2022-8-10 22:45
请问动图中对应的代码是哪一段哦?看着效果已经很完美了。

是第二种方式,又进行了修改,贴上


  • ;;表格实体居中------------
  • (defun sl-bjz (/ wt en lis)
  •   (setq wt (ssget '((0 . "*TEXT,CIRCLE,ARC,ELLIPSE,DIMENSION,LEADER,INSERT,ATTDEF,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,SPLINE"))))
  •   (ss-bjz wt)
  • )
  • ;;从一个点求到某个方向最近线的距离---(一级)----
  • (defun snearlin (pt ang / dis ss n obj lst)
  •   (if  (setq ss (ssget "f" (list pt (polar pt ang (getvar "viewsize"))) '((0 . "LINE,*P*LINE"))))
  •     (progn
  •       (repeat (setq n (sslength ss))
  •         (setq  obj (en2obj (ssname ss (setq n (1- n))))
  •           dis (distance pt (vlax-curve-getclosestpointto obj pt t))
  •           lst (cons dis lst)
  •         )
  •       )  
  •       (apply 'min lst)
  •     )
  •   )
  • )
  • ;;实体四周线框包容四角点、实体中点表----(一级)----
  • ;;返回 (单元格左下 单元格右下 单元格右上 单元格左上  实体中心))
  • (defun enear4p (enam / plis p0 pz py ps px p1 p2 p3 p4)
  •   (setq plis (ebox4 enam))
  •   (setq p0 (sl:mid (car plis) (caddr plis)))
  •   (setq pz (polar p0 pi (snearlin p0 pi))
  •     py (polar p0 0 (snearlin p0 0))
  •     ps (polar p0 pi2 (snearlin p0 pi2))
  •     px (polar p0 3pi2 (snearlin p0 3pi2))
  •     p1 (list (car pz) (cadr px) 0)
  •     p2 (list (car py) (cadr px) 0)
  •     p3 (list (car py) (cadr ps) 0)
  •     p4 (list (car pz) (cadr ps) 0)
  •   )
  •   (list p1 p2 p3 p4 p0)
  • )
  • ;;wt 表选择集居中   支持所有实体--(一级)----
  • (defun ss-bjz (wt / ss n i en pt0 p0 pts a c dis ang)
  •   (_undo1)  
  •   (repeat (setq n (sslength wt))  
  •     (setq en (ssname wt (setq n (1- n))))
  •     (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (setq pts (enear4p en))))))
  •       (progn
  •         (setq a (car pts) c (caddr pts))
  •         (setq pt0 (nth 4 pts));实体中心
  •         (setq p0 (sl:mid a c)) ;单元格中心
  •         (setq dis (* 0.99 (distance a c)) ang (angle a c));;修改此处,对角点进行1%缩小,涉及本行和下面两行
  •         (setq c (polar a ang dis))
  •         (setq a (polar c (+ ang pi) dis))
  •         (setq i (sslength (setq ss (ssget "W" a c))))
  •         (if (> i 0)
  •           (progn
  •             (if (= i 1)
  •               (vla-move (en2obj (ssname ss 0)) (vlax-3d-point pt0) (vlax-3d-point p0))
  •               (progn
  •                 (setq pts (get-box ss) pt0 (sl:mid (car pts) (cadr pts)))
  •                 (command "MOVE" ss "" pt0 p0)
  •               )
  •             )
  •             (setq wt (ssdiff wt ss))
  •           )
  •         )
  •       )
  •     )
  •   )
  •   (_undo2)
  • )

发表于 2022-8-11 09:12:55 | 显示全部楼层
那个子函数ebox4,不知道是什么意思,猜不出来……

点评

就是实体四点包容盒,  发表于 2022-8-11 19:40
发表于 2022-9-4 15:04:24 | 显示全部楼层
尘缘一生 发表于 2022-8-10 23:15
是第二种方式,又进行了修改,贴上

您好,请问您还有highflybird分享的DynamicLisp源代码么?
 楼主| 发表于 2022-9-5 06:52:46 | 显示全部楼层
20060510412 发表于 2022-9-4 15:04
您好,请问您还有highflybird分享的DynamicLisp源代码么?

你看是不是这个



本帖子中包含更多资源

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

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:42 , Processed in 0.226156 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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