Jump to content

Function to calculate Mtext Justification based on Rotation


Recommended Posts

Posted

@CivilTechSource

Quote

I suppose the next to improve it is add offset, or a settings menu?

It's easy to do that.

I have make a more robust filter for mtext (with your exemple, adjust if necessary) 

(defun q_ang (alpha / )
  (cond
    ((not (eq (rem alpha (* 1.5 pi)) alpha)) 4)
    ((not (eq (rem alpha pi) alpha)) 3)
    ((not (eq (rem alpha (* 0.5 pi)) alpha)) 2)
    (T 1)
  )
)
(defun c:wow ( / ss ent dxf_ent ptlst n pt_cen dir_ang tmp ofst n rot)
  (princ "\nSelect closed polylines")
  (setq ss (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&") (70 . 1))))
  (cond
    (ss
      (initget 4)
      (setq
        ent (ssname ss 0)
        dxf_ent (entget ent)
        ptlst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_ent))
        n (float (length ptlst))
        pt_cen (list (/ (apply '+ (mapcar 'car ptlst)) n) (/ (apply '+ (mapcar 'cadr ptlst)) n))
        dir_ang (mapcar 'q_ang (mapcar '(lambda (x) (angle pt_cen x)) ptlst))
        tmp (* (distance pt_cen (car ptlst)) 0.25)
        ofst (getdist (car ptlst) (strcat "\nOffset for text <" (rtos (getvar "TEXTSIZE")) ">?: "))
      )
      (if (not ofst) (setq ofst (getvar "TEXTSIZE")))
      (mapcar
        '(lambda (p d / j po)
          (setq qsel (ssget "_C" (mapcar '- p (list tmp tmp 0.0)) (mapcar '+ p (list tmp tmp 0.0)) '((0 . "MTEXT") (8 . "-LE-E-External Levels") (7 . "LE Standard (No Height)"))))
          (cond
            (qsel
              (repeat (setq n (sslength qsel))
                (setq
                  ent (ssname qsel (setq n (1- n)))
                  dxf_ent (entget ent)
                  rot (cdr (assoc 50 dxf_ent))
                )
                (if (eq d 1) (if (zerop rot) (setq j 9 po (polar p (* 0.5 pi) ofst)) (setq j 7 po (polar p 0.0 ofst))))
                (if (eq d 2) (if (zerop rot) (setq j 7 po (polar p (* 0.5 pi) ofst)) (setq j 1 po (polar p pi ofst))))
                (if (eq d 3) (if (zerop rot) (setq j 1 po (polar p (* 1.5 pi) ofst)) (setq j 7 po (polar p pi ofst))))
                (if (eq d 4) (if (zerop rot) (setq j 3 po (polar p (* 1.5 pi) ofst)) (setq j 1 po (polar p 0.0 ofst))))
                (setq dxf_ent (subst (cons 10 po) (assoc 10 dxf_ent) dxf_ent))
                (setq dxf_ent (subst (cons 71 j) (assoc 71 dxf_ent) dxf_ent))
                (entmod dxf_ent)
              )
            )
          )
        )
        ptlst dir_ang
      )
    )
  )
  (prin1)
)

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...