Aller au contenu

Substitution de blocs


Messages recommandés

Posté(e)

Bonjour,

 

J'ai un dessin qui contient des blocs identiques mais qui portent un nom différent, et donc pleins de définitions de blocs pour rien. Par exemple mes symboles d'arbres s'appelent arbre, arbre_1, arbre_2, etc.... et mes poteaux s'appellent poteau, poteau_1, poteau_2, etc...

 

Je souhaite donc substituer les blocs avec suffixe (_xx) par le bloc d'origine (arbre, poteau, etc...). J'ai essayé avec la commande blockreplace des expresstools et avec la commande substituer de covadis. Ca marche bien mais que pour un bloc à la fois, et j'ai des centaines de remplacements à faire...

 

Qui aurait eu idée sur l'automatisation de ces substiutions ?

 

Merci d'avance.

 

Cdt.

Posté(e)

Hello le Grenoblois

 

J'ai deja eu ce genre de probleme et donc j'ai resolu avec une manipulation MAP !

 

1) MAPEXPORT vers SHP (de type Ponctuel) de TOUS les blocs selectionnes (donc ceux qui sont concernes)

 

2) MAPIMPORT depuis SHP en donnant le bon Nom de bloc ...

 

Et voila c fini !!

 

lecrabe

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Et si je souhaite rester dans l'environnement Autocad sans passer par un shp ?

En fait mes blocs ont des rotations, des attributs et des échelles que je ne souhaite pas perdre.

Donc je voyais plus la chose en lisp. Si je passe par le shp je vais perdre des choses en route.

 

J'qi trouvé ca (http://forums.autodesk.com/autodesk/attachments/autodesk/247/33798/1/rblock.zip) , pas mal mais pas automatisés. Ce que je cherche c'est un truc du genre :

 

- sélectionne tous les blocs nommés ******_*

- remplace les par le bloc nommé ******

 

Merci, @+

Posté(e)

Hello

 

Tu peux envoyer (MAPEXPORT) TOUS les parametres voulus dans le SHP

et donc il faut aussi exporter la Rotation et Echelle_X !

 

Puis lors de l'Import (MAPIMPORT) les donnees attributaires peuvent "rentrer directement"

dans les attributs du bloc/symbole (a condition que Etiquette Attribut = Nom de champ du SHP)

 

Ne pas oublier 2 attributs du genre : ROTATION et SCALE

que tu vas utiliser ci-apres ...

 

Ensuite par 2 requetes successives sur le groupe de dessin, tu vas appliquer ROTATION et SCALE

a tes blocs/symboles ...

 

Bon d'accord c du pur MAP et non pas de l'AutoCAD ...

 

Que veux tu le gars du 42 essaye t'aider le gars du 38 ...

 

Bon Appetit, lecrabe

Autodesk Expert Elite Team

Posté(e)

Merci Le Crabe pour ton aide, mais je préferais rester dans l'environnement Autocad et pas me servir de MAP sur ce coup là.

 

Donc si un lispeur passe dans le coin, son aide est la bienvenue...

 

Sinon, c'est vrai que le préfère de loin le 38 au 42 ....

 

A+

Posté(e)

Hello

 

Le 42 = La diagonale du vide !

 

Oui pourquoi pas, mais en terme de vide je suis deja alle dans la Lozere (48), Correze (19), Creuse (23), etc

et donc je pense que La Loire (42 - Prefecture: St-Etienne) n'est quand meme pas si "vide" que cela !

 

Mais c SUR, le passe industriel (historique) de St-Etienne est MORT : la Siderurgie, les Mines, Manufrance, etc ...

Meme la Manufacture d'Armes de St-Etienne est "OUT" !

http://fr.wikipedia.org/wiki/Manufacture_d%27armes_de_Saint-%C3%89tienne

 

"Tout fout le camp" ...

 

Quoique un collegue est deja alle dans l'Ariege (09 - Prefecture: Foix)

et il m'avait dit que c'etait vraiment "microscopique"

 

 

 

lecrabe

Autodesk Expert Elite Team

Posté(e)

Hello le 38

 

Sinon j'ai deja resolu ce genre de probleme d'une autre facon "plus violente"

Si tes blocs/symboles se nomment par exemple : poteau_1, poteau_2, etc

et que le bon nom de bloc/symbole se nomme : poteau

 

