Aller au contenu

DenisHen

Membres
  • Compteur de contenus

    4 029
  • Inscription

  • Dernière visite

  • Jours gagnés

    21

Tout ce qui a été posté par DenisHen

  1. Merci pour ce conseil Patric_35... Amicalement...
  2. 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 : 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..
  3. Non, s'il édite le bloc, tous changerons... Je ne pense pas que ce soit possible, de ne changer qu'un seul bloc du même nom qu'un autre sans changer aussi l'autre...
  4. Je sais, mais je ne pensais pas être capable de m'en tirer... J'ai fais les trois actes seul... ;)
  5. 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...
  6. 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 : Toujours à la recherche d'une astuce ou d'un conseil... ;)
  7. 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...
  8. DenisHen

    Lisps de Patrick_35

    Merci (gile) pour cette réponse, Donc, si j'ai bien compris, il serait préférable que j'insert un "nouveau" bloc à la place de l'ancien et que je supprime l'ancien ? Reste juste à récupérer l'échelle et la rotation du bloc, car ils n'ont pas d'attributs... Je ne pense pas que ce soit à ma porté mais ça vaut le coup d'essayer... En tous cas, merci à vous pour tous ces conseils... Bon week-end à tous. Denis...
  9. DenisHen

    Lisps de Patrick_35

    Merci de ton aide Patrick_35, mais ça plante toujours, et je ne vois pas où : ;;Remplacement de blocs---------------------------------------------------------- (defun nombl (blo) (if (vlax-property-available-p blo 'effectivename) (vla-get-effectivename blo) (vla-get-name blo) ) ;_ Fin de if ) ;_ Fin de defun ;;; (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 (princ "\nDrapeau 01") (setq doc (vla-get-activedocument (vlax-get-acad-object))) (princ "\nDrapeau 02") (vla-startundomark doc) (princ "\nDrapeau 03") (foreach PosLstBlk LstBlk (princ "\nDrapeau 04") (and (ssget "x" (list (cons 0 "insert"))) (progn (princ "\nDrapeau 05") (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (and (wcmatch (nombl ent) (car PosLstBlk)) (vla-put-name ent (cdr PosLstBlk))) ) ;_ Fin de vlax-for (vla-delete sel) ) ;_ Fin de progn (princ "\nDrapeau 06") ) ;_ Fin de and (princ "\nDrapeau 07") ) ;_ Fin de foreach (princ "\nDrapeau 08") (vla-endundomark doc) ;;; Et AutoCAD me répond : J'ai positionné des drapeau, à l'ancienne, pour m'aider à trouver où ça coince... Mais je ne trouve pas :(
  10. DenisHen

    Lisps de Patrick_35

    Rebonjour Patrick_35, Et merci de m'aider. A ta question si ce nouveau code fonctionne, la réponse est "Non", et AutoCAD ne me dit rien... Par contre, est-ce que les blocs remplaçants doivent être définis dans le dessin courant ? Si oui, dois-je les insérer puis les effacer ensuite ? EDIT : En fait, même si le bloc est déjà défini dans le dessin, ça ne fonctionne pas. Mais je cherche...
  11. DenisHen

    Lisps de Patrick_35

    Bonjour à tous, Je tente d'adapter ce code à mes besoins, bien bien entendu, ça ne fonctionne pas... Voici le code : (defun nombl (blo) (if (vlax-property-available-p blo 'effectivename) (vla-get-effectivename blo) (vla-get-name blo) ) ;_ Fin de if ) ;_ Fin de defun ;;; (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 (vla-startundomark doc) (foreach PosLstBlk LstBlk (setq doc (vla-get-activedocument (vlax-get-acad-object))) (and (tblsearch "block" (car PosLstBlk)) (ssget "x" (list (cons 0 "insert"))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (and (wcmatch (nombl ent) (cdr PosLstBlk)) (vla-put-name ent (car PosLstBlk))) ) ;_ Fin de vlax-for (vla-delete sel) ) ;_ Fin de progn ) ;_ Fin de and ) ;_ Fin de foreach (vla-endundomark doc) Si quelqu'un a un conseil ou une astuce, je suis preneur...
  12. Merci encore (gile) pour cette explication, mais je pense que ça dépasse mon piètre niveau... Effectivement, c'est "moins lisible"... Et ça rejoint le "(car PosLstBlk)" pour la première occurrence de la paire. Mais ce code est issue d'une aide fournie aimablement sur ce forum. Je ne suis pas capable d'écrire un tel code, mais une fois "analysé", j'en comprend l'essentiel pour pouvoir le modifier à mes besoins. Merci encore... Denis...
  13. Merci (gile) pour toutes ces précisions qui, malgré que le consulte dès que j'ai une macro à faire, sont pourtant dans ton super "Introduction_a_AutoLISP.pdf"... J'avoue avoir toujours du mal avec la logique Lisp... C'est très dommage, car quand je vois ce que certains arrivent à faire... En tous cas, merci encore à vous tous... Denis...
  14. Bonjour (gile), AutoCAD me répond : Et la Console me dit :
  15. Bonjour Tramber, et merci pour ton aide. En gros, il fallait préciser que (car PosLstBlk) était une constante pour qu'il l’évalue correctement ?
  16. Eh ben voilà, merci Patrick_35 pour ton aide, ça fonctionne nickel... Je n'ai plus qu'à le faire sur tout mes blocs... Encore merci à tous...
  17. Bonjour à tous, Voilà, j’essaie de faire une macro qui change de calque certain blocs à partir d'une liste pointé. Voici mon code : ;;; Liste pointé des blocs et de leur futur calque (setq LstBlk '(("AVSIMP*" . "RES_EP") ("EAU*" . "RES_EAU") ("EDF*" . "RES_ELEC") ("EGO*" . "RES_ASS") ("GAZ*" . "RES_GAZ") ("MOB*" . "MOBILIER_URBAIN") ("PLPTT*" . "RES_TEL") ("PTT*" . "RES_TEL") ("REGARD*" . "RES_ASS") ("VEG52*" . "VEG_ARBRE") ) ) ;_ Fin de setq ;;;Début de la boucle (foreach PosLstBlk LstBlk ;;; Création du calque s'il n'existe pas (if (not (tblsearch "layer" (cdr (assoc (car PosLstBlk) LstBlk)))) (command "-calque" "n" (cdr (assoc (car PosLstBlk) LstBlk)) "") ) ;_ Fin de if ;;;Affiche le Bloc en cour et le Calque en cour (princ (strcat "\nBloc= " (car PosLstBlk))) (princ (strcat "\nCalque= " (cdr (assoc (car PosLstBlk) LstBlk)))) ;;;Vide la Sélection (setq Select nil) ;;Sélectiones les blocs puis les place dans leur calque (if (setq Select (ssget "_X" '((0 . "INSERT") (2 . (car PosLstBlk))))) (command "chprop" Select "" "ca" (cdr (assoc (car PosLstBlk) LstBlk)) "") ) ;_ Fin de progn ) ;_ Fin de foreach AutoCAD me dit : Si quelqu'un a un conseil ou une astuce, je suis preneur...
  18. Bonjour à vous, didier : non, je n'ai rien traité, c'est le dessin brut. Patrick_35 : merci pour cette précision, je fini une autre macro et je regarde ça. Merci encore pour votre aide...
  19. Bonjour à tous, didier : j'ai placé en pièce jointe un extrait de mon fichier, il y a quelques bloc renommés en "*_1" voir en "*_2", comme le bloc tout en bas nommé "EGO62_1" alors qu'il devrait porter le même nom que l'original : "EGO63". lrbd@homme : merci pour le lien, j'y vais à l'instant. Encore merci à vous. Denis...
  20. Salut Patrick_35 J'ai essayé Rbloc, le problème est que je ne sais pas où sont les "faux" bloc, donc, pour faire une sélection multiple, je me promène dans un levé topo de 5km... C'est très long... Et je ne pense pas qu'avec tous ces blocs à l'échelle 1 ça fonctionne correctement... En tous cas, merci pour ton aide...
  21. Merci à vous pour votre aide, lrdb@home : je ne pensais pas à à ce forum, j'irai demain. T'as une idée des mots clefs pour ma recherche dans ce forum ? didier : aucun problème, je te ferais ça demain. Et merci encore...
  22. Salut Hbs69, et merci de me répondre. J'ai des centaines de blocs à traiter, mais en fait, c'est pire que ça ! ! ! Microstation renomme les blocs et les REDÉFINIT ! ! ! Par exemple, un bloc "carré" (qui représente...oui, un carré), il est inséré à l'échelle 1 si il fait 1 mètre de côté,mais si il est inséré dans MicroStation à l'échelle 0.65, MicroStation le renomme en "CARRE_1" et le redéfinit pour l'insérer à l'échelle 1. Ce qui fait donc que le bloc "CARRE_1" fait 0.65m de coté ! ! ! Du grand n'importe quoi ! ! ! Du coup, c'est infaisable... Merci Bentley...
  23. Bonjour à tous, Voilà, je dois bosser sur des fichiers issus de MicroStation. Le problème est que, lors de l'enregistrement sous DWG depuis MicroStation, il multiplie les blocs de même nom en les renomment. Je m'explique, si MS trouve 4 blocs "ARBRE", il me créé 4 blocs de noms différents, comme "ARBRE" "ARBRE_1" "ARBRE_2" et "ARBRE_3", je me retrouve donc avec des centaines de blocs identiques mais avec des noms "incrémentés"... Et il le fait pour tous les blocs, bien sûr, et j'en ai des centaines ! ! Je vais essayé de comprendre RBloc pour l'adapter à mes besoins, pour faire un truc comme : (RempBloc "ARBRE" "ARBRE*"), mais c'est pas gagné, ce Lisp est coton ! ! Si quelqu'un a une astuce ou un conseil, je suis preneur...
  24. Je pense qu'il faut un T après le GetString : (setq REPONSE (getstring T "Données d'objet à sélectionner?: ")) Pour une fois que j'aide quelqu'un en Lisp ! !
  25. Salut Steven, Et merci pour ton aide, ça fonctionne nickel... Et bonne journée aussi... ;)
×
×
  • 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é