Aller au contenu

remplacement intelligent de blocs


Messages recommandés

Invité ingoenius
Posté(e)

j'ai 2 biblioteques de blocs

 

serie H30D

H30D-C013-3D, H30D-L100-3D, H30D-L200-3D,.......

 

seria H30V

H30V-C013-3D, H30V-L100-3D, H30V-L200-3D,......

 

maintenant je voudrait avec un lisp remplacer tous les blocs dans le dessin

 

correspondants dans la serie H30D avec les H30V

 

donc le prefix du nom du bloc change mais le reste est correspondant , je sais pas

 

comment mi prendre pour la routine

merci de votre aide ;-)

 

 

Posté(e)

Voici une fonction magique qui permet de modifier un peu tout ce qu'on veux d'une entitée:

 

(defun apply-to-select (var func select)
 (if (= 'pickset (type select))
    (repeat (setq n (sslength select))
    (setq entity (ssname select (setq n (1- n))))
	(entmod
	   (subst
	      (cons var (apply func (list (cdr (assoc var (entget entity))))))
		  (assoc var (entget entity))
		  (entget entity))))))

 

que tu peux utiliser comme suit:

(apply-to-select 2 '(lambda (x) (vl-string-subst "H30V" "H30D" x)) (ssget))

 

PS: Le code peut bien-sûr être optimisé,,, je t'en laisse le soin ;-)

 

 

[Edité le 11/4/2008 par Carbo]

Posté(e)

Salut,

 

Si tes blocs ne contiennent pas d'attributs dont tu veux conserver les valeurs et qu'il sont dans un répertoire du chemin de recherche, tu peux utiliser la méthode :

 

(command "_insert" "H30D-C013-3D=H30V-C013-3D.dwg" '(0 0) 1 1 0)

(command "_erase" "_last" "")

 

Pour appliquer cette méthode à tous les blocs de la collection :

 

EDIT : code modifié suite à la remarque pertinente de Carbo.

 

(defun c:test (/ blk name)
 (while (setq blk (tblnext "BLOCK" (not blk)))
   (setq name (cdr (assoc 2 blk)))
   (if	(wcmatch name "H30D*")
     (command "_insert"
       (strcat name "=" (strcat "H30V" (substr name 5) ".dwg"))
       '(0 0 0)
       1
       1
       0
       "_erase"
       "_last"
       ""
       "_rename"
       "_block"
       name
       (strcat (substr name 1 1)  "2")
     )
   )
 )
 (princ)
) 

 

[Edité le 11/4/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bien vu Carbo,

 

J'ai posté un peu vite sans tester.

 

Donc si les blocs H30V* sont des fichiers dans un répertoire du chemin de recherche et qu'ils n'appartiennent pas à la collection du dessin (por pouvoir utiliser la commande renommer), on peut utiliser le LISP (modifié) donné plus haut.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité ingoenius
Posté(e)

merci a vous tous ;-)

ca commence a fonctionner, mais je doit adapter certains blocs pour le rendre compatibles , mais la routine fonctionne

 

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é