Eventuellement tu fais AVANT par securite, un RENOMMER en mode type d'objet : BLOC

poteau*

en

zzzpoteau*

 

afin d'etre SUR d'avoir un nom de type zzzpoteauXXXXX qui est seulement un nom de bloc/symbole

 

Puis DXFOUT de tout le DWG (ou peut etre meme QUE les blocs/symboles) en texte/ascii

Une manipulation subtile avec un editeur de texte

ET tu finis par un DXFIN

et ca marche en principe !

 

lecrabe (decapodesquement votre serviteur du 42)

Autodesk Expert Elite Team

Posté(e)

Pour ma part, je ferai la méthode suivante:

 

  • Exportation de tous les "Arbre_1" dans un fichier, des "arbre_2" dans un autre fichier, etc...
    (Pour le faire simplement, tu selectionnes un "arbre_1", bouton de droite "sélection similaire" et wbloc dans un fichier.)
     
  • Ouverture de chacun des fichier, commande "renommer" "bloc" Ancien nom "Arbre_1" nouveau nom "Arbre"
    (Certains lisp du forum peuvent te permettre de faire ça rapidement pour tous les fichiers)

 

Une fois que tu as fait ça pour tous les fichiers, tu supprimes tous les blocs ayant une indexation (arbre_1, arbre_2, etc...)

 

Tu importes tous les fichiers que tu as modifier. Si le point d'insertion et les paramètres sont les même pour tes blocs, tu n'aura plus qu'un seul blocs arbres.

 

La méthode la plus rapide est d'exporter tous les blocs dans un fichiers DXF (format Ascii) et de changer les arbre_1, arbre_2, arbre_3 en arbre. Une fois enregistrer tu importes ton dxf dans un nouveau fichier avant de l'insérer dans ton dessin.

Posté(e)

Merci Dioka, mais vu le nombre de blocs à traiter et le nombre de fichiers à traiter ta méthode serait beaucoup trop longue. A raison de plusieurs centaines de définitiions de blocs x plusieurs dizaines de fichiers, c'est pas jouable avec la méthode d'export dans un fichier.

 

Je vais essayer la méthode "brute force" du DXF si pas d'autres astuces, mais j'aimerais éviter de dégrader mon DWG d'origine.

 

A+ les cadistes...

Posté(e)

Bonjour,

 

Je relance le sujet, car je suis toujours demandeur d'une astuce sans passer ni par MAP ni par le DXF.

Rbloc et Rblock ne propose pas cette fonction.

 

Cordialement

Posté(e)

Bonjour,

 

Un petit Lisp vite fait:

 

(defun c:FUSBLOCS ( / ss i el bname nbname suff )
 (setq ss (ssget "_X" '( (0 . "INSERT")(2 . "*_*") ) ))
 (setq i 0)
 (repeat (sslength ss)
   (setq el (entget (ssname ss i))
         bname (cdr (assoc 2 el))
         pos (vl-string-search "_" bname)
         nbname (substr bname 1 pos)
         suff (substr bname (+ pos 2)))
   (if (> (atoi suff) 0)
     (entmod (subst (cons 2 nbname) (cons 2 bname) el))
   )
   (setq i (+ 1 i))
 )
)

Posté(e)

Hello Bryce

 

Desole mais il y a un probleme (Teste sur AutoCAD 2009 et AutoCAD 2013) :

 

Commande: FUSBLOCS

; erreur: type d'argument incorrect: lselsetp nil

 

SVP serait il possible que tu mettes dans une simple variable Lisp

au depart de ton progr un truc du genre :

(setq nombloc "TAMPON_")

et donc ne traiter que les blocs dont le nom commence par ...

 

Ainsi on pourra adapter facilement ton progr a differents cas !

Car en effet j'ai deja eu le meme probl que Balyoa

et si on n'est pas avec un AutoCAD MAP (ou CIVIL), c chiant a resoudre !

 

Merci d'avance, lecrabe

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Merci Bryce. Mais moi aussi probleme sur un MAP2011, quand le lance le lisp il m'écrit "149" ou "10", ou autre chiffre aléatoire et ne traite rien, bizarre... Sinon je suis aussi preneur de pouvoir filtrer soit sur les premiers caractères du nom des blocs à traiter (genre T***_X), soit par sélection à l'écran.

 

Merci d'avance, bonne journée à tous.

 

Yo

Posté(e)

Bonjour,

 

Desole mais il y a un probleme (Teste sur AutoCAD 2009 et AutoCAD 2013) :

 

Commande: FUSBLOCS

; erreur: type d'argument incorrect: lselsetp nil

 

C'est simplement que la sélection est vide (aucun bloc à traiter).

 

Merci Bryce. Mais moi aussi probleme sur un MAP2011, quand le lance le lisp il m'écrit "149" ou "10", ou autre chiffre aléatoire et ne traite rien, bizarre...

 

Le chiffre en question n'est pas aléatoire, c'est le nombre de références de blocs remplacées dans le dessin. ;)

Tu es sûr qu'il ne traite rien ?

Si c'est le cas, merci de poster un dessin en exemple.

Voici une version légèrement modifiée pour que les messages soient plus clairs.

 

(defun c:FUSBLOCS ( / ss i el bname nbname suff )
 (setq ss (ssget "_X" '( (0 . "INSERT")(2 . "*_*") ) ))
 (if ss
   (progn
     (setq i 0)
     (repeat (sslength ss)
       (setq el (entget (ssname ss i))
             bname (cdr (assoc 2 el))
             pos (vl-string-search "_" bname)
             nbname (substr bname 1 pos)
             suff (substr bname (+ pos 2)))
       (if (> (atoi suff) 0)
         (entmod (subst (cons 2 nbname) (cons 2 bname) el))
       )
       (setq i (+ 1 i))
     )
     (princ (strcat "\n" (itoa (+ 1 i)) " blocs substitués."))
   )
   (princ "\nAucun bloc trouvé.")
 )
 (princ)
)

 

Pour les autres améliorations demandées, je verrai quand j'aurai le temps. ;)

Posté(e)

Bonjour et merci Bryce,

 

le lisp marche bien en fait, mais le probleme c'est que pour certains blocs il n'existait pas dans le dessin le bloc d'origine (sans suffixe), et donc il ne faisait aucun remplacement (logique ;-)

 

Il ne manque qu'un filtre de sélection (à l'écran ca suffirait) et c'est parfait.

 

Encore merci à tous pour ces échanges et votre disponibilité ;-)

 

A+

 

Yo

Posté(e)

Hello Bryce

 

Dans mon dessin Test, les blocs se nomment : C_1, C_2, C_11, C_22, C_111, C_112, etc

 

Que fais tu exactement dans ton Progr ?

Je pensais que tu rassemblais "TOUT" sur le bloc nomme "C_1" par exemple ?

Mais je pense que tu raisonnes autrement ...

 

C pour ca que j'aurais bien aime 2 preparations de variables

(setq ancienbloc "TAMPON_") c en fait le prefixe a rechercher TAMPON_???????

(setq nouveaubloc "JOLITAMPON") c le nouveau nom de bloc que tu substitues

 

Vois tu ce que je veux dire ?

 

lecrabe

Autodesk Expert Elite Team

Posté(e)

En fait son lisp cherche les blocs "C_1, C_2, C_11, C_22, C_111, C_112, etc..." et les substituent par le bloc "C" si il est présent dans le dessin. Mais j'ai des blocs comportant un suffixe que je ne veux pas substituer d'où la demande de filtre sur le préfixe du bloc ou sur une sélection à l'écran (qui doit suffire si avant on lance un filter sur le nom des blocs à traiter ;-)

 

A+

Posté(e)

Hello

 

OUI je viens de voir ca !

 

Merci a notre charmant Pingouin du 38 qui apporte la lumiere dans le "Vide" du 42 ...

 

lecrabe

Autodesk Expert Elite Team

Posté(e)

Salut

 

Avec Rbloc, tu peux choisir plusieurs blocs de noms différents (sélection écran) que tu peux remplacer par un seul.

Si je pousse le bouchon, il est tout à fait possible avec Rbloc de remplacer tous les blocs d'un dessin pas un seul type de bloc.

 

@+

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)

Hello

 

Un truc du genre :

 

;; (setq ss (ssget "_X" '( (0 . "INSERT")(2 . "*_*") ) ))

 

devient

 

(setq ss (ssget '( (0 . "INSERT")(2 . "*_*") ) ))

 

 

lecrabe

 

PS: Sorry j'ai ete devance par Super_BRYCE

Autodesk Expert Elite Team

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é