Karmelie Posté(e) le 10 février 2011 Posté(e) le 10 février 2011 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
bryce Posté(e) le 10 février 2011 Posté(e) le 10 février 2011 Bonsoir, Comme il va falloir filtrer les blocs d'après leur calque d'insertion, un simple script ne suffira plus...Il va falloir y ajouter du lisp. Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 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.
bryce Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 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. ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Patrick_35 Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 Salut Une piste de recherche pour commencerUne liste contenant les blocs d'origine avec leurs calquesUne liste contenant les blocs à remplacer avec leurs calquesUne 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 secondeA vos claviers @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bryce Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 Oui, je pensais aussi à une seule liste de ce genre : bloc d'origine ; calque d'origine ; nouveau bloc ; nouveau calque par exemple : B1;C1;Sym12;LEVE_256B1;C2;Sym44;LEVE_32etc. Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 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?
bryce Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 Oui, tu peux mettre tes fichiers en ligne surhttp://dl.free.frou http://file.ahst.fr/et poster les liens ici ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 et voici http://dl.free.fr/qLC50l0Qa
(gile) Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 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
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 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?
(gile) Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 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
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 Je ferai un autre bloc "point_0" avec identique à 0 et je remplacerai la ligne0,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) ?
(gile) Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 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
(gile) Posté(e) le 11 février 2011 Posté(e) le 11 février 2011 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
Karmelie Posté(e) le 11 février 2011 Auteur Posté(e) le 11 février 2011 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!...
Karmelie Posté(e) le 16 février 2011 Auteur Posté(e) le 16 février 2011 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
bryce Posté(e) le 16 février 2011 Posté(e) le 16 février 2011 Bonjour, Peut-être qu'en connaissant les messages d'erreur en question, on comprendrait mieux... :P Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Karmelie Posté(e) le 16 février 2011 Auteur Posté(e) le 16 février 2011 bonjour, Erreur avec la ligne: 0,*,point_0,c-e-arp-pnt-rel,0.50Erreur 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.
(gile) Posté(e) le 16 février 2011 Posté(e) le 16 février 2011 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
Karmelie Posté(e) le 17 février 2011 Auteur Posté(e) le 17 février 2011 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
Karmelie Posté(e) le 17 février 2011 Auteur Posté(e) le 17 février 2011 Si ça peut aider, voici un exemple de DWG qui contient les blocs avant et après sur leur calque respectif et une liste des concordances pour ces blocs http://file.ahst.fr/get.php?id=4d5d2f89c9a1d Karmélie
Karmelie Posté(e) le 17 février 2011 Auteur Posté(e) le 17 février 2011 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.5valeur 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.5valeur 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.
(gile) Posté(e) le 17 février 2011 Posté(e) le 17 février 2011 Salut, J'ai corrigé le code, ça semble fonctionner. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Karmelie Posté(e) le 17 février 2011 Auteur Posté(e) le 17 février 2011 Bonjour ça passe si l'échelle est un nombre entier ex: 1 , s'est une décimale ex. 1. ça ne passe pas.
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant