概要 - 文字の範囲を取得する(AutoLISP)

textbox 関数は、文字を囲むボックスの対角頂点の座標を返します。

この関数には唯一の引数として、entget が返すのと同じ形式の図形定義リスト(グループ コードと値で構成された連想リスト)を指定します。このリストには、文字オブジェクトを表す完全な連想リストを指定することも、テキスト文字列を表すリストだけを指定することもできます。

textbox が返す点は、その挿入点が(0,0,0)にあり、回転角度が 0(ゼロ)であるかのように、文字オブジェクトの境界ボックス(文字を囲んでいる仮想のボックス)を表します。返される最初のリストは、文字オブジェクトが斜体、縦書き、または基準線の下にはみ出た文字(g や p)でない限り、点 (0.0 0.0 0.0) です。最初の点リストの値は、文字の挿入点から、その文字を囲んでいる最小矩形の左下コーナーまでのオフセット距離を表します。 2 番目の点リストは、そのボックスの右上コーナーを表します。返される点リストは、計測される文字の向きに関係なく、常に境界ボックスの左下と右上のコーナーを表します。

次のコード例は、textbox が受け入れる最小限の図形定義リストを示します。他の情報を指定していないので、textbox は文字スタイルと文字高さに現在の既定を使用します。

コマンド: (textbox '((1 . "Hello world")))

((0.0 0.0 0.0) (2.80952 1.0 0.0))

textbox が返す実際の値は、現在の文字スタイルによってさまざまです。

次に、textbox 関数に図形定義リストを指定する方法の一例を示します。

コマンド: text

文字列の始点を指定 または [位置合わせオプション(J)/文字スタイル変更(S)]: 1,1

高さを指定 <0.2000>: [Enter]を押します。

文字列の角度を指定 <0>: [Enter]を指定します。

インプレイス テキスト エディタで、testと入力します。

インプレイス テキスト エディタで、[Enter]を押します

コマンド: (setq e (entget (entlast)))

((-1 . <図形名: 7ffffb05da0>) (0 . "TEXT") (330 .<図形名:

7ffffb039f0>) (5 . "1D2") (100 . "AcDbEntity") (67 .0) (410 .

"Model") (8 . "0") (100 . "AcDbText") (10 1.0 1.0 0.0) (40 .0.2) (1 .

"test") (50 .0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 .0) (72

. 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 .0))

コマンド: (textbox e)

((0.00491132 -0.00327422 0.0) (0.448295 0.195498 0.0))

次の図に、高さ 1.0 の文字オブジェクトに textbox を適用した結果を示します。この図には、文字の基準線と挿入点も示されています。

文字が縦書きまたは回転している場合でも、pt1 は左下コーナー、pt2 は右上コーナーです。 左下の点は必要に応じて負のオフセットになります。

次の図は、textbox が縦書きおよび両端揃えの文字 samples に対して返す点の値(pt1pt2)を示しています。どちらの samples も、文字の高さは 1.0 です(両端揃えの文字については、高さは両端揃えの点に合うよう調整されます)。

縦書きの文字スタイルを使用するときも、横書きの文字スタイルと同様、点は左から右、下から上の順に返されますから、最初の点リストには文字挿入点からの負のオフセットが格納されます。

文字の向きや文字スタイルに関係なく、textbox が返す点は、文字挿入点(グループ コード 10)が、対応する文字オブジェクトのオブジェクト座標系(OCS)の原点になるように変換されたものです。この点は、textbox から返された座標をその文字の実際の範囲を定義する点に変換するときに参照できます。次の 2 つのサンプル関数は、選択した文字の回りに、その向きに関係なく、textbox を使用してボックスを描きます。

最初のルーチンは、textbox 関数を使用して、選択した文字オブジェクトの回りにボックスを描きます。

(defun C:TBOX ( / textent tb ll ur ul lr)
  (setq textent (car (entsel "\nSelect text: ")))
  (command "._ucs" "Object" textent)
  (setq tb (textbox (list (cons -1 textent)))
        ll (car tb)
        ur (cadr tb)
        ul (list (car ll) (cadr ur))
        lr (list (car ur) (cadr ll))
  )
  (command "._pline" ll lr ur ul "Close")
  (command "._ucs" "p")
 (princ)
)

次に示す 2 番目のルーチンは、AutoLISP 関数 sincos を使用して幾何学的な計算を実行することで、最初のルーチンと同じ処理を行っています。正しい結果が得られるのは、現在の UCS が文字オブジェクトの平面に平行な場合だけです。

(defun C:TBOX2 ( / textent ang sinrot cosrot t1 t2 p0 p1 p2 p3 p4)
  (setq textent (entget (car (entsel "\nSelect text: "))))
  (setq p0 (cdr (assoc 10 textent))
        ang (cdr (assoc 50 textent))
        sinrot (sin ang)
        cosrot (cos ang)
        t1 (car (textbox textent))
        t2 (cadr (textbox textent))
        p1 (list
               (+ (car p0)
                 (- (* (car t1) cosrot)(* (cadr t1) sinrot))
               )
               (+ (cadr p0)
                 (+ (* (car t1) sinrot)(* (cadr t1) cosrot))
               )
             )
        p2 (list
               (+ (car p0)
                 (- (* (car t2) cosrot)(* (cadr t1) sinrot))
               )
               (+ (cadr p0)
                 (+ (* (car t2) sinrot)(* (cadr t1) cosrot))
               )
             )
        p3 (list
               (+ (car p0)
                 (- (* (car t2) cosrot)(* (cadr t2) sinrot))
               )
               (+ (cadr p0)
                 (+ (* (car t2) sinrot)(* (cadr t2) cosrot))
               )
             )
        p4 (list
               (+ (car p0)
                 (- (* (car t1) cosrot)(* (cadr t2) sinrot))
               )
               (+ (cadr p0)
                 (+ (* (car t1) sinrot)(* (cadr t2) cosrot))
               )
             )
  )
  (command "._pline" p1 p2 p3 p4 "c")
 (princ)
)