Aller au contenu

Justification de mtextes suivant un angle


fabcad

Messages recommandés

Bonjour,

 

Voici une suggestion de développement intéressante :

Pouvoir modifier la Justification de mtextes (textes voire attributs de blocs) suivant un angle de façon dynamique.

 

1 sélection du textuel (j'emploie ce mot pour représenter les 3 types d'objets cités ci-dessus).

2 Point de base (qui serait le centre du cercle imaginaire)

3 Puis définir la justification suivant l'angle avec l'option des quadrants pour les 5 cas particuliers (0 90 180 270 et 360).

 

0 = Milieu Gauche

entre 1 et 89 = Bas Gauche

90 = Bas Centre

entre 91 et 179 = Bas Droite

180 = Milieu Droite

entre 181 et 269 = Haut Droite

270 = Haut Centre

entre 271 et 359 = Haut Gauche

360 = Milieu Gauche

 

Merci,

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un petit LISP qui répond à ce que j'ai compris.

J'ai rajouté la justification Milieu Centre si on fait Entée au lieu de sélectionner le second point.

 

(defun c:djust (/ ent elst base)
 (if
   (and
     (setq ent (car (nentsel "\nSélectionnez un textuel: ")))
     (setq elst (entget ent))
     (member (cdr (assoc 0 elst)) '("ATTRIB" "TEXT" "MTEXT"))
     (setq base (getpoint "\nPoint de base: "))
   )
    (progn
      (entmod
 (subst (cons 10 (trans base 1 0)) (assoc 10 elst) elst)
      )
      (and (/= (assoc 0 elst) "MTEXT")
    (entmod
      (subst (cons 11 (trans base 1 0)) (assoc 11 elst) elst)
    )
      )
      (if (not
     (setq pt (getpoint base "\nCliquer un point ou : "))
   )
 (justify ent "MC")
 (progn
   (setq ang (angle base pt))
   (justify ent
	    (cond
	      ((= ang 0.0) "MG")
	      ((		      ((= ang (* pi 0.5)) "BC")
	      ((		      ((= ang pi) "MD")
	      ((		      ((= ang (* 1.5 pi)) "HC")
	      ((		    )
   )
 )
      )
    )
 )
 (princ)
)

(defun justify (ent just / elst org pos vert)
 (setq elst (entget ent))
 (if (= (cdr (assoc 0 elst)) "MTEXT")
   ;; texte multiligne
   (progn
     (setq
pos (vl-position
      just
      '(nil "HG" "HC" "HD" "MG" "MC" "MD" "BG" "BC" "BD")
    )
     )
     (entmod (subst (cons 71 pos) (assoc 71 elst) elst))
   )

   ;; texte simple ou attribut
   (progn
     (if (= (cdr (assoc 0 elst)) "TEXT")
(setq vert 73)
(setq vert 74)
     )
     (setq org (cdr (assoc 10 elst)))
     (if (= (cdr (assoc 72 elst)) (cdr (assoc vert elst)) 0)
(setq
  elst (subst (cons 11 org) (assoc 11 elst) elst)
)
(setq
  elst (subst (cons 10 (cdr (assoc 11 elst)))
	      (assoc 10 elst)
	      elst
       )
)
     )
     (entmod
(subst (cons vert
	     (cond
	       ((wcmatch just "B*") 1)
	       ((wcmatch just "M*") 2)
	       ((wcmatch just "H*") 3)
	       (T 0)
	     )
       )
       (assoc vert elst)
       (subst (cons 72
		    (cond
		      ((wcmatch just "*G") 0)
		      ((wcmatch just "*C") 1)
		      ((wcmatch just "*D") 2)
		    )
	      )
	      (assoc 72 elst)
	      elst
       )
)
     )
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Une autre 'vraiment dynamique'

 

(defun c:djust (/ ent elst base gr loop pt)
 (if
   (and
     (setq ent (car (nentsel "\nSélectionnez un textuel: ")))
     (setq elst (entget ent))
     (member (cdr (assoc 0 elst)) '("ATTRIB" "TEXT" "MTEXT"))
   )
    (progn
      (if (setq base (getpoint "\nSpécifiez le nouveau point de base ou : "))
 (progn
   (setq ins (trans base 1 0))
   (if (= (assoc 0 elst) "MTEXT")
     (entmod (subst (cons 10 ins) (assoc 10 elst) elst))
     (entmod
       (subst (cons 11 ins)
	      (assoc 11 elst)
	      (subst (cons 10 ins) (assoc 10 elst) elst)
       )
     )
   )
 )
 (if
   (or
     (= "MTEXT" (cdr (assoc 0 elst)))
     (and
       (= "TEXT" (cdr (assoc 0 elst)))
       (= 0 (cdr (assoc 73 elst)))
       (= 0 (cdr (assoc 72 elst)))
     )
     (and
       (= "ATTRIB" (cdr (assoc 0 elst)))
       (= 0 (cdr (assoc 74 elst)))
       (= 0 (cdr (assoc 72 elst)))
     )
   )
    (setq base (trans (cdr (assoc 10 elst)) 0 1))
    (setq base (trans (cdr (assoc 11 elst)) 0 1))
 )
      )
      (setq loop T)
      (princ "\nCliquer un point ou : ")
      (while (and (setq gr (grread T 4 0)) loop)
 (redraw)
 (cond
   ((= (car gr) 5)
    (setq pt (cadr gr))
    (grdraw base pt -1 1)
    (setq ang (angle base pt))
    (justify
      ent
      (cond
	((and (		((and (		((and (		((and (		((and (		((and (		((and (		(T "MG")
      )
    )
   )
   ((or	(equal gr '(2 13))
	(equal gr '(2 32))
	(member (car gr) '(12 25))
    )
    (justify ent "MC")
    (setq loop nil)
    (redraw)
   )
   ((= 3 (car gr)) (setq loop nil) (redraw))
 )
      )
    )
 )
 (princ)
)

(defun justify (ent just / elst org pos vert)
 (setq elst (entget ent))
 (if (= (cdr (assoc 0 elst)) "MTEXT")
   ;; texte multiligne
   (progn
     (setq
pos (vl-position
      just
      '(nil "HG" "HC" "HD" "MG" "MC" "MD" "BG" "BC" "BD")
    )
     )
     (entmod (subst (cons 71 pos) (assoc 71 elst) elst))
   )

   ;; texte simple ou attribut
   (progn
     (if (= (cdr (assoc 0 elst)) "TEXT")
(setq vert 73)
(setq vert 74)
     )
     (setq org (cdr (assoc 10 elst)))
     (if (= (cdr (assoc 72 elst)) (cdr (assoc vert elst)) 0)
(setq
  elst (subst (cons 11 org) (assoc 11 elst) elst)
)
(setq
  elst (subst (cons 10 (cdr (assoc 11 elst)))
	      (assoc 10 elst)
	      elst
       )
)
     )
     (entmod
(subst (cons vert
	     (cond
	       ((wcmatch just "B*") 1)
	       ((wcmatch just "M*") 2)
	       ((wcmatch just "H*") 3)
	       (T 0)
	     )
       )
       (assoc vert elst)
       (subst (cons 72
		    (cond
		      ((wcmatch just "*G") 0)
		      ((wcmatch just "*C") 1)
		      ((wcmatch just "*D") 2)
		    )
	      )
	      (assoc 72 elst)
	      elst
       )
)
     )
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Ah, (gile) à mis sa routine.

Bon, je mets quand même la mienne, histoire de n'avoir pas bossé pour rien ;)

 

(defun c:dtxt(/ ang der dxf jus lec pt1 pt2 sor txt)
 (and	(setq txt (nentsel))
(setq txt (entget (car txt)))
(member (cdr (assoc 0  txt)) '("TEXT" "MTEXT" "ATTRIB"))
(setq pt1 (getpoint "\nindiquez le point de centre : "))
(setq pt1 (trans pt1 1 0))
   (progn
     (while (not sor)
(setq lec (grread T 1 0))
(and der (entdel der))
(cond
  ((or (and (eq (car lec) 2)  (member (cadr lec) '(13 32)))
       (member (car lec) '(3 25))
    )
    (setq sor t)
  )
  ((and (eq (car lec) 5) (not (equal (cadr lec) pt1)))
    (setq pt2 (trans (cadr lec) 1 0)
	  ang (angle pt1 pt2)
    )(setq bb ang)
    (cond
      ((eq ang 0)
	(setq jus '(0 2 4))
      )
      ((and (> ang 0) (< ang (/ pi 2)))
	(setq jus '(0 1 7))
      )
      ((eq ang (/ pi 2))
	(setq jus '(1 1 8))
      )
      ((and (> ang (/ pi 2)) (< ang pi))
	(setq jus '(2 1 9))
      )
      ((eq ang pi)
	(setq jus '(2 2 6))
      )
      ((and (> ang pi) (< ang (+ pi (/ pi 2))))
	(setq jus '(2 3 3))
      )
      ((eq ang (+ pi (/ pi 2)))
	(setq jus '(1 3 2))
      )
      (T
	(setq jus '(0 3 1))
      )
    )
    (cond
      ((eq (cdr (assoc 0 txt)) "TEXT")
	(setq txt (subst (cons 11 pt2) (assoc 11 txt) txt)
	      txt (subst (cons 72 (car jus)) (assoc 72 txt) txt)
	      txt (subst (cons 73 (cadr jus)) (assoc 73 txt) txt)
	)
      )
      ((eq (cdr (assoc 0 txt)) "ATTRIB")
	(setq txt (subst (cons 11 pt2) (assoc 11 txt) txt)
	      txt (subst (cons 72 (car jus)) (assoc 72 txt) txt)
	      txt (subst (cons 74 (cadr jus)) (assoc 74 txt) txt)
	)
      )
      (T
	(setq txt (subst (cons 10 pt2) (assoc 10 txt) txt)
	      txt (subst (cons 71 (caddr jus)) (assoc 71 txt) txt)
	)
      )
    )
    (entmod txt)
    (entmake (list (cons 0 "LINE")
		   (cons 10 pt1)
		   (cons 11 pt2)
	     )
    )
    (setq der (entlast))
  )
)
     )
   )
 )
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile)

 

Je vois que nous n'avons pas compris la même chose...

Ah oui, c'est ce qui fait la richesse du site :D

 

PS : il faut une tolérance autour de 0°, 90°, 180° et 270° sinon on n'arrive pas s'arrêter sur ces angles (grrread désactive le repérage polaire).

Pas avec une résol

 

@+l

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité