DenisHen Posté(e) le 10 novembre 2015 Posté(e) le 10 novembre 2015 Salut à la communauté... Voilà, j'ai un LiSP qui fusionne des calques depuis une suite de "paires pointés", Comme ça : (setq LstCalq '(("1COMM" . "CAD_LIM_COMMUN") ; Amorces des limites communales ("1DEPART" . "CAD_LIM_DEPART") ; Amorces des limites départementales ("1ETAT" . "CAD_LIM_ETAT") ; Amorces des limites étatiques ("1LIEUDIT" . "CAD_LIM_LIEUDIT") ; Périmètre du lieut-dit ("1PARCELLE" . "CAD_LIM_PARC") ; Périmètre de la parcelle figurée au plan ......... ......... ("3TUNNELTEX" . "CAD_DIVERS_TEXT") ; Nom du tunnel ("3ZONCOMMTEX" . "CAD_DIVERS_TEXT") ;Nom de la voie du DP routier ) ) ;_ Fin de setq que j'utilise comme suit : (foreach PosLst LstCalq (if (tblsearch "layer" (car PosLst)) (progn (if (not (tblsearch "layer" (cdr (assoc (car PosLst) LstCalq)))) (command "-calque" "n" (cdr (assoc (car PosLst) LstCalq)) "") ) ;_ Fin de if (command "fuscalques" "n" (car PosLst) "" "n" (cdr (assoc (car PosLst) LstCalq)) "o") ;_ Fin de command ) ;_ Fin de progn ) ;_ Fin de if ) ;_ Fin de foreach Maintenant, j'ai plusieurs "configurations" de paires pointés. Plustôt que de faire plusieurs LiSP pour chaque liste, j'aimerai faire autant de fichiers type texte (comme un .lst par exemple) pour y placer les différentes paires... J'aimerais faire, en fait, un fichier "Cadastre.lst", un "Primagaz.lst", un "Carto200.lst"... Si quelqu'un a un conseil ou une astuce... Je suis preneur... J'ai déjà lu l'excellent "Introduction _a_AutoLISP.pdf" du grand (gile), mais je n'arrive à rien... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 10 novembre 2015 Posté(e) le 10 novembre 2015 Bonjour, je pense que tu t'en tireras avec la fonction read. Dans un premier temps, tu fais un fichier texte sauvegardé dans un répertoire où Autocad recherche les fichiers de support. Il contiendra la liste des paires pointées.Je pense que le plus simple est de mettre une paire par ligne.("1COMM" . "CAD_LIM_COMMUN")("1DEPART" . "CAD_LIM_DEPART")("1ETAT" . "CAD_LIM_ETAT")("1LIEUDIT" . "CAD_LIM_LIEUDIT")("1PARCELLE" . "CAD_LIM_PARC") Ensuite dans le lisp, tu ouvres le fichier avec la commande open. Findfile n'a pas besoin de chemin si le fichier est dans un répertoire inclus dans la liste des chemins de recherche de fichiers de support. (setq FCALQUE (findfile "cadastre.lst")) (setq F (open FCALQUE "r")) puis tu fais un read-line de chaque ligne et tu mets ça bout à bout. Ce sera du texte, puisque cela provient d'un fichier de ce type. (setq L "") (while (setq LIGNE (read-line F)) (setq L (strcat L LIGNE)) ) puis tu refermes le fichier. (close F) A ce moment, tu disposes de la variable L qui contient la liste de paires pointées, mais sous forme texte. Il suffit d'utiliser la fonction read, puisque (read "(a b c)")->(A B C), pour transformer ce texte en liste :(read (strcat "(" L ")")) Ensuite on pourra éventuellement s'intéresser à rajouter un contrôle dans le while qui permettrait de supprimer des commentaires après des ; (vl-string-position ...) et (substr ...) ou de demander à l'utilisateur de choisir le fichier qu'il veut ouvrir (getfiled...). Je n'ai pas les moyens de vérifier si ce que j'écris fonctionne : je n'ai pas d'autocad sur le pc que j'utilise à l'instant. Mais cela peut déjà être une piste de recherche. AmicalementVincent PS : si cela t'a aidé, tu pourras dire que je suis grand. Même si cela ne t'as pas aidé, tu pourras le dire aussi, cela ne sera pas faux du haut de mes 2m :)Mais l'adjectif "grand" en français est l'un des rares pour lequel la position par rapport au nom qu'il qualifie est significative. En effet, un homme grand n'est pas forcément un grand homme... contrairement à bonnet blanc et blanc bonnet :D C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
GJulien Posté(e) le 10 novembre 2015 Posté(e) le 10 novembre 2015 Bonsoir Denish, Je me suis lancé, j'ai essayé et apparement chez moi tout marche bien. J'ai créé un fichier texte (.txt) :AncienCalque1NouveauCalque1AncienCalque2NouveauCalque2... etc Pour ce qui est du code, je me suis permis de traduire tes commandes en langage international (comme je travaille avec AutoCAD en anglais, certaines choses ne passaient pas). (setq calqFile (open (getfiled "Open txt file" "txt" "*" 0) "r")) (while (setq line (read-line calqFile)) (setq temp (cons line temp)) ) (close file) (setq ind 0 temp (reverse temp) calqList nil ) (while (< ind (length temp)) (setq calqList (cons (nth ind temp) (nth (1+ ind) temp))) (if (tblsearch "LAYER" (car calqList)) (progn (if (not (tblsearch "LAYER" (cdr calqList))) (command "_-LAYER" "N" (cdr calqList) "") ) (command "_-LAYMRG" "_N" (car calqList) "" "_N" (cdr calqList) "_Y") ) ) (setq ind (1+ (1+ ind))) ) Il y a sûrement mieux mais j'espère que ça peut t'aider. EDIT : Désolé je viens de me rendre compte que j'ai changé ta variable "LstCalq" par "calqList". Cordialement,GJulien
DenisHen Posté(e) le 11 novembre 2015 Auteur Posté(e) le 11 novembre 2015 Salut à tous, Et merci beaucoup à vous deux... Zebulon : un "grand" merci pour ta proposition de code, je ne pensais pas à écrire directement mon fichier .lst en paire pointée... Et je ne connaissais pas (read, intéressant... GJulien : pas de problème pour le nom de la liste, je corrigerais... Je vais essayé tout ça cet après-midi, si j'en ai le temps... Si non, ce sera demain... Merci encore à tous... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 11 novembre 2015 Auteur Posté(e) le 11 novembre 2015 Bon, j'ai tenté ça :(setq FichierLu (open (getfiled "Open txt file" "txt" "*" 0) "r")) (princ (strcat "FichierLu =" FichierLu)) Mais AutoCAD me réponds ça :Commande: CONVERTCALQUE ; erreur: type d'argument incorrect: stringp #<file "C:\\Cadastre.lst">Et bien entendu, je ne sais pas quoi faire avec ça... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 11 novembre 2015 Posté(e) le 11 novembre 2015 Bonsoir, La réponse s'explique par le fait que tu tentes d'utiliser une fonction qui permet d'écrire du texte (princ) avec la variable FichierLu qui n'est pas de type texte, mais de type fichier. C'est la fonction (getfiled) qui renvoie du texte ou nil, pas la fonction (open) qui, elle, renvoie un "descripteur" de fichier qui n'est utilisable que par les autres fonctions d'entrée/sortie comme (close ...) (read-line ...) Par conséquent, si tu veux afficher le nom du fichier choisi par l'utilisateur, il faut récupérer la variable à la sortie de (getfiled ) et faire un princ puis un open de cette variable... si elle n'est pas nil. Pour read, voir ce fil qui explique un peu comme il est facile de transformer du texte en liste. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 11 novembre 2015 Posté(e) le 11 novembre 2015 je ne pensais pas à écrire directement mon fichier .lst en paire pointée... pourquoi pas, après tout ? AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
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