Aller au contenu

Remplacement blocs avec excel


Messages recommandés

Posté(e)

Bonjour tout le monde.

 

Existe il un moyen de remplacer tout une série de plusieurs blocs par d'autre bloc en utilisant par exemple excel.

J'ai un plan avec tout une série de blocs différent que je dois remplacer par d'autres blocs, il y a bien des lisp ou les express tools pour remplacer une série de blocs du même nom par un autre bloc mais si je dois faire l'action pour chaque type de bloc ça va être très long.

L'idéal serait d'utiliser le même principe que pour les exportations d'attributs, d'avoir une colonne qui reprend les blocs insérés dans le dessin et remplacer par ceux d'une deuxième colonnes.

Posté(e)

Bonjour,

 

Tu peux essayer avec le Lisp ci-dessous, que j'avais écrit en réponse à une autre demande sur le forum.

Ça me semble correspondre à ce que tu as besoin de faire.

Il nécessite un fichier txt contenant sur chaque ligne le nom d'un bloc à remplacer et le nom du bloc de remplacement, séparés par un point-virgule.

ancienbloc;nouveaubloc
old;new
aaa;bbb
ccc;ddd

Tu pourras créer ce fichier depuis Excel assez facilement je pense.

Évidemment, les nouveaux blocs devront soit exister dans le dessin, soit se trouver dans un chemin de recherche d'AutoCAD.

 

(defun c:SWAPBLOCKS ( / acdoc ms *error* plist sep f l flst i ob nb ss vlnb )

 ; Caractère de séparation entre l'ancien bloc et le nouveau dans le fichier texte:
 (setq sep ";")

 ; Liste des propriétés de l'ancien bloc à appliquer au bloc de remplacement
 ; (l'échelle en X, Y et Z et l'angle de rotation sont récupérés d'office):
 (setq plist '("Layer" "TrueColor" "Linetype" "LinetypeScale" "LineWeight"))

 (vl-load-com)
 (setq acdoc (vla-get-activedocument (vlax-get-acad-object))
       ms (vla-get-modelspace acdoc))

 (defun *error* (msg)
   (and msg
     (or
       (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
       (princ (strcat "\nErreur : " msg))
     )
   )
   (if ss (setq ss nil))
   (vla-endundomark acdoc)
   (princ)
 )

 (vla-startundomark acdoc)
 
 (setq flst '()
       f (getfiled "" "" "txt;csv;prn" 4))
 (if (and f (setq f (open f "r")))
   (progn
     (while (setq l (read-line f))
       (setq flst (cons l flst))
     )
     (close f)
     (setq flst (reverse flst))
   )
 )
 
 (foreach l flst
   (setq i (vl-string-search sep l)
         ob (substr l 1 i)
         nb (substr l (+ i 2)))
   (princ (strcat "\n\nRemplacement de " ob " par " nb ":"))
   (setq ss (ssget "_X" (list (cons 0 "INSERT")(cons 2 ob)(cons 410 "Model") )))
   (if ss
     (if (or (tblsearch "BLOCK" nb) (setq nb (findfile (strcat nb ".dwg"))))
       (progn
         (setq i 0)
         (repeat (sslength ss)
           (setq ob (vlax-ename->vla-object (ssname ss i)))
           (setq vlnb (vla-insertblock ms
               (vla-get-InsertionPoint ob)
               nb
               (vla-get-XScaleFactor ob)
               (vla-get-YScaleFactor ob)
               (vla-get-ZScaleFactor ob)
               (vla-get-Rotation ob)))
           (foreach p plist
             (eval (read (strcat "(vla-put-" p " vlnb (vla-get-" p " ob))")))
           )
           (vla-delete ob)
           (setq i (+ 1 i))
         );repeat
         (setq ss nil)
         (princ (strcat "\n" (itoa i) " blocs remplacés."))
       );progn
       (princ (strcat "\nBloc " nb " non trouvé, remplacement non effectué."))
     );if
     (princ (strcat "\nAucun bloc " ob " à remplacer."))
   );if ss
 );foreach
 (*error* nil)
)

Posté(e)

Oups c'était une erreur de ma part j'ai dû mal copier le lisp.

 

Tout fonctionne parfaitement et c'est exactement ce d'ont j'avais besoin.

 

Bryce t'est un chef et je te remercie beaucoup

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é