DenisHen Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 Bonjour à la communauté. Voilà, j'ai un souci avec un DWG issu de Microstation. J'ai des centaines de blocs alors que, visuellement, seul une vingtaine sont utilisés. C'est une mauvaise gestion de l'enregistrement sous DWG par MicroStation, apparemment... Je n'ai pas d'autre choix que de remplacer toutes les déclinaisons (une incrémentation dans le nom des blocs) par un seul et même bloc. Ces blocs n'ont aucun attribut. Par exemple, dans mon DWG, j'ai des blocs "EDF12" puis, MicroStation a créé "EDF12_1", "EDF12_2"... ainsi de suite des centaines de fois... C'est pour cela que j'ai décidé de faire une macro qui remplacerait tous les blocs "EDF12*" par le bloc "Poteau_Bt" (j"en ai profité pour redéfinir les blocs pour que ça corresponde à une charte graphique). J'ai donc commencé une routine mais je ne sais pas comment fouiller la liste des blocs dans le ssget pour en retenir l'X, l'Y et la rotation du bloc à effacer pour insérer mon "futur" bloc avec ces variables... Voici ce que j'ai commencé à écrire : ;;Remplacement de blocs---------------------------------------------------------- (setq Select nil) (princ "\nDébut du remplacement des blocs") (setq LstBlk '(("EDF12*" . "Poteau_Bt") ("EAU12*" . "BoucheIncendie") ("EDF112*" . "Poteau_Cand") ("PTT12*" . "Poteau_Tel") ("EAU42*" . "Bouche") ("PLOT*" . "Poteau_Plot") ("GAZ22*" . "BoucheGaz") ) ) ;_ Fin de setq ;;;Début de la boucle (foreach PosLstBlk LstBlk (setq Select (ssget "x" (list (cons 0 "INSERT") (cons 2 (car PosLstBlk))))) ;(car PosLstBlk) est le nom de l'ancien bloc ;(cdr PosLstBlk) est le nom du futur bloc ;;;Placer ici la fouille de tous les blocs contenus dans Select ;;;Récupérer les coordonnées de l'ancien bloc ;;;Récupérer la rotation de l'ancien bloc ;;;Récupérer les échelles de l'ancien bloc ;;;Insérer le nouveau Bloc avec les données de l'ancien bloc ;;;Supprimer l'ancien bloc ) ;_ Fin de foreach ;;; Je pense que cette structure est bonne, reste plus qu'à la remplir... Mais là, je sèche un peu... Si quelqu'un as une astuce ou un conseil, je suis preneur... Amicalement, Denis... 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 22 février 2016 Auteur Posté(e) le 22 février 2016 J'ai piqué le code suivant dans l'excellent "Introduction à AutoLisp" de (gile) et l'ai adapter à mes besoin, c'est juste pour savoir ci je fais "bien"...(defun c:TestDXF () (setq n 0) ; initialisation de l'indice (if (setq Select (ssget "_X" (list (cons 0 "INSERT") (cons 2 "EDF12")))) (while (setq ent (ssname Select n)) (setq elst (entget ent) ; liste DXF de l'objet Coord (cdr (assoc 10 elst)) EchX (cdr (assoc 41 elst)) EchY (cdr (assoc 42 elst)) Rot (cdr (assoc 50 elst)) n (1+ n) ; incrémentation de l'indice ) ;_ Fin de setq (princ "\nInsertion") (command "-inserer" "Poteau_Bt" (car Coord) (cadr Coord) ExhX EchY Rot) (princ "\nInseré") ) ;_ Fin de while ) ;_ Fin de if (princ elst) ) ;_ Fin de defun Mais ça plante, AutoCAD me répond :Commande: TESTDXFInsertion1.000000; erreur: Fonction annulée; redéfinir après erreur Toujours à la recherche d'une astuce ou d'un conseil... ;) 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 22 février 2016 Auteur Posté(e) le 22 février 2016 Après de multiples recherches, j'ai fini par faire ça : ;;Remplacement de blocs---------------------------------------------------------- (setq Select nil) (princ "\nDébut du remplacement des blocs") (setq LstBlk '(("EDF12*" . "Poteau_Bt") ("EAU12*" . "BoucheIncendie") ("EDF112*" . "Poteau_Cand") ("PTT12*" . "Poteau_Tel") ("EAU42*" . "Bouche") ("PLOT*" . "Poteau_Plot") ("GAZ22*" . "BoucheGaz") ) ) ;_ Fin de setq ;;;Début de la boucle (foreach PosLstBlk LstBlk ;(car PosLstBlk) est le nom de l'ancien bloc ;(cdr PosLstBlk) est le nom du futur bloc (setq n 0) ; initialisation de l'indice (if (setq Select (ssget "_X" (list (cons 0 "INSERT") (cons 2 (car PosLstBlk))))) (while (setq ent (ssname Select n)) (setq elst (entget ent) ; liste DXF de l'objet Coord (cdr (assoc 10 elst)) EchX (cdr (assoc 41 elst)) EchY (cdr (assoc 42 elst)) Rot (cdr (assoc 50 elst)) n (1+ n) ; incrémentation de l'indice ) ;_ Fin de setq (setvar "clayer" (cdr (assoc 8 elst))) (command "_erase" ent "") (setq Coord (strcat (rtos (car Coord) 2 3) "," (rtos (cadr Coord) 2 3))) (princ "\nInsertion") ;(command "-inserer" Bloc Pt_Ins echBlk echBlk pause) (command "-inserer" (cdr PosLstBlk) "_non" Coord EchX EchY Rot) (princ "\nInseré") ) ;_ Fin de while ) ;_ Fin de if ) ;;; Mon code n'est peut-être pas très "académique", mais il est de mon niveau... Il remplace le premier bloc ("EDF12*", "EAU12*"...) avec des "*" par les deuxièmes ("Poteau_Bt", "BoucheIncendie"...) Si ça peut servir à quelqu'un... Denis... 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 22 février 2016 Auteur Posté(e) le 22 février 2016 Je sais, mais je ne pensais pas être capable de m'en tirer... J'ai fais les trois actes seul... ;) 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)
Patrick_35 Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 Salut Il me semble t'avoir déjà donné la réponse, où une chose m'échappe. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 22 février 2016 Auteur Posté(e) le 22 février 2016 Non Patrick_35, tu ne te trompes pas, mais (gile), dans le post de tes routines, avait expliquer que ce que je voulais faire ne correspondait pas à Rbloc :Salut, Il me semble que tu essayes de renommer des références de blocs. Je crains que ça ne soit pas possible. tu peux renommer des définitions de blocs à condition que ça ne soit pas de des blocs anonymes créés par AutoCAD pour les blocs dynamiques.Ce n'est pas un problème de LISP (ou de programmation) ce sont les blocs AutoCAD qui sont définis de cette manière, il est important de bien comprendre la différence et les relations entre définition de bloc et références de bloc (de même pour les définitions et références d'attributs). Enfin, c'est ce que j'ai compris... Et comme je n'arrivais pas à bien comprendre ton Lisp pour l'adapter à mes besoins, j'en ai écris un... Je préfère faire un code moi-même que je comprend, plutôt que je saccager le code d'un autre, surtout s'il est bien fait, comme tous vos codes d'ailleurs... Désolé du dérangement... Par contre, j'ai un problème avec la rotation... La variable Rot, que je défini avec (cdr (assoc 50 elst)) n'est pas bonne... Je me noie dans un verre d'eau... C'est en radian par défaut ? Merci de m'avoir répondu.. 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)
Patrick_35 Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 Je préfère faire un code moi-même que je comprend100% d'accord plutôt que je saccager le code d'un autreC'est aussi ce qui permet d'avancer Désolé du dérangement...Ce n'est pas grave, mais je ne comprenais plus où tu voulais en venir.Mais cela me fais aussi songer que tu n'as pas lu ma réponse à ce propos ou je n'ai pas été suffisament clair. La variable Rot, que je défini avec (cdr (assoc 50 elst))La valeur est en radian.Pour vérifier, tu insères un bloc à 90° et tu regardes le code dxf (1.5708 soit pi/2) S'il y a une chose que je te conseillerai, ce serait d'écrire le code en testant ligne par ligne et regardant les résultats que d'écrire tout d'un seul bloc et de passer ensuite son temps à jouer aux 7 erreurs.C'est ce que je fais. Bout par bout et ensuite, on assemble. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 23 février 2016 Auteur Posté(e) le 23 février 2016 Merci pour ce conseil Patric_35... Amicalement... 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)
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