DenisHen Posté(e) le 27 juillet 2017 Posté(e) le 27 juillet 2017 Bonjour à tous. Aujourd'hui, je cherche à remplacer un bloc (FARBRE) par un autre (VegArbFeuil1), j'ai donc écris une petite routine qui, bien sûr, ne fonctionne pas :(defun c:TestBlkArbre () (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 "FARBRE")))) (while (setq ent (ssname ss i)) (setq i (1+ i) elst (entget ent) ) ;_ Fin de setq (setq elst (subst (cons 2 "VegArbFeuil1") (assoc 2 elst) elst)) ; (entmod elst) ) ;_ Fin de while ) ;_ Fin de if )Je connais RBloc mais j'aimerais l'éviter, pour intégrer ce bout de code dans une autre routine. Si quelqu'un a une astuce, un conseil... Je suis preneur... 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)
Matt666 Posté(e) le 27 juillet 2017 Posté(e) le 27 juillet 2017 (modifié) Salut ! J'espère que tout le monde va bien ici, apparemment le forum perdure, c'est bien. Personnellement je passerais par une sélection de tous les blocs FARBRE dans le dessin comme tu l'as fait, insertion du nouveau bloc VegArbFeuil1 à la même place que celui-ci puis suppression du vieux bloc. Bon courage. Modifié le 28 juillet 2017 par Matt666 1 "Chacun compte pour un, et nul ne compte pour plus d'un."
DenisHen Posté(e) le 27 juillet 2017 Auteur Posté(e) le 27 juillet 2017 Salut Matt666, et merci de m'aider. Le truc, c'est que j'ai "copié" (didier va aimer) ce bout de code ailleurs, mais je n'arrive pas à l'adapter à mes besoins... 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)
Matt666 Posté(e) le 27 juillet 2017 Posté(e) le 27 juillet 2017 La routine que tu demandes est faisable si tous les blocs à remplacer ne sont pas imbriqués dans d'autres blocs. Et aussi s'ils ne contiennent pas d'attributs. Dans ces cas c'est déjà plus compliqué. "Chacun compte pour un, et nul ne compte pour plus d'un."
Matt666 Posté(e) le 27 juillet 2017 Posté(e) le 27 juillet 2017 Essaie ceci : ; Fusion des blocs (defun c:BMM ( / *error* sel dest cmdecho clayer e n ndest) ;Fonction d'erreur (vl-load-com) (defun *error* (msg) (if (and msg (/= msg "Fonction annulée") (/= msg "Function cancelled") ) (princ (strcat (if (= "fr_FR" (getvar 'locale)) "\nErreur: " "\Error: " ) msg ) ) ) (setvar 'cmdecho cmdecho) (setvar 'clayer clayer) (vla-endUndoMark acdoc) (princ) ) (if (ssget "i") (if (and (eq (sslength (ssget "i")) 1) (eq "INSERT" (cdr (assoc 0 (entget (ssname (ssget "i") 0))))) ) (setq source (ssname (ssget "i") 0)) (while (not (and (setq source (car (entsel "\nSelectionner le bloc source : "))) (eq "INSERT" (cdr (assoc 0 (entget source)))) ) )) ) (while (not (and (setq source (car (entsel "\nSelectionner le bloc source : "))) (eq "INSERT" (cdr (assoc 0 (entget source)))) ) )) ) (while (not (and (setq dest (car (entsel "\nSelectionner le bloc à remplacer : "))) (eq "INSERT" (cdr (assoc 0 (entget dest)))) ) )) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) cmdecho (getvar 'cmdecho) clayer (getvar 'clayer) ) (setvar 'cmdecho 0) (setvar 'clayer "0") (setq dest (cdr (assoc 2 (entget dest))) source (cdr (assoc 2 (entget source))) ) (command "_-insert" source "0,0,0" "1" "1" "0") (setq sset (ssadd) e (entlast)) (command "_explode" e) (while (setq e (entnext e)) (ssadd e sset) ) (command "_-bloc" dest "_Y" "0,0,0" sset "" ) (setvar 'cmdecho cmdecho) (setvar 'clayer clayer) (princ) ) "Chacun compte pour un, et nul ne compte pour plus d'un."
DenisHen Posté(e) le 28 juillet 2017 Auteur Posté(e) le 28 juillet 2017 Salut et merci pour ton aide. Utiliser ton code serait utiliser Grosse Berta pour écraser une mouche... Je n'ai besoin de remplacer qu'un bloc par un autre, sans attributs, sans bloc à l'intérieur du bloc... C'est pour cette raison que je dois utiliser mon code, je suis sûr que mes quelques lignes suffisent... Il doit contenir une petite erreur, mais il devrait fonctionner... Si je n'y arrive pas (ce qui serait dommage), j'utiliserais RBloc... Tant pis... Encore merci pour ton aide... 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 28 juillet 2017 Auteur Posté(e) le 28 juillet 2017 Ça y est, j'ai réussi, je n'avais pas initialisé i, voici donc le code :(defun c:TestBlkArbre (/ i ss) (setq i 0) (if (setq ss (ssget "_A" (list (cons 0 "INSERT") (cons 2 "FARBRE")))) (while (setq ent (ssname ss i)) (setq i (1+ i) elst (entget ent) ) ;_ Fin de setq (setq elst (subst (cons 2 "VegArbFeuil1") (assoc 2 elst) elst)) (entmod elst) ) ;_ Fin de while ) ;_ Fin de if (princ) ) 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)
Matt666 Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Ok, effectivement, le entmod sur le nom du bloc fonctionne. J'étais persuadé que non, et je n'ai pas testé.. Merci à toi, c'est effectivement beaucoup plus désormais. "Chacun compte pour un, et nul ne compte pour plus d'un."
didier Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Coucou j'ai effacé mon message de réponse dans lequel je te proposais une solution et où je te moquais.car malgré le fait que je n'aime pas la copieque j'aime ou pas est anecdotique et on s'en fout, je parle de principe d'apprentissagesi tu VEUX apprendre, ne copie pas est-ce que tu as compris pourquoi ça ne marchait pas ? à Mat666 : avant d'écrire péremptoirement qu'il n'est pas possible de faire quelque chose (entmod) il est utile de vérifier pour ne pas laisser trainer sur le net des informations fausses qui si elles ne sont pas contredites (dans notre cas elles le sont) risquent de mettre le doute dans la tête des futurs lecteurs... les écrits restent et sur le net on en trouve des fausses infos écrites par des gens qui n'imaginent pas du doute qu'ils diffusent. Éternel débutant... Mon site perso : Programmer dans AutoCAD
Matt666 Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Tout à fait Didier, je m'en vais de ce pas modifier mon message péremptoire, puisque je ne sais pas comment l'effacer.Au plaisir de te relire. "Chacun compte pour un, et nul ne compte pour plus d'un."
x_all Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 J'ai bien l'impression que tu ne peux pas te passer quand tu parcours ta liste de récupérer le pts d'insertion (peut être aussi l'orientation et l’échelle) insérer le nouveau bloc, puis effacer l'ancien.Effectivement ça ne peut prendre que qqs lignes.Je comprends bien l'idée de faire pointer le nom du bloc vers un autres, mais j'ai peur que ça ne marche pas. L'autre jour, je crois que c'est toi, on m'a fait découvrir les getproperty et setproperty essaye de tester si de changer le nom suffit, mais j'y crois pas. j'ai tester (dumpallproperties (ssname (ssget) 0)) sur un regard, je ne retrouve pas le nom du bloc...d'ou mon pessimisme quelques trucs sur autocad
bonuscad Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 je cherche à remplacer un bloc (FARBRE) par un autre (VegArbFeuil1) Ceci me semble réalisable sans lisp. Je considère que "VegArbFeuil1" n'existe pas dans le dessin à traiter.Utiliser la commande RENOMMER (_RENAME), prendre l'option bloc, ancien nom: "FARBRE" nouveau nom: "VegArbFeuil1". Tous les blocs insérés sont ainsi renommé. Utiliser alors la commande INSERER (_INSERT), parcourir dans votre bibliothèque externe et choisir le fichier VegArbFeuil1.dwg.Lorsqu'il aura été sélectionné, un message va vous demander de confirmer la redéfinition du bloc, annuler l'insertion (le bloc a été redéfini), c'est fini! Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
x_all Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 ha! l'astuce du sioux !!bien sur... ou avec le desing center redéfinir le bloc seulement... mais je crois qu'il veux faire une routine pour l'intégrer dans un lisp qui mouline d'autres choses... quelques trucs sur autocad
DenisHen Posté(e) le 28 juillet 2017 Auteur Posté(e) le 28 juillet 2017 Salut à tous... si tu VEUX apprendre, ne copie pasBien sûr que je VEUX apprendre, mais je vais me permettre une petite comparaison culinaire. Chez moi, ma femmes fait d'excellents plats "complexes" avec livre de cuisine sous le coude et tout et tout, et c'est délicieux... Par contre, quand je cuisine, j'adapte ce qui reste dans le frigo et, avec quelques autres ingrédients, j'improvise un plat, qui lui aussi est délicieux... En programmation, je fais pareil, j'adapte différents codes pour en faire un nouveau... Ce qui in fine veux dire que je ne ferais jamais de grande cuisine, mais je mangerais tout de même de bons plats, tant qu'il y aura des restes bien sûr... est-ce que tu as compris pourquoi ça ne marchait pas ?Oui, c'est la variable i qui n'était pas initialisée. Tout ce que j'ai fais, c'est comprendre le code d'un autre... Merci encore pour vos aides/remarques... Amicalement. Denis...Cela dit, je reste entièrement d'accord avec toi didier, taper le code en entier est bien plus efficace dans l'apprentissage que copier/coller des bouts de codes... 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)
didier Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Coucou Si on veut filer la métaphore :Il vaut mieux partir d'un livre de cuisine et APPRENDRE à faire la cuisineQue secouer le frigo et mélanger les restesCe que tu risques dans le deuxième cas : intoxication si mauvais restes et tu ne sauras toujours pas cuisinerDésolé mais je suis rigide sur ce point d'apprentissage Je suis en train de chercher à progresser et je trouve 99.9% des réponses à mes questions dans l'aide AutoCAD.Je fais des dizaines de mini-programmes et ensuite je fais ma cuisine mais toujours en partant d'une page blanche ce qui m'a fait acquérir des réflexes du style initialiser un compteur, mettre un "progn" dans un if, ... Amicalement tout de même ! Éternel débutant... Mon site perso : Programmer dans AutoCAD
x_all Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Je n'ai jamais été bon en cuisine... mais je m'en sort pour faire à bouffer :) Je comprend bien la démarche monacale, et j'en suis revenu des copies de bout de code par ci par là... Mais il m'a fallu pas mal de galère pour comprendre que je ne gagnais pas du temps.Quand on part de zéro (en terme de connaissance du langage) la réutilisation de bout de code à cet avantage que l'on apprend à lire le lisp. On va chercher dans le Ref. le nom d'une fonction, et en plus de l'exemple officiel, on en a un autre adapté à l'exercice. Bref ça aide au début à savoir par quel bout aborder le pb. Mais ce recyclage à ses limites. Si un débutant vient taper chez moi, il va trouver des codes très commenté (surtout pour m'aider à m'y retrouvé) mais d'un piètre niveau et souvent mal fichu. Quand il va pioché chez (gile) il va être confronté à une extrême concision qui, si elle touche au sublime, demande une ''culture'' de lisp pour en apprécier la rigueur et la beauté. Bricoler ma bidouille rajoute une couche de mauvaise habitude aux miennes, bricoler du code de (gile) revient à colorier un dessin noir et blanc comme les enfants qui apprennent à pas déborder avec leur feutre, ce qui n'a jamais appris à dessiner, tout juste à tenir un crayon. De mon point de vue, il vaut mieux s’intéresser à l'algorithme. Qu'est ce qu'on veut obtenir de quel éléments on a besoin et lire (ou recopier parfois) des bouts de code permet de comprendre la logique du lisp pour dérouler un algorithme. C'est pas toujours intuitif. quelques trucs sur autocad
DenisHen Posté(e) le 28 juillet 2017 Auteur Posté(e) le 28 juillet 2017 Je suis d'accord avec vous deux... Je fais de plus en plus des code depuis une page blanche, mais je m'inspire toujours d'autres codes, surtout de CadXP.com... Pour faire simple, le copier/coller n'est pas une méthode d'apprentissage... Mais ce site est une mine d'or... Et il est très actif... 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)
Olivier Eckmann Posté(e) le 28 juillet 2017 Posté(e) le 28 juillet 2017 Bonsoir, Tant qu'à déclarer tes variables, vas jusqu'au bout et déclares aussi la variable elstD'autre part le code ne fonctionne que si le bloc VegArbFeuil1 est défini dans le dessin, donc il faudrait ajouter cette condition (if (and (setq ss (ssget "_A" (list (cons 0 "INSERT") (cons 2 "FARBRE")))) (tblsearch "BLOCK" "VegArbFeuil1") ) L'idéal ensuite c'est d'en faire une fonction avec 2 paramètres l'ancien nom et le nouveau comme ça tu as une fonction réutilisable à volonté.Meme si c'est toi qui programme tu peux ajouter 2 tests sur tes arguments : qu'ils ne soient pas vides et que ce soit bien des textes. Ce qui pourrait donner quelque chose comme cela (defun DH_ReplaceBlock (sAncienNom sNouveauNom / i ss elst) (setq i 0) (if (and sAncienNom (= (type sAncienNom) 'STR) sNouveauNom (= (type sNouveauNom) 'STR) (setq ss (ssget "_A" (list (cons 0 "INSERT") (cons 2 sAncienNom)))) (tblsearch "BLOCK" sNouveauNom) ) (while (setq ent (ssname ss i)) (setq i (1+ i) elst (entget ent) ) ;_ Fin de setq (setq elst (subst (cons 2 sNouveauNom) (assoc 2 elst) elst)) (entmod elst) ) ;_ Fin de while ) ;_ Fin de if (princ) ) ;; exemple d'utilisation (defun c:TestBlkArbre () (DH_ReplaceBlock "FARBRE" "VegArbFeuil1") ) Olivier
didier Posté(e) le 29 juillet 2017 Posté(e) le 29 juillet 2017 Coucou Comme il me semble l'avoir déjà dit et en particulier à DenisHENOn apprend à marcher et ... ensuite ... à courir. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
lecrabe Posté(e) le 1 août 2017 Posté(e) le 1 août 2017 HelloEt moi je rampe ...Encore MERCI a TOUS les Lispeurs qui partagent leur savoir ! Bye, lecrabe Autodesk Expert Elite Team
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