bucheron Posté(e) le 21 octobre 2004 Posté(e) le 21 octobre 2004 Bonjour a tous, Voila mon probleme: J'ai une grande quantité de cercles sur des calques different et le but est de remplacer chaque cercle par un blocs (toto.dwg par exemple). La selection des cercles doit se faire par son rayon (10cm).Le bloc de remplacement doit garder les propriétés du cercle (même calque, même couleur).Le point d'insertion du bloc doit etre le centre du cercle. Apres traitement, le fichier ne doit plus avoir de cercles. Ils doivent tous etre remplacés par le bloc toto.dwg A mon niveau, je ne sait que faire la sellection des cercles mais je seche complettement pour le reste. Merci de votre aide :P
didier Posté(e) le 21 octobre 2004 Posté(e) le 21 octobre 2004 bonsoir, comme d'habitude, c'est du vite fait,donc pas de contrôlesle scu par exemple c'est le généralil faut que le bloc "toto" existe dans le fichierje te laisse améliorer le tout,mais tu as une base de départ :(setq jeu (ssget "x" ' ((0 . "CIRCLE"))))(setq n 0)(repeat (sslength jeu) (setq ent (ssname jeu n)) (if ( = 0.1 (cdr(assoc 40 (entget ent)))) (progn (setq calque-ent (cdr(assoc 8 (entget ent)))) (setvar "CLAYER" calque-ent) (command "_insert" "toto" (cdr(assoc 10 (entget ent))) "1" "1" "0") (entdel ent) (setq n ( + 1 n)) ) (setq n (+ 1 n)) ) )amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bucheron Posté(e) le 22 octobre 2004 Auteur Posté(e) le 22 octobre 2004 Merci Didier pour ton petit lisp qui me fait gagner beaucoup de temps.Je l'ai corrigé et ça marche très bien. (defun C:REM_CERCLE_BLOC() (setq jeu (ssget "x" ' ((0 . "CIRCLE")))) (setq n 0) (repeat (sslength jeu) (setq ent (ssname jeu n)) (if (= 0.1 (cdr(assoc 40 (entget ent)))) (progn (setq calque-ent (cdr(assoc 8 (entget ent)))) (setvar "CLAYER" calque-ent) (command "_insert" "toto" (cdr(assoc 10 (entget ent))) "1" "1" "0") (entdel ent) ) ) (setq n (+ 1 n)) )) J'ai une petite question. J'ai voulu rechercher des cercles de rayon 0.0575427 (valeur recuperée avec (entget(car(entsel))). J'ai remplace le 0.1 par 0.0575427 et rien n'a ete changé.Le IF n'est pas executé. Peux tu me dire s'il y a une precision a apporter pour que le test du IF fonctionne avec cette precision ? Merci encore
didier Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 bonjouril est courant, lors de la comparaison de valeurs numériques,en fait lors de la comparaison de nombres réels, de ne pas trouver d'égalité.en fait c'est au niveau de la énième décimale que la différence se produitet le logiciel s'obstine à ne pas trouver d'égalité.la solution que j'applique c'est de "transformer"le réel en chaîne de caractère ,avec assez de précision pour être significatif,et c'est cette chaîne qu'on va comparer pour le test.Pour mémoire un réel passera en caractères via le RTOSpar exemple :(setq pi-reel pi)(setq pi-chaine (rtos pi 2 8))l'exemple de PI est significatif,vu la complexité de ce nombre. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Patrick_35 Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 Bonjour,juste une précision, plutôt que de sélectionner tous les cercles et ensuite de faire un test sur le rayon d'un cercle, on peut aussi faire un filtre un peu plus élaboré avec les fonctions and, or, xor et not Par exemple(setq jeu (ssget "_x" '((-4 . "AND") (0 . "CIRCLE") (40 . 0.1) (-4 . "AND>"))))Je choisis que des cercles avec un rayon de 0.1 @+ Ps : Ajouter un "<" devant le premier AND , c'est à cause du message qui ne s'affiche pas complètement si on le laisse dedans. [Edité le 22/10/2004 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
didier Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 salut Patrickje te rejoins complètement,mais j'ai fait simple pour deux raisons:une : j'ai tapé ça vite fait sur le gaz,deux: il ne me semble pas bénéfique de trop en faire,surtout dans le forum "débuter".une seule condition et ça fonctionne plus,c'est chiant pour le mec qui débute.n'empêche que ta remarque est constructive et que c'est une bonne amélioration.on peut même imaginer, que la routine "demande" le rayon des cercles qu'elle doit filtrer,et là "le bucheron" aura le sentiment d'avoir progressé,ce qui est le but initial de ce fort homme, ou forum ;) amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Patrick_35 Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 Salut DidierC n’est en aucun cas une critique, juste une précision pour notre ami Bucheron qui apprend le lisp et pour le faire progresser. Il faut d’abord faire ses lisps avec des conditions pour comprendre comment ça marche, puis passer à l’étape suivante avec les filtres @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 Ben moi aussi je vais apporté ma pierre. Didier te propose de faire un test d'égalité de nombre en passant par RTOS.Bien que cette solution fonctionne, tu peux obtenir la même chose avec la fonction(equal 0.0575427 (cdr(assoc 40 (entget ent))) 0.0000001) Le dernier élément est l'écart toléré pour la comparaison. Voilà pour la précision si tu te sens pas à l'aise avec les filtre de (ssget) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didier Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 coucoubien vu BonusCad, je ne pense pas souvent à cette commande,car je l'ai vue que très tard, c'est l'éternel problème des autodidactes, quant à la réponse de Patrick_35, rassure toi, je n'ai pas pris ton post pour une critique,je suis serein à ce niveau,tu sais que je pense que :toute critique est constructive, si elle n'est pas basée sur la jalousie ou l'envie.donc ce qui vient de toi n''étant pas concerné par ces défauts, c'est toujours le bienvenu.sans compter que souvent c'est comme ça qu'on progresse TOUS,débutants et moins débutants. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Serge Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 Bonuscad, Juste un petit truc. Lorsque le nombre de zéros commence à être important, on peut écrire 1e-6 (ou autre), et ce même sur la ligne de commande. De même, le "equal "présume que ce n'est pas le ssget qui filtre mais le programmeur. Patrick_35,Lorsqu'il n'y a que des items reliés par des AND, il n'est pas requis de les spécifier.(setq ss (ssget "_x" (list (cons 0 "circle") (cons 40 0.1))))aurait suffit et a l'avantage d'être plus lisible. S'écrivent également:(setq ss (ssget "_x" (list (cons 0 "circle") (cons -4 ">=") (cons 40 2.0))))(setq ss (ssget "_x" (list (cons 0 "circle") (cons -4 ">=") (cons 40 35.0) (cons -4 "<=") (cons 40 40.0)))) Par contre, si on a 2 plages ou 2 types d'objet, il faut utiliser les opérateurs logiques. Didier,La commande Insert s'occupe d'insérer le bloc au besoin. Mais pour être élégant, on pourrait écrire en début de programme:(setq blockname "direct") ; Ou n'importe quel nom.(if (not (tblsearch "block" blockname)) (progn (command "._insert" blockname) (command))) Serge
didier Posté(e) le 22 octobre 2004 Posté(e) le 22 octobre 2004 hello,bienvenue au club des critiqueurs constructifs, ;) merci serge.ciao Éternel débutant... Mon site perso : Programmer dans AutoCAD
Patrick_35 Posté(e) le 25 octobre 2004 Posté(e) le 25 octobre 2004 Génial, je ne connaissais pas ce truc qu'avec des opérateurs andEt comme on est dans les améliorations, plutôt que de passer par la commande _insert et ensuite de changer l'objet de calque, type de ligne et j'en passe, autant faire un entmake (entmake (list '(0 . "INSERT") '(100 . "AcDbBlockReference") '(2 . "TOTO") (assoc 10 ent) (assoc 8 ent))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bucheron Posté(e) le 2 novembre 2004 Auteur Posté(e) le 2 novembre 2004 Boujours a tous, Je vois que ma petite question a entrainé beaucoup de reponses très constructives et je vous en remercie. Il est vrai que en tant que debutant, je suis un peu perdu mais ça me motive pour continuer a apprendre et surtout a ne pas hesiter a poser des questions. A+ :)
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