Aller au contenu

Coup de "Stabilo" sur un texte


bonuscad

Messages recommandés

Bonjour,

 

Suite à une demande sur le forum Autodesk, je me suis amusé à essayé d'écrire une fonction pour réaliser cela.

Si celle-ci fonctionne bien (quelque soit le SCU) sur des textes simples, j'aurais trouvé intéressant de l'étendre aux textes multi-lignes. Mais je ne vois pas comment appréhender ceux-ci..., un challenge ?

 

Voici déjà le code pour les textes simples

 

(vl-load-com)
(defun transpts (apt matrix / )
 (list
   (+
     (* (car (nth 0 matrix)) (car apt))
     (* (car (nth 1 matrix)) (cadr apt))
     (* (car (nth 2 matrix)) (caddr apt))
     (cadddr (nth 0 matrix))
   )
   (+
     (* (cadr (nth 0 matrix)) (car apt))
     (* (cadr (nth 1 matrix)) (cadr apt))
     (* (cadr (nth 2 matrix)) (caddr apt))
     (cadddr (nth 1 matrix))
   )
   (+
     (* (caddr (nth 0 matrix)) (car apt))
     (* (caddr (nth 1 matrix)) (cadr apt))
     (* (caddr (nth 2 matrix)) (caddr apt))
     (cadddr (nth 2 matrix))
   )
 )
)
(defun c:stabilo ( / js dxf_ent dxf_210 dxf_10 dxf_50 txt_box mat entline PathObj EndDist StartPoint EndPoint
                    tmp tmp0 e_last dxf_last)
 (setq js (ssget "_+.:E:S" '((0 . "TEXT"))))
 (cond
   (js
     (setq
       dxf_ent (entget (ssname js 0))
       dxf_210 (cdr (assoc 210 dxf_ent))
       dxf_10 (trans (cdr (assoc 10 dxf_ent)) dxf_210 0)
       dxf_50 (cdr (assoc 50 dxf_ent))
       txt_box (textbox dxf_ent)
       mat
       (mapcar
         '(lambda (n x d / )
           (append n (list x) (list d))
         )
         (mapcar '(lambda (v) (trans v dxf_210 0)) '((1 0 0) (0 1 0) (0 0 1)))
         dxf_10
         '(0 0 0 1)
       )
     )
     (entmake
       (list
         '(0 . "LINE")
         '(100 . "AcDbEntity")
         (assoc 67 dxf_ent)
         (assoc 410 dxf_ent)
         (assoc 8 dxf_ent)
         '(100 . "AcDbLine")
         (cons 10 (transpts (car txt_box) mat))
         (cons 11 (transpts (polar (car txt_box) dxf_50 (- (caadr txt_box) (caar txt_box))) mat))
         '(39 . 0)
         '(60 . 1)
         (assoc 210 dxf_ent)
       )
     )
     (setq
       entline (entlast)
       PathObj (vlax-ename->vla-object entline)
       EndDist (vlax-curve-getDistAtParam PathObj (vlax-curve-getEndParam PathObj))
       StartPoint nil
       EndPoint nil
     )
     (princ "\nDonnez le debut du surlignage du texte")
     (while (= 5 (car (setq tmp (grread t 5 1))))
       (cond
         ((= 5 (car tmp))
           (if StartPoint (grdraw (trans StartPoint 0 1) (trans tmp0 0 1) -1))
           (setq
             StartPoint (vlax-curve-getClosestPointTo PathObj (trans (cadr tmp) 1 0))
             tmp0 (polar (trans StartPoint 0 dxf_210) (+ (* 0.5 pi) dxf_50) (- (cadadr txt_box) (cadar txt_box)))
           )
           (grdraw (trans StartPoint 0 1) (trans tmp0 dxf_210 1) -1)
         )
         (T (princ "\nArrêt anormal de la commande "))
       )
     )
     (entmake
       (list
         '(0 . "SOLID")
         '(100 . "AcDbEntity")
         (assoc 67 dxf_ent)
         (assoc 410 dxf_ent)
         (assoc 8 dxf_ent)
         '(62 . 2)
         '(100 . "AcDbTrace")
         (cons 10 (trans StartPoint 0 dxf_210))
         (cons 11 (trans StartPoint 0 dxf_210))
         (cons 12 tmp0)
         (cons 13 tmp0)
         '(39 . 0)
         (assoc 210 dxf_ent)
       )
     )
     (setq
       e_last (entlast)
       dxf_last (entget e_last)
     )
     (princ "\nDonnez la fin du sulignage du texte")
     (while (= 5 (car (setq tmp (grread t 5 1))))
       (cond
         ((= 5 (car tmp))
           (setq
             EndPoint (vlax-curve-getClosestPointTo PathObj (trans (cadr tmp) 1 0))
             tmp0 (polar (trans EndPoint 0 dxf_210) (+ (* 0.5 pi) dxf_50) (- (cadadr txt_box) (cadar txt_box)))
           )
           (setq
             dxf_last (subst (cons 11 (trans EndPoint 0 dxf_210)) (assoc 11 dxf_last) dxf_last)
             dxf_last (subst (cons 13 tmp0) (assoc 13 dxf_last) dxf_last)
           )
           (entmod dxf_last)
         )
         (T (princ "\nArrêt anormal de la commande "))
       )
     )
     (entdel entline)
     (sssetfirst nil js)
     (ai_draworder "_front")
   )
 )
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Hello bonuscad,

 

Tout d'abord, merci pour ce code ;) .

 

Pour le multiligne j'ai une fois bidouillé cela ainsi, afin d'éviter de devoir dessiner des trames de fonds derrière des textes. Mais attention, accroche-toi, c'est de la bricole pure... :blink: :blink:

 

J'ai créé un style de cote sans aucune ligne de cote ou d'attache, j'ai imposé un fond en arrière plan pour les textes de cotation. Après je créé une cote sur mon dessin, double clique sur le texte de cote et j'ai mon multiligne avec fond... Seul hic, c'est le centrage horizontal du texte, mais bon, c'était de la bricole qui m'avait dépanné sur le moment. :)

 

Je suis sûr que vous trouverez mieux bien sûr, mais je trouvais rigolo d'en parler...

Hi, hi, il y en a qui vont me trouver cinglé après ça, mais j'adore sortir des sentiers battus ! B)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Lien vers le commentaire
Partager sur d’autres sites

Chapeau bas en tous les cas ;)

 

Un défi serait d'accrocher mieux à chaque lettre....

Modifié par Tramber
défi

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
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é