Invité ingoenius Posté(e) le 13 septembre 2010 Posté(e) le 13 septembre 2010 Quand j'écris un texte normal avec la commande TXTDYN a chaque fois que je tape enter je vais a la ligne et j'écris une nouvelle ligne, ensuite avec 2 fois enter je sort de la command, or comment je peut récupérer la dimensions globale des textes écrits (a l'intérieur de cette commande, donc il faut aussi voir combien de lignes j'ai écrit ) pour pouvoir créer un encadrement (rectangle avec coins arrondis) en lisp ? Merci et bonne semaine ;-)
vincentp010 Posté(e) le 13 septembre 2010 Posté(e) le 13 septembre 2010 Salut, en lisp je crois pas trop que ce soit possible, ou alors en faisant la différence des entités présentes dans le dessin avant et après la commande pour ensuite faire le cadre sur les entités crées.Sinon, je fais un txtmult que je décompose par la suite, après la création de mon cadre. Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
Carboleum Posté(e) le 13 septembre 2010 Posté(e) le 13 septembre 2010 yo, Voici une petite méthode qui pourrait t'aider:Pour chaque ligne (c'est à dire chaque objet texte), on va calculer les boundingbox.On va mettre tous ces points dans une liste: (setq lst (apply 'append (ssmap '(lambda (x / a b) (vla-getboundingbox (vlax-ename->vla-object x) 'a 'b) (list (vlax-safearray->list a) (vlax-safearray->list b))) (ssget)))) L'idée est d'en extraire les X minimum, les Y minimum, les X maximum et Y maximum: (setq xmin (apply 'min (mapcar 'car lst))) (setq xmax (apply 'max ( ... Tu as ton rectangle. Bon code, PS: Ici les fonctions les plus indispensables sous AutoCAD: (defun sslist (ss / n lst) (if (= 'pickset (type ss)) (repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst))))) (defun ssmap (fct ss) (mapcar fct (sslist ss))) Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
Invité ingoenius Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Merci de la réponse, mais...... j'ai essaie sans réussir a utiliser ces bout de codes il faudrait que j'étudie mieux la question ca c'est ma selection de textes (setq myFilter(list (cons 0 "TEXT")(cons 8 "!!Nomenclature"))) (setq TT3(ssget "X" myFilter)) ;selection set comment j'intergre les fonctions pour sortir le 2 points extremes du rectangle qui delimite ces textes??
Carboleum Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Voici, rien que pour toi, le code complet: (defun sslist (ss / n lst) (if (= 'pickset (type ss)) (repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst))))) (defun text-boundingbox (entity) (vla-getboundingbox (vlax-ename->vla-object entity) 'a 'b) (list (vlax-safearray->list a) (vlax-safearray->list b))) (defun multitext-boundingbox (selection / lst) (setq lst (apply 'append (mapcar 'text-boundingbox (sslist selection)))) (list (list (apply 'min (mapcar 'car lst)) (apply 'min (mapcar 'cadr lst))) (list (apply 'max (mapcar 'car lst)) (apply 'max (mapcar 'cadr lst))))) (defun c:rectangle-autour-de-textes () (setq myFilter(list (cons 0 "TEXT")(cons 8 "!!Nomenclature"))) (setq TT3(ssget "X" myFilter)) ;selection set (setq lst (multitext-boundingbox TT3)) ;; <-- ici lst = la liste des deux points (command "_rectang" "_non" (car lst) "_non" (cadr lst))) voilà... à toi de l'intégrer dans tes lisps. [Edité le 15/9/2010 par Carboleum] Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
Invité ingoenius Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Cool Merci ;-) demain je vais integrer tout cela a mon lisp Merci
Patrick_35 Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Salut Par exemple(defun bdtxt( / bg ent hd lst sel lstxyz xyz) (defun xyz(mm cc lst) (apply mm (mapcar cc lst)) ) (defun lstxyz(lst) (list (list (xyz 'min 'car lst) (xyz 'min 'cadr lst) (xyz 'min 'caddr lst) ) (list (xyz 'max 'car lst) (xyz 'max 'cadr lst) (xyz 'max 'caddr lst) ) ) ) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (vla-getboundingbox ent 'bg 'hd) (setq lst (append (lstxyz (list (vlax-safearray->list bg) (vlax-safearray->list hd))) lst ) ) ) (vla-delete sel) (lstxyz lst) ) Pour tester(defun c:test() (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (ssget) (setq mes_points (bdtxt)) ) ps : Carboleum à été plus rapide @+ [Edité le 15/9/2010 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Carboleum Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 (defun lstxyz(lst) [...] (xyz 'min 'caddr lst) [...] ps : Carboleum à été plus rapide Mais toi, tu es en 3d ;-) Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
Patrick_35 Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 (defun lstxyz(lst) [...] (xyz 'min 'caddr lst) [...] ps : Carboleum à été plus rapide Mais toi, tu es en 3d ;-) Oui ;) Je remarque tu as une fonction sslist. Tu n'as jamais pensé à la fonction lisp ssnamex ? ps : (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))) = sslist mais en vla. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Carboleum Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Je remarque tu as une fonction sslist. Tu n'as jamais pensé à la fonction lisp ssnamex ? Tiens non, je connais pas! Mais cette fonction impose un traitement en aval: (cdr (reverse (mapcar 'cadr (ssnamex (ssget))))) Mouais, je suis pas convaincu. ps : (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))) = sslist mais en vla. J'ai tendance à éviter le vla, c'est beaucoup moins immédiat que l'autolisp, au niveau développement de routine, j'entends. Parfois il est inévitable (cas des boundingbox notamment ;-) En tous cas merci pour ces précisions. à bientôt,Bruno @+ Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
(gile) Posté(e) le 15 septembre 2010 Posté(e) le 15 septembre 2010 Salut, Pour info, pour obtenir les coins inférieur gauche et supérieur droit d'une liste de points :(apply 'mapcar (cons 'min '((1 8 4) (9 3 5) (7 4 9) (4 1 0))))retourne (1 1 0)(apply 'mapcar (cons 'max '((1 8 4) (9 3 5) (7 4 9) (4 1 0))))retourne (9 8 9) J'ai tendance à éviter le vla, c'est beaucoup moins immédiat que l'autolisp, au niveau développement de routine, j'entends. Parfois il est inévitable (cas des boundingbox notamment ;-) Avec les entités TEXT, on peut éviter d'utiliser vla-GetBoundingBox, voir la fonction textbox. (defun c:mtextbox (/ ss n txt pts) (if (setq ss (ssget '((0 . "TEXT")))) (progn (setq n -1) (while (setq txt (ssname ss (setq n (1+ n)))) (setq elst (entget txt) pts (append (mapcar '(lambda (p) (mapcar '+ p (cdr (assoc 10 elst)))) (textbox elst) ) pts ) ) ) (command "_rectangle" "_non" (apply 'mapcar (cons 'min pts)) "_non" (apply 'mapcar (cons 'max pts)) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 16 septembre 2010 Posté(e) le 16 septembre 2010 Pour info, pour obtenir les coins inférieur gauche et supérieur droit d'une liste de points :(apply 'mapcar (cons 'min '((1 8 4) (9 3 5) (7 4 9) (4 1 0))))retourne (1 1 0)(apply 'mapcar (cons 'max '((1 8 4) (9 3 5) (7 4 9) (4 1 0))))retourne (9 8 9)Bravo (gile) Jolie formule, comme je les aime. :) Mais, je n'arrive pas à comprendre la logique.Je vois bien pour le mapcar, le cons et l'apply, mais l'apply appelant le mapcar qui lui-même utilise le min dans la liste, quelque chose m'échappe :casstet: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 16 septembre 2010 Posté(e) le 16 septembre 2010 Salut, On va faire un pas à pas :(apply 'mapcar (cons 'min '((1 8 4) (9 3 5) (7 4 9) (4 1 0))))L'interpréteur ne peut pas évaluer l'expression apply avant d'avoir interprété l'expression cons, qui est plus imbriquée :(cons 'min '((1 8 4) (9 3 5) (7 4 9) (4 1 0)))ce qui donne :'('min (1 8 4) (9 3 5) (7 4 9) (4 1 0))L'interpréteur va ensuite réduire l'expression de niveau supérieur :(apply 'mapcar '('min (1 8 4) (9 3 5) (7 4 9) (4 1 0)))apply applique la fonction (1er argument à la liste 2ème argument), l'expression est maintenant évaluable :(mapcar 'min (1 8 4) (9 3 5) (7 4 9) (4 1 0)) En résumé, l'utilisation des expressions du type : (apply 'mapcar (cons 'fonction liste_de_listes)) est un moyen pour passer comme arguments à mapcar une fonction et un nombre indéterminé de listes contenues dans une liste. Autres exemples : Transposer une matrice (faire passer les rangées en colonnes) :(apply 'mapcar (cons 'list '((1 2 3) (4 5 6) (7 8 9))))équivaut à (mapcar 'list '(1 2 3) '(4 5 6) '(7 8 9)) et retourne ((1 4 7) (2 5 8) (3 6 9)) Faire la somme d'une liste de vecteurs :(apply 'mapcar (cons '+ '((1 2 3) (4 5 6) (7 8 9))))équivaut à (mapcar '+ '(1 2 3) '(4 5 6) '(7 8 9)) et retourne (12 15 18) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 17 septembre 2010 Posté(e) le 17 septembre 2010 Merci (gile) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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