Aller au contenu

Bounding box TexDyn


Messages recommandés

Invité ingoenius
Posté(e)

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 ;-)

 

 

 

 

 

Posté(e)

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

Posté(e)

 

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)

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??

 

Posté(e)

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)

Cool Merci ;-) demain je vais integrer tout cela a mon lisp

 

 

Merci

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)


 (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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)
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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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

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é