Aller au contenu

Remplacement de blocs


Messages recommandés

Posté(e)

Bonjour,

 

J'ai un script qui me permet de passer mes dessins d'une norme antérieure à une norme actuelle. Je me sert de la commande _blockreplace pour remplacer l'ancienne symbologie par la nouvelle en ayant un dessin qui contient tous les éléments de l'ancienne et de la nouvelle norme J'utilise ensuite le convertisseur de calque pour passer les anciens contenus vers leur(s) nouveaux calques. Jusque là tout va bien.

 

Voici qu'on me demande de normaliser les anciennes données terrain qui ne sont pas structurées de la même façon. Exemple: Bloc B1 est actuellement sur plusieurs calques C1, C2, C3. Les blocs B1 sur le calque C1 doivent être remplacé par le bloc Sym12 et être déplacés sur le calque LEVE_256. Les blocs B1 sur le calque C2 doivent être remplacés par le bloc Sym44 et être déplacés sur le calque LEVE_32 et ainsi de suite.

 

Comment faire pour intégrer ces changements à l'intérieur de mon script?

 

Karmélie

Posté(e)

Bonjour,

 

Et un lisp qui ferait le travail ça pourrait ressembler à quoi? Je sais utiliser les lisp, mais je suis nulle pour les créer.

Posté(e)

Bonjour,

 

Pour l'instant je ne sais pas non plus à quoi il pourrait ressembler... :P

 

En premier lieu je pense que tu devrais établir un cahier des charges, une liste précise de toutes les opérations à effectuer sur les fichiers, en joignant un dessin exemple.

Ça sera plus facile de t'aider ensuite. ;)

 

 

Posté(e)

Salut

 

Une piste de recherche pour commencer

Une liste contenant les blocs d'origine avec leurs calques

Une liste contenant les blocs à remplacer avec leurs calques

Une boucle qui sélectionne tous les blocs et qui remplace les blocs de la 1ere liste avec ceux de la seconde sur les calques de la 1ere liste avec les calques de la seconde

A vos claviers

 

@+

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)

J'ai un lisp qui fonctionnait jadis avec une liste de ce genre avec en plus un facteur échelle. Je n'arrive pas à le faire fonctionner. Je pourrais vous faire parvenir le lsp, la liste et un dessin exemple?

Posté(e)

Salut,

 

Il semble que tu n'aies pas bien compris, il faudrait que tu fournisses un fichier texte (txt, csv ou autre) où figurent, pour chaque bloc, le nom de l'ancien bloc, son calque, le nom du bloc remplaçant, son calque. Ces données étant séparées par le même séparateur (virgule, point-virgule, espace, peu importe).

Le LISP pourrait lire ce fichier et faire le remplacement de bloc et de calque pour chaque ligne.

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

Posté(e)

Dans le fichier .zip il y a Blocs_avant_apres.dtb qui correspond à

bloc_avant,Calque_avant,bloc_apres_calque,apres,facteur_echelle

 

Ça ne suffit pas?

Posté(e)

OK,

 

Il reste un problème avec les attributs :

Par exemple, le bloc 0 a 3 attributs : NUMB ELEV DESC et il faut le remplacer par le bloc POINT qui a aussi 3 attributs, mais avec les mêmes étiquettes : ELEV POINT DESC

 

Faut-il mettre la valeur de NUMB dans POINT ?

Qu'en est-il pour les autres blocs avec attributs ?

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

Posté(e)

Je ferai un autre bloc "point_0" avec identique à 0 et je remplacerai la ligne

0,10,0,c-e-arp-pnt-rel,1.0

 

Idéalement il faudrait conserver les attributs des blocs mais si pour ça il faut refaire tous les blocs et leurs ajouter des attributs, on oublie ça. Le bloc Point_0 avec attributs fera l'affaire.

 

 

Dans la liste, est-ce que je pourrai remplacer le calque_avant par un * (tous les calques) ?

Posté(e)

Re,

 

Il va falloir beaucoup de rigueur quand tu feras ta liste. Le LISP ne fait qu'exécuter automatiquement des taches.

Par exemple, dans le fichier que tu donnes l'ancien calque est avant le nom de l'ancien bloc, certains noms de nouveau calque n'existent pas.

 

Tout ce que je peux faire, c'est passer les lignes qui génèrent une erreur et retourner un message en ligne de commande.

 

Dans la liste, est-ce que je pourrai remplacer le calque_avant par un * (tous les calques) ?

Oui.

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

Posté(e)

Tu peux essayer ça.

Ça devrait fonctionner avec une liste du type :

ancien_bloc,ancien_calque,nouveau_bloc,nouveau_calque,echelle

 

(defun c:karmelie (/ str2lst replace ms filename file line nblst)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (setq ms (vla-get-ModelSpace *acdoc*))

 (defun str2lst (str sep / pos)
   (if	(setq pos (vl-string-search sep str))
     (cons (substr str 1 pos)
    (str2lst (substr str (+ (strlen sep) pos 1)) sep)
     )
     (list str)
   )
 )

 (defun replace (ob ol nb nl sc / ss new atts)
   (if	(ssget "_X" (list '(0 . "INSERT") '(410 . "Model") (cons 2 ob) (cons 8 ol)))
     (progn
(vlax-for old (setq ss (vla-get-ActiveSelectionSet *acdoc*))
  (setq	new
	 (vla-InsertBlock ms (vla-get-InsertionPoint old) nb sc sc sc (vla-get-Rotation old))
  )
  (vla-put-Layer new nl)
  (if (setq atts (mapcar '(lambda (x) (cons (vla-get-TagString x) (vla-get-TextString x)))
			 (vlax-invoke old 'GetAttributes)
		 )
      )
      (foreach att (vlax-invoke new 'GetAttributes)
	(vla-put-TextString att (cdr (assoc (vla-get-TagString att) atts)))
      )
  )
  (vla-Delete old)
)
(vla-Delete ss)
     )
   )
 )

 (if (setq filename (getfiled "Remplace bloc" "" "dtb" 0))
   (progn
     (setq file (open filename "r"))
     (while (setq line (read-line file))
(setq rep (vl-catch-all-apply 'replace (str2lst line ",")))
(if (vl-catch-all-error-p rep)
  (princ (strcat
	   "\nErreur avec la ligne: "
	   line
	   "\n"
	   (vl-catch-all-error-message rep)
	 )
  )
)
     )
     (close file)
   )
 )
 (princ)
)

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

Posté(e)

C'est exactement le genre de liste que j'ai.

Merci! J'essaie le tout et je vous reviens lundi avec les résultats (décalage horaire oblige avec -6hr).

 

Et si j'avais:

1. Une belle liste toute propre avant-après.

2. Un dessin dans lequel tous les blocs et tous les calques avant et après sont présents (dessinés ?). (dwg ou dwt ou dws)

3. Un dws d'uniquement les nouveaux éléments normalisés avec concordance avant-après pour les calques.

3. Un répertoire spécifique pour la conversion contenant tous les dessins à convertir. (ou la possibilité de choisir un dessin à convertir)

4. Une façon de nommer les fichiers "convertis" (ex.: l'ancien nom suivi de la date du jour).

 

On pourrait automatiser le tout?

Je tire un peu sur l'élastique, ;) mais je constate que vous êtes vraiment forts!...

 

Posté(e)

Bonjour,

 

J'ai réussi à faire fonctionner le tout en m'assurant que les blocs "avant" et "après" ont les mêmes d'attibuts (en insérant le dessin à convertir dans un prototype "trafiqué") contenant tous les blocs et tous les calques. En 2006 ça fonctionne.

 

En 2010, j'ai des erreurs à toutes les lignes... avec les mêmes fichiers.

 

Vous y comprenez quelque chose?

 

Karmélie

Posté(e)

bonjour,

 

Erreur avec la ligne: 0,*,point_0,c-e-arp-pnt-rel,0.50

Erreur avec la ligne: 7,*,c-e-top-pui,c-e-top-pui-rel,0.75

 

Erreurs en exécutant le lisp posté dans la réponse #4.

 

Les blocs et les calques avant et après sont tous dans le dessin.

 

 

Posté(e)

Salut,

 

Je ne vois vraiment pas ce qui peut faire que ça marche sur 2006 et pas sur 2010.

 

Ces messages sont ceux que j'ai programmé pour avertir des lignes qui posent problème, ils ne renseignent pas sur la nature de l'erreur.

J'ai modifié le code pour que les messages d'erreurs affichent aussi la nature de l'erreur.

À re-tester avec le nouveau code,pour avoir plus d'infos sur le type d'erreur, mais il est difficile de comprendre ce genre de problème à distance (sans accès aux fichiers ni aux postes).

 

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

Posté(e)

Bonjour,

 

J'ai l'erreur "; erreur: parenthèse fermante supplémentaire en entrée" au chargement du Lisp. Je ne sais pas quoi faire pour revenir au dessin et me débarasser de _vlide à la ligne de commande

 

 

Posté(e)

Bonjour,

 

J'ai résolu le problème des parentèses. J'ai envlevé celle avant le (princ)

Maintenant j'ai les messages suivants:

Erreur avec la ligne: 0,*,point_0,c-e-arp-pnt-rel,0.5

valeur Lisp sans contrainte avec VARIANT de ce type: "0.5"

Erreur avec la ligne: 7,*,c-e-top-pui,c-e-top-pui-rel,0.5

valeur Lisp sans contrainte avec VARIANT de ce type: "0.5"

 

Si j'assigne une valeur entière de 1 à l'échelle, ça passe.

Une valeur de 1.0 ne passe pas.

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é