Bred Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Salut,Suite à mes derniers sujets concernant un lisp de Remplacement de bloc, et de la proposition de (gile), quelque chose m'echappe :Ce lisp : (defun Replace_Bloc (/ bloc_sel obj Group_bloc_sel Quest index bloc_R) (princ "\n------------------------------\n Sélection du Bloc à Remplacer:") (while (= bloc_sel nil) (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))) (setq obj (vlax-ename->vla-object (ssname bloc_sel 0))) ; (vla-Highlight obj 1) ;;;surbrillance (initget "Oui Non") (setq Quest (getkword "\n Choix Multiple (Oui/Non)? ")) (if (= Quest "Oui") (progn (setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0)))))) (ssadd (ssname bloc_sel 0) Group_bloc_sel) (setq bloc_sel Group_bloc_sel))) (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : ")) (if (= bloc_R "") (progn (while (= bloc_R "") (setq bloc_R (ssget "_:S:E" '((0 . "INSERT"))))) (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0))))))) (vla-Highlight obj 0) ;;;fin de surbrillance (setq index 0) (repeat (sslength bloc_sel) (setq obj (vlax-ename->vla-object (ssname bloc_sel index))) (vla-put-layer (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vla-get-InsertionPoint obj) (findfile (strcat bloc_R ".dwg" )) (vla-get-XScaleFactor obj) (vla-get-YScaleFactor obj) (vla-get-ZScaleFactor obj) (vla-get-rotation obj)) (vla-get-layer obj)) (vla-delete obj) (setq index (1+ index))) (if (> (sslength bloc_sel) 1) (princ (strcat "\n ---------------------------------- \n" " "(rtos (sslength bloc_sel)) " objets remplacés.")) (princ (strcat "\n ---------------------------------- \n" " "(rtos (sslength bloc_sel)) " objet remplacé."))) (prin1) )... ne fonctionne que pour les wblocs...pourtant, quand je fais un (vlax-dump-object obj) entre un bloc et un wbloc, je ne vois pas de différence.... merci de vos lumières.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
BIM G CO Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Faire un Wbloc c'est de créer un fichier externe (DWG) d'un bloc nommé, d'une sélection ou même d'un dessin complet.Pour réinsérer ce fichier ainsi créé, on peut l'inséré en bloc (Menu Insertion Bloc) ou en Référence externe. Wbloc n'est donc pas une entité mais une commande permettant de créer des fichiers à partir du plan en cours. Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
Bred Posté(e) le 21 juillet 2006 Auteur Posté(e) le 21 juillet 2006 Heu... merci Maximilien... mais peut-être que je n'utilisa pas le bon vocabulaire.... :casstet: un "Wbloc" est pour moi un bloc créé avec la commande "wbloc"un "bloc" est pour moi un bloc créé avec la commande "bloc" ... et donc ma question est : dans le traitement en lisp écrit en sujet, quel est la "différence lisp" entre un bloc et un wbloc qui fait que ce lisp ne fonctionne pas pour les "blocs" ???? [Edité le 21/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Salut, je t'avais donné une piste ici. Il s'agit, à la spécification du nom du bloc remplaçant, si celui-ci est entré au clavier, de vérifier si le bloc est déjà dans la collection. Si le bloc n'y est pas (c'est un wbloc = fichier .dwg), il faut spécifier le chemin vers le fichier. Une fois ce wbloc inséré dans le dessin, il sera dans la collection et on pourra l'insérer en spécifiant uniquement son nom. (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : ")) (if (= bloc_R "") ;; Si sélection à l'écran (le bloc est forcément dans la collection) : (progn (while (= bloc_R "") (setq bloc_R (ssget "_:S:E" '((0 . "INSERT")))) ) (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0))))) ) ;; Si un nom a été entré au clavier : (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) bloc_R ) ) ) ;; Si le bloc n'est pas trouvé dans la collection : (setq bloc_R (findfile (strcat bloc_R ".dwg" ))) ) ) Par sécurité, il vaut mieux faire en suite : (if bloc_R ...) au cas ou (findfile ...) n'aurait pas trouvé le fichier, bloc_R serait nil. [Edité le 21/7/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 (if (vl-catch-all-error-p(vl-catch-all-apply'vla-item(list (vla-get-Blocks(vla-get-ActiveDocument (vlax-get-acad-object)))bloc_R))) SalutUn peu plus simple avec un (tblsearch "block" bloc_R) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 21 juillet 2006 Auteur Posté(e) le 21 juillet 2006 Heu.... en fait je crois mieux comprendre maintenant... et c'est pour ça que je n'avais pas compris la proposition que tu cites...! :P En effet, il est logique que le lisp ne fonctionne pas, vu que je fais un (findfile (strcat bloc_R ".dwg" ) quoi qu'il arrive... et comme un bloc (simple) n'a pas de chemin, le lisp se met à rigoler et se moque de moi en m'envoyant une erreur !!!.... ... pffff.... :exclam: merci edit.---------------et merci à Patrick, qui avait cité son exemple aussi... je n'avais vraiment rien compris..... [Edité le 21/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Un peu plus simple avec un (tblsearch "block" bloc_R) Certes, mais ne doit-on pas se mettre au vlisp ? ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Oui, mais je suis partisant du plus clair et du plus court possible :) @+ 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 21 juillet 2006 Posté(e) le 21 juillet 2006 Moi aussi, mais Bred voulais connaître un peut mieux le VisualLISP, c'était "pédagogique". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Tu as raison sur le principe, mais je ne pense pas que Bred (excuse-moi Bred) saisisse toutes les subtilités Il faut déjà comprendre qu'un (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) Bloc_R) retourne en vla le bloc de la table du document actif (donc le dessin courant) s'il existeEnsuite comprendre le vl-catch-all-apply ainsi que sa syntaxePour ce qui est du vl-catch-all-error-p, je pense que c'est plus facile ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 21 juillet 2006 Auteur Posté(e) le 21 juillet 2006 mais je ne pense pas que Bred (excuse-moi Bred) saisisse toutes les subtilités ... en fait je comprend de mieux en mieux vu que (gile) m'explique à chaque fois sa logique, et en faisant des tests sur ce qu'il me propose (une centaines de tests par proposition...) et en lisant les réaction dans la console, je comprend ce qu'il se passe au bout d'un moment... mais il est vrais que je met de côté pas mal de chose en me disant que j'y reviendrais plus tard... et je me contente d'une version autolisp... d'ailleurs, je comprends quand (gile) dit qu'il n'aime pas trop mélanger les genres (vl et auto), mais est-ce véritablement justifié au point de vue programmation ???... si c'est plus "rapide", pourquoi s'en priver ??? merci dans tout les cas à vous deux. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Pour ce qu'il en est du "mélange des genres", je n'ai jamais (durant ma courte vie de lispeur) remarqué le moindre dysfonctionnement, mais je ne peux oublier les quelques messages de Serge Camiré (développeur émérite) disant qu'il est préférable de ne pas mélanger les (command ...) avec les (entmake ...) (entmod ...) ou les (vla-add ...), voir ce sujet Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité Patrick Posté(e) le 21 juillet 2006 Posté(e) le 21 juillet 2006 Cette discussion est l'occasion de rappeler l'importance de la langue et de la terminologie. Familièrement, on dit "créer un Wbloc", il a été dit pourquoi cette expression est impropre, tout simplement parce qu'un objet Wbloc n'existe pas... Il existe dans AutoCAD trois notions liées aux blocs: les blocs internes, les références (ou instances) de blocs et les fichiers AutoCAD. Les blocs internes sont aussi appelés "définitions de blocs", ils sont stockés dans la table des blocs (pour partie), interne à un dessin. Les références de blocs sont les blocs "visibles" si l'on peut dire, c'est un exemplaire d'une définition de bloc sur lequel on peut cliquer. Les fichiers AutoCAD sont ce que l'on appelle familièrement des "Wbloc", mais ce sont tout simplement des fichiers dessins.
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