zebzeb Posté(e) le 9 mai 2012 Posté(e) le 9 mai 2012 Bonjour, Je me tourne à nouveau vers vous car sèche complètement :huh: sur la méthode de réalisation,Je n'arrive pas à récupérer les coordonnées des blocs ; Insertion des distances de blocs (defun c:ditoblocs() (setq di 0) (princ "\nSélectionnez le point d'origine") (setq ptorigine(getpoint)) (princ "\nSélectionnez les blocs à affecter") (setq lis (ssget)) (setq y (sslength lis)) (setq a 0) (while (< a y) (setq detect (ssname lis a)) (setq ent (entnext detect)) (setq verif "debut") (while (/= verif "fin") (setq kt (cdr (assoc 2(entget ent)))) (if (= kt "DISTANCE") (progn ; ; Ici je souhaite récupérer la distance entre ; le point d'origine et le blocs concerné ; Et l'insérer dans l'attribut DISTANCE ; (setq divdi(strcat (fix (/ di 100) " mètres") (setq ent(subst divdi (assoc 1 (entget ent))(entget ent))) (entmod ent) (entupd detect) (setq verif "fin") ) (setq ent (entnext ent)) ) ) (setq a (+ a 1)) ) ) J'espère ne pas être trop confus dans ma demande qui pour moi est grandement épineuse ! Et par avance merci
Patrick_35 Posté(e) le 9 mai 2012 Posté(e) le 9 mai 2012 Salut (cdr (assoc 10 (entget detect))) Et j'ajouterai quelque part dans la boucle de recherche des attributs(= (cdr (assoc 0 ent)) "SEQEND") Ainsi que de filter mes objets(ssget '((0 . "INSERT") (66 . 1))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebzeb Posté(e) le 9 mai 2012 Auteur Posté(e) le 9 mai 2012 Merci pour ta réponse super rapide, je testerais demain au boulot ici je n'ai pas autocad Bonne soirée
zebzeb Posté(e) le 16 mai 2012 Auteur Posté(e) le 16 mai 2012 Bonjour, Encore besoin de votre soutient Je n'ai su utiliser ce qui suit :blink:Et j'ajouterai quelque part dans la boucle de recherche des attributs(= (cdr (assoc 0 ent)) "SEQEND") Ainsi que de filter mes objets(ssget '((0 . "INSERT") (66 . 1)))Car je n'en comprends pas le sens... Actuellement le lisp fonctionne en l'état toutefois je galère à cause de la sélection, je n'arrive pas à "débrancher" avec un "if" avant l'erreur 1. Si un bloc n'a d'attribut => lentityp nil2. Si un bloc n'a pas l'attribut "DISTANCE" => lentityp nil3. Si un autre élément à était sélectionné (par exemple une ligne) => lentityp nil Dans les 3 cas l'exécutions est arrêtée, je n'arrive pas à écrire "si c'est nil passe au suivant" ;) (defun c:dstvdi() (setq comp 0) (initget (+ 1 2 4)) (setq ech (getint "\nEchelle: " )) (initget (+ 1 4)) (setq comp (getint "\nCompensation: ")) (princ "\nSélectionnez le point d'origine") (setq pt1(getpoint)) (setq pt1X(car pt1)) (setq pt1Y(cadr pt1)) (princ "\nSélectionnez les blocs à affecter") (setq lis (ssget)) (setq y (sslength lis)) (setq a 0) (while (< a y) (setq detect (ssname lis a)) (setq ent (entnext detect)) (setq verif "debut") (while (/= verif "fin") (setq kt (cdr (assoc 2(entget ent)))) (if (= kt "DISTANCE") (progn (setq pt2(cdr (assoc 10 (entget detect)))) (setq pt2X(car pt2)) (setq pt2Y(cadr pt2)) (setq di1 (abs (- pt1X pt2X))) (setq di2 (abs (- pt1Y pt2Y))) (setq di (+ (+ di1 di2) 100)) (setq divdi (fix (/ di ech))) (setq divdi(+ divdi comp)) (setq ent(subst (cons 1 (rtos divdi)) (assoc 1 (entget ent))(entget ent))) (entmod ent) (entupd detect) (setq verif "fin") ) (setq ent (entnext ent)) ) ) (setq a (+ a 1)) ) ) Merci par avance
Patrick_35 Posté(e) le 16 mai 2012 Posté(e) le 16 mai 2012 Salut Et j'ajouterai quelque part dans la boucle de recherche des attributs(= (cdr (assoc 0 ent)) "SEQEND")Comme tu parcours tes attributs avec entnext, c'est pour ajouter une sécurité pour sortir de ta fonction.Le '(0 . SEQEND) est là pour indiquer que tous les attributs du bloc ont été trouvés et qu'il est temps de faire autre chose. Extrait de l'aideThe entities selected by ssget are main entities, not attributes of blocks or vertices of polylines. You can access the internal structure of these complex entities by walking through the subentities with entnext. Once you obtain a subentity's name, you can operate on it like any other entity. If you obtain the name of a subentity with entnext, you can find the parent entity by stepping forward with entnext until a seqend entity is found, then extracting the -2 group from that entity, which is the main entity's name. Ainsi que de filter mes objets(ssget '((0 . "INSERT") (66 . 1)))C'est pour éviter de sélectionner des lignes, des textes, etc...La sélection se fait uniquement sur les blocs (0 . "INSERT") et possédants des attributs (66 . 1) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebzeb Posté(e) le 18 mai 2012 Auteur Posté(e) le 18 mai 2012 Enfin!... Après beaucoup de tâtonnement, j'y suis arrivé :D Avec tous mes meilleur remerciement Patrick
alala Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Pour les points d'insertion des bloc j'ai eu quelques soucis car certains sur certains plans voyaioent leurs coordonnées exprimé dans SCO et non dans le SCG (ou le SCU).J'avais donc des point de base en négatif en X ou Y ou à 0,0,0. Perso pour avoir l'origine de mes bloc dans le SCG j'applique ceci : (if (not (equal (cdr( assoc 210 (entget NomEnt))) '(0.0 0.0 1.0))) (setq pt (trans (cdr(assoc 10(entget NomEnt))) NomEnt 2 )) (setq pt (cdr(assoc 10(entget NomEnt)))) ) C'est surement pas très "propre" mais ça fonctionne à la perfection sur les plans que je rencontre. Voila, je m'incruste mais si ça peu t'éviter de longues heures de prise de tête. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
Patrick_35 Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Salut Deux petites remarques sir tu le permets1) Tu peux inverser tes deux conditions et cela évite un not2) Tu peux utiliser (trans pt 1 0) et cela fonctionne sans conditions. Cela indique systématiquement les coordonnées en WCS.Le 1 représentant l'UCS courant, si tu es déjà en WCS, cela ne change donc rien. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
alala Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Oups l'erreur de not qui est un héritage de toute une routine modifié un paquet de fois!Il faut donc modifier cela. Pour la seconde remarque si je fait cela sur un de mes plans je n'obtiens pas le même résultat entre les deux solution.Et pourtant je suis en SCG. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
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