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

Aller au contenu

Page 1 sur 1

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

#1 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 25 juillet 2019 - 08:20

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!
0

#2 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3343
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 25 juillet 2019 - 08:26

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 10 Pro 64bits / AutoCAD MAP 3D 2019 (22.0.022.4)
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#3 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 25 juillet 2019 - 08:27

Cool merci!

Je posterai la solution dès que je l'aurai trouvé :)
0

#4 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 25 juillet 2019 - 08:39

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!
0

#5 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3343
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 25 juillet 2019 - 08:41

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 10 Pro 64bits / AutoCAD MAP 3D 2019 (22.0.022.4)
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#6 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 25 juillet 2019 - 14:04

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 ^^ )
0

#7 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3343
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 25 juillet 2019 - 14:30

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 10 Pro 64bits / AutoCAD MAP 3D 2019 (22.0.022.4)
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#8 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 25 juillet 2019 - 14:36

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()...)
)

0

#9 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 01 août 2019 - 13:47

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!
0

#10 L'utilisateur est hors-ligne   AzRoDoRzA 

  • Advanced Member
  • PipPipPip
  • Groupe : Membres
  • Messages : 37
  • Inscrit(e) : 16-juillet 19

Posté 01 août 2019 - 13:58

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!
0

Partager ce sujet :


Page 1 sur 1


Réponse rapide

  

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)