明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9274|回复: 34

[资源] 封闭区域的文字对齐[源码]

  [复制链接]
发表于 2013-6-5 06:28 | 显示全部楼层 |阅读模式
本帖最后由 yxp 于 2013-6-5 17:53 编辑

用了飞诗的 ssget 函数,仿一下院长的程序

按字符对齐时,可能会因文字高度不同而缩进距离不同。


  1. ;;**********************************************
  2. ;;带关键字的 ssget  原创:飞诗,来自明经通道论坛
  3. ;;转载、引用请注明出处
  4. ;;**********************************************

  5. (defun Fsxm-entsel (msg filter /  enp)
  6.   (setq enp (entsel msg))
  7.   (if (or (= (type enp) 'str)
  8.           (and enp (ssget (cadr enp) filter))
  9.       )
  10.     enp
  11.   )
  12. )

  13. ;;;用分隔符解释字符串成表
  14. (defun Fsxm-Split (string strkey / po strlst xlen)
  15.   (setq xlen (1+ (strlen strkey)))
  16.   (while (setq po (vl-string-search strkey string))
  17.     (setq strlst (cons (substr string 1 po) strlst))
  18.     (setq string (substr string (+ po xlen)))
  19.   )
  20.   (reverse (cons string strlst))
  21. )

  22. ;;点化字串
  23. (defun Pt2Str (pt)
  24.   (strcat (rtos (car pt) 2 20)
  25.          ","
  26.           (rtos (cadr pt) 2 20)
  27.           ","
  28.           (rtos (caddr pt) 2 )
  29.           "\n")
  30. )

  31. (defun Fsxm-ssget (Msg Kwd Fil / Kwd0 pt var)
  32.   (cond ((cadr (ssgetfirst)))
  33.         (t
  34.          (setq Kwd0 "W L C BOX ALL F WP CP G A R M P U AU SI")
  35.          (initget (strcat Kwd0 " " kwd))
  36.          (cond ((and (listp (setq var (fsxm-entsel Msg Fil)))
  37.                      (/= 52 (getvar "errno"))
  38.                 )
  39.                 (vla-sendcommand *doc* (Pt2Str (cadr (grread t))))
  40.                 (ssget ":S" Fil)
  41.                )
  42.                ((member var (fsxm-split Kwd0 " "))
  43.                 (vla-sendcommand *doc* (strcat var "\n"))
  44.                 (ssget ":S" Fil)
  45.                )
  46.                (t var)
  47.          )
  48.         )
  49.   )
  50. )


  51. ;;**********************************************
  52. ;;表格内文字水平对齐,条件: 文字外为线条封闭
  53. ;;明经通道   by yxpxa    2013-6-5
  54. ;;**********************************************

  55. (defun c:bgtxt( / Ltn bgtxt-s bgtxt-a ss *acad* *doc* *error* *txtdq* *fpath* f)
  56.   (defun *error*(msg)(princ "\n程序结束")(princ))
  57.   (setq *acad* (vlax-get-acad-object)
  58.         *doc* (vla-get-ActiveDocument *acad*)
  59.         *fpath* (strcat (getvar "LOCALROOTPREFIX") "bgtext.dcl"))
  60.         
  61.   (setq Ltn '(0 1 2 3 4 5 6 7 8 9 10)  ;;dcl控件数
  62.         bgtxt-s (mapcar '(lambda(x) (strcat "bgtext" (itoa x))) Ltn)
  63.         bgtxt-a '(1 0 0 0 4.5 2 4.5 2 0 1 0))  ;;默认值
  64.   (or *bgtxt-val* (setq *bgtxt-val* (mapcar 'cons bgtxt-s bgtxt-a))) ;;全局变量表:控件名及值
  65.   ;;创建对话框
  66.   (if (null (findfile *fpath*))(progn
  67.    (setq f (open *fpath* "w"))
  68.        (mapcar '(lambda(x) (write-line x f)) (bgtxtssdcl))
  69.    (close f)
  70.   ))
  71.   (show-mode *bgtxt-val*)
  72. (while (setq ss (Fsxm-ssget "\n模式设置(D) / 或选择表格内文字 <退出>:" "D" '((0 . "TEXT"))))
  73.         (cond ((= ss "D") (bgtxt-getval))
  74.               ((= (type ss) 'PICKSET)(bgtxt-treat ss))))
  75. (princ)
  76. )

  77. ;;文字修改主程序
  78. (defun bgtxt-treat (ss / n a lhig lsys ptxt as ptz ptLt xxx wkent ptl xmax xmin Ldis Rdis)
  79. (setq n 0 a *bgtxt-val*)
  80. (setq Lhig (getvar "TEXTSIZE") Lsys (getvar "TEXTSTYLE"))
  81. (command "undo" "be")
  82. (if (> (sslength ss) 0)
  83.   (repeat (sslength ss)
  84.      (setq ptxt (entget (ssname ss n)))
  85.      (if (= (cdr (nth 10 a)) 1)
  86.        (setq as (vl-string-left-trim " " (cdr (assoc 1 ptxt)))
  87.              ptz (subst (cons 1 as)(assoc 1 ptxt) ptxt)
  88.              ptxt (entmod ptz)))
  89.      (if ptxt        
  90.      (setq ptz (cdr (assoc 10 ptxt))
  91.            ptLt (txt-sbox ptxt)
  92.            xxx (car(car(textbox ptxt)))
  93.           wkent (bpoly (caddr ptLt))
  94.               n (1+ n))) ;;外框
  95.      (if (and ptxt wkent) (progn
  96.      (setq wkdxf (entget wkent)
  97.             ptL (vl-remove 'nil (mapcar '(lambda(x)(if (= (car x) 10)(cdr x))) wkdxf))
  98.             xmax (apply 'max (mapcar 'car ptL))
  99.             xmin (apply 'min (mapcar 'car ptL)))
  100.       (setq Ldis (if (= (cdr (nth 9 a)) 1) (* (cadr ptLt) (cdr (nth 5 a)))(cdr (nth 4 a)))
  101.             Rdis (if (= (cdr (nth 9 a)) 1) (* (cadr ptLt) (cdr (nth 7 a)))(cdr (nth 6 a))))
  102.       (cond
  103.           ((= *txtdq* "左")(setq ptxt (bgtxt-modfy ptxt))
  104.                 (entmod(subst (list 10 (- (+ xmin Ldis) xxx) (cadr ptz)) (assoc 10 ptxt) ptxt)))
  105.           ((= *txtdq* "右")(setq ptxt (bgtxt-modfy ptxt))
  106.                (entmod(subst (list 10 (- xmax Rdis (car ptLt) xxx) (cadr ptz)) (assoc 10 ptxt) ptxt)))
  107.           ((= *txtdq* "中")(setq ptxt (bgtxt-modfy ptxt))
  108.               (entmod(subst (list 10 (- (/ (- (+ xmin xmax) (car ptLt)) 2.) xxx) (cadr ptz)) (assoc 10 ptxt) ptxt)))
  109.           ((= *txtdq* "分散")(if (= (cdr (nth 8 a)) 1)(setq Ldis Rdis))
  110.              (entmod (setq ptxt (subst '(72 . 5)(assoc 72 ptxt) ptxt)
  111.                     ptxt (subst (list 10 (- (+ xmin Ldis) xxx) (cadr ptz)) (assoc 10 ptxt) ptxt)
  112.                     ptxt (subst (list 11 (- xmax Rdis)(cadr ptz) 0)(assoc 11 ptxt) ptxt)
  113.                     ptxt (subst '(73 . 0)(assoc 73 ptxt) ptxt)))
  114.             )
  115.       )(entdel wkent)
  116.      ))
  117.   )
  118.   (princ "\n未选择文本,程序结束")
  119.   )
  120. (command "undo" "e")
  121. (setvar "TEXTSIZE" Lhig)(setvar "TEXTSTYLE" Lsys)
  122. (princ)
  123. )

  124. (defun bgtxt-modfy( dxf )
  125. (setq dxf (subst '(72 . 0)(assoc 72 dxf) dxf)
  126.       dxf (subst '(73 . 0)(assoc 73 dxf) dxf)
  127.       dxf (subst '(41 . 0.76)(assoc 41 dxf) dxf)  ;;修改宽度比例
  128. )
  129. )

  130. ;;返回单行文本的宽度、中心
  131. (defun txt-sbox( Ldxf / Lsys Lhig p1 p2 p4th tw pp wsing)
  132. (setq Lsys (cdr (assoc 7 Ldxf))  ;;样式
  133.        Lhig (cdr (assoc 40 Ldxf)) ;;字高
  134.         p1 (cdr (assoc 10 Ldxf))    ;;文字dxf左下角
  135.         pp (textbox Ldxf)           ;;文字伪对角线
  136.         tw (abs (- (car (cadr pp))(car (car pp))))    ;;文字的绝对宽度
  137.         th (- (cadr (cadr pp))(cadr (car pp)))  ;;文字的绝对高度
  138.         p2 (list (+ (car p1) (car(car pp))) (+ (cadr p1)(cadr(car pp))))  ;;左下
  139.         P4 (list (+ (car p2) (* 0.5 tw)) (+ (cadr p2) (* 0.5 th))))       ;;中
  140.   (setvar "TEXTSIZE" Lhig)(setvar "TEXTSTYLE" Lsys)
  141.   (setq pp (textbox '((1 . "字")))
  142.         Wsing (- (car (cadr pp))(car (car pp))));;单字宽度
  143.   (list tw wsing p4) ;;(+ (cadr p1)(cadr(car pp)))
  144. )

  145. ;;模式显示
  146. (defun show-mode(a)
  147. (princ (strcat "\n模式: 对齐= "
  148.   (setq *txtdq* (car (vl-remove nil (mapcar '(lambda(x y)(if (= (cdr x) 1) y)) a '("左" "中" "右" "分散")))))
  149.   (if (= (cdr (nth 9 a)) 1)
  150.   (strcat "; 按字符缩进: 左侧= " (itoa (cdr (nth 5 a))) " 字符, 右侧= " (itoa (cdr (nth 7 a))) " 字符" )
  151.   (strcat "; 按距离缩进: 左侧= " (rtos (cdr (nth 4 a))) " 右侧= " (rtos (cdr (nth 6 a))))) "; 其他: "
  152.   (if (= (cdr (nth 8 a)) 1) "对称缩进" "无")
  153. ))
  154. )

  155. ;;DCL主菜单控制
  156. (defun bgtxt-getval( / Ltn dcl_id tems next)
  157. ;;DCL加载
  158. (setq next 2 dcl_id (load_dialog *fpath*))
  159. (while (>= next 2)
  160.   (if (not (new_dialog "bgtext" dcl_id))(exit))

  161. ;;下拉列表控件初始化
  162.   (foreach n '("bgtext5" "bgtext7")
  163.     (start_list n)
  164.     (mapcar '(lambda(x)(add_list (strcat (itoa x) " 字符"))) '(0 1 2 3 4))
  165.     (end_list)
  166.   )(setvar "DIMZIN" 9)
  167. ;;DCL控件操作预定义
  168.   (foreach n *bgtxt-val*
  169.      (set_tile (car n) (rtos (cdr n) 2 2)) ;;所有控件的赋值操作
  170.       (action_tile (car n) "(setq tems (dclvalue))") ;;取值操作
  171.    )
  172.   (bgthesame (get_tile "bgtext8"))
  173.   (action_tile "bgtext8" "(bgthesame $$$$value)")
  174.   (action_tile "bgbuton3" "(done_dialog 3)")
  175.   (action_tile "bgbuton2" "(done_dialog 2)")
  176.   (setq next (start_dialog))
  177.   (cond
  178.     ((and (= next 1) tems) (show-mode (setq *bgtxt-val* tems)));;按确定键赋值有效
  179.     ((= next 2)(putvalue 6 (getdist "\n请输入右侧间距 或 <点取>: "))(putvalue 9 0)(putvalue 8 0))
  180.     ((= next 3)(putvalue 4 (getdist "\n请输入左侧间距 或 <点取>: "))(putvalue 9 0)))
  181. )
  182.   (unload_dialog dcl_id)
  183. (princ)
  184. )

  185. ;;DCL取值函数
  186. (defun dclvalue()
  187. (mapcar '(lambda(x) (cons (car x) (read (get_tile (car x))))) *bgtxt-val*)
  188. )
  189. (defun putvalue(n i / s)
  190. (setq s (car (nth n *bgtxt-val*))
  191.     *bgtxt-val* (subst (cons s i)(assoc s *bgtxt-val*) *bgtxt-val*))
  192. )
  193. (defun bgthesame(s)
  194. (if (= s "1")(progn
  195. (set_tile "bgtext6" (get_tile "bgtext4"))
  196. (set_tile "bgtext7" (get_tile "bgtext5"))))
  197. )

  198. (defun bgtxtssdcl()
  199. '("bgtext:dialog {label="表格内文字对齐";spacer_1;"
  200. ":boxed_column{label="水平对齐";"
  201. ":row{:radio_button{key="bgtext0";label="左(&L)";}"
  202. "    :radio_button{key="bgtext1";label="中(&M)";}"
  203. "    :radio_button{key="bgtext2";label="右(&R)";}"
  204. "    :radio_button{key="bgtext3";label="分散(&F)";}}}"
  205. ":boxed_column {label="缩进距离";"
  206. ":row{:edit_box{key="bgtext4";label="左侧(&A)";}"
  207. ":button{label=".<";key="bgbuton3";fixed_width=true;}"
  208. ":popup_list{key="bgtext5";}}"
  209. ":row{:edit_box{key="bgtext6";label="右侧(&B)";}"
  210. ":button{label=".<";key="bgbuton2";fixed_width=true;}"
  211. ":popup_list{key="bgtext7";}}:spacer{height=0.1;}"
  212. ":row{:toggle{label="按字符宽度";key="bgtext9";}"
  213. ":toggle{label="对称缩进";key="bgtext8";}}}"
  214. ":row{:spacer{width=0.2;}:toggle{label="删除文字前空格";"
  215. " key="bgtext10";}:spacer{width=20;}}"
  216. " spacer_1;:row{spacer_1;"
  217. ":button{label="确定";key="bgbuton1";is_default=true;}"
  218. ":button{label="取消";key="bgbuton0";is_cancel=true;}"
  219. " spacer_1;}spacer_1;}"))

  220. (princ)

本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +4 金钱 +5 收起 理由
xyz2009xyz + 1 + 5 很给力!
仲文玉 + 1 赞一个!支持楼主
hhhlike + 1 楼主好人啊
669423907 + 1 赞一个!谢谢楼主!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2018-5-3 11:49 | 显示全部楼层
qq1254582201 发表于 2018-5-3 10:56
网上有网友那你的程序赚钱呢,赶紧投诉他http:// www.lisp123.com/wbl/2015/0129/440.html

果然是的,免费就罢了,竟然还收费,太不地道了。
没地方投诉啊,这网站就是他的
发表于 2019-10-16 10:31 | 显示全部楼层
兄弟,你的这个程序非常好,又是源码,可惜不能竖向对齐,

能不能加上一个竖向中心对齐啊,感谢ing
发表于 2018-5-3 10:56 | 显示全部楼层
网上有网友那你的程序赚钱呢,赶紧投诉他http:// www.lisp123.com/wbl/2015/0129/440.html
发表于 2013-6-5 07:52 | 显示全部楼层
正事所需的,谢谢
发表于 2013-6-5 08:03 | 显示全部楼层
好像用过后会改变文字的宽度

点评

yxp
在源码138行,你把那行屏蔽即可  发表于 2013-6-5 17:48
发表于 2013-6-5 08:03 | 显示全部楼层
这个非常不错
发表于 2013-6-5 08:55 | 显示全部楼层
程序改变了用户设置的字体的宽度因子。谢谢楼主分享。

点评

yxp
自己修改源码吧  发表于 2013-6-5 17:56
发表于 2013-6-5 10:32 | 显示全部楼层
来顶贴的,支持!
发表于 2013-6-6 20:20 | 显示全部楼层
好东西,应该上个演示的,增强一下大家的下载欲望。感谢了
发表于 2013-6-6 21:30 | 显示全部楼层
测试过了,提出个建议,能否加个竖向对齐,不仅仅有水平对齐选项。
发表于 2013-6-7 09:28 | 显示全部楼层
好东西,支持源码分享,感谢了
发表于 2013-6-7 14:08 | 显示全部楼层
这个确实是好东东呀,赶快下载。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 10:26 , Processed in 0.251158 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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