最初由 sywdl 发布
[B]我想达到如下的效果, 不知道如何实现??
输入一些文字,并给出文字在书写长度,当文字的长度大于书写长度时,文字自动换行! [/B]
写完文字后,得到文字的包围框,判断是否大于指定长度。
如果大,那么你在内存中,以写完的那个文字的ads_entget数据为基础,依次用ads_subst ,循环依次用一个、两个、。。。字符生成新的数据,利用ads_textbox函数得到依次的文字框,得到长度,找到小于等于指定长度的文字后,后面的文字提取出来,换行重新写,同时把写完的那个文字用前面小于指定长度的字符串替换掉。
在LISP下,我就是用上面方法写的,你可以看看“晓东工具箱”里面关于文字处理的工具。
在ARX下面,可能还有其他的方法,没有考虑过。我想使用AcGeTextStyle类下的方法,应该更方便的做出来。
- [FONT=courier new]
- AcGiTextStyle::extents Function virtual AcGePoint2d
- extents(
- const char* pStr,
- const Adesk::Boolean penups,
- const int len,
- const Adesk::Boolean raw,
- AcGiWorldDraw * ctxt = NULL) const;
- [/font]
- [FONT=courier new]
- AcGiTextStyle::extentsBox Function virtual Acad::ErrorStatus
- extentsBox(
- const char* pStr,
- const Adesk::Boolean penups,
- const int len,
- const Adesk::Boolean raw,
- AcGePoint2d & extMin,
- AcGePoint2d & extMax,
- AcGiWorldDraw * ctxt = NULL) const;
- pStr Description to come
- penups Description to come
- len Description to come
- raw Description to come
- extMin Description to come
- extMax Description to come
- ctxt Description to come
- [/font]
下面的LISP的代码是可以在一个图中文字,指定中间的任一点,把文字在该点打断成前后两个字符串。
- [FONT=courier new]
- (defun $xdlsp_txtbrk (e pt / e0 e1 p10 le le0 le1 p1 px a a1 d d1 dx dm i i1
- txt txt1 cha tfhz tf pos
- )
- (xdrx_setenttodb e)
- (if (= "TEXT" (xdrx_getentdxf 0))
- (progn
- (setq _pi2 (/ pi 2)
- le0 (entget e)
- e1 (assoc 1 le0)
- txt (cdr e1)
- p10 (assoc 10 le0)
- p1 (cdr p10)
- a (cdr (assoc 50 le0))
- a1 (+ a _pi2)
- px (trans pt 1 0)
- dx (xdrx_p2ldist px p1 (polar p1 a1 1e3))
- )
- (setq dm (caadr ($xdlsp_textbox le0))
- i 1
- i1 1
- d1 0
- txt1 ""
- tf T
- )
- (while (and
- tf
- (/= "" (setq cha (substr txt i 1)))
- )
- (if (setq tfhz (> (ascii cha) 159))
- (setq cha (substr txt i 2))
- )
- (setq txt1 (strcat txt1 cha)
- le (subst
- (cons 1 txt1)
- e1
- le0
- )
- d (caadr ($xdlsp_textbox le))
- i (+ i (if tfhz
- 2
- 1
- )
- )
- tf (> dx d)
- )
- (if tf
- (setq i1 i
- d1 d
- le1 le
- len (strlen (cdr (assoc 1 le)))
- )
- )
- )
- (if (< (abs (- d dx)) (abs (- d1 dx)))
- (setq i1 i
- d1 d
- le1 le
- )
- )
- (if (and
- (not tf)
- (<= 2 i1 (strlen txt))
- )
- (progn
- (setq pos (strlen (xdrx_string_trimRight (cdr (assoc 1 le1))))
- le (subst
- (cons 1 (substr txt i1))
- e1
- le0
- )
- d1 (caadr ($xdlsp_textbox le))
- px (polar p1 a (- dm d1))
- le (subst
- (cons 10 px)
- p10
- le
- )
- )
- (list pos px)
- )
- )
- )
- )
- )
- [/FONT]
|