Aller au contenu

Remplacement de cercles par des blocs


Messages recommandés

Posté(e)

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

 

 

Posté(e)

bonsoir,

 

comme d'habitude, c'est du vite fait,

donc pas de contrôles

le scu par exemple c'est le général

il faut que le bloc "toto" existe dans le fichier

je 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

 

Posté(e)

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

 

 

Posté(e)

bonjour

il 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 produit

et 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 RTOS

par 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

 

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

salut Patrick

je 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

 

Posté(e)

Salut Didier

C 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

coucou

bien 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

Posté(e)

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

 

 

 

Posté(e)

Génial, je ne connaissais pas ce truc qu'avec des opérateurs and

Et 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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+ :)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité