Fraid Posté(e) le 28 mai 2011 Posté(e) le 28 mai 2011 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 nickelj'obtient un texte avec mes nouvelles coordonnéesplus 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 starappfichier vide re :o [Edité le 28/5/2011 par Fraid] https://github.com/Fraiddd
Fraid Posté(e) le 28 mai 2011 Auteur Posté(e) le 28 mai 2011 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 pointil y a des fois des choses toutes simples qui ne veulent pas marcher :( j'avais oublier de direqu'il faut installer Circebatchhttp://geodesie.ign.fr/index.php?page=circe et que je suis sur xp64 et Autocad 2011 [Edité le 28/5/2011 par Fraid] https://github.com/Fraiddd
Fraid Posté(e) le 30 mai 2011 Auteur Posté(e) le 30 mai 2011 je vous livre la routine en entierqui 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 chantierset sans prendre en compte l'altitude Il me manque pas grand chose pour finir cette routinejuste récupérer la liste des nouveaux points quelqu'un aurait une idée?Merci [Edité le 31/5/2011 par Fraid] https://github.com/Fraiddd
Fraid Posté(e) le 31 mai 2011 Auteur Posté(e) le 31 mai 2011 J'ai essaye en mettant un delaycela 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 estComment 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 https://github.com/Fraiddd
VtKp Posté(e) le 31 mai 2011 Posté(e) le 31 mai 2011 Bonjour FraidJ'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 lispLa 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
Fraid Posté(e) le 31 mai 2011 Auteur Posté(e) le 31 mai 2011 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 clientset 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 fichierce 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 https://github.com/Fraiddd
VtKp Posté(e) le 31 mai 2011 Posté(e) le 31 mai 2011 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
Fraid Posté(e) le 31 mai 2011 Auteur Posté(e) le 31 mai 2011 Merci J'avais déjà essayé mais je devais me tromper quelque part je vais reprendre tout mes tests depuis le début y a bien une solution :D https://github.com/Fraiddd
Fraid Posté(e) le 14 juin 2011 Auteur Posté(e) le 14 juin 2011 Bonjour, J'ai fini par trouver la solutiondans 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 cuitobliger de mettre des temps de pause sinon le lisp a un comportement imprevisible pas moyen d'enchainer 2 .batj'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 https://github.com/Fraiddd
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