Clément.a Posté(e) le 22 avril 2013 Posté(e) le 22 avril 2013 Bonjour à tous, J'aimerais recherché un bloc dans l'espace objet dont je connais son nom et les coordonnées du point d'insertion, pour pouvoir extraire son ename. Merci Désolé pour la faute dans le titre! :( --> Merci
Clément.a Posté(e) le 22 avril 2013 Auteur Posté(e) le 22 avril 2013 (modifié) Pour expliquer un peu mieux mon probleme j'ai un nombe x de bloc avec attribut qui se nome "annotation", quand j'applique une action (depuis une routine) j'aimerai que ça modifie un bloc "annotation" dont je connais seulement les coordonnées de son point de base. Y a t'il un moyen de resortir tout les blocs du nom "annotation" avec leur entget et retrouver celui dont j'ai besoin en cherchant celui qui à les coordonnées de base que je connais. Donc ce qu'il me faudrait c'est tout les enames des blocs "annotation", pour pouvoir interrogé le paire poibté (10. ..) et vérifier si elle est égale à celle que je veut. J'ai deja vu qu'on pouvait ressortir la liste de tout les noms des bloc inserés dans le dessin, est ce possible de faire ce que j'aiemerais? Merci Modifié le 23 avril 2013 par Clément.a
didier Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 coucou ce que tu demandes n'a pas l'air bien compliqué, mais, franchement, fais un effort pour expliquer car c'est à la limite du compréhensible. je pense te donner une piste de recherche : utilisation du (entnext), en effet si tu as l'ename d'un bloc qui contient des attributs, avec (entnext), tu auras la définition de ''entité qui suit le bloc dans la base donc le premier attribut si j'ai bien compris, ce dont il est possible de douter... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
-Olivier- Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 Bonjour, D'après ce que j'ai compris, ceci devrais fonctionner :(ssget "_X" '((0 . "INSERT") (2 . "nom_du_bloc") (10 coordonnées_du_bloc)))Bonne journée,Olivier
Clément.a Posté(e) le 23 avril 2013 Auteur Posté(e) le 23 avril 2013 Bonjour Oui, désolé pour le message de hier soir j'était un peu fatigué quand je l'ai écrit et je n'ai pas pris le temps de relire je m'en excuse. Ce que me propose -Olivier- me parait bien mais j'arrive pas à l'appliquer avec les coordonnées. J'ai essayé dans un plan avec un seul bloc mais il ne trouve rien quand je met les coordonnées et quand je les enlèves il me trouve quelque chose.Voila ce que j'ai écris : (setq nom (ssget "_X" '((0 . "INSERT")(2 . "annotation")(10 28482.7 408.153 0.0)))) D'autre pas quand ça marche nom rend la valeur <Selection set: aa> Comment ça s'utilise <Selection set: aa> Merci
Clément.a Posté(e) le 23 avril 2013 Auteur Posté(e) le 23 avril 2013 quand j'ai un bloc au point (0 0)et que je fait (setq nom (ssget "_X" '((0 . "INSERT")(2 . "annotation")(10 0 0))))il le trouve par contre quand c'est une coordonnées bidon il le trouve pas il doit y avoir une incertitude sur mes coordonnées?!
-Olivier- Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 Pour ta première question : le problème doit provenir de la précision des coordonnées. Soit pt1 les coordonnées et ton point. (setq lupr (/ 1.000000000 (expt 10 (getvar 'luprec)))) Permet de définir une précion plus ou moins grande suivant la valeur de la variable LUPRECPuis : (setq ss1 (ssget "_C" (mapcar 'lambda (x) (- x lupr)) pt1) (mapcar 'lambda (x) (+ x lupr)) pt1) (list '(0 . "INSERT") '(2 . "annotation"))) Défini une sélection avec une fenêtre autour des coordonnées de ton point. Pour la seconde question : Le résultat est une sélection. Pour obtenir l'entité, il te suffit de récupérer le premier (et normalement unique objet) de la sélection avec (ssname ss1 0) Olivier
Clément.a Posté(e) le 23 avril 2013 Auteur Posté(e) le 23 avril 2013 Astucieux le coup de la fenêtre suivant le précision, mais je ne devrait pas avoir bessoin de ça car dans ma routine je calcul les coordonnées de la même façon que pour l'inserer donc sa devrait etre bon.C'est pour mes essais ça ne marchais pas car je reprennais les coordonnées dans le entget de mon bloc et comme je vien de le constaté elles sont arrondi ce qui me surpend, surtout que avec cette arrondi ça me permet pas de les retrouver avec le ssget c'est un peut contradictoire il arrondi les coordonnées mais pas partout, bizzard... Est ce que quelqu'un à une expliquation à cela?
-Olivier- Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 J'avais cru voir passé un poste de (gile) à ce sujet.C'est pourquoi j'utilise une fenêtre. Une autre possibilité, faire une sélection global des blocs avec un filtre de nom puis vérifier que la coordonnées est équivalente à celle rechercher.Olivier
bonuscad Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 Bonjour, Quand tu fais ceci:(setq nom (ssget "_X" '((0 . "INSERT")(2 . "annotation")(10 28482.7 408.153 0.0)))) tu 'quote ton point'((10 28482.7 408.153 0.0))Ce qui n'est pas du tout la même chose que:(cons 10 pt_ins) même si !pt_ins te retourne (28482.7 408.153 0.0)Si tu fais (rtos (car pt_ins) 2 12) tu pourrais obtenir par exemple: "28482.729563457823" <> 28482.7 Quand tu 'quote tu perds la précision, donc la sélection échoue si le point est quelconque... (repeat (setq n (sslength nom)) (print (ssname nom (setq n (1- n)))))Dans ton cas vas retourner tout les noms d'entités contenu dans le jeu de sélection "nom" Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 23 avril 2013 Posté(e) le 23 avril 2013 Bonjour, Dans le cas d’une sélection sur un point d’insertion d’une référence de bloc, je ne pense pas que la sélection par "Capture" soit la plus judicieuse, pour cela il suffit de penser aux blocs qui sont définit très loin de leur point d’insertion ou aux blocs circulaire dont l’origine et souvent le centre du cercle. Donc pour rebondir sur la proposition de filtre sur le code 10, et compléter les propos de BonusCAD sur l’emploie du quote et des erreurs d’arrondie. On peut également par sécurité introduire des tests relationnels dans les filtres de sélections, par exemple si on a calculé un point de sélection pins.Pour avoir ses coordonnées par excès et par défaut à 1e-8 prés, on peut faire :(setq pinSup (mapcar '(lambda (x) (+ x 1e-8)) pins) ; coordonnées par excès pinInf (mapcar '(lambda (x) (- x 1e-8)) pins) ; coordonnées par défaut ) Puis il ne reste plus qu’à sélectionner les références du bloc annotation dont le point d’insertion est compris entre ces 2 intervalles de coordonnées:(setq nom (ssget "_X" (list '(0 . "INSERT") '(2 . "annotation") '(-4 . ">,>,>") (cons 10 pinInf) '(-4 . "<,<,<") (cons 10 pinSup)))) A+ Apprendre => Prendre => Rendre
Clément.a Posté(e) le 23 avril 2013 Auteur Posté(e) le 23 avril 2013 Bon je vais travailler tous ça, merci beaucoup
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