Aller au contenu

Récupération d'attribut de bloc par sommet de polyligne


Messages recommandés

Posté(e)

Hello,

 

J'aurai voulu savoir si c'était possible en Lisp de récupérer un attribut de Bloc (ex: son nom) grâce au sommet d'une polyligne.

 

En gros, à la création de ma polyligne, ça me retourne le nom des blocs aux extrémité de celle ci.

 

Bye!

Posté(e)

Salut.

 

Je pense que la méthode serait :

1. création de la polyligne,

2. interrogation des blocs situés sur les sommets de cette polyligne (grace à ceci).

 

C'est très faisable...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Ma solution serait je pense de récupérer les sommet aux extrémité de ma polyligne (grâce à ton programme) puis de vérifier tout les sommets de tout les bloc dans mon plan.

 

Ensuite, vérifier si un sommet de bloc = un sommet de polyligne, c'est que c'est attaché et donc on récupère le nom du bloc!

 

C'est partit pour programmer!

Posté(e)

Ma méthode serait, une fois les sommets de la polyligne connus, d'intéroger tous les blocs du dessin et d'identifier les coordonnées communes (entre le sommet en cours et le bloc en cours). Ensuite tu récupères les données du bloc correspondant.

 

Mais je pense que cette méthode sera très chronophage, il y a certainement un autre moyen...

 

D'autres que moi devraient avoir une solution plus... Esthétique...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Comme promis, voici le code :

(defun c:searchBlocFromPoly()
(setq liste-sommets '()
        ent (car (entsel"\nChoix de la polyligne\n"))
        ent-liste (entget ent)
        n 0)
(repeat (length ent-liste)
   (if (= 10 (car (nth n ent-liste)))
      (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets))
    ) 
	(setq n (+ 1 n))
	)
(setq liste-sommets (reverse liste-sommets))
(setq i 0)
(setq liste-sommBloc '())
(while (setq name (ssname(ssget "_X" (list(cons 0 "insert"))) i))
	(setq pos1 (cadr(assoc 10 (entget(ssname(ssget "_X" (list(cons 0 "insert"))) i)))))
	(setq pos2 (caddr(assoc 10 (entget(ssname(ssget "_X" (list(cons 0 "insert"))) i)))))
	(setq liste (list pos1 pos2))
	(setq liste-sommBloc (append liste-sommBloc (list liste)))
	(if(member liste liste-sommets)
		(progn
			(setq value (getattributevalue (ssname(ssget "_X" (list(cons 0 "insert"))) i)))
			(prin1 value)
		)
		
	)
	(setq i (+ i 1))
)
)

(defun getattributevalue ( entName_bloc / enx )
   (if (and (setq entName_bloc (entnext entName_bloc)) (= "ATTRIB" (cdr (assoc 0 (setq enx (entget entName_bloc))))))
       (cdr (assoc 1 (reverse enx)))
       (getattributevalue entName_bloc)
   )
)

Avec ce code, on choisis une polyligne et ça nous renvoie les attributs des blocs :) (Je n'ai pas testé avec plusieurs blocs par contre, et désolé pour le code pas très beau à regarder ^^ )

Posté(e)

Personnellement, et pour ne pas me faire taper dessus ( ;) ), j'aurais déclaré mes variables :

(defun c:searchBlocFromPoly ( / liste-sommets ent-liste n liste-sommBloc name pos1 pos2 liste value)
 (setq liste-sommets '()
       ent-liste     (entget (car (entsel "\nChoix de la polyligne\n")))
       n             0
 ) ;_ Fin de setq
 (repeat (length ent-liste)
   (if (= 10 (car (nth n ent-liste)))
     (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets))
   ) ;_ Fin de if
   (setq n (+ 1 n))
 ) ;_ Fin de repeat
 (setq liste-sommets (reverse liste-sommets))
 (setq i 0)
 (setq liste-sommBloc '())
 (while (setq name (ssname (ssget "_X" (list (cons 0 "insert"))) i))
   (setq pos1 (cadr (assoc 10 (entget (ssname (ssget "_X" (list (cons 0 "insert"))) i)))))
   (setq pos2 (caddr (assoc 10 (entget (ssname (ssget "_X" (list (cons 0 "insert"))) i)))))
   (setq liste (list pos1 pos2))
   (setq liste-sommBloc (append liste-sommBloc (list liste)))
   (if (member liste liste-sommets)
     (progn (setq value (getattributevalue (ssname (ssget "_X" (list (cons 0 "insert"))) i)))
            (prin1 value)
     ) ;_ Fin de progn
   ) ;_ Fin de if
   (setq i (+ i 1))
 ) ;_ Fin de while
) ;_ Fin de defun

(defun getattributevalue (entName_bloc / enx)
 (if (and (setq entName_bloc (entnext entName_bloc))
          (= "ATTRIB" (cdr (assoc 0 (setq enx (entget entName_bloc)))))
     ) ;_ Fin de and
   (cdr (assoc 1 (reverse enx)))
   (getattributevalue entName_bloc)
 ) ;_ Fin de if
) ;_ Fin de defun

Chose que je remarque chez les autres mais jamais chez moi... :huh:

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Aha merci! Oui je ne connais pas trop les normes j'ai appris le Lisp lundi donc bon ^^

Je ferai attention la prochaine fois! ;)

 

Bye!

 

Edit#1 rajouter ce code avant le while sinon le programme crash s'il n'y a aucun bloc dans le plan:

(if(/= (ssget "_X" (list(cons 0 "insert"))) nil)
(while()...)
)

Posté(e)

Hello,

 

Bon alors ce programme fonctionne nickel.... Quand on a qu'une 20aine de bloc, mais quand on a environ 1 000 bloc (1 067 pour être exact) , le programme est très, très lent (il met environ 10 secondes à s’exécuter). Du coup je relance un peu le sujet pour savoir s'il n'y a pas moyen d'améliorer le programme pour le rendre plus rapide (instantané serait cool) ou alors une fonction qui permettrait de récupérer un objet en fonction d'un point donné.

 

Bye!

Posté(e)

Ok c'est bon j'ai trouvé ^^

 

Le code:

(defun c:searchBlocFromPoly ( / liste-sommets ent-liste n liste-sommBloc name pos1 pos2 liste value listee)
 (setq liste-sommets '()
       ent-liste     (entget (car (entsel "\nChoix de la polyligne\n")))
       n             0
 ) ;_ Fin de setq
 (repeat (length ent-liste)
   (if (= 10 (car (nth n ent-liste)))
     (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets))
   ) ;_ Fin de if
   (setq n (+ 1 n))
 ) ;_ Fin de repeat
 (setq liste-sommets (reverse liste-sommets))
 (setq i 0)
 (setq liste-sommBloc '())
 (setq listee (ssget "_X" (list(cons 0 "insert"))))
 (if(/= listee nil)
   (while (setq name (ssname listee i))
     (setq pos1 (cadr (assoc 10 (entget (ssname listee i)))))
     (setq pos2 (caddr (assoc 10 (entget (ssname listee i)))))
     (setq liste (list pos1 pos2))
     (setq liste-sommBloc (append liste-sommBloc (list liste)))
     (if (member liste liste-sommets)
       (progn (setq value (getattributevalue (ssname listee i)))
              (prin1 value)
       ) ;_ Fin de progn
     ) ;_ Fin de if
     (setq i (+ i 1))
   ) ;_ Fin de while
 ) ;_ Fin de if
) ;_ Fin de defun

(defun getattributevalue (entName_bloc / enx)
 (if (and (setq entName_bloc (entnext entName_bloc))
          (= "ATTRIB" (cdr (assoc 0 (setq enx (entget entName_bloc)))))
     ) ;_ Fin de and
   (cdr (assoc 1 (reverse enx)))
   (getattributevalue entName_bloc)
 ) ;_ Fin de if
) ;_ Fin de defun

 

Il suffisait juste de mettre ssget dans une variable au lieu de l'appeler 15 fois ;)

 

Bye!

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é