Aller au contenu

Remplacement d'un bloc par un autre


DenisHen

Messages recommandés

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)

Lien vers le commentaire
Partager sur d’autres sites

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é par Matt666
  • Downvote 1

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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."

Lien vers le commentaire
Partager sur d’autres sites

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."

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

Ç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)

Lien vers le commentaire
Partager sur d’autres sites

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 copie

que j'aime ou pas est anecdotique et on s'en fout, je parle de principe d'apprentissage

si 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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous...

 

si tu VEUX apprendre, ne copie pas

Bien 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)

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Si on veut filer la métaphore :

Il vaut mieux partir d'un livre de cuisine et APPRENDRE à faire la cuisine

Que secouer le frigo et mélanger les restes

Ce que tu risques dans le deuxième cas : intoxication si mauvais restes et tu ne sauras toujours pas cuisiner

Dé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 !

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

Tant qu'à déclarer tes variables, vas jusqu'au bout et déclares aussi la variable elst

D'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

Lien vers le commentaire
Partager sur d’autres sites

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é