Aller au contenu

BatLisp VS Circé


Fraid

Messages recommandés

Bonjour,

 

J'essais de me servir de la version batch de circé

afin de l'integrer dans un lisp.

 

voici le .bat

 

 "C:\Program Files (x86)\Institut Géographique National\Circé France Batch 4.0\CirceBatch.exe" -init Circe.ini -mode 0 -type 2 -sys1 2 -sys2 2 -typcoor1 3 102 -typcoor2 3 120 -E 314248.125 -N 250214.62 -H 0.0 > "C:\\TMP\\ReturnCirce.txt"

 

Quand je copie cette ligne dans la fenetre de Commandes Windows cela fonctionne nickel

j'obtient un texte avec mes nouvelles coordonnées

plus qu'a la lire

 

Parcontre des que je l'utilise dans un lisp via startapp ou shell le fichier texte est bien créer mais est vide :o

 

Ya t'il une subtilité qui m'a echappé?

 

Merci

 

en plus je viens de double cliquer sur le .bat et cela fait la meme chose que starapp

fichier vide re :o

 

[Edité le 28/5/2011 par Fraid]

Lien vers le commentaire
Partager sur d’autres sites

Voila la fonction

 

(defun Circe ( Pt typc1 typc2 / TempReturn)

(command "_.shell" 
	(strcat "\"C:\Program Files (x86)\Institut Géographique National\Circé France Batch 4.0\CirceBatch.exe\" -init Circe.ini -mode 0 -type 2 -sys1 2 -sys2 2 -typcoor1 3 " 
		typc1 
		" -typcoor2 3 "
		typc2 
		" -H 0.0 -E " 
		(rtos (car pt)) 
		"	-N " 
		(rtos (cadr Pt)) 
		" > \"C:\\TMP\\ReturnCirce.txt\""
	)
)

(setq TempReturn (open "C:\\TMP\\ReturnCirce.txt" "r")
                NewPt (str2lst (read-line TempReturn) " ")
)
(close TempReturn)
newpt	
) 

;Transforme une chaine de caractères en liste (Gile)
(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)
 )
)

qui devrai me retourner la listes des coordonées du nouveau point

il y a des fois des choses toutes simples qui ne veulent pas marcher :(

 

j'avais oublier de dire

qu'il faut installer Circebatch

http://geodesie.ign.fr/index.php?page=circe

 

et que je suis sur xp64 et Autocad 2011

 

 

[Edité le 28/5/2011 par Fraid]

Lien vers le commentaire
Partager sur d’autres sites

je vous livre la routine en entier

qui théoriquement change le géoréférencement d'un dessin

 

 
;Lancements et tests
(defun c:2t9 nil ;Lambert 2 en Lambert 2 Etentu
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 2)
(if 	flagGéo 
	(TranCirc "102" "120")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "102" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;-----------------
(defun c:1t9 nil ;Lambert 1 en Lambert 2 Etentu
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 1)
(if 	flagGéo 
	(TranCirc "101" "120")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "101" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;-----------------
(defun c:3t9 nil ;Lambert 3 en Lambert 2 Etentu
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 3)
(if 	flagGéo 
	(TranCirc "103" "120")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "103" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;-----------------
(defun c:9t1 nil ; Lambert 2 Etentu en Lambert 1
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 9)
(if 	flagGéo 
	(TranCirc "120" "101")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "103" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;-----------------
(defun c:9t2 nil ; Lambert 2 Etentu en Lambert 2
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 9)
(if 	flagGéo 
	(TranCirc "120" "102")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "103" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;-----------------
(defun c:9t3 nil ; Lambert 2 Etentu en Lambert 3
(vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (= (getvar "worlducs") 0) (command "_ucs" ""))
(ControlGeo 9)
(if 	flagGéo 
	(TranCirc "120" "103")
	(progn
		(princ "\nLe dessin ne semble pas être Géoréférencé dans un système pris en charge")
		(initget "Oui Non _Yes No")
		(if  (eq (getkword (strcat "\nVoulez vous continuer ? [Oui/Non] < Non> : ")) "Yes")
			(TranCirc "103" "120")
			(princ "\nAbandon")
		) 
	)
)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq flagGéo nil TextGéo nil)
(princ)
)
;------------------------------------------------------------------------------------------------------------
;Fonction Principale
(defun TranCirc ( Dep Arr / oldcmdecho oldosmode cvue Xcv1 Ycv1 Pt1 Xcv2 Ycv2 Pt2 NPt1 NPt2 ToAl)
  	(setq	
		oldcmdecho 	(getvar "cmdecho")
		oldosmode 	(getvar "osmode")
)
(setvar "cmdecho" 0)
(setvar "osmode" 0)

(setq 	;à factoriser
		cvue  	(getvar "viewctr")
		Xcv1      	(- (car cvue) 100)
		Ycv1 	(- (cadr cvue) 100)
		Pt1 		(list Xcv1 Ycv1)
		Xcv2      	(+ (car cvue) 100)
		Ycv2 	(+ (cadr cvue) 100)
		Pt2 		(list Xcv2 Ycv2)
		NPt1 	(Circe Pt1 Dep Arr) 
		NPt2 	(Circe Pt2 Dep Arr)
		ToAl 	(ssget "_x" (list (cons 410 "MODEL")))
)
(if ToAl 
	(progn
		(command "_align" ToAl "" Pt1 NPt1 Pt2 NPt2 "" "o")
		(princ "\nTranslation Réussie")
	)
	(princ "\nAucun objets dans le dessin")
)

(setvar "cmdecho" 	oldcmdecho)
(setvar "osmode" 	oldosmode)
(princ )

)

;------------------------------------------------------------------------------------------------------------
;Fonction Utilisant Circé
;Arguments: Pt un point sous forme de liste, typc1 et typc2 Le type de coordonnée de départ et d'arrivée en chaine de caracteres ;101	[Lambert 1 Nord]/ 102[Lambert 2 Centre]/ 103[Lambert 3 Sud]/ 120[Lambert 2 étendu]
(defun Circe ( Pt typc1 typc2 / TempReturn)
(command "_.shell" 
	(strcat "\"C:\Program Files (x86)\Institut Géographique National\Circé France Batch 4.0\CirceBatch.exe\" -init Circe.ini -mode 0 -type 2 -sys1 2 -sys2 2 -typcoor1 3 " 
		typc1 
		" -typcoor2 3 "
		typc2 
		" -H 0.0 -E " 
		(rtos (car pt)) 
		"	-N " 
		(rtos (cadr Pt)) 
		" > \"C:\\TMP\\ReturnCirce.txt\""
	)
)

(setq TempReturn (open "C:\\TMP\\ReturnCirce.txt" "r")
                  NewPt (str2lst (read-line TempReturn) " ")
)
(close TempReturn)
newpt	
) 
;---------------------------------------
;Transforme une chaine de caractères en liste (Gile)
(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)
 )
)
;----------------------------------------
;Controle du géorérencement éventuel
;Arguments: LAMB entier (1 Lambert 1, 2 Lambert 2, 3 Lambert 3 et 9 Lambert 2 Etendu
(defun ControlGeo ( LAMB /  Xcvue Ycvue )
	(setq 	
			Xcvue 	(car (getvar "viewctr"))
			Ycvue 	(cadr (getvar "viewctr"))
	)
	(if (and(= LAMB 1) (> Xcvue 75000) (< Xcvue 1000000) (> Ycvue 100000) (< Ycvue 300000))
			(setq flagGéo 1 TextGéo "Le plan semble être en Lambert 1 Zone Nord")
	)
	(if (and(= LAMB 2) (> Xcvue 75000) (< Xcvue 750000) (> Ycvue 100000) (< Ycvue 450000))
			(setq flagGéo 2 TextGéo "Le plan semble être en Lambert 2 Zone Centre")
	)
	(if (and(= LAMB 3) (> Xcvue 260000) (< Xcvue 1000000) (> Ycvue 75000) (< Ycvue 350000))
			(setq flagGéo 3 TextGéo "Le plan semble être en Lambert 3 Zone Sud")
	)
	(if (and(= LAMB 9)(> Xcvue 72300) (< Xcvue 1030900) (> Ycvue 1700000) (< Ycvue 2681000))
			(setq flagGéo 9 TextGéo "Le plan semble être en Lambert 2 Etendu")
	)
	(if (= flagGéo nil) (setq TextGéo "\nLe plan ne semble pas être Géoréférencé"))
	
	TextGéo
)


 

Bien sur cette méthode est valable sur des petits chantiers

et sans prendre en compte l'altitude

 

Il me manque pas grand chose pour finir cette routine

juste récupérer la liste des nouveaux points

 

quelqu'un aurait une idée?

Merci

 

[Edité le 31/5/2011 par Fraid]

Lien vers le commentaire
Partager sur d’autres sites

J'ai essaye en mettant un delay

cela change rien

 

j'ai essayé avec les activex

 

 
(defun Circe ( Pt typc1 typc2 / TempReturn strbat
)
 	(setq  strbat 
	(strcat "\"C:\Program Files (x86)\Institut Géographique National\Circé France Batch 4.0\CirceBatch.exe\" -init Circe.ini -mode 0 -type 2 -sys1 2 -sys2 2 -typcoor1 3 " 
		typc1 
		" -typcoor2 3 "
		typc2 
		" -H 0.0 -E " 
		(rtos (car pt)) 
		"	-N " 
		(rtos (cadr Pt)) 
		" > \"C:\\TMP\\ReturnCirce.txt\""
	)
)
      (run_and_wait strbat)

(setq TempReturn (open "C:\\TMP\\ReturnCirce.txt" "r")
                  NewPt (str2lst (read-line TempReturn) " ")
)
(close TempReturn)
newpt	
) 

(defun run_and_wait (strCommand / WScript_obj)
;    strCommand — command string with arguments (theswamp.org)
;       : "notepad.exe \"c:\\My Folder\\tmp.txt\""
;  Returns 0 | <%catch-all-apply-error%> | nil.
 (vl-load-com)
 (if (setq WScript_obj (vlax-get-or-create-object "WScript.Shell"))
   (vl-catch-all-apply 'vlax-invoke-method (list WScript_obj "Run" strCommand 4 :vlax-true))
 );if
);defun

 

pas mieux

 

En fait la question principale est

Comment récupérer le retour d'une commande windows en lisp?

 

quand on cherche circebatch dans le google, c'est pratiquement le désert...

 

a part http://www.cadxp.com/XForum+viewthread-fid-115-tid-24155.html

 

Y a t'il un autre moyen, sans pour cela récrire circé en lisp, d'intégrer un outil de géoreferencement simple dans Autocad?

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Fraid

J'ai eu pour ma part le même probleme que toi un moment a savoir transformer un fichier d'un système a un autre via Circebatch.

J'ai en ce qui me concerne fais comme suit :

- exporter toutes les coordonnes possibles de mon dessin (ligne, polyligne, blocs,...)

- converti le fichier d'export d'un système a l'autre avec Circebatch

- reouvre le fichier résultat pour calculer une transformation d'Helmert

- change par une matrice de transformation l'orientation et la position de tout mon dessin

- compare les résultats obtenues avec un nouvel export des coordonnes etle fichier résultat de circé pour calcul des différences et des emq

 

Tout ça en lisp

La routine tourne pendant 15min selon le nombre de points a traiter mais les résultats sont la.

Ne marche comme tu sis que sur un petit chantier par contre.

 

Cette démarche m'a évite de nombreux problèmes car connaitre le retour d'une ligne de commande Dos avec Autocad, la je ne vois vraiment pas.

 

En espérant t'avoir éclaire

 

John

 

 

Lien vers le commentaire
Partager sur d’autres sites

Merci VtKp de te penché sur mon problème

 

La commande _align me permet d'evité l'utilisation de matrices (elle le fait toute seule)

 

et de n'avoir que 2 points a s’occuper

 

les résultats que j'obtient on une précision suffisante pour mon activitée et a ete validé par mes clients

et cela ne met pas 1/4 d'heures même sans lisp

 

surtout pour passer du Lambert 2 au Lambert 2 Etendu ;)

 

le but de cette routine, comme la plupart, est de gagner du tepms, d'eviter les erreurs de frappes et gagner en confort d'utilisation.

 

mes essais de circebatch en mode 1 : mode fichier

ce sont conclue par des échecs

 

je veux bien voir ton script car les exemples sont rare et ceux fournis par ign ne fonctionne pas en l'etat

 

Sinon je ne m'avoue pas vaincu si facilement

 

je vais explorer plus profondement les lignes de commandes windows

 

merci

 

 

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Fraid,

 

Avec une transformation d'Helmert, les résultats sont tous à faits satisfaisant.

Voici une ligne de commande DOS pour CirceBatch en modefichier, à toi de l'adapter selon tes besoins

 

"C:\CirceBatchDos\CirceBatch.exe" -init "Circe.ini" -mode 1 -type 2 -sys1 997 -sys2 547 -alt 2 019 -typcoor1 3 150 -typcoor2 3 149 -f1 1 "C:\TMP\SEMIS_COR.txt" -f2 1 "C:\TMP\SEMIS_FIN.txt" 

 

Cette ligne est dans un fichier bat accessible directement depuis C:/ et dans mon lisp,

j'ai

 (command "sh" "c:/TMP/LAMBERTII-RGF93.bat")

qui correspond au nom de mon fichier.

 

Quand je dis 15min, c'est pour un nombre de points supérieurs à 300 000.

Sinon pour 1000 à 3000 points environ, le lisp tourne 2-3min.

 

J'ai fais ca surtout (comme indiqué dans le lien que tu as mis précedent) pour pouvoir transformer des fichiers depuis n'importe quel poste sans être obligé d'avoir Covadis qui le fais très bien d'ailleurs.

 

Voila tout, En espérant t'avoir éclairé.

 

John

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

J'ai fini par trouver la solution

dans le .bat ce sont les accents dans le chemin de recherche qui pose problème

 

donc soit changer de chemin en copiant les fichier

 

comme C:\\CirceBatch\\CirceBatch.exe

 

ou indiquer le chemin avant la commande externe

 

cd /d "C:\Program Files ^(x86^)\Institut Géographique National\Circé France Batch 4.0\" 
CirceBatch.exe -init Circe.ini -mode 0 -type 2 ect...

 

en tout cas utiliser des .bat avec du lisp, ce n'est pas du tout cuit

obliger de mettre des temps de pause

sinon le lisp a un comportement imprevisible

 

pas moyen d'enchainer 2 .bat

j'ai du les ecrires dans le même

 

a partir de la on peut soit récupérer le retour en l’écrivant dans un texte, ou dans la base de registre

 

sujet clos

 

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é