Aller au contenu

Commande MSDOS et Helmert


chris_mtp

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 56
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

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ême

faç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...

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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 0

ligne 2: y1 -x1 0 1

...

ligne n: xi yi 1 0

ligne n+1: yi -xi 0 1

avec i = n/2

 

avec un fichier texte initial du type

 

1 x1 y1 z1

2 x2 y2 z2

...

n xn yn.

 

Le séparateur dans le fichier texte est une tabulation.

Merci par avance de votre aide.

 

John

 

Lien vers le commentaire
Partager sur d’autres sites

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 X1

et (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...

Lien vers le commentaire
Partager sur d’autres sites

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 type

N 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.

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

1 oui, et tu peux même faire une matrice difforme:

0 1 2

0 2 6 7 9

5 4

3 5 5

 

Le lisp ne connait que les variables simples (entier, réel, chaine de caractères) et les listes (composées

de 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 fichier

est fait ligne par ligne, que chaque élément est séparé par une tabulation (ou autre caractère

spécifique) et que la ligne contient X éléments dont X0= quelque chose, X1= autre chose et ainsi

de 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...

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 Bseb67

Les 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.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'ai essayé la ligne de code de Bonuscad

Je 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 dur

D'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ées

Merci par avance

John.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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éseau

je 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 bat

voili voilou :cool:

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Re

 

bseb67

il faut que tu ouvres un fichier (setq file (open "monfichierbat.bat" "w"))

Tu te compliques la vie

 

chris_mtp

Tu ouvres le bloc notes (notepad) et tu écris ta phrase

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

et 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

J'adore me compliquer la vie ;)

 

Non, en fait c'était juste qu'avec cette méthode c'est pour créer en live

le 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...

Lien vers le commentaire
Partager sur d’autres sites

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é