DenisHen Posté(e) le 6 octobre 2006 Posté(e) le 6 octobre 2006 Bonsoir à tous, Je me lance dans des sélections d'entité... Mais je n'arrive pas à comprendre ssget, l'aide est en Anglais et le livre de Contensou gère en même temps des "list". Si je comprend, la sélection d'une entité stock la totalité de ses propriété dans une liste. Ensuite, on "fouille" cette liste pour en sortir ce que l'on cherche... Mais les liste, je n'y ai encore jamais touché...Un truc ou une astuce pour me sauver ? Merci, Denis... 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)
(gile) Posté(e) le 6 octobre 2006 Posté(e) le 6 octobre 2006 Salut, Il me semble qu'il y a confusion. SSGET est une fonction pour créer des jeux de sélection (soit un ensemble de une ou plusieurs entités). Chaque entité a un nom d'entité (ename) du type : On peut récupérer les noms d'entité des entités d'un jeu de sélection avec les fonctions SSNAME et SSNAMEX. On peut aussi récupérer le nom de la dernière entité créée avec la fonction ENTLAST. On peut sélectionner une entité unique avec la fonction ENTSEL, elle retourne une liste contenant le nom d'entité et les coordonnées du point qui a servi à la sélectionner, donc pour avoir le nom d'entité faire : (car (entsel)) Chaque entité possède des données qui sont contenues dans une liste accessible avec la fonction ENTGET (liste DXF).Cette liste est une "liste associative" dont les éléments sont des listes ou des "paires pointées" (dotted pair).Le premier élément de chacun des membres de la liste retournée par ENTGET est un "code de groupe DXF". Les groupes DXF pour les différentes entités sont décrits (en français) dans l'aide aux développeurs >> Référence DXF.La fonction ASSOC permet d'accéder directement dans une liste associative à l'élément du groupe spécifié. Les fonctions CAR, CDR et leurs combinaisons, ainsi que NTH et LAST permettent d'accéder à un élément spécifique, LENGTH retourne le nombre d'éléments. Le LISP est un langage de listes, il est, à mon avis, impératif de savoir les "lire" mais aussi les créer (LIST, CONS, APPEND) et les manipuler (APPLY, FOREACH, MAPCAR, MEMBER, REVERSE, SUBST). [Edité le 7/10/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 Hello, Moi-même débutant en lisp je comprend mieux quand c'est écrit en langage d'hérétique !... Merci (Gile). "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
DenisHen Posté(e) le 7 octobre 2006 Auteur Posté(e) le 7 octobre 2006 Merci (gile), ça me dégage vraiment le terrain ! ! J'ai donc commencé à faire..... des trucs... Pour essayé de comprendre.. J'ai ce petit truc (que j'ai récupéré) : (defun c:PtPlign (/ lst) (princ "\nSélectionnez une polyligne : ") (setq objet (car (entsel))) (if (or (= (cdr (assoc 0 (entget objet))) "POLYLINE") (= (cdr (assoc 0 (entget objet))) "LWPOLYLINE") ) ;_ Fin de or (progn (princ "\nFlag 1 : ") (princ (cdr (assoc 10 (entget objet)))) ) ;_ Fin de progn (princ "\nCe n'est pas un objet Cercle, Polyligne ou Polygone") ) ) Je ne sélectionne q'une entité et il me répond "(106.29 458.32)" bref, les dernières coordonnées de ma polyligne sélectionnée. Pour avoir les autre coordonnées, je suppose qu'il va falloir faire des caadr ou des caddr... toujours avec "assoc 10" J'en ai fait une autre plus complexe sur la base de la première... Rien ne fonctionnait... J'ai donc raccourci mla deuxième jusqu'à ressemblé à la première... Ben y-a rien à faire... Avec la deuxième, je peut sélectionné plein d'entité, ouis, je tape "entré" et...rien ! ! La voici : (defun c:Select (/ lst) (princ "\nSélectionnez une polyligne : ") (setq objet (car (entsel))) (if (or (= (cdr (assoc 0 (entget objet))) "POLYLINE") (= (cdr (assoc 0 (entget objet))) "LWPOLYLINE") ) ;_ Fin de or (progn (princ "\nSélection : ") (princ (cdr (assoc 10 (entget objet)))) (princ "\nDrapeau 3 : ") ) (princ "\nCe n'est pas un objet Cercle, Polyligne ou Polygone") ) ) Fauti'il réinitialisé quelque part le jeu de sélection ? Merci encore, même sans ça, j'ai pas mal de boulo avec les ssget et entget ! ! ! Denis... 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)
(gile) Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 Attention Denis ! SELECT est une commande AutoCAD, il faut éviter de donner comme nom de fonction (defun c:...) le nom d'une commande existante. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 7 octobre 2006 Auteur Posté(e) le 7 octobre 2006 PFFFFFF ! ! Vraiment, là, j'ai "merdé" plein pot ! ! Merci (gile), Denis... 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)
bonuscad Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 SELECT est une commande AutoCAD, il faut éviter de donner comme nom de fonction (defun c:...) le nom d'une commande existante. Hé oui, c'est pour cela qu'il est important d'utiliser la syntaxe "." + "commande" pour utiliser la commande native. Autocad permet cette substitution (qui peut être parfois pratique) mais très dangereuse si mal manipulé. Denis je te suggère temporairement d'utiliser (pour les atomes) la fonction TYPE qui t'aideras à classiffier le type de donné que tu vas manipuler et a ne pas les mélanger entre elles. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
DenisHen Posté(e) le 7 octobre 2006 Auteur Posté(e) le 7 octobre 2006 Merci bonuscad, selon ton conseil, j'ai fais çà : (defun c:ptPlign (/ objet) (princ "\nSélectionnez une polyligne : ") (while (/= (type (setq objet (ssget ":S"))) SYM) (princ "\nPolyligne sélectionnée") (princ (type objet)) ) ) Mais biensur, ça ne marche pas... Dans l'aide en anglais ::S Allow single selection only Je ne vois pas où j'ai faut... Denis... 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)
DenisHen Posté(e) le 7 octobre 2006 Auteur Posté(e) le 7 octobre 2006 Et dans ça : (defun c:ptPlign (/ objet) (princ "\nSélectionnez une polyligne : ") (while (/= (type (cadr (setq objet (entsel)))) SYM) (princ objet) ) ) (le while ne sert strictement à rien, sauf pour la boucle... Je viens de le voir...) Je n'ai que des : ( (153.91 173.818 0.0)) entre autre... Bref, le résultat est toujours une liste... Ben alors d'où qu'il est où mon "symbole" ? :( Denis... 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)
(gile) Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 N'essaye pas de faire trop de truc nouveau à la fois. Teste les fonctions que tu ne connais pas une par une avant d'essayer de les imbriquer. (setq ent (entsel)) -> ? (car (ensel)) -> ? (type (car (ensel))) -> ? (cadr (entsel)) -> ? (type (cadr (ensel))) -> ? (caadr (entsel)) -> ? (type (caadr (ensel))) -> ? (setq ss (ssget "_:S")) -> ? (type ss) -> ? (ssname ss 0) -> ? (type (ssname ss 0)) -> ? etc .... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 7 octobre 2006 Auteur Posté(e) le 7 octobre 2006 Ok m'sieur (gile) ;) Mais je pensais que pour avoir un résultat probant, il fallait au moins combiner deux fonctions... Et comme je ne sais pas encore exactement ce qu'elles font... Mais je vais faire tes testes (qui me semblent beaucoup plus intéressants en te lisant)... Merci mille fois... Denis... 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)
bonuscad Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 Denis, Essayes ceci par exemple pour éplucher tes soumissions. (defun my_type (e / ) (trace my_type) (print e) (princ " est un/une ") (princ (type e)) (print) (if (eq (type e) 'LIST) (if (atom (cdr e)) (progn (my_type (car e)) (my_type (cdr e))) (foreach n e (my_type n)) ) ) (untrace my_type) (prin1) ) Aprés tu l'utilise comme tu veux, exemple:(my_type (entsel))(my_type (car (entsel)))(my_type (setq objet (ssget "_:S"))) ou (my_type objet) après déclaration Ouups! J'avais oublié les listes de paires pointées.Code rectifié, (my_type (entget (car (entsel)))) par exemple pourra fonctionner. [Edité le 8/10/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 7 octobre 2006 Posté(e) le 7 octobre 2006 Salut Denis H,En tant que débutant en lisp moi aussi, je t'ai écris un petit truc qui peut te permettre peut être d'y voir un peu plus clair dans la base d'utilisation de ssget..... (defun c:dxf2 () (princ "\n Sélection :") (setq sel (ssget)) (setq nb_ob_sel (sslength sel)) (princ (strcat "il y a " (rtos nb_ob_sel) " Objet(s) dans la Sélection")) (setq x 0) (repeat nb_ob_sel (setq ob (ssname sel x)) (setq nom (cdr (assoc 0 (entget ob)))) (princ (strcat " \nCode DXF 2 d'un Objet dans la sélection : " nom)) (setq x (+ x 1)) ) ) [Edité le 7/10/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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