Aller au contenu

Ouvrir le plan de base d'un bloc sélectionné sur un plan d'ensemble


Messages recommandés

Posté(e)

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.txt

Open-BL.LSP

NewOpen-BL.LSP

Posté(e)

Bonjour,

Merci ,j'ai modifié List en FolderList

La 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.

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour,

J'ai essayé ce lisp sans succès.

Poutant il fonctionne si

 

1) S'il trouve le fichier H:/test.txt

2) Si on sélectionne un bloc

3) 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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 weekend

Francine

Posté(e)

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 weekend

Francine

Par 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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") )
)

Posté(e)

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 Autocad

Un (vla-item table élément) nom permet de savoir si l'élément existe dans la table

Donc 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é