francinez Posté(e) le 6 novembre 2014 Posté(e) le 6 novembre 2014 Bounjour,Sur un forum j'ai pu récupérer un lisp me permettant d'ouvrir un bloc en donnant simplement un nom d'un bloc ou dessin qui est sauvegardé dans un chemin spécifique. Ces chemins spécifiques sont indiqués dans un fichier txt. J'ai essayé ce lisp "Open-BL" et ca fonctionne, mais j'aimerai pouvoir récupérer le nom d'un bloc sélectionné sur un plan ayant beaucoup de blocs et ouvrir ce dernier. J'ai modifié le lisp et donné un nouveau nom "NewOpen-BL" mais ca ne fonctionne pas. J'ai juste une remarque qu'il ne trouve pas le bloc!!!!Pouvez vous m'aider.test.txtOpen-BL.LSPNewOpen-BL.LSP
didier Posté(e) le 6 novembre 2014 Posté(e) le 6 novembre 2014 Coucou je ne vois pas l'utilité d'un tel programme car pour ouvrir un bloc il suffit de lancer refedit, non ? une première chose me choque dans le lisp c'est d'utiliser le mot réservé LIST pour déclarer une variable c'est pas bien propre tout ça... Éternel débutant... Mon site perso : Programmer dans AutoCAD
francinez Posté(e) le 6 novembre 2014 Auteur Posté(e) le 6 novembre 2014 Bonjour,Merci ,j'ai modifié List en FolderListLa raison de ce lisp est que j'ai un plan avec beaucoup de blocs aux noms compliqués, ces blocs sont enregistrés dans des chemins spécifique au chantier.Actuellement pour ouvrir ces blocs je copie le nom avec crtl copie puis je l'insère dans la fenetre ouvrir.Ex d'un nom de bloc: Element-H-Left-Flat-SingleGlazedPanel-Glass_Drainage.Je pourrai utilisé Xref mais je ne travaille pas en réseau et je dois garder les modifications intermédiaire.
francinez Posté(e) le 6 novembre 2014 Auteur Posté(e) le 6 novembre 2014 Refedit n'ouvre que le bloc inséré sur le dessin, moi j'aimerai ouvrir la base du bloc sauvegardé à part!!!
didier Posté(e) le 6 novembre 2014 Posté(e) le 6 novembre 2014 Coucou content que tu sois parvenu au résultat souhaité.pour être parfaitement exact dans ton vocabulaire il eût fallu utiliser WBLOC et non BLOC tout est bien qui finit bien sur CadXP. Éternel débutant... Mon site perso : Programmer dans AutoCAD
francinez Posté(e) le 6 novembre 2014 Auteur Posté(e) le 6 novembre 2014 Le lisp ne fonctionne toujours pas, mais la réponse je l'ai eu d'un membre de CADtutor.
Patrick_35 Posté(e) le 7 novembre 2014 Posté(e) le 7 novembre 2014 Le lisp ne fonctionne toujours pas, mais la réponse je l'ai eu d'un membre de CADtutor.Salut Ce serait sympa de donner la réponse. Bon, je t'ai quand même fait quelque chose(defun c:newopen-bl(/ bloc chemin fichier folderlist ent lecture nombl path pointer) (defun nombl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) (setq pointer "H:" fichier "/test.txt" ) (and (setq folderlist (findfile (strcat pointer fichier))) (setq ent (entsel "\nSelect Block Entity: ")) (setq ent (vlax-ename->vla-object (car ent))) (eq (vla-get-objectname ent) "AcDbBlockReference") (progn (setq bloc (nombl ent) chemin "" lecture (open folderlist "r") ) (while (and chemin (not (setq path (findfile (strcat chemin bloc ".dwg")))) ) (setq chemin (read-line lecture)) ) (close lecture) (and path (if (eq (getvar "sdi") 0) (vla-activate (vla-open (vla-get-documents (vlax-get-acad-object)) path)) (if (eq (getvar "dbmod") "0") (vl-cmdf "_.open" path) (vl-cmdf "_.open" "_yes" path) ; ATTENTION, FERME LE DESSIN SANS SAUVEGARDE ) ) ) ) ) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
francinez Posté(e) le 7 novembre 2014 Auteur Posté(e) le 7 novembre 2014 Bonjour,J'ai essayé ce lisp sans succès. Ci joint le lien du forum qui m'a aidé, ainsi que le lisp.http://www.cadtutor.net/forum/showthread.php?89543-Autocad-open-source-drawing-of-selected-bloc&p=613126#post613126
Patrick_35 Posté(e) le 7 novembre 2014 Posté(e) le 7 novembre 2014 Bonjour,J'ai essayé ce lisp sans succès.Poutant il fonctionne si 1) S'il trouve le fichier H:/test.txt2) Si on sélectionne un bloc3) Si le fichier est trouvé dans les chemins de recherches ou dans les chemins indiqués dans le fichier H:/test.txt J'ai quand même testé avant de le publier @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
francinez Posté(e) le 7 novembre 2014 Auteur Posté(e) le 7 novembre 2014 Rebonjour,J'ai trouvé, je n'ai meme plus besoin du fichier txt.Dans le même lisp j'ai 2 routines, une pour ouvrir le bloc et une pour réinserer le bloc. (defun partsearch (n /) (cond ((findfile n)) ;;; first search the dir's in AutoCAD's "env" variable, then search the additional places listed below: ((findfile (strcat "H:/bloc/profile/" n))) ;;;<--- this is an example path ((findfile (strcat "H:/bloc/gomme/" n)));;;<--- this is another example path ;;; etc, etc. List as many block folder ;;; paths as you need, following the patterns (t (progn (prompt (strcat "** PartSearch Error ** Required file (" n ") could not be found.")) (terpri) ) ) ) );defun ;;; ----------- Open source drawing of selected Block-------------- (defun c:OpenBL ( / cmdecho regen n bpath) (setq cmdecho (getvar "cmdecho")) (setq regen (getvar "regenmode")) (setvar "cmdecho" 0) (setvar "regenmode" 0) (setq ent (car (entsel "\nSelect Block Entity: "))) (if (eq (cdr (assoc 0 (entget ent))) "INSERT") (progn (setq BLKN (vla-get-effectivename (vlax-ename->vla-object ent))) ) ) (setq bpath (partsearch (strcat blkn ".dwg"))) (if bpath (if (= 0 (getvar "SDI")) (vla-activate (vla-open (vla-get-documents (vlax-get-acad-object)) bpath)) (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "(command \"_.open\")\n" bpath "\n") ) ) ) (setvar "cmdecho" cmdecho) (setvar "regenmode" 1) (princ) ); close defun (princ) ;;; ----------- Insert & rededine Block -------------- (defun c:ReInsertBL ( / cmdecho regen n bpath) (setq cmdecho (getvar "cmdecho")) (setq regen (getvar "regenmode")) (setvar "cmdecho" 0) (setvar "regenmode" 0) (setq ent (car (entsel "\nSelect Block Entity: "))) (if (eq (cdr (assoc 0 (entget ent))) "INSERT") (progn (setq BLKN (vla-get-effectivename (vlax-ename->vla-object ent))) ) ) (setq bpath (partsearch (strcat blkn ".dwg"))) (if bpath (vl-cmdf "insert" (strcat blkn "=" bpath) ) (command) ) (setvar "cmdecho" cmdecho) (setvar "regenmode" 1) (princ) ); close defun (princ) Juste une question, dans la routine ou j'ouvre le bloc, si le bloc est déjà ouvert le programme ne me dit pas qu'il est déjà ouvert et l'ouvre en Readonly. Y a t-il un moyen de résoudre cela...Encore merci et bon weekendFrancine
Patrick_35 Posté(e) le 7 novembre 2014 Posté(e) le 7 novembre 2014 Juste une question, dans la routine ou j'ouvre le bloc, si le bloc est déjà ouvert le programme ne me dit pas qu'il est déjà ouvert et l'ouvre en Readonly. Y a t-il un moyen de résoudre cela...Encore merci et bon weekendFrancinePar exemple avec Dessin2.dwg(or (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-documents (vlax-get-acad-object)) "Dessin2.dwg"))) (vla-open (vla-get-documents (vlax-get-acad-object)) "Dessin2.dwg") ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
francinez Posté(e) le 7 novembre 2014 Auteur Posté(e) le 7 novembre 2014 Je n'ai pas compris comment ceci pourrait résoudre mon problème, comment dois-je l'insérer dans le lisp? (if (= 0 (getvar "SDI")) (vla-activate (vla-open (vla-get-documents (vlax-get-acad-object)) bpath)) (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "(command \"_.open\")\n" bpath "\n") ) )
Patrick_35 Posté(e) le 11 novembre 2014 Posté(e) le 11 novembre 2014 Salut Plutôt que de t'indiquer où le mettre, je vais t'expliquer la logique (vla-get-documents (vlax-get-acad-object)) permet d'avoir la liste des documents ouverts dans AutocadUn (vla-item table élément) nom permet de savoir si l'élément existe dans la tableDonc un (vla-item (vla-get-documents (vlax-get-acad-object)) "Dessin2.dwg") permet de savoir si le "Dessin2.dwg" est ouvert dans Autocad.Si ce n'est pas le cas, j'ai un message d'erreur et le lisp s'arrête. Donc à moi de la gérer grâce à vl-catch-all-error et pour savoir si c'est une erreur, avec vl-catch-all-error-p Donc, (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-documents (vlax-get-acad-object)) "Dessin2.dwg"))) veut dire si j'ai une erreur en regardant si le "dessin2.dwg" est ouvert. @+ 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 11 novembre 2014 Posté(e) le 11 novembre 2014 Salut, Plusieurs fonctions vla-* génèrent une erreur là où des fonctions LISP auraient plutôt retoruné nil.L'utilisation de vl-catch-all-apply permet au code de capturer ces erreurs et de les traiter d'une manière plus 'LISPienne'. On peut implémenter ce processus dans une fonction générique (gc:Try ci-dessous) qui évalue une expression dans un bloc vl-catch-all-apply et retourne le résultat de l'évaluation ou nil en cas d'erreur. ;; gc:Try ;; Retourne le résultat de l'évaluation d'une expression ou nil en cas d'erreur. ;; ;; Argument : ;; expr : l'expression à évaluer. (defun gc:Try (expr / result) (vl-catch-all-apply (function (lambda () (setq result (eval expr))))) result )Cette fonction peut ensuite être appelée par des fonctions plus spécifiques pour rendre des fonctions vla-* (comme vla-Item, vla-ObjectIdToObject, vla-HandleToObject, ...) plus conformes à ce qu'on attend généralement d'une fonction LISP. ;; gc:GetItem (gile) ;; Retourne le vla-object de l'item s'il est présent dans la collection (ou nil sinon) ;; ;; Arguments ;; col : la collection (vla-object) ;; name : le nom de l'objet (string) ou son indice (entier) (defun gc:GetItem (col name / obj) (gc:Try '(vla-item col name)) ) ;; gc:ObjectIdToObject ;; Retourne un objet (vl-object) d'après son 'ObjectId' (ou nil si l'objet effacé) ;; Arguments ;; doc : le document auquel appartient l'objet (vla-object) ;; id : le 'handle' de l'objet (string) (defun gc:ObjectIdToObject (doc id / obj) (gc:Try '(vla-ObjectIdToObject doc id)) ) ;; gc:HandleToObject ;; Retourne un objet (vl-object) d'après son 'handle' (ou nil si l'objet effacé) ;; Arguments ;; doc : le document auquel appartient l'objet (vla-object) ;; handle : le 'handle' de l'objet (string) (defun gc:HandleToObject (doc handle / obj) (gc:Try '(vla-HandleToObject doc handle)) ) Ou, dans le cas présent, si on veut tester si un fichier est ouvert (et avoir un retour de type booléen : T ou nil) :(defun IsOpen (docName) (not (null (gc:try '(vla-Item (vla-get-Documents (vlax-get-acad-object)) docName) ) ) ) ) (isOpen "Dessin2.dwg") retournera T si "Dessin2.dwg" est ouvert, nil sinon. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
francinez Posté(e) le 13 novembre 2014 Auteur Posté(e) le 13 novembre 2014 Bonjour, Et voilà j'ai à nouveau recu la réponse d'un autre forum.... trop bien :(rires forts):
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