bonuscad Posté(e) le 7 novembre 2007 Posté(e) le 7 novembre 2007 Essayes le code suivant qui devrait répondre à tes souhaits. Il bosse dans les blocs pour les attributs, mais cela oblige à faire une sélection unique en boucle. Pour l'écart, dans le code, il est fixé à ces lignes (j'ai fais un rapport de 5): ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) PS: outre le calque, je pompe aussi la couleur et l'épaisseur de trait attribué au texte (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 v_matr (dpt alphax alphay alphaz echx echy echz / ) (list (list (* echx (cos alphaz) (cos alphay)) (- (sin alphaz)) (sin alphay) (car dpt) ) (list (sin alphaz) (* echy (cos alphaz) (cos alphax)) (- (sin alphax)) (cadr dpt) ) (list (- (sin alphay)) (sin alphax) (* echz (cos alphax) (cos alphay)) (caddr dpt) ) (list 0.0 0.0 0.0 1.0) ) ) (defun c:box_text ( / ent_txt dxf_ent ins_point ht_txt lg_box ht_box ang_box pt_just lst_box transform diag_box) (while (null (setq ent_txt (nentsel "\nChoix d'un MultiTEXTE ou TEXTE: ")))) (setq dxf_ent (entget (car ent_txt))) (cond ((and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "MTEXT")) (setq ins_point (cdr (assoc 10 dxf_ent)) ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) lg_box (cdr (assoc 42 dxf_ent)) ht_box (cdr (assoc 43 dxf_ent)) ang_box (atan (/ (caddr (assoc 11 dxf_ent)) (cadr (assoc 11 dxf_ent)))) pt_just (cdr (assoc 71 dxf_ent)) ) (if (< (cadr (assoc 11 dxf_ent)) 0) (setq ang_box (+ pi ang_box))) (setq lst_box (list (list (- ht_txt) ht_txt 0.0) (list (+ lg_box ht_txt) ht_txt 0.0) (list (+ lg_box ht_txt) (- 0.0 ht_box ht_txt) 0.0) (list (- ht_txt) (- 0.0 ht_box ht_txt) 0.0) ) ) (cond ((eq pt_just 1) (setq transform (v_matr (list 0.0 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 2) (setq transform (v_matr (list (- (/ lg_box 2.0)) 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 3) (setq transform (v_matr (list (- lg_box) 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 4) (setq transform (v_matr (list 0.0 (+ (/ ht_box 2.0)) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 5) (setq transform (v_matr (list (- (/ lg_box 2.0)) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 6) (setq transform (v_matr (list (- lg_box) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 7) (setq transform (v_matr (list 0.0 ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 8) (setq transform (v_matr (list (- (/ lg_box 2.0)) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ((eq pt_just 9) (setq transform (v_matr (list (- lg_box) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0)) ) ) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) (setq transform (v_matr ins_point 0.0 0.0 (- ang_box) 1.0 1.0 1.0)) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) ) ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) ) (setq diag_box (textbox dxf_ent) ins_point (cdr (assoc 10 dxf_ent)) ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0) ang_box (cdr (assoc 50 dxf_ent)) ) (setq lst_box (list (list (- (caar diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0) (list (+ (caadr diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0) (list (+ (caadr diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0) (list (- (caar diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0) ) ) (setq transform (v_matr ins_point 0.0 0.0 (- ang_box) 1.0 1.0 1.0)) (setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box)) ) (T (princ "\nN'est pas un TEXTE/TEXTE MultiLigne, ou non parallèle au SCG.") (setq lst_box nil) ) ) (cond (lst_box (entmake (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (assoc 67 dxf_ent) (assoc 410 dxf_ent) (assoc 8 dxf_ent) (if (assoc 62 dxf_ent) (assoc 62 dxf_ent) (cons 62 256)) (if (assoc 6 dxf_ent) (assoc 6 dxf_ent) (cons 6 "BYLAYER")) (if (assoc 370 dxf_ent) (assoc 370 dxf_ent) (cons 370 -1)) (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) ) (apply 'append (mapcar '(lambda (x10) (list (list 10 (car x10) (cadr x10)) '(42 . 0)) ) lst_box ) ) '((210 0.0 0.0 1.0)) ) ) ) ) (princ) ) [Edité le 8/11/2007 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
sechanbask Posté(e) le 7 novembre 2007 Auteur Posté(e) le 7 novembre 2007 est-il possible de sélectionner plusieurs texte en même temps ?est-il possible d'utiliser le jeux de sélection actif avant la commande pour mettre en boîte les texte précédemment sélectionnés ? j'ai noté que ça ne marche pas pour :- les Mtextes justifiés par le haut gauche avec une rotation de 91 à 269° inclus, pour les Textes tout va pour le mieux.- les attributs non contenu dans un bloc ne sont pas pris en compte (je sais c'est pas bien d'utiliser ces attributs là, mais j'en trouve souvent sur les plans archi...) Merci déjà pour ce travail, qui va me faire gagner du temps :-) ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
bonuscad Posté(e) le 8 novembre 2007 Posté(e) le 8 novembre 2007 j'ai noté que ça ne marche pas pour :- les Mtextes justifiés par le haut gauche avec une rotation de 91 à 269° inclus J'ai édité le code, cela devrait aller mieux, merci pour le retour. ;) es attributs non contenu dans un bloc ne sont pas pris en compte Là, je n'ai pas trop saisi... pourrais tu faire un (entget (car (entsel))) sur le type d'entité que tu voudrais traiter et me coller le retour d'info DXF est-il possible de sélectionner plusieurs texte en même temps ? Si tu veux pouvoir traiter les Attributs dans les bloc, c'est non, autrement il faut reprendre le mode sélection comme fait dans "arround_text". Cependant j'ai commencé à réfléchir à une solution de sélection (objet-unique-imbriqué/objet-multiple/implicite) dont voici une épure, je te laisse chercher (toi ou d'autre) dans cette voie. ((lambda ( / js tmp e_sel js_tmp n) (setq js (ssadd) n -1) (if (setq js_tmp (ssget "_I" '((0 . "*TEXT")))) (repeat (sslength js_tmp) (ssadd (ssname js_tmp (setq n (1+ n))) js) (redraw (ssname js_tmp n) 3) ) ) (princ "\nChoix des MultiTEXTE ou TEXTE: ") (while (or (= 5 (car (setq tmp (grread t 5 2)))) (= 3 (car tmp)) (null js)) (cond ((= 3 (car tmp)) (setq e_sel (nentselp (cadr tmp))) (if e_sel (progn (ssadd (car e_sel) js) (redraw (car e_sel) 3) ) (progn (setq js_tmp (ssget '((0 . "*TEXT"))) n -1) (cond (js_tmp (repeat (sslength js_tmp) (ssadd (ssname js_tmp (setq n (1+ n))) js) (redraw (ssname js_tmp n) 3) ) ) ) ) ) ) ) ) (if js (sssetfirst nil js)) (prin1))) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
sechanbask Posté(e) le 10 novembre 2007 Auteur Posté(e) le 10 novembre 2007 Merci bonuscad pour ta réponse rapide : pour les attribut qui ne sont pas encore dans un bloc voilà le retour que code que tu m'a donné : [Commande: (entget (car (entsel))) Choix de l'objet: ((-1 . ) (0 . "ATTDEF") (330 . d'entité: 7ef7fcf8>) (5 . "253") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Calque1") (100 . "AcDbText") (10 -750.0 2350.0 0.0) (40 . 144.934) (1 . "zerg") (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 . "AcDbAttributeDefinition") (3 . "ergz") (2 . "SDMUIB") (70 . 0) (73 . 0) (74 . 0))] Merci pour la modification sur ton lisp qui fonctionne parfaitement pour les Multitextes et les textes, maintenant je vais de le faire marcher avec une sélection selectonscreen [Edité le 12/11/2007 par sechanbask] ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
bonuscad Posté(e) le 12 novembre 2007 Posté(e) le 12 novembre 2007 La modification est très simple pour inclure les définitions d'attributs (les codes DXF sont équivalents aux textes). donc pour modifier arround_text, il suffit de modifier(setq js (ssget '((0 . "*TEXT") (-4 . "=") (210 0.0 0.0 1.0))) n -1)en(setq js (ssget '((0 . "*TEXT,ATTDEF") (-4 . "=") (210 0.0 0.0 1.0))) n -1) et((eq (cdr (assoc 0 dxf_ent)) "TEXT"))en((or (eq (cdr (assoc 0 dxf_ent)) "TEXT") (eq (cdr (assoc 0 dxf_ent)) "ATTDEF")) De même pour box_text en modifiant ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) )en ((or (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB")) (and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTDEF")) ) C'est vrai que l'utilisation de définitions d'attribut en dehors des blocs est surprenante ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Comme j'ai fait un truc avec les textes/mtextes suivant jeurs justifications, j'y vais aussi de mon code. Le décalage proposé par défaut (20% de la hauteur de texte courante) est exprimé en unité de dessin. Il peut être modifier en faisant Entrée, Espace ou clic droit au lieu de sélectionner les textes. La dernière valeur est conservée dans le dessin pendant la session et est proposée comme valeur par défaut au prochain lancement. Ça semble fonctionner quelque soit la justification, la rotation, l'élévation et le SCO des objets sélectionnés. ;; CT (gile) 15/11/07 ;; Encadre les textes (simples ou multilignes) sélectionnés (defun c:ct (/ of n ss tx elst nor ref elv rot wid hgt jus org box plst mat) (or *TextFrameOffset* (setq *TextFrameOffset* (/ (getvar "TEXTSIZE") 5.0)) ) (setq of *TextFrameOffset*) (princ (strcat "\nDécalage courant : " (rtos of) "\tSélectionnez les textes ou ." ) ) (while (not (setq ss (ssget '((0 . "*TEXT"))))) (if (setq of (getdist (strcat "\nSpécifiez le décalage du cadre (rtos of) ">: " ) ) ) (setq *TextFrameOffset* of) (setq of *TextFrameOffset*) ) ) (setq n -1) (while (setq tx (ssname ss (setq n (1+ n)))) (if (= "MTEXT" (cdr (assoc 0 (setq elst (entget tx))))) (setq nor (cdr (assoc 210 elst)) ref (trans (cdr (assoc 10 elst)) 0 nor) elv (caddr ref) rot (angle '(0 0 0) (trans (cdr (assoc 11 elst)) 0 nor)) wid (cdr (assoc 42 elst)) hgt (cdr (assoc 43 elst)) jus (cdr (assoc 71 elst)) org (list (cond ((member jus '(2 5 8)) (/ wid -2)) ((member jus '(3 6 9)) (- wid)) (T 0.0) ) (cond ((member jus '(1 2 3)) (- hgt)) ((member jus '(4 5 6)) (/ hgt -2)) (T 0.0) ) ) plst (mapcar (function (lambda (p) (mapcar '+ org p) ) ) (list (list (- of) (- of)) (list (+ wid of) (- of)) (list (+ wid of) (+ hgt of)) (list (- of) (+ hgt of)) ) ) ) (setq box (textbox elst) ref (cdr (assoc 10 elst)) rot (cdr (assoc 50 elst)) plst (list (list (- (caar box) of) (- (cadar box) of)) (list (+ (caadr box) of) (- (cadar box) of)) (list (+ (caadr box) of) (+ (cadadr box) of)) (list (- (caar box) of) (+ (cadadr box) of)) ) ) ) (setq mat (list (list (cos rot) (- (sin rot)) 0) (list (sin rot) (cos rot) 0) '(0 0 1) ) plst (mapcar (function (lambda (p) (cons 10 (mapcar '+ (mxv mat p) (list (car ref) (cadr ref))) ) ) ) plst ) ) (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") (assoc 8 elst) '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) (cons 38 (caddr ref)) (assoc 210 elst) ) plst ) ) ) (princ) ) ;; Applique une matrice de transformation à un vecteur (Vladimir Nesterovsky) (defun mxv (m v) (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 C'est quoi la fonction "function" ? "Chacun compte pour un, et nul ne compte pour plus d'un."
lecrabe Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Hello Gilles - Encore MERCI Je viens de tester ton CT sur AutoCAD 2004 et 2008, donc on peut supposer que ca fonctionne aussi sur 2005 / 2006 / 2007 !? :) Comme d'hab, c nickel-chrome :D Par contre, j'imagine tout de suite une variante : obtenir un masque d'arriere plan et non pas un simple rectangle autour du TEXT / MTEXT ! Mais, mais, les masques ne sont possibles que sur les MTEXT, donc ca me pose un problème !Je n'envisage pas du tout de transformer les TEXT en MTEXT !! Donc j'imagine l'option suivante, dessiner le rectangle et (en plus) une hachure de type solid dont la couleur sera (Question à poser au début) ... ;) Les priorités d'affichage en montant seraient bien sur :Hachure puis Rectangle puis le TEXT ou MTEXT On pourra toujours par une sélection rapide resortir les rectangles et hachures pour les mettre (si nécessaire) sur un autre calque ! Le Decapode "chiant" Autodesk Expert Elite Team
Matt666 Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Bah pas forcément une hachure, puisqu'une hachure change de couleur en fonction de la couleur d'affichage... Ptet plutot une image !Ca ressemble fortement à l'outil express, mais en muitligne, et en mieux ! Je trouve que le décapode, malgré son poids, a de bonnes idées :thumbup: Désolé, je charrie... A bientotMatt. "Chacun compte pour un, et nul ne compte pour plus d'un."
Bred Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 .... et bien moi, je vais titiller beaucoup plus (gile) je pense.....Déjà, bravo pour ton code (gile) ! Mais un truc bluffant que je pense être possible (... pour les connaisseurs des réacteurs ! ;) )Grouper le texte et le cadre, et si l'on modifie le textes, le cadre suit !....mmmm ? ;) ;) :P Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
lecrabe Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Hello Non désolé, je pense que la hachure SOLID, c mieux car elle peut être de couleur soit DUCALQUE, soit en couleur forcée et plus particulièrement en couleur RGB 16M qui va permettre d'obtenir un fond de couleur palichonne/pastel du plus bel effet ! On pourrait aussi envisager de poser la question de la couleur du rectangle soit DUCALQUE, soit couleur forcée !? N'oublions pas que ce dessin pourrait être repris par un AutoCAD LT :casstet: Le Decapode qui reste sur ses positions ... :mad: Autodesk Expert Elite Team
(gile) Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Et voilà, tu leur donne ça : -et tout de suite ils veulent ça : -------------------------------------------------- ;) Je vais essayer de répondre dans l'ordre Matt666, la fonction function équivaut à la fonction quote (') :(mapcar (function (lambda ...))) fonctionne comme (mapcar '(lambda ...))mais elle permet de lier et d'optimiser la fonction dans le compileur Visual LISP comme si c'était une fonction prédéfinie ou un defun. lecrabe, je vais essayer de voir ce que je peux faire... Bred, alors toi tu exagères !je ne maîtrise pas vraiment les réacteurs, et en plus, ça demanderais de tout ré-écrire en Visual LISP... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Le décapode Têtu :) :Oui c'est vrai. Plus simple à coder, en plus ! Par contre pour ACLT, vu qu'ils n'ont pas de possibilité de lisp, ça change pas grand chose (les pauvres !!)... Gile :Ah ok d'ac ! Merci pour la précision.. [Edité le 15/11/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
(gile) Posté(e) le 15 novembre 2007 Posté(e) le 15 novembre 2007 Bon, voilà pour les masques d'arrière plan en hachures solides en plus des cadres, j'ai préféré démarrer une autre sujet. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant