chris_mtp Posté(e) le 8 juin 2009 Posté(e) le 8 juin 2009 Bonjour à tous, Je ne sais pas si c'est possible mais peut-on lancer des commandes MS DOS avec un lisp pour convertir un fichier de points NXYZ d'un système à un autre avec CirceBatch puis de calculer à partir de ces deux fichiers (celui de départ dans le système A) et celui d'arrivée dans le système B) les paramètres d'une transformation d'Helmert ? Cette transfo se calcule par un calcul matriciel de moindres carrés à partir d'un semis de points connus dans deux systèmes différents mais je bloque sur une question. Comment lire des données avec un lisp dans un fichier texte puis en extraire les données pour écrire une matrice ? Merci par avance de votre aide.John.
bseb67 Posté(e) le 8 juin 2009 Posté(e) le 8 juin 2009 Salut chris_mtp, Pour ouvrir et lire des données dans un fichier texte, ce n'est pas compliquéen soit, il faut juste que le fichier à lire soit bien écrit càd formatter de la mêmefaçon quelque soit les lignes. Il suffit de faire un open, puis un read-line et traiter la ligne lue.Pense à faire le close à la fin pour libérer le fichier. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
chris_mtp Posté(e) le 8 juin 2009 Auteur Posté(e) le 8 juin 2009 Tu n'as pas d'exemple de la fonction read-lineLe but serait en fait de créer une matrice lisp en lisant un fichier de coordonnées x y Merci de ton aide.John.
bseb67 Posté(e) le 9 juin 2009 Posté(e) le 9 juin 2009 Salut, voici un exemple rapide, la fonction traitement_ligne par contre devraêtre celle qui décode ta ligne en fonction de comment tu sépares les X des Y ;| une matrice peut être vue comme une liste contenant des listes ex: ((1 2 3 4 5 8) (4 5 0 3 4 8) (1 2 6 7 9 5)) |; (defun load_matrice_in_file( mon_fichier / res desc buffer) (setq res nil) (cond ((/= (type mon_fichier) 'STR) (princ "\nLe paramètre mon_fichier n'est pas une chaine") ) ; on tente d'ouvrir le fichier ((= (setq desc (open mon_fichier "r")) nil) (princ (strcat "\nErreur d'ouverture de " mon_fichier)) ) (t ; on boucle sur le fichier pour lire ligne par ligne (while (/= (setq buffer (read-line desc)) nil) ; on décompose les données lues et on les rajoutent (setq res (append res (traitement_ligne buffer))) ) ; while (close desc) (setq desc nil) ) ; progn ) ; cond res ) ; load_matrice_in_file ensuite tu pourra utiliser des (nth ... (nth ...)) pour accéder à un élément, mais au cas ou tu ne le sais pas, les indices vont de 0 à N-1 Voilà, à toi de le mettre à ta sauce [Edité le 9/6/2009 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
chris_mtp Posté(e) le 9 juin 2009 Auteur Posté(e) le 9 juin 2009 Bonjour, Merci pour vos réponses.J'ai pu faire un petit test en insérant des points nodal en lisant les coordonnées à partir d'un fichier texte mais le souci vient des numéros. Si on passe point n°9 au n°10, cela décale le nombre de colonnes.En modifiant un bout de code,je suis arrivé à cela un petit test (defun c:lire_txt (/ fic enrg atr x y z pt) (setq fic (open "C:/TMP/TEST.txt" "r")) (while (setq enrg (read-line fic)) (setq atr (substr enrg 1 2)) (setq x (atof(substr enrg 3 15))) (setq y (atof(substr enrg 16 28))) (setq z (atof(substr enrg 29 37))) (setq pt (list x y z)) (command "_point" pt)) (close fic) (prin1) ) Par contre, je ne sais pas comment utiliser la fonction de bseb67 pour réaliser une matrice du type ligne 1: x1 y1 1 0ligne 2: y1 -x1 0 1...ligne n: xi yi 1 0ligne n+1: yi -xi 0 1avec i = n/2 avec un fichier texte initial du type 1 x1 y1 z12 x2 y2 z2...n xn yn. Le séparateur dans le fichier texte est une tabulation.Merci par avance de votre aide. John
bseb67 Posté(e) le 9 juin 2009 Posté(e) le 9 juin 2009 Re, ;-------------------------------------; ; nom: StringToList ; ; role: renvoie sous forme de liste ; ; les entiers ou réels contenus ; ; dans la chaine de caractères ; ; str séparés avec sep ; ; param: str => string ; ; sep => séparateur ; ; retour: une liste d'entiers ou réels; ; date: 09/06/2009 ; ; BLAES Sébastien ; ;-------------------------------------; (defun StringToList( str sep / res tmp pos_sep) (setq res '() tmp str) (cond ; condition d'arrêt ((/= (type str) 'STR) ) ; on cherche s'il y a encore le séparateur dans la chaine ((= (setq pos_sep (vl-string-search sep str)) nil) ; il ne reste plus qu'un seul élément (setq res (list (read str))) ) ; s'il y a encore un séparateur on garde le premier élément ; et on relance sur la suite (t (setq res (cons (read (substr str 1 pos_sep)) (StringToList (substr str (+ (max 2 (strlen sep)) pos_sep)) sep))) ) ) ; cond res ) ; StringToList ex: (StringToList "1 2.15 35 7" " ") => (1 2.15 35 7)comme le premier élément de la liste c'est le numéro, on prendra le (cdr ...)(setq du_res (cdr (StringToList "1 2.15 35 7" " "))) => (2.15 35 7) => X=2.15 Y=35 et Z=7 En regardant ton exemple, tu n'utilises pas le z, et en faisant (car du_res) tu obtiens donc le X1et (cadr du_res) tu obtiens le Y. Et si j'ai bien compris ta suite: ;--------------------------------------; ; nom: traitement_ligne ; ; role: décode la ligne est renvoie ; ; une liste contenant deux listes; ; param: str => string ; ; retour: une liste de listes ; ; date: 09/06/2009 ; ; BLAES Sébastien ; ;--------------------------------------; (defun traitement_ligne( str / res) (setq res '()) (cond ((= (setq du_res (cdr (StringToList str " "))) nil) ) (t (setq le_X (car du_res) le_Y (cadr du_res) res (cons (list le_X le_Y 1 0) (list (list le_Y (- le_X) 0 1)))) ) ) ; cond res ) ; traitement_ligne Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
chris_mtp Posté(e) le 10 juin 2009 Auteur Posté(e) le 10 juin 2009 Merci pour tes réponses bseb67. Les fonctions lisp marchent bien mais j'ai trois questions : 1-En Lisp, on peut bien faire des matrices a n lignes et m colonnes et non que des matrices carrés type 4*4 ?2- Quel est le nom de la matrice de sortie ?3- Si le fichier texte lu avec traitement_ligne comprend des lignes avec d'autres du typeN X Y Z PoidsX PoidsY ......La liste de la matrice est constitué seulement des infos utiles ou bien doit on avoir un fichier absolument du type N X Y Z ? Je n'ai pas trouvé d'exemples pour tester ce cas là. Par contre, Gile dans une autre discussion donne des infos pour les matrices transpose inverse ...mais je ne vois pas le nom des matrices qu'il utilise ou bien qu'on peut intégrer dans les fonctions qu'ils proposent. Il faut aussi que je résous le probleme de lancer des commandes DOS avec du lisp.Je ne sais pas si c'est possible. Je ne me suis pas encore trop penché de ce côté là étant concentré sur ces fameuses matrices. MErci encore pour votre aide.John.
bseb67 Posté(e) le 10 juin 2009 Posté(e) le 10 juin 2009 Re, 1 oui, et tu peux même faire une matrice difforme: 0 1 20 2 6 7 95 43 5 5 Le lisp ne connait que les variables simples (entier, réel, chaine de caractères) et les listes (composéesde sous-listes... et de ces éléments). 2 le nom c'est celui que tu veux, c'est simplement le nom de la variable:(setq ma_matrice '((0 1 2)(0 2 6 7 9) (5 4) (3 5 5))) ma_matrice contiendra l'exemple du 1. 3 pour ca, je te renvoie sur la fonction de traitement d'une ligne, si tu sais que ton fichierest fait ligne par ligne, que chaque élément est séparé par une tabulation (ou autre caractèrespécifique) et que la ligne contient X éléments dont X0= quelque chose, X1= autre chose et ainside suite, il te faut récupérer ce que tu veux utiliser; qu'importe si la ligne contient plus d'infos Pour le pilotage de ms-dos, je crois que c'est possible, mais là fait une recherche, je pense que patrick35 ou Gile ont peut-être touché le sujet. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 10 juin 2009 Posté(e) le 10 juin 2009 Salut Directement le ms-dos, non mais tout dépend aussi du besoin.Tu peux faire une recherche avec l'activex "Wscript.Shell", "Scripting.Filesystemobject" ou encore "Shell.Application" (je dois en oublier) Un sujet à voir qui donne une idée des possibilités ou encore celui-ci @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
chris_mtp Posté(e) le 10 juin 2009 Auteur Posté(e) le 10 juin 2009 Encore trois petites dernières question et je pense qu'après je pourrais un test sur un exemple. 1-Pour connaitre le nombre de lignes d'une mattrice, un sslength me donne l'info non ?Exemple Matrice MA de n lignes et m colonnes le sslength de MA me donnera n 2-Peut on combiner les matrices pour en sortir une valeur réelle de type mq0 ? 3-Le signe négative devant une matrice permet il d'effectuer les opérations de somme ? Voilà ce que j'ai pu faire avec les infos de Bseb67Les matrices MA et MK sont concues avec la fonction traitement par ligne (setq MX '((a) (b) (p) (q))) matrice des inconnues(setq MP (Imat (sslength MK))) matrice des poids(setq MN '((mxm (mxm (trp MA) MP) MA))) matrice N des équations normales(setq MN1 '((InverseMatrix MN))) Inverse de la matrice N(setq NK '((mxm (mxm (trp MA) MP) MK))) Matrice nk(setq MDX '((mxm MN1 NK))) Matrice des appoints(setq MV '((m+m (mxm MA MDX) (- MK)))) Matrice des résidus(setq MY2 '((mxm (mxm (trp MV) MP) MV)))(setq MQ0 (sqrt (/ MY2 (- (sslength MA) 4)))) Ecart moyen quadratique (setq MY1 '(- (mxm (mxm (trp MV) MP) MV))) (setq MY3 '((mxm (mxm (trp MA) MP) MV))) Les fonctions mxm, trp et m+m sont de Gile d'un autre post.John.
chris_mtp Posté(e) le 10 juin 2009 Auteur Posté(e) le 10 juin 2009 Bonjour Patrick_35 En fait, je dois lancer une application du type "C:\CirceBatchDos\CirceBatch.exe" -init "Circe.ini" à lancer sous MS-DOs pour pouvoir créer mes deux fichiers txt et en extraire les infos utiles pour créer ensuite mes matrices et donc ma transformation d'Helmert. J'ai jeté un oeil sur les sujets mais rien ne correspond apparemment à ce que je cherche.La seule solution que je vois est le vlisp pour lancer MS-DOs puis copier -coller moi-même ma ligne de commande. Autrement je ne vois pas ..... Merci de ton aide.John.
(gile) Posté(e) le 10 juin 2009 Posté(e) le 10 juin 2009 Salut, sslength = nombre d'éléments dans un jeu de sélection length = nombre d'éléments dans une liste Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 10 juin 2009 Auteur Posté(e) le 10 juin 2009 Pour le DOS même sur Internet ya rien apparemment et le pire c"est que sans ca mon lisp ne peut pas aboutir. John.
Bred Posté(e) le 10 juin 2009 Posté(e) le 10 juin 2009 Salut, A tester : (startapp "C:\\CirceBatchDos\\CirceBatch.exe\\-init\\Circe.ini") Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
chris_mtp Posté(e) le 10 juin 2009 Auteur Posté(e) le 10 juin 2009 Bonjour Bred, J'ai le retour nil en entrant ce code dans la barre de commande AutoCAD. Ma ligne de commande complète à entrer sous DOS est du style "C:\CirceBatchDos\CirceBatch.exe" -init "Circe.ini" -mode 1 -type 2 -sys1 859 -sys2 860 -alt 2 019 -typcoor1 3 130 -typcoor2 3 120 -f1 1 "C:\TMP\LEVER_INI.txt" -f2 1 "C:\TMP\LEVER_FIN.txt" donc avec des paramètres de transformations de Circe. Merci par avance de votre aide.John
bonuscad Posté(e) le 11 juin 2009 Posté(e) le 11 juin 2009 Bonjour, Sans pouvoir tester ma proposition... (donc erreurs possibles) (command "_.shell" "\"C:\\CirceBatchDos\\CirceBatch.exe\" -init \"Circe.ini\" -mode 1 -type 2 -sys1 859 -sys2 860 -alt 2 019 -typcoor1 3 130 -typcoor2 3 120 -f1 1 \"C:\\TMP\\LEVER_INI.txt\" -f2 1 \"C:\\TMP\\LEVER_FIN.txt\"") Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chris_mtp Posté(e) le 11 juin 2009 Auteur Posté(e) le 11 juin 2009 Bonjour, J'ai essayé la ligne de code de BonuscadJe n'ai pas d'erreur ou d'anomalie mais je ne trouve pas le fichier de sortie _FIN dans le dossier et même sur le disque durD'où deux possiblités, il faut soit bloquer Autocad un moment pour éviter les problèmes de conflit avec MS DOS et les ActiveX soit executer la commande MSDOS indépendamment d'AutoCAD en l'ouvrant soi même Je ne vois que çà de plus que si on tape _.shell dans Autocad, la fenêtre MSDOS ne s'affiche pas et reste caché Si vous avez des idéesMerci par avanceJohn.
bonuscad Posté(e) le 11 juin 2009 Posté(e) le 11 juin 2009 si on tape _.shell dans Autocad, la fenêtre MSDOS ne s'affiche pas et reste caché Sauf si tu fais "entrée" sur une ligne vide, à ce moment là il t'affiche la fenêtre :"***Interpréteur de commandes AutoCAD actif***" Cela peut te permettre de tester ta syntaxe DOS dans de meilleures conditions Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 11 juin 2009 Posté(e) le 11 juin 2009 Salut Le plus simple serait de créer un fichier bat que l'on lancerai via sh ou startapp @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
chris_mtp Posté(e) le 12 juin 2009 Auteur Posté(e) le 12 juin 2009 Un fichier bat permet de lancer une commande dos ?et comment le créer ?A partir d'un bloc notes ?Et comment le lancer d'un startapp ou shMerci par avance de votre aide.John.
bseb67 Posté(e) le 12 juin 2009 Posté(e) le 12 juin 2009 Salut Le plus simple serait de créer un fichier bat que l'on lancerai via sh ou startapp @+ Exactement la même idée que je voulais proposer :) , mais ayant des soucis réseauje n'ai pu revenir avant. chris_mtp: il faut que tu ouvres un fichier (setq file (open "monfichierbat.bat" "w"))que tu écrives dedans tes commandes DOS, et après tu lances l'exécution de ce batvoili voilou :cool: Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 12 juin 2009 Posté(e) le 12 juin 2009 Re bseb67il faut que tu ouvres un fichier (setq file (open "monfichierbat.bat" "w"))Tu te compliques la vie chris_mtpTu ouvres le bloc notes (notepad) et tu écris ta phraseC:\CirceBatchDos\CirceBatch.exe -init Circe.ini -mode 1 -type 2 -sys1 859 -sys2 860 -alt 2 019 -typcoor1 3 130 -typcoor2 3 120 -f1 1 C:\TMP\LEVER_INI.txt -f2 1 C:\TMP\LEVER_FIN.txtet tu sauvegardes par exemple en c:\test.bat Un double clique depuis l'explorateur sur le fichier bat pour verifier que c'est ok Puis l'instruction lisp(command "sh" "c:\\test.bat")ou(startapp "c:\\test.bat") @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 12 juin 2009 Posté(e) le 12 juin 2009 J'adore me compliquer la vie ;) Non, en fait c'était juste qu'avec cette méthode c'est pour créer en livele fichier si il faut écrire les commandes en fonction de certains critères ou paramètres. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
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