atile Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Bonjour à tous, Je poste ici, dans la rubrique suggestion de développements car je ne sais pas si c'est réalisable...Et si c'est réalisable peut être que cela intéressera quelqu'un de s'y frotter. Le contexte: J'ai accumulé, récupéré, et créé au fur des années un bon paquet de blocs. Je me suis enfin lancé dans le grand ménage rangement de cette bibliothèque. J'ai donc créée des fichiers Autocad par grande catégorie dans lesquels j'ai inséré tous mes blocs, puis j'ai traité ceux-ci avec le formidable Edit_bloc de gile, afin de les nettoyer. Mes souhaits: Je souhaiterais maintenant redéfinir le point d'insertion de ces blocs, le lisp Rins fonctionne très bien, mais il est "manuel", donc sur une énorme quantité de blocs c'est très pratique mais cela reste un peu fastidieux. Je souhaiterais de plus renommer l'ensemble des blocs insérés dans le dessin avec un Préfixe puis une numérotation incrémentale, par exemple "Arbres Hautes Tiges _ 001" Pour résumer est-il possible de:1- Redéfinir le point d'insertion pour l'ensemble des blocs, comme le point le plus bas en Y et le plus à gauche sur les X2- Renommer l'ensemble des blocs avec un préfixe plus un numérotation. Si cela est déjà possible mes excuses, j'ai pourtant farfouillé pas mal... @ bientôt.
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Salut, Voilà déjà une réponse pour le 1. Essaye dans une copie de fichier, je ne l'ai pas testé en profondeur et ne sais pas si ça répond bien à ta demande. Pour le 2, comment choisir le préfixe : le nom du fichier ou un nom entré par l'utilisateur ou le choix entre les deux ou autre chose ? (defun c:ins-minpt (/ acdoc name minpt maxpt) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for bloc (vla-get-Blocks acdoc) (setq name (vla-get-Name bloc)) (if (not (wcmatch name "`**_Space*")) (progn (setq ins (vla-insertblock (vla-get-ModelSpace acdoc) (vlax-3d-point '(0 0 0)) name 1 1 1 0 ) ) (vla-getBoundingBox ins 'minpt 'maxpt) (vla-delete ins) (vlax-for ent bloc (vla-move ent minpt (vlax-3d-point '(0 0 0))) ) ) ) ) (princ) ) [Edité le 16/10/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Salut Pour le 2, même réponse que (gile) qui m'a grillé ;) Sinon, (gile), pour ton lisp, tu peux redéfinir l'origine du bloc directement dans la table @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Sinon, (gile), pour ton lisp, tu peux redéfinir l'origine du bloc directement dans la table J'ai préféré déplacer les objet dans le bloc pour conserver l'origine en (0 0 0).Le bloc n'est inséré que pour récupérer les coordonnées du coin inférieur gauche de sa boundingbox. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Une propostion pour renommer les blocs, l'utilisateur spécifie le préfixe ou fait Entrée pour utiliser le nom de fichier. Si tu veux systématiquement utiliser les deux LISP, il vaudra mieux les regrouper en un seul pour optimiser le traitement. (defun inc-str (str / sub) (defun sub (lst) (if ( (if (cadr lst) (cons 97 (sub (cdr lst))) (list 97 97) ) (cons (1+ (car lst)) (cdr lst)) ) ) (vl-list->string (reverse (sub (reverse (vl-string->list str))))) ) (defun c:renomtout (/ acdoc old pref ind) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) ind "000" ) (if (not (setq pref (getstring T "\nEntrez le préfixe :")) ) (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname"))) ) (vlax-for bloc (vla-get-Blocks acdoc) (if (not (wcmatch (vla-get-name bloc) "`**_Space*")) (vla-put-name bloc (strcat pref "_" (setq ind (inc-str ind)))) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
atile Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 La vache les deux "maitres" font la course :)Désolé de ne pas avoir pu préciser ma question plus tôt, je préfére en effet rentrer le préfixe moi même. Je teste ça et je vous tiens au jus. Merci de tout cœur.
atile Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 La première "fonction" marche très bien.Le seul "bug" relevé pour l'instant vient de blocs eux mêmes composés de blocs, c'est donc normal, je n'avais pas fait un tri assez soigneux...Je me rends compte par contre que je ne m'étais pas forcément très bien exprimé, serait-il envisageable que le point d'insertion soit en fait:Le point d'accroche 'existant dans le dessin du bloc) le plus bas et le plus à gauche. La deuxième fonction me renvoie une erreur: Commande:RENOMTOUTEntrez le préfixe < Fichier >:; erreur: Erreur Automation Entrée incorrecte La méthode utilisée pour la charger:1-copier coller dans la ligne de commande2-je tape renomtout dans la ligne, je valide3- A l'invite je tape le préfixe ou je valide pour utiliser le nom du fichier Je n'arrive pas à faire l'étape 3... Merci encore.
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Ce que tu demandes pour le point d'insertion est beacoup plus complexe (voire impossible). Cela supposerait de comparer tous les points de toutes les entité constituant le bloc. C'est faisable pour des lignes ou des polylignes composées de segments droits, plus difficiles pour les arcs cercle et polyligne et comment déterminer le point le plus en bas à gauche d'un cercle ? Pour l'erreur avec la deuxième fonction, je pense que c ça vien de la manière dont tu as procédé (copier collé sur la lignes de commande et du fait qu'il y a 2 routines séparées par un saut de ligne qui doit être interprété comme une Entrée.Essaye de copier coller d'abord de (defun inc-str ... à ...(vl-string->list str)))))) puis de :(defun c:renomtout ...à... (princ)) ou alors tu copies colles tout dans le bloc-notes l'enregitres avec l'extension .lsp et le fais cglisser déposer dans la fenêtre d'AutoCAD. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
atile Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 Ce que tu demandes pour le point d'insertion est beacoup plus complexe (voire impossible). Cela supposerait de comparer tous les points de toutes les entité constituant le bloc. C'est faisable pour des lignes ou des polylignes composées de segments droits, plus difficiles pour les arcs cercle et polyligne et comment déterminer le point le plus en bas à gauche d'un cercle ? Ok, je comprends, peut-on envisager alors d'utiliser le point le plus bas et le centre alors? Pour l'erreur avec la deuxième fonction, je pense que c ça vien de la manière dont tu as procédé J'ai essayé les deux méthodes... Je n'y arrive pas, ça marche chez toi, je suppose?Lorsque je créée le fichier lsp, je peux l'appeler comme je veux? @ plus tard.
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Ok, je comprends, peut-on envisager alors d'utiliser le point le plus bas et le centre alors? Le problème est exactement le même. J'ai essayé les deux méthodes... Je n'y arrive pas, ça marche chez toi, je suppose?Lorsque je créée le fichier lsp, je peux l'appeler comme je veux? Oui, ça marche chez moi. Oui tu peux appeler le fichier comme tu veux. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
atile Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 J'ai bien compris qu'il n'était pas envisageable de replacer le point d'insertion sur un point variable mais spécifique du dessin. Le lisp RBL permet de recentrer le point de d'insertion du bloc, toi tu m'as permis de placer le point d'insertion an bas à gauche. Je pensais qu'il était envisageable de placer le point d'insertion au plus bas des Y et au centre du bloc. Je suis un peu lourd, je me doute, mais ce serait très apprécié ;) Pour "Renomtout" est-il possible que cela fasse appel à une fonction que je n'aurais pas sur Autocad 2007? J'ai bien enregistré ton code en un seul fichier, je voudrais rajouter à la fin une petite phrase qui précise les 2 commandes à taper, est ce que je peux mettre ça? Ou est ce que cela n'est pas comme cela que ça marche, j'ai "pompé" ça sur un lisp qui affichait les commandes à exécuter... (princ "Le lisp de gile pour les blocs chargé. Tapez inc-str pour déplacer le point d'insertion Tapez renomtout pour renommer l'ensemble des blocs")(princ) Merci encore pour le temps passé et tes explications.
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Excuse moi, je n'avais pas bien compris la demande, je pensais que tu voulais toujours le point d'insertion sur un des composant du bloc. Voilà pour le premier: (defun c:ins-minpt (/ acdoc name minpt maxpt) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for bloc (vla-get-Blocks acdoc) (setq name (vla-get-Name bloc)) (if (not (wcmatch name "`**_Space*")) (progn (setq ins (vla-insertblock (vla-get-ModelSpace acdoc) (vlax-3d-point '(0 0 0)) name 1 1 1 0 ) ) (vla-getBoundingBox ins 'minpt 'maxpt) (setq minpt (vlax-safearray->list minpt) maxpt (vlax-safearray->list maxpt) ) (vla-delete ins) (vlax-for ent bloc (vla-move ent (vlax-3d-point (list (/ (+ (car minpt) (car maxpt)) 2.) (cadr minpt) (caddr minpt) ) ) (vlax-3d-point '(0 0 0)) ) ) ) ) ) (princ) ) (princ "\nLISP correctement chargé, taper ins-minpt pour lancer la commande.") (princ) Pour le second, je l'ai testé sur 2007, pas de problème.Je te le remet ici mis enforme différemment (une seule routine) (defun c:renomtout (/ inc-str acdoc old pref ind) (vl-load-com) (defun inc-str (str / sub) (defun sub (lst) (if ( (if (cadr lst) (cons 97 (sub (cdr lst))) (list 97 97) ) (cons (1+ (car lst)) (cdr lst)) ) ) (vl-list->string (reverse (sub (reverse (vl-string->list str))))) ) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) ind "000" ) (if (not (setq pref (getstring T "\nEntrez le préfixe :")) ) (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname"))) ) (vlax-for bloc (vla-get-Blocks acdoc) (if (not (wcmatch (vla-get-name bloc) "`**_Space*")) (vla-put-name bloc (strcat pref "_" (setq ind (inc-str ind)))) ) ) (princ) ) (princ "\nLISP correctement chargé, taper renomtout pour lancer la commande.") (princ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
atile Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 Excuse moi, je n'avais pas bien compris la demande, je pensais que tu voulais toujours le point d'insertion sur un des composant du bloc. Voilà pour le premier: Pas de soucis. Merci, cela fonctionne parfaitement.Je vais conserver les deux, en fonction des séries de blocs, les deux solutions peuvent être utiles. Pour le second, je l'ai testé sur 2007, pas de problème.Je te le remet ici mis en forme différemment (une seule routine) Cela ne fonctionne toujours pas chez moi, mais sur le poste d'un collègue oui...Je regarderais ce qui peut bien causer ce dysfonctionnement... Si tu as une idée pour me mettre sur une piste... Merci encore mille fois, tu me simplifie grandement la vie d'Autocadien :) [Edité le 16/10/2007 par atile]
atile Posté(e) le 17 octobre 2007 Auteur Posté(e) le 17 octobre 2007 Hello, Bon cela marche en fait aussi très bien chez moi sur des fichiers simples avec peu de blocs. Par contre dès que je le lance sur des fichiers un peu plus costaud (avec plus de blocs quoi...) il s'emmêle les pinceaux et me mets une erreur... Je peux te faire parvenir le fichier incriminé (env. 170 ko), si tu as le temps d'y jeter un oeil. @ bientôt.
(gile) Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 Salut, tu peux m'envoyer un fichier à : gilecantel (a) wanadoo.fr Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 :calim: :calim: :calim: Le problème vient de la routine inc-str que j'ai pris dans ma bibliothèque sans vérifier si c'était bien celle là dont j'avais besoin. Eh bien non ! C'était pas la bonne... Celle là ne passe pas de "009" à "010". Donc revoilà renomtout avec la bonne routine : inc-numstr (defun c:renomtout (/ inc-str acdoc old pref ind) (vl-load-com) (defun inc-numstr (str / l) (setq l (strlen str) str (itoa (1+ (atoi str))) ) (while ( (setq str (strcat "0" str)) ) str ) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) ind "000" ) (if (not (setq pref (getstring T "\nEntrez le préfixe :")) ) (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname"))) ) (vlax-for bloc (vla-get-Blocks acdoc) (if (not (wcmatch (vla-get-name bloc) "`**_Space*")) (vla-put-name bloc (strcat pref "_" (setq ind (inc-numstr ind))) ) ) ) (princ) ) (princ "\nLISP correctement chargé, taper renomtout pour lancer la commande." ) (princ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
atile Posté(e) le 22 octobre 2007 Auteur Posté(e) le 22 octobre 2007 Super merci d'avoir pris le temps de regarder. Désolé de ne pas avoir été plus prompt à te remercier, j'étais absent en fin de semaine. Merci encore et à bientôt.
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