AzRoDoRzA Posté(e) le 25 juillet 2019 Posté(e) le 25 juillet 2019 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! Citer
DenisHen Posté(e) le 25 juillet 2019 Posté(e) le 25 juillet 2019 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... Citer 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)
AzRoDoRzA Posté(e) le 25 juillet 2019 Auteur Posté(e) le 25 juillet 2019 Cool merci! Je posterai la solution dès que je l'aurai trouvé :) Citer
AzRoDoRzA Posté(e) le 25 juillet 2019 Auteur Posté(e) le 25 juillet 2019 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! Citer
DenisHen Posté(e) le 25 juillet 2019 Posté(e) le 25 juillet 2019 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... Citer 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)
AzRoDoRzA Posté(e) le 25 juillet 2019 Auteur Posté(e) le 25 juillet 2019 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 ^^ ) Citer
DenisHen Posté(e) le 25 juillet 2019 Posté(e) le 25 juillet 2019 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 defunChose que je remarque chez les autres mais jamais chez moi... :huh: Citer 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)
AzRoDoRzA Posté(e) le 25 juillet 2019 Auteur Posté(e) le 25 juillet 2019 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()...) ) Citer
AzRoDoRzA Posté(e) le 1 août 2019 Auteur Posté(e) le 1 août 2019 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! Citer
AzRoDoRzA Posté(e) le 1 août 2019 Auteur Posté(e) le 1 août 2019 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! Citer
Messages recommandés