Baraa Natour
Baraa Natour

Reputation: 69

text aligning by dxf groups

I have a bunch of text lines , iam drawing\showing them one in each line using entmake procedure. and for that i provide a insertion point , i want the text to be aligned from the left , the problem is that the lines lengths are different and the insertion point seems to be the center of text.

i was thinking of using the length of the text and the size\height of the text to calculate the pad i need to make so the text is aligned . if iam in the right path i cant find out how to do the calculation .

if I am not please help. here is how i make text entities:

  (defun text(point text)

         (list ( cons 0  "TEXT")

           (cons 11 point)
           (cons 10  point)
           (cons 40  0.4)
           (cons 1  text)
           (cons 41  1.0)
           (cons 72  4)
               (cons 73  0)
      ) )

thank you

Upvotes: 1

Views: 1195

Answers (1)

Lee Mac
Lee Mac

Reputation: 16015

You can create left-justified single-line TEXT entities using the following entmakex expression:

(defun mytext ( ins hgt str )
    (entmakex
        (list
           '(000 . "TEXT")
            (cons 010 ins)
            (cons 040 hgt)
            (cons 001 str)
        )
    )
)

Which may be called for example:

(mytext '(1.0 1.0 0.0) 0.4 "This is a test")

Here:

  • DXF group 0 is the entity type
  • DXF group 10 is the text insertion point
  • DXF group 40 is the text height
  • DXF group 1 is the text content

These four DXF groups are the minimum groups required to create a single-line TEXT entity.

For left-justified single-line text, only DXF group 10 is required to specify the position; for all other justifications, DXF group 11 represents the text alignment point and the value of DXF group 10 (the insertion point) is ignored if supplied (though, the group must be present).

For example, for middle-center justified single-line text, you might use the following:

(defun mytext ( ins hgt str )
    (entmakex
        (list
           '(000 . "TEXT")
            (cons 010 ins)
            (cons 011 ins)
            (cons 040 hgt)
            (cons 001 str)
           '(072 . 1)
           '(073 . 2)
        )
    )
)

Here:

  • DXF group 0 is the entity type
  • DXF group 10 is the text insertion point (used if both DXF 72 and 73 are zero)
  • DXF group 11 is the text alignment point (used if either DXF 72 or 73 are non-zero)
  • DXF group 40 is the text height
  • DXF group 1 is the text content
  • DXF group 72 determines the horizontal alignment
  • DXF group 73 determines the vertical alignment

If you want to create single-line text which adheres to the properties of the active UCS (for example, created in the UCS construction plane, rotated to align with the UCS x-axis), you can use the following:

(defun mytext ( ins hgt str )
    (
        (lambda ( ocs )
            (entmakex
                (list
                   '(000 . "TEXT")
                    (cons 010 (trans ins 1 ocs))
                    (cons 050 (angle '(0.0 0.0) (trans (getvar 'ucsxdir) 0 ocs t)))
                    (cons 040 hgt)
                    (cons 001 str)
                    (cons 210 ocs)
                )
            )
        )
        (trans '(0.0 0.0 1.0) 1 0 t)
    )
)

This assumes that the insertion point will be supplied relative to the active UCS, e.g.:

(defun c:test ( )
    (mytext
        (progn
            (initget 1)
            (getpoint "\nSpecify insertion point: ")
        )
        (progn
            (initget 7)
            (getdist "\nSpecify text height: ")
        )
        (getstring t "\nSpecify text content: ")
    )
)

A reference for all of the DXF groups applicable to a TEXT entity may be found here.

Upvotes: 3

Related Questions