明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4925|回复: 17

[提问] 再次求助高手们完善下面这个封闭区域内文本居中小程序

[复制链接]
发表于 2013-6-12 08:21:20 | 显示全部楼层 |阅读模式
本帖最后由 hnlgy 于 2013-6-12 08:53 编辑

原程序来自论坛里的 “绝情一剑” ,短小精悍,比较实用。根据我的需求小小地改动了一下选择对象的方式。原程序只允许选择单行文本,现在改为可以选中单行、多行文本了。实际运行过程中多行文本居中有问题。 vla-getboundingbox函数在取得多行文本包围框坐标的时候,是按照多行文本的宽度、高度值来取值的,而不是按实际文本的宽度与高度。解决的办法是将多行文本的宽度、高度值设置为0,就可以获得满意的效果。 请高手们修改一下下面的代码,将多行文本的宽度、高度属性设置为0。

;;;==================================================================================
;;; 文字居中程序,SNSJ。原程序来自 明经论坛 绝情一剑
;;; 原帖地址:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=67812&page=3#pid358978
;;; 命令 WZCS
;;;==================================================================================
(defun c:WZCS (/ mid obj mid1 dob selobjs)
  (setvar "cmdecho" 0)
  (Princ "\n 将所选文字在封闭区域内对齐... \n")
  (setq selobjs (ssget '((0 . "TEXT,MTEXT"))))
  (vl-cmdf "undo" "BE")
  (if selobjs
    (progn
      (vlax-for obj (vla-get-activeselectionset
        (vla-get-activedocument (vlax-get-acad-object))
      )
(if (/= (setq ob (bpoly (setq mid (pt1-pt2-mid obj)))) nil)
   (progn
     (setq mid1
     (pt1-pt2-mid (setq dob (vlax-ename->vla-object ob)))
     )
     (vla-delete dob)
     (vla-move obj (vlax-3D-point mid) (vlax-3D-point mid1))
   )
)
      )
    )
    (princ "\n...您未选中文本对象...")
  )
  (vl-cmdf "undo" "E")
  (princ)
)

;;;|求物体中心
(defun pt1-pt2-mid (e / minpoint maxpoint)
  (vla-getboundingbox e 'minpoint 'maxpoint)
  (setq pt (mapcar '*
     '(0.5 0.5)
     (mapcar '+
      (vlax-safearray->list minpoint)
      (vlax-safearray->list maxpoint)
     )
    )
  )
)

发表于 2022-2-20 08:34:17 | 显示全部楼层
gzxl 发表于 2013-6-15 00:03
是不是这样的?先发个测试的fas,如是这样再奉上代码

大佬 能发一下这个文本居中的源码 学习一下吗
发表于 2013-6-12 09:39:14 | 显示全部楼层
多行文字居中后字基本重合,何解
 楼主| 发表于 2013-6-12 10:02:46 来自手机 | 显示全部楼层
您那不是多行文本,而是多个单行文本对象。
单行文本是由text对象,多行文本是mtext对象。
发表于 2013-6-12 10:03:30 | 显示全部楼层
试试这个
  1. ;;;===选择集实体外矩形框(左下角点与右上角点)
  2. ;;;示例 (GetssBox (ssget))
  3. (defun GetssBox (ss / i L l1 l2 ll ur)
  4.   (setq L (sslength ss))
  5.   (repeat (setq i L)
  6.     (vla-getBounDingBox (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 'll 'ur)
  7.     (setq l1 (cons (vlax-safearray->list ll) l1)
  8.           l2 (cons (vlax-safearray->list ur) l2)
  9.     )
  10.   )
  11.   (mapcar '(lambda (a b) (apply 'mapcar (cons a b))) '(min max) (list l1 l2))
  12. )
发表于 2013-6-12 10:39:04 | 显示全部楼层
hnlgy 发表于 2013-6-12 10:02
您那不是多行文本,而是多个单行文本对象。
单行文本是由text对象,多行文本是mtext对象。

改了下好像一样的,楼主最好发张测试图
发表于 2013-6-12 11:02:24 | 显示全部楼层
可以联系我QQ496968041
发表于 2013-6-12 11:06:45 | 显示全部楼层
wau2000022 发表于 2013-6-12 11:02
可以联系我QQ496968041

啥意思,QQ号码广告
发表于 2013-6-13 11:18:12 | 显示全部楼层
其实楼主不必局限于文字,
我这里收藏了一个,很通用的:
非常感谢原作者zml84大师
;对象居中(zml84,2009-06-15)
(defun c:xa(/ X Y SIZE PT EN AREA STR TMP)
(while(setq SS (entsel "\n点取需要居中的对象:"))
(setq EN (car SS))
(command "undo" "be")
(setq EN_TMP (bpoly (cadr SS)))
(progn (setq TMP (BOX EN)
TMP (mapcar '+ (car TMP) (cadr TMP))
PT0 (mapcar '* TMP '(0.5 0.5 0.5)))
(setq TMP (BOX EN_TMP)
TMP (mapcar '+ (car TMP) (cadr TMP))
PT1 (mapcar '* TMP '(0.5 0.5 0.5)))
(command "_.move" EN "" "non" PT0 "non" PT1)
(entdel EN_TMP)))
(princ))
(defun BOX (E / LL UR)
(vla-getboundingbox (vlax-ename->vla-object E) 'LL 'UR)
(mapcar 'vlax-safearray->list (list LL UR)))
 楼主| 发表于 2013-6-13 15:52:30 | 显示全部楼层
669423907 发表于 2013-6-13 11:18
其实楼主不必局限于文字,
我这里收藏了一个,很通用的:
非常感谢原作者zml84大师

谢谢您的回复,不过还是不符合我的需求。1、未能解决多行文本的问题。2、只能一个个的选择,不能一次框选。
 楼主| 发表于 2013-6-14 20:07:31 | 显示全部楼层
顶起来让大家看见,别沉了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:38 , Processed in 0.228349 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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