I
UNE INTERFACE COMPATIBLE PC POURI
LE CALEPIN ELECTRONIQUE SDR2:I
TOPO.BAS, editeur et createur de fichiers.
Par Pierre Marchildon (87 052 88)
Projet de fin d'etudes
Pr8sente au Professeur McKyes
P
ar un ~uet mabiJ d9 dibut d9 maJ; j9 me prt!sente pour la premiere l'ois c/Jez mon 6Yl7p/oyeuresbYala SaJiJt-C8sa!re 11 est 6:(}() AM et des mon am~ lepatron
nous
a~~ mole/ un autre ellldianl du Col~ a DanieL Cesl un ~n!C!e7en
!Jydmulique agr~ aupes
sUr et a la M?~%~ quinous
amene
dens
la fl!7b7 de Mlmbe/ (otJ 11 ya
beeucvup d9ctiwre depu!S la ~xprqonSI!On des1em9sJ.
oa_s.
noireJY877kire
pu~ on se J,al a:m/i9r des taches plutot 1nteressantes: prelevement dS7hanblbnsde sola
la~ testsd9 /87701716i9 duniveau deau
dens
Asfs'trous
~prcmenade
leb:y d9 la
terre du
culb'vateur p?Ur noter toutes Asfs' caracteristiques particulieres et enniJ, releYtftopcmetr,que
des pan;e/Asfs'a
d/Biher.E
IJ ou£ car 11 s agit bel et b1en de tous lespni/lin1i'la!/es ~tie/sa 1a amaspi!On dun
plan
de d/B/~ que nous aYOnS e.ff6r7~ dumnl noirepremiere ;ournee douvrage pour ce bureau d7i1gtin/eurs ag~ Jaiper la suite nialistf que le
d/B//Jage d6meu/B/l6Yla:Yl1 le p8/i7 et le beurre de la
pro~ et que nous aYions
ete
a7ana.9tLK detcm-ber sur un S77pb.ft1Ur quin 7Jtkllall
pes
a
nous
a:YJ/i9rdes ~u~ IVI1 mfl~ m&f7nf notm
statu/ d-8/l/diant
a
uelques ;ours passtirent. Puis un nouvel/Jumanoii:Ma trolspe~ #I
son
appgtitbn au SSiiJ du ptHSV~JI16Y. En /'si~ 11 s~~l dune s/atbn to/aleaVBC tou~ • cptbns t:bnt notm li:Jna9ur et liJ-nowteur
petn:Jn
venaJl del'alm
l~uisflbn mo.ft:WJ·nent le bagatelle de$ 2~000. Les re/eves
topcmetnques
~res au plans de dm1/7age etaux d!mirents
plans
de Kx:a//selion ~t 8/hside /~dupepier
et crayona
ce/uide 1717/'otmatique.STATION TOTALE
11 s'agit du tacheometre electronique Set 3 de Sokkisha. C'est un appareil qui, cam me le tacheometre classique, est monte sur trepied et sert a prendre les angles horizontaux et verticaux, de meme que la distance tors des releves topometriques. Le fait qu'il soit etectronique tui confere la possibilite d'afficher de maniere digitate les lectures prises, et meme de pouvoir transferer directe-ment ces donnees
a
un calepin electronique branche sur la sortie "Data Out-pur· de la station. Je vais d'ailleurs revenir plus tard au calepin electronique.A premiere vue, la station ressemble
a
une tete de robot garnie de nombreux controles qui permettent de prendre differents types de lectures: azimuth horizontal, denivelee, angle relatif, distance reelle, distance horizon-tale, etc .. Cette tete electronique est aussi munie d'un objectif qui donnea
l'operateur la possibilite de viser la mire situee sur le pointa
relever. On la monte sur un trepied convention ne! et on doit ajuster le niveau jusqu'a ce que la station soit satisfaite, sous peine de se voir refuser le signal de depart. Lorsque tout est regie, on peut commencer a prendre les lectures.Comme pour les releves tradition nets, deux operateurs sont n9cessaires a la bonne conduite de l'entreprise. Avant tout, l'operateur sur la mire doit in-diquer
a
celui de la station la hauteura
laquelle il a regie la mire. Effectivement, la mire est ici constituee de deux cylindres metalliques telescopes: celuia
l'interieur est gradue pour indiquer I' elevation du sommet de la mire. Cara
l'extremite superieure, on retrouve un prisme principalement constitue d'un mirroir concave. C'est ce prisme que l'op8rateur de la station doit viser et ainsi mettre dans l'objectif de la station. Une fois que le prisme est bel et bien dans le champ de vision de la station, I' operateur appuie sur un bouton qui demandea
la station de prendre la lecture. Celle-ci emet alors un signallumineux qui, si le prisme se trouve bien en vue, sera retourne par le mirroir concave, car c'est la la propriete essentielle de cette piece optique: retourner vers la source emet-trice sa propre reflection. Lorsque la station re<.(Qit cette reponse, elle prend en note le degre d'inclinaison de l'objectif, qui correspondraa
l'angle vertical, l'azimuth horizontal de la tourelle par rapport au zero relatif, et enfin la distance reelle claculeea
partir de l'intervalle enregistree entre l'emission et la recep-tion du signallumineux. Bien entendu, ces donnees sont brutes et devront etrecorrigtles en tenant compte de nombreux parametres physiques et relatifs: pression atmospheriq·ue, temperature, position terrain de l'azimuth zero, elevation de la mire, etc .. La station sait meme de combien de fractions de degre sa mise au niveau n'est pas exacte. Cela demontre blen le degre de sophistication de !'instrument et les potentiels dt3savantages qui r:>euvent en dScouler.
Eh cui, lors de sa reception, la station totale a souleve beaucoup d'emo· tion technologlque au sein du cabinet. Mais cela a bien pris une benne semalne d'experimentatlons et monopolise un certain nombre d'employes avant d'obtenir le moindre resultat pratique. Tout ce nouvel equipement avait ete achete
a
grands frais sans recevoir le moindre supJJOrt technique ou forma-tion adequate de la part du revendeur. 11 a done fallu composer avec les moyens du bord et reapprendrea
marcher avec ce nouveau tripectea
tete transistorisee. Meme apres quelques mois d'utilisation, plus de 60% des pos-sibilites de la station n'ont pas ete utilise3es. On a reussia
faire fonctionner la station de maniere acceptable d'une certaine fac;:on, alors 11 serait trop hasar· deux et coOteux de tenter d'utlllser les autres posslbllltes. N'oubllons pas que sommes ici dans le secteur prive.CALEPIN ELECTRONIQUE
La station totale perdrait tout son interet (du mains, la pertinence de son
rapport productiviteJprix) si elle
ne-~fait
pas munie d'une unite de memoire--%-capable de stooker les lectures prises, afin de sou lager l'operateur de la prise de donnees ..
a
mitaine ... Eh bien le Dieu de l't3quipement geodesique, en l'occurence Sokkisha, a aussi cree le SDR2.Cela ressemble
a
un petit ordinateur de poche de type Hewlett-Packard (ace sujet, le HP-17C aurait tres bien pu rempla~r le SDR2, et cea
beaucoup moindre cout) que l'on branchea
la sortie prevuea
cet effet sur la station to· tale. Le SDR2 est compose d'un simill-clavier alphanumerique avec affichage d'une ligne, de 64K de memoire accessible en ecriture et lecture, d'unltes deROM qui comprennent les programmes que J:>eUt executer le calepin et d'une unite d'alimentation par batteries. La continuite de l'alimentation electrique est ici importante car elle J:>ermettra la conservation des lectures prises en memoire vive jusqu'a ce qu'elles soient retin9es du calepin. Alors, en plus des
batteries ordinaires (format AA) qui sont au nombre de quatre, la SDR2
cam-parte une petite pile interne qui assure une reserve de courant pour permet-tre le changement des batteries lors d'une utilisation au champ.
Les programmes que le SDR2 possede en memoire morte sont en
quetque sorte des gestionnaires de donnees pour la station totale. Car le SDR2
ne se contente pas de recevoir passivement l'information de la station totale, il corrige) les donnees reques selon les parametres d'utilisation mentionnes precedemment, et transforme les angles et les distances corriges en
coor-donnees de type X-Y -Elevation (Est et Nord remplacent X et Y dans le jargon
de la station). 11 pose de plus des q'uestions
a
l'op8rateur de la station quant aux coordonnees du point de depart, conditions atmospheriques, hauteur de la mire et changements de station.lllui permet aussi d'entrer un code, lors de la prise de chacun des points, qui ldentifle le ty()e de lecture prise (ex: T f:X>Ur terrain, F pour fosse et B pour tout ce qui est b§timent).~~
C'est done un micro-ordinateur qui r~it des indications physiques de la
station quant aux correct I~ apporter aux donnees qui entreront par la suite,
et qui met en memoire taus les resultats ainsi obtenus. Cela nt3cessite done une p8riode de calcul au cours de laquelle le calepin ne peut plus recevoir
d'information. Les programmeurs du SDR2 ant done decide que ces
opera-tions auraient lieu lors des changements de station au champ (pour ne pas in-staller la confusion dans l'esprit du lecteur: lorsqu'il est question de changement de station, cela signifie que l'on change la position de la station totale sur le terrain afin de prelever d'autres points). Le microprocesseur du calepin n'etant pas tres puissant, il faut parfois attend re jusqu'a trente minutes, le temps n8cessaire au calepin pour tout faire ses devoirs, avant de pouvoir
poursuivre
a
une nouvelle station. Du rant ce delai, les operateurs en profitentpour demenager la station totale et la remettre au niveau a la position de la nouvelle station au champ.
RECEPTION DES DONNEES SUR COMPATIBLE PC
De retour au bureau, les operateurs doivent transferer le contenu du calepin electronique sur un support lisible par un ordinateur compatible PC. Cela se fait done par la meme interface, une prise
a
plusieurs branches ( .. pins .. ) situee sur le face supt1rieure du calepin, qui a reQu les informations de la sta-tion totale. Le meme cable qui faisait la liaison avec la stasta-tion se voit rajouterun adapteur afln de se connecter a la prise serie (RS-232) du compatible PC.
Puis,
a
partir de l'ordinateur, on lance un petit programme en Basic fourni par le revendeur, qui assurera par la communication en serie le .. dumpage" dedonnees du calepin sur une disquette ou le disque dur. Ce programme r~it
le contenu du calepin sous le format ASCII et le sauve sur la disquette ligne par ligne sous ce meme format en fichier sequential. Tout cela peut s'effectuer
a
differentes vitesses, mais la communication se fait de maniere optimale (le plus rapidement sans qu'il y est pour autant d'erreur)a
1200 bauds. En general, un releve de 250 fX>ints (le maximum que permet les 64K du calepin) requiere une benne vingtaine de minutes fX>Ur le transfert sur disquette.Une fois le contenu transfere et seulement alors, le calepin permettra l'effacement du contenu de la memoire. De maniere evidente, un temps enorme vient d'etre epargne par rapport
a
la methode traditionnelle ou on devait d'abord reduire le calepin de notes (falre les ajustements angulalres et la difference des fils stadimetriques)a
la main, puis communiquer unea
unea
l'aide du clavier les donnees a l'ordinateur.FICHIERS DE DONNEES DU CALEPIN
Voici
a
quoi ressemble un fichier sEquential ecrit sur la disquette lors du transfert des donnees du calepin:OONMSDR2 V02-08S(3)843205-0ct-88 18:48 111111 1 ONMLOISELLE 08NM1. 00000000 13CPSea level cm: N 13CPC and R cm: N 13CPAtmos cm : N 13TS04-0ct-88 10:51 01NM: 0.000 000000 00000031 02lV00012000. 000 2000.000 50.000 081<100093000. 000 2000.000 03NM2.400 09F1 0001 00094.877 85.97500 357.85187 09F1 00011 00019.033 88.57778 188.92058 BPOR 09F1 00011 0019.580 81.98887 180.17111 BPOR 09F1 00011 00237.945 87.28194 1 07.13083 FOSSE 09F1 00011 003+1.598 87.87750 1 00.83558 FOSSE 09F1 00011 00448.471 87.89056 108.06944 FOSSE 09F10001100558.072 88.26833 111.16361 FOSSE 09F1 0001100682.050 88.40583 111.69811 FOSSE 09F10001100784.197 88.51333 104.57894 FOSSE 09F10001100895.241 89.14722 114.37839 BPOR 09F10001100997.825 88.84417 114.18811 FOSSE 09F100011010102.239 88.801&4 109.51444 FOSSE 09F1 00011 011152.118 90.18472 288.70528 ST A 121V0001 012 09MC0001 00095.282 112.92829 0.00000 09MC00011 00019.041 93.80582 191.08889 BPOR 09MC00011 0019.528 98.41312 182.31944 BPOR 09MC00011 00237.907 90. 907~ 109.27917 FOSSE 09~0001100344.585 90.78204 102.98389 FOSSE 09MC00011 00448.442 90.72844 110.21778 FOSSE 09MC00011 00558.051 90.72127 113.311 &4 FOSSE 09MC00011 00882.030 90.82237 113.84444 FOSSE
09MC0001100784.180 90.85589 108.72528 FOSSE 09MC00011 00895.238 90.59111 118.52472 BPOR 09MC0001100997.808 90.24997 118.31444 FOSSE 09MC00011 01 01 02.209 89.94705 111.88278 FOSSE 09MC00011 011152.142 91.08858 288.85381 ST A 081V1 0001981.354 1998.352 48.738 BPOR 081V1 0011990.542 1999.617 48.936 BPOR 081V10021987.486 2035.777 49.399 FOSSE 081V10031989.988 2043.422 49.407 FOSSE 081V1 0041983.260 2045.454 49.384 FOSSE 081V10051977.820 2051.471 49.294 FOSSE 081V10061974.926 2056.732 49.326 FOSSE 081V1 0071981.531 2061.460 49.266 FOSSE 081V1 0081957.472 2085.207 49.017 BPOR 081V1 0091956.643 2087.670 49.573 FOSSE 08lV10101962.270 2094.990 50.0fM FOSSE 081V1 0112049.156 1856.048 47.163 STA 02TV1 0112049.156 1856.046 47.163
Au tout debut du fichier on retrouve d'abord les informations qui sont relit9es a l'identification de l'ouvrage: date et heure du transfert (OONM), et nom donne au releve (10NM). Puis viennent les conditions atmospheriques (13CPS, 13CPC et 13CPA), qui sont presque toujours omises par les operateurs. Arrivent ensuite le debut de releve avec la date et l'heure (13TS), lescoordonnees du point de depart donnees par l'op8rateur (02TV), celles du backside pour fixer I' azimuth g8ographique zero (08KI) et la hauteur de la mire (03NM).
Suite a ce preambule, peuvent enfin commencer les lectures des differents points visas au cours du releve. Toute ligne commenQSnt par "09F1 .. correspond aux lectures brutes (non corrigt9es) prises par la station totale. La premiere de ces lectures (09F1 0001
ooo ... )
est reservee au backside pris sur le terrain et c'est ce point qui fixera I' orientation de l'azimuth zero: les coor.-donnees 3000.000 et 2000.000 du 1108KI11
n'ont
ete
spScifiEies que pour indi-quer que le backside correspond au Nord relatlf du releve. Les lectures de veritables points succecJent a celles du backside jusqu'a ce qu'on rencontreun 11
121VI qui indique la fin des lectures prises
a
la premiere station, le numero de celle-ei (0001) et le nombre de points vis8s (012). Puis le calepin se meta
caleuler les lectures corrigees, auxquelles corresr:x>ndent les 1109MC ... Elles ant le meme format que les 11
09F1 .. , mais toutes les corrections dues au rajuste-ment
a
l'azimuth zero, aux variables atmospheriques,a
la justesse de la mise au niveau ainsi qu'aux ehangements de hauteur de la mire ant ete apportees. Ce sont done les valeursa
partir desquelles les coordonnees deflnitives de ehaque point sont caleulees par trigonometrie. Celles-ci correspondent aux.. oaw·
et apparaissenta
la suite des 1109MC ... II est aussi
a
noter que le format pour les coordonnees ne renferme plus le numero de la stationa
partir de la-quelle on a vise, contrairement aux deux autres formats, mais seulement le numero du point, suivi des coordonnees Est, Nord et elevation. Le code, lui apparaTt toujoursa
la fin de la ligne. Lors d'un ehangement de station (ce qui n'est pas le cas pour le fichier de l'exemple qui ne demontre qu'une seule sta-tion, 0001 ), le calepin prend les coordonnees calculees de la nouvelle station et ce sont celles-ei qui deviennent l'origine relative pour le caleul des coor-donnees suivantes.Faisons maintenant une petite recapitulation: ehaque fiehier provenant du calepin comporte une intrcx:tuction comprenant les details techniques, puis pour ehaeune des differentes stations sur le terrain, la serie des lectures brutes (09F1 ), des lectures corrig9es (09MC) et des coordonnees des differents points. 11 y a done trois series de mesures pour ehaeun des points pris au champ.
NECESSITE o·uN EDITEUR-CORRECTEUR POUR
lES FICHIERS DU CALEPIN
Tout ceci sera it bien beau si la station to tale savait corriger les erreurs de manipulation des operateurs, si ceux-ci ne commettaient aucun oubli dans les entrees au calepin et si tout cet 9quipement sophistique fonetionnait exacte-ment comme il l'est indique dans leur manuel d'instructions. Mais, on s'en doute bien, la perfection n'etant pas de ce monde, surtout celui des
manipula-tions de donnees par material informatique, il s'est avere qu'un pourcentage non n8gligeable (plus de 40%) des reveles faits
a
l'aide de la station totale et du calepin electronique n8cessitaient differents types de correction.L'erreur la plus courante consiste en un dtlcalage angulaire de taus les rx>ints pris
a
une station donnee. En effet, les r:x>ints semblent dtlcales d'un certain angle par rapport a un centre de rotation, qui s'est avere etre la posi-tion de la staposi-tion concernee. Apres ptusieurs heures de dechiffrage du .. listing .. des fichiers, j'ai constate que le calepin, et la je ne saurais expliquer pourquoi, fait quelquefois une erreur de calcul dans l'angle de correction qu'il doit ajouter ou en lever aux lectures .. 09F1 .. de I' angle horizontal pour les rend re relativesa
I' azimuth zero du releve. Dans ce cas, il faut done corriger les lectures 1109MC .. (qui sont supposSes etre les corrections definitives des 11
09F1 .. ) en
y
ajoutant l'angle de correction trouve a partir des donnees obtenuesa
la station precedente au sujet de la pr9sente station et du backside cons8cutif. A I' aide de ces indications, on f)eUt evaluer de maniere rigoureuse la continuite des lectures prises.Une autre cat9gorie d'erreur englobe toutes les avaries techniques qui r:>euvent arriver au champ et au tranfert des donnees. Par exemple, apres un changement de batteries durant un releve, on constate une alteration d'une partle des donnees contenues dans le calepln. La station totale perd alors ses
valeurs de reference et on doit continuer en commen~nt un nouveau releve.
11 faudra done par la suite etablir les coordonnees
a
partir des lectures partiel-les et fusionner le nouveau releve avec celui initialement commence. Tout cela nt3cessitera un editeur approprie pour manipuler les donnees obtenues et ef-fectuer les calculs d'usage. D'autres erreurs qui causent a peu pres les memes anomalies: accrochage et derE)glement de la station totale durant la prise de lecture, mauvaise sequence de touches sur le clavier du calepin, lancement d'un autre programme de gestion du calepin et transmission irr9guliere lors du .. dumpage .. des donnees.Enfin, il
y
a les erreurs proprement humaines. Du genre: des codesinap-propries ont ete entres lors du releve, ou lors d'un second releve sur un meme
terrain, les oper~teurs ont oublh3 de donner les bonnes coordonnees du point
de depart. Celles-ci sont les plus simples
a
corriger car elles n8cessitent soitune intervention d'edition ponctuelle ou une correction globale sans dis-crimination.
Cela definit en gras les options et les possibilites que devrait offrir routil de correction
a
batir. Mais on devra aussi considerer le fait que les donnees obtenues du calepin, meme lorsqu'elles sont entierement depourvues d'erreur, ne constituent qu'un ramassis compact d'informations qu'il faudra maintenant interpreter et ideatement traiter directementa
l'aide de l'ordinateur. C'est pourquoi, afin d'obtenir en bout de ligne un produit fini qui ressemblea
un plan de drainage ou de localisation avec tout l'apparat d'usage, it faudra aussi pouvoir transferer ces donnees dans tes logiciels specialises en design et dessin technique.PROGRAMME TOPO.BAS
Evidemment, j'aurais bien aime que le calepin electronique se contente de stacker les lectures d'angles et de distances prises par la station totale. 11 aurait ete beaucoup plus facile d'ecrire un programme qui reprennait ces donnees brutes et les convertissait en coordonnees X-Y-Eievation. L'intt9grite des calculs aurait ete assuree par la rigueur du code source. Mais, comme je devais composer avec le materiel existant, je me suis done mis
a
la tache d'ecrire un programme qui decortiquerait pasa
pas le fichier procJuit par le calepin et reconstituerait taus les catculs et les etapes cruciales du releve afin de pouvoir detecter toute source d'erreur dans le traitement des donnees. Le pr()(Jramme devait aussi cam porter des facilites pour proc::edera
la correction de la grande majorite des erreurs rencontrees. Et enfin, il devait permettre la creation de fichiers au formats compatibles avec Autocad et Land I m prove, les deux logiciels utilises au bureau pour la conception des differents plans.Pour reussir dans cet entreprise, il fallait fragmenter l'ensemble du travail
a
effectuer en plusieurs petites taches. L'emploi d'un langage de programma-tion structure s'imFX>Sctit done. Ayant de sol ides bases de programmaprogramma-tion en Basic, je fut tres heureux de constater que la version 4.0 de QuickBasicper-mettait une approche _structuree et des possibilites de n3cursivite. Je n'avais done pas
a
faire l'apprentlssage d'un nouveau langage mais seulementa
ap~ prlvolser le puissant envlronnement de travail du QulckBaslc 4.0 .A fin de rendre avec justesse I' elaboration du programme TOPO.BAS, je vais done entreprendre la description du programme partle par partie , solt chaque sous~programme (par ordre alphabetlque de leur nom) avec
ses
utlllsatlons et sa formulation precectant le code source. Je ne feral qu'une ebauche sommalre de chacun en lalssant les details a l'analyse du code source. L'evolutlon de la resolution des tachesa
rempllr devralt alnsl sembler plus claire et credible.r1_
I
Programme prlnclpallAvant de pouvolr generer du code, 11 faut etabllr les dlfferentes taches
a
accompllr. C'est ce qui est faita
l'alde des Instructions DECLARE et de leurs arguments propresa
chaque sous-prCXJramme. Puis, on retrouve le dimen-sionnement des differentes matrices nt3cessaires JX>Ur stacker les valeurs ob-tenues tors de la decortication du fichier ASCII du calepin. A l'aide de l'instruction TYPE, on etablit les trois principales structures de donnees: la matrice "Shor· qui renferme les indications pour chacun des points vises, la matrice .. Station .. qui retient taus les parametres propres aux differentes sta-tions et la matrlce .. Job" pour chacun des releves, s'ily
a fusion de flchlers.Avec I' instruction DIM SHARED, on fixe ensuite les constantes
et
les vari-ables qui dolvent etre globales au programme, car en QulckBaslc celles-cl sont locales aux sous-programmes,a
mains qu'on ne le specifle. On retrouve aussl deux fonctlons (fnxr et fnyr) pour le calcul de la positiona
l'ecran des fX>Ints affiches tors de l'ectition. Car toute fonctlon dolt etre declaree dans le programme principal.On a malntenant satlsfalt taus les prellmlnatres requts pour commencer
a
formuler les sous-programmes. Alnsl, des la fin des differentes declarations, on se dlrlge vers le sous- programme qui afftchea
l'ecran le menu des optionsoffertes par le programme. Voila, c'est deja fini pour le programme principal, car tout le reste est accompli par les sous-programmes.
DECLARE SUB sauvegarde () DECLARE SUB nettole () DECLARE SUB vtslon () DECLARE SUB correcteur () DECLARE SUB correction () DECLARE SUB retour.dos () DECLARE SUB flchler. dXf ()
DECLARE SUB landlmprove ()
DECLARE SUB flchler.xye (Nom.XYE$, Code.XYE$, lmpOouN$) DECLARE SUB menuprlnclpaJ ()
DECLARE SUB edition () DECLARE SUB Impression ()
D8flnttlon et dlmenalonnement du format des matr1cea
TYPE Coordonneea statlonNo AS INTEGER NoPosltlon AS STRING * 4 HauteurMire AS SINGLE F1 Distance AS SINGLE F1 Vertical AS SINGLE F1 Horizontal AS SINGLE MCDistance AS SINGLE MCVertlcaJ AS SINGLE MCHortzontaJ AS SINGLE Nord AS SINGLE Est AS SINGLE Elevation AS SINGLE Code AS STRING * 8 END TYPE TYPE Detalla Shotea AS INTEGER Polnteur AS INTEGER Numero AS STRING * 4 NordO AS SINGLE EttO AS SINGLE
ElevO AS SINGLE NoJob AS INTEGER F1VersHor AS SINGLE F1 VersVer AS SINGLE F1Vers01st AS SINGLE NostaDe AS STRING * 4 F1 DeHor AS SINGLE F1 DeVer AS SINGLE F1 DeDiat AS SINGLE MCVersHor AS SINGLE MCVersVer AS SINGLE MCVersDist AS SINGLE MCDeHor AS SINGLE MCDeVer AS SINGLE MCDeDist AS SINGLE END TYPE TYPE Speclflque NoPSta AS INTEGER NoDsta AS INTEGER Polnteur AS INTEGER No9000 AS INTEGER NbreShF1 AS INTEGER NbreShMC AS INTEGER NbreShlV AS INTEGER Reste AS INTEGER NordRef AS SINGLE EttRef AS SINGLE END TYPE
DIM SHARED NShob% NShotl%
=
2000DIM SHARED Shot(NShob%) AS Coordonneet DIM SHARED Statlon(20) AS Details
DIM SHARED Job(1 0) AS Speclflque DIM SHARED P9000(15) AS Coordonnees DIM SHARED Achler.ASC$(1 0)
DIM SHARED AchlerflnaJS DIM SHARED NombreShots% DIM SHARED RchlerEdHe$ DIM SHARED FlchlerTOP$
DIM SHARED CorrecUons$ DIM SHARED Rchlera$ DIM SHARED AbsentASC$ DIM SHARED VldeASC$ DIM SHARED Bate$ DIM SHARED lmprlmante$ DIM SHARED AbsentDXF$ DIM SHARED PI
DIM SHARED ConvA DIM SHARED NJ% DIM SHARED NbJob%
VldeASC$ = 'Non• AbsentASC$ = 'Non• lmprlmante$ = •out• AbsentDXF$
=
'Non• PI = 3.141593 ConvA = Pll180DEF fnxr (x, xmln, ratio, deltax)
posx
=
20 + CINT((Shot(x).Est · xmln) * (600 I (1.91 ratio) I deltax)) fnxr = posxEND DEF
DEF fnyr (x, ymln, rallo2, dettay)
posy = 270 · CINT((Shot(x).Nord · ymln) * 289 * ratlo21 dettay) fnyr = posy END DEF CALL menuprtnclpal CLS SYSTEM END
IGestion des erreursj
Contrairement ace que laisse penser le titre, cette portion du programme ne s'attaque pas aux erreurs des fichiers ASCII du calepin, mais plutot aux defaillances potentielles du programme. Eh oui, si l'on veut que le programme ait un minimum de contort d'utilisation, on doit prevoir des moyens de pallier
a
l'imprevisibillte de l'utlllsateur ou de la quincaillerie informatique c·hardware11) . 11 y a done une J.)etite routine de gestlon pour chacune de erreurs
r:x>tentlelles les plus susceptlbles de se produlre: le cas ou le flchler spSclfle par l'utlllsateur ne se trouve pas dans le directorie courant ("File not found"), celui ou le fichier est vide (bizarrement, cela se produit souvent), celui aussl ou le fichier nt3cessaire
a
la production du flchier compatible Autocad (.dxf) n'est pas accessible, et enfin le cas de l'imprimante qui ne repond pas. Bien sur, ily
a d'autres routines pour la gestion des erreurs qui se trouvent dans chacun des sous-programmes concernes.AchlerNonTrouve:
CLS
AbaentASC$ = •ou1•
PRINT I ALERTE MAlNE . . . ALERTE MAlNE . . . ALERTE MAlNE ... I
PRINT I Eh oul, 9a peut arrtver
a
tout l'monde ... •PRINT 'Le flchler . aac apeclfle ne ae trouve pas dans le dlrectorle courant • PRINT
PRINT 1Essayer un autre nom •
PRINT I ou•
PRINT •ones 'AsseZ' pour retoumer au menu principal et faJre• PRINT •un retour momentane au DOS pour trouver votre flchler. • PRINT
PRINT •Lea flchlera deja admla aeront alora oubllea et voua• PRINT 1devrez re commencer a les nommer. •
PRINT PRINT
RESUME NEXT
AchlerVIde: CLS
VldeASC$ = •out•
PRINT I ALERTE TURQUOISE ... ALERTE TURQUOISE ... ALERTE TURQUOISE ... I
PRINT : PRINT PRINT•
Le flchler •; Achler.ASC$(NJ%); • eat vtde. •
PRINT •cet Incident vous oblige a retoumer au menu principal (vous • PRINT •paasez GO mala ne pouvez r6clamer 200 dollara) et vous devr1ezi PRINT 'V6rlf1er par un retour momentan6 au DOS le contenu du flchle,.. PAINT •concem6. •
PRINT •Pressez une touche ... • w$ = 11 WHILEw$ = 11 w$ = INKEY$ RESUME NEXT DXFAbaent AbaentDXF$
=
•out• CLSPRINT • ALERTE BLEUE PALE... ALERTE BLEUE PALE... ALERTE BLEUE PALE ... •
PRINT : PRINT
PRINT I Le flchler •; Base$; I neceaaaJre pour la cr6allon•
PRINT • des flchlera . DXF ne se trowe pu dana le dlrectorle courant. • PRINT
•cet
Incident voua obligea
retoumer au menu principal (voua • PRINT •puaez GO mala ne pouvez r6clamer 200 dollars) et voua devrez' PRINT •sortlr de TOPO et copier le flchler •; Bue$; • dans te•PRINT •dtrectorle utilise si vous voulez faJre un flchler . DXF • PRINT •ult6rleurement. •
PRINT •Pre••ez une touche ... •
~ = 11
WHILEw$
= ..
w$ = INKEY$WEND
lmprtmanteFermee: lmprtmante$ = 'Non• PRINT : PRINT
PRINT I ALERTE POURPRE... ALERTE POURPAE... ALERTE POURPRE ... I
PAINT : PRINT
PRINT 'L'lmprlmante ne repond pas. • PRINT
INPUT • AJiumez ·la et preasez sur une touche pour conUnuer'; ouvert$ PRINT
RESUME
I
Sous- programme •correcteur"'l
Cette routine a pour principal but de faire apparaitre durant l'edition des coordonnees un tableau qui indique les n3sultats reelles et theoriques quant au transferts de station. S'il
y
a une trap grande difference (plus de 0.25 degre) entre les deux, il affiche la possibilite d'une erreur et l'angle de la correctiona
apporter. U ne boucle va judicieusement ( !) chercher les valeurs requises dans les dlfferentes matrices et effectue les calculs theorlques. C'est done lcl que s'offre la possibilite de corriger les erreurs dues au d9calage angulaire. Pour realiser la correction, on devra enchainer avec le prochain sous-programme c·correctlon11) .
SUB correcteur
UNE (280, 0)·(839, 214), , BF UNE (284, 4)·(835, 210), 0, BF
LOCATE 2, 37: PRINT • VERIACATION DES TRANSFERTS DE STATION' LOCATE 4, 37: PRINT 'Station Job AngCor AngTheo Detta•
LOCATE 25, 8: PRINT I
LOCATE 15, 37: PRINT • 1: RETOUR AU PlAN 2: CORRECTION';
rangee%
=
8FOR I
=
1 TO Job(NJ% · 1 ).NoDstaLOCATE ran gee%, 37: PRINT STR$(1) + ')' + station( I). Numero; LOCATE rangee%, 48: PRINT Statlon(I).NoJob;
TOPO.BAS
..
,MCV = statlon(l). MCVeraHor IF statlon(l). Numero = •ooo1• THEN
Oppo = statlon(I).Eato · Job(Statlon(I).NoJob).EatRef Adja = statlon(I).NordO · Job(Statlon(I).NoJob).NordRef IF Adja = 0 THEN
IF Oppo
=
0 THEN AngleVers=
90 ELSE AngleVers=
270 GOTO MCVEQEND IF
AngleVera = ATN(Oppo I Adja) * 380 I (2 *PI)
IF AngleVers
=
0 AND Adja 0 THEN AngleVers=
180 MCVEQ: MCV = AngleVeraEND IF
IF MCV 180 THEN Slgne = ·1 ELSE Slgne = 1 MCD = MCV + (Signe * 180)
AngCorTh = MCD · Statlon(I).F1 DeHor
AngCorPr = statlon(I).MCDeHor · statlon(I).F1DeHor Delta = AngCorTh · AngCorPr
LOCATE rangee%, 50: PRINT AngCorPr, LOCATE rangee%, 60: PRINT AngCorTh;
IF ABS(Detta) . 25 AND ABS(Detta) 359.75 THEN
Detta = INT(Detta * 1 00) 1100 LOCATE rangee96, 71: PRINT Den&; rangee% = rangee% + 1
LOCATE ran gee%, 40: PRINT •Posslblltte d'erreur a cette station t• rangee% = rangee% + 1
ELSE
LOCATE rangee96, 71: PRINT • r'U o•
END IF rangee%
=
rangee% + 1 NEXT I w$=
•go• WHILE w$ •atop• w$ = INKEY$ IF w$=
'11 THEN w$=
•atop•IF w$
=
•2• THEN CALL correction: w$=
•atop•WEND END SUB
I
Sous- programme •correction•!
Lorsqu'on a reussi
a
determiner la source de l'erreur et son amplitude, on doit maintenant avoir la possibilite d'apporter la correction en spe3cifiant les valeurs nt9cessaires. Pour ce faire, on appelle le sous-programme .. correction ..a
partir du tableau de verification des transferts de station C'correcteur'). Alors, en indiquant les correctifs (Nord, Est, elevation et angle)a
apporter et l'eten-due des points concernes (numero du releve, numero de station, points lnferleur et superteur), on dellmlte les crlteres de la correction. On enclenche par la suite la boucle qui prend unea
une les lignes des lectures pour chaque point (matrice .. Shot .. ), verifie si elle fait partie de l'etenduea
corriger et si cui, effectue les operations n8cessit8es par la correction.Des
la fin de ce proces-sus, on est redirige vers le sous-programme .. vision .. qui affichea
l'ecran I' ensemble des points ainsi obtenus.SUB correction AutreCorrect rg% = 2 UNE (8, 0)-(276, 214), 6, BF UNE (12, 4)-(272, 21 0), 7, BF LOCATE 15, 37: PRINT I
LOCATE rg%, 3: PRINT 1 CORRECTION 1
rg% = rg% + 2
UnNJ: LOCATE rg%, 3: PRINT 1
I·
'
LOCATE rg%, 3: INPlJT I No de Job: I; NJ$ JN
=
VAL(NJ$)IFJN = OTHEN
LOCATE 14, 3: PRINT I 11 faut preclaer
I•
'
LOCATE 15, 3: PRINT •1e numero de la Job •; GOTO UnNJ END IF rg%
=
rg% + 1 LOCATE rg%, 3: PRINT •..
' LOCATE rg%, 3: INPlJT 1 No de station: •; NS$ rg%=
rg% + 1TOPO.BAS
..
•Page 19
IF NS$ 11THEN
LOCATE rg%, 3: PRINT • •;
LOCATE rg%, 3: INPUT • No Shot lnf6r1eure:•; NSI$ rg% = rg% + 1
LOCATE rg%, 3: PRINT •
..
'
LOCATE rg%, 3: INPUT • No Shot Super1eure:•; NSSS rg,.; = rg,.; + 1
END IF
LOCATE rg96, 3: PRINT • LOCATE rgcr, 3: INPUT • Est rg% = rg% + 1
LOCATE rg%, 3: PRINT • LOCATE rg%, 3: INPUT • Nord: rg% = rg% + 1
LOCATE rg%, 3: PRINT •
LOCATE rg%, 3: INPUT • Elevation: rg% = rg% + 1 LOCATE rg%, 3: PRINT • •; ES$
..
'..
' •; NO$..
' •; EL$LOCATE rg%, 3: INPUT • Angle: •; ANS LOCATE 13, 3: PRINT • 1 : GO
LOCATE 1 .. , 3: PRINT • 2: Recommencer LOCATE 15, 3: PRINT • 3 : Retour au plan
wS = •go• WHILE w$ •stop•
w$ = INKEY$
IF w$ = •1• THEN w$ = •stop•
IF w$
=
•2• THEN GOTO AutreCorrect IF w$ = •3• THEN GOTO RnCorrect WENDIF NS$ = •• THEN NS = 0 ELSE NS = VAL(NS$) IF NSI$ = •• THEN NSI
=
0 ELSE NSI=
VAL(NSI$) IF NSS$ = •• THEN NSS=
0 ELSE NSS = VAL(NSS$) IF ES$= ••
THEN ES=
0 ELSE ES = VAL(ES$)IF NOS = •• THEN NO
=
0 ELSE NO=
VAL(NO$) IF EL$ = .. THEN EL = 0 ELSE EL = VAL(EL$) IF AN$ = .. THEN AN = 0 ELSE AN = VAL(AN$)SS = 0: ENE
=
0: NSIS=
0: NSSS=
0 IF NS = 0 THEN SS=
0 ELSE SS=
1IF (ES 0) OR (NO 0) THEN ENE
=
1DeltaN
=
NO · staUon(Job(JN). NoPSta). NordO deltaE = ES · statlon(Job(JN).NoPSta).EttO deltaEL = EL · statlon(Job(JN). NoPSta). EI8VO ELSEIF (ES = 0) AND (NO = 0) AND (El 0) THENENE = 2 deltaEL
=
EL DeltaN=
0 denaE= o
ELSE ENE=
0 DeltaN=
0 deltaE=
0 deltaEL =o
END IFIF (NSI 0) THEN NSIS = 1
IF (NSS 0) THEN NSSS = 1 IF AN= 0 THEN ANS = 0 ELSE IF SS= 1 THEN ANS
=
1 NO = Statlon(NS). NordO EO = statlon(NS).Esto ELO = staaon(NS). ElevOdenaA = AN * ConvA
ELSE
ANS = 2
NO
=
statlon(Job(JN). NoPSta). NordO EO = staaon(Job(JN).NoPSta).EstO ELO=
stallon(Job(JN).NoPSta).EievO deltaA = AN*
ConvA END IF END IFTOPO.BAS
Page 21
FORk = Job(JN)..Polnteur TO Job(JN + 1).Polnteur · 1 IF (Shot(k).Eievatlon) 0 AND (Shot(k).Nord 0) THEN
IF ENE = 1 THEN
Shot(k). Nord = Shot(k). Nord + DeltaN Shot(k). Eat = Shot(k). Eat + deltaE
Shot(k). Elevation = Shot(k). Elevation + denaEL END IF
IF ENE = 2 THEN
Shot(k). Elevation = Shot(k). Elevation + deltaEL END IF
IF ANS = 2 THEN
AdJ = Shot(k). Nord · NO Opp = Shot(k). Eat · EO
Distance = (Opp /'. 2 + AdJ A 2) /'. .5 IF AdJ = 0 THEN
IF Opp 0 THEN Angle
=
1. 5 * PI ELSE Angle= .
5 * PI ELSEIF (AdJ 0) THEN
Angle = ATN(Opp I AdJ) ELSE
Angle
=
PI + ATN(Opp I AdJ) END IFEND IF
Angle = Angle + deltaA
Shot(k).Nord = NO + (Distance* COS(Angle)) Shot(k). Est = EO + (Distance * SIN( Angle)) ·
END IF END IF NEXTk
IF ANS
=
1 THENstallon(NS). MCDeHor = Statlon(NS). MCDeHor + AN FOR I
=
Job(JN).Polnteur TO Job(JN + 1).Polnteur · 1IF (Shot(I).StallonNo = NS) AND (Shot(I).Nord 0) THEN 04
=
Shot( I). MCDistance * SIN( Shot( I). MCVertlcal * ConvA) Shot( I). MCHortzontal = Shot( I). MC HoriZontal + ANShot(I).Nord
=
NO + (o.f * COS(Shot(I).MCHorlzontal * ConvA)) Shot( I). Eat = EO + (o.f * SIN(Shot(l). MCHortzontaJ*
ConvA)) END IFEND IF
Corrections$ = -ou1• AnCorrect
END SUB
I
Sous- programme •edition•
I
11 representesansdoute la piece maitresse de tout le programme, car c'est ici qu'on reconstitue le developpement togique du reteve en isotant chacune des valeurs du fichier et en les plagant dans l'espace reserve en memoire par la structure de la matrice approprlee. Pour ce faire, des nombreux tests (IF ... THEN ... ) sent requis, car on doit aussi restituer la chronologle du releve. Une fois le fichier completement epluche et les valeurs mises dans les cellules de
memoire appropri8es, on possede alors una structure de donnees de type
relationnel sur laquelle it est beaucoup plus facile d'effectuer des corrections sur des elements inter-relies, comme les lectures d'un releve topometrlque. Enfin, seulement si cette etape est franchie avec succes, on pourra avoir acces aux outils de correction et de creation de fichiers.
SUB edition CLS
AchlerTOP$ = •Non• CorrectlonaS = •Non•
PRINT •fUSION ET EDmON DE ACHIER .ASC DU SDR2' PRINT I I
PRINT •Entrez lea flchler• dana l'ordre destre•
PRINT 'Tapez •Implement aur Enter sana rten ecrtre aprea le demler flchler' PRINT : PRINT : PRINT
N=O
CLOSE
ON ERROR GOTO AchlerNonTrouve NomS= 'OK'
WHILE NomS ••
IFN 0 THEN
Flchler.ASC$(N) = UCASE$(Nom$) + 1 .ASC1
OPEN Flchler.ASC$(N) FOR INPUT AS #1 CLOSE
IF AbsentASCS = •out• THEN AbsentASCS = 'Non•
N = N -1
IFN = 0 THEN PRINT 1
Aucun flchler.ASC accept& juaqu'i priaenr PRINT
ELSE
PRINT • Achler( a) d6Ja ad m la : • FORk= 1 TON PRINT Flchler.ASCS(k) NEXTk PRINT END IF GOTO NomAchler END IF
PRINT Flchler.ASCS(N): PRINT END IF
NomAchler: INPUT 'Nom de flchler a 6dtter'; NomS IF UCASES(NomS) = 'ASSEZ' THEN GOTO NoEdlllon N=N+1
WEND
CLS
PRINT : PRINT NFichler = N · 1
IF NFichler = 0 THEN GOTO NoEdltlon
IF NAchler 1 THEN
INPUT •oonnez le nom du noweau flchler cr66 ( 5 letlres maximum )'; nnomS PRINT : PRINT
Lnn = LEN(nnom$)
IF Lnn = 5 THEN Rnn = Lnn ELSE Rnn = 5
FlchlerFinaJS = UCASES(LEFTS(nnomS, RM)) + 'TOP.ASC1
PRINT 'Fusion de •; NFichler; • flchlen .ASC' PRINT •source : •; Flchler.ASC$(1 ); 1
Deatlnalon: •; FlchlerAnaiS FOR y = 2 TO NFichler
PRINT 1
•; Flchler.ASC$(y)
Flchlen$
=
·o~1·ELSE
Lnn = LEN(Fichler.ASC$(1 ))
IF Lnn
=
5 THEN Rnn=
Lnn ELSE Rnn = 5Achlerflnal$ = LEFTS(Achler.ASC$(1 ), Ann) + 'TOP.ASC' PRINT 'Pas du fusion, un aeul flchler source: •; Rchler.ASC$(1)
Flchlers$ = 'Non• END IF
PRINT : PRINT : PRINT
PRINT • un petit Instant, Je r8flechls ... • IF RchlerEdlte$ = •out• THEN CALL nettole
N9000%
=
10 Nsta% = 0 NSh% = 0 Job(O).Polnteur =o
DenaN = 0 NbJob% = 0 NJ% = 1 NombreShob% =o
AutreJob: ERASE P9000 F1 Nbre9000% =o
MCNbre9000% = 0 TVNbre9000%=
0 F1Nbre%=
o MCNbre%=
0 TVNbre%=
0 INTE = 1Job(NJ%). NoPSta
=
NSta% + 1Job(NJ%). Polnteur = Job(NJ% · 1 ). Polnteur + DenaN NSh%
=
0OPEN Rchler.ASC$(NJ%) FOR INPliT AS #1 ON ERROR GOTO Rchlei'VIde
AutreRecord: INPUT #1, A$
IF VldeASC$ = 'Oul' THEN VldeASC$ = 'Non• GOTO NoEdttlon
END IF
teatpre$
=
te·•tS teat$ = LEFT$(AS, 4)nothS
=
~~s, s,4Jnoaho%
=
V~nosh$)IF test$ = 108KI1 THEN
Job(NJ9b).NordRef = VAL(MIDS(AS, 9, 8)) Job(NJ%).EstRef = VAL(MIO$(A$, 19, 8)) END IF
IF test$ = 1
021'\1" THEN
IF MID$(A$, 5, 4) •ooo1• THEN INTE = INTE * ·1
IF INTE
=
1 THEN GOTO Saute END IFNsta% = Nsta% + 1
Statlon(Nsta%).NoJob = NJ%
statlon(Nsta%).Polnteur
=
Job(NJ%).Polnteur + NSh% Statlon(Nsta%).Numero = MIDS(A$, 5, .f)NO$ = MID$(A$, 9, 8): statton(Nsta%).Nord0
=
VAL(NO$) EO$ = MID$(A$, 19, 8): statlon(Nsta%).Eat0=
VAL(EO$) ELO$ = MID$(A$, 29, 8): statlon(Nsta%). EI8VO = V AL(ELO$)Saute:
staNum% = VAL(MID$(A$, 5, 4))
END IF
IF test$
=
•o3NM• THEN hautrnlre=
VAL(MID$(A$, 5, 5))IF teat$ = •oeF1• AND no•hS = •oooe• THEN statton(Nsta%). NostaDe
=
no•hSStatlon(Nsta%).F1DeDitt
=
VAL(MID$(A$, 13, 7))Stallon(Nsta%).F1DeVer = VAL(MID$(A$, 23, 7))
stallon(Nsta%).F1DeHor
=
VAL(MID$(A$, 33, 7))GOTO AutreRecord END IF
IF teat$ = •o9F1' AND noaho% staNum% THEN NoMat
=
Job(NJ%).Polnteur + staNum% · 1 000staaon(Nsta%). NoStaDe = MIDS(A$, 9, 4) staaon(NSta%).F1 DeDitt
=
VAL(MIDS(A$, 13, 7)) statlon(Nsta%).F1DeVer=
VAL(MIDS(AS, 23, 7))statlon(Nsta%).F1 DeHor = VAL(MID$(A$, 33, 7)) statlon(Nsta%). F1 VersDist = Shot(NoMat). F1 Distance statlon(Nsta%). F1VersVer = Shot( No Mat). F1 VerUcal Statlon(Nsta%).F1VersHor = Shot(NoMat).F1 HoriZontal GOTO AutreRecord END IF IF test$ = '09F1' THEN IF nosho% = 9000 THEN F1 Nbre9000% = F1 Nbre9000% + 1 NoMatrtce% = F1 Nbre9000% P9000(NoMatrtce%).F1Distance
=
VAL(MIDS(A$, 13, 7)) P9000(NoMab1ce%).F1VerUcal = VAL(MIDS(A$, 23, 7)) P9000(NoMab1ce%).F1Hortzontal = VAL(MID$(A$, 33, 7))P9000(NoMatrlce%). Code = MID$(A$, ~3, 8)
P9000(NoMatrlce%). staaonNo = Nsta% P9000(NoMatrtce%).NoPosltlon
=
nosh$ P9000(NoMatr1ce%). HauteurMire = hautrnlre ELSEF1 Nbre% = F1 Nbre% + 1
NoMab1ce% = Job(NJ%).Polnteur + nosho% · 1000 Shot(NoMatrlce%). F1 Distance
=
V AL(MID$(A$, 13, 7))Shot(NoMalrtce%).F1Vertlcal = VAL(MID$(A$, 23, 7))
Shot(NoMab1ce%).F1Hortzontal = VAL(MIDS(A$, 33, 7))
Shot(NoMalrtce%). Code = MID$(A$, .f3, 8)
Shot(NoMatrlce%). StatlonNo = Nsta% Shot(NoMab1ce%). NoPosltlon = nosh$ Shot(NoMab1ce%).HauteurMire = hautrnlre END IF END IF IF teat$
=
'121V' THEN Stalon(Nsta%).Shotes = VAL(MID$(A$, 9, 3)) END IFIF teat$ = '09MC' AND noahS = '0009' THEN
statlon(Nsta%).MCDeDiat = VAL(MID$(A$, 13, 7))
statlon(Nsta%). MCDeVer
=
V AL(MID$(A$, 23, 7))stallon(NSta%).MCDeHor = VAL(MIDS(A$, 33, 7))
GOTO AutreRecord END IF
IF teat$ = •o9Mc• AND noaho% staNum% THEN NoMat = Job(NJ%). Polnteur + staNum% · 1 000 statlon(Nsta%).MCDeDist = VAL(MIDS(A$, 13, 7))
statlon(NSta%).MCDeVer = VAL(MID$(A$, 23, 7))
statlon(Nsta%).MCDeHor
=
VAL(MIDS(A$, 33, 7))staUon(Nsta%). MCVersDist = Shot(NoMal). MCDistance staaon(Nsta%). MCVersVer = Shot(NoMat). MCVer11caJ statlon(Nsta%). MCVersHor = Shot( No Mal). MCHortzontal
GOTO AutreRecord END IF IF test$ = 1 09MC• THEN IF nosho% = 9000 THEN MCNbre9000% = MCNbre9000% + 1 NoMatr1ce%
=
MCNbre9000% P9000(NoMatrtce%).MCDistance = VAL(MIDS(A$, 13, 7)) P9000(NoMatrtce%).MCVer11cal = VAL(MIDS(A$, 23, 7)) P9000(NoMatrtce%).MCHortzontal = VAL(MID$(A$, 33, 7)) ELSE MCNbre% = MCNbre% + 1NoMatrtce% = Job(NJ%). Polnteur + nosho% · 1 000 Shot(NoMab1ce%).MCDittance = VAL(MID$(A$, 13, 7))
Shot(NoMatrtce%).MCVer11cal = VAL(MID$(A$, 23, 7))
Shot(NoMab1ce%).MCHortzontal = VAL(MIDS(A$, 33, 7))
END IF END IF
IF teat$
= •oslV'
THENnoshtv% = VAL(MIDS(A$, 5, 4))
IF nosht\1% = 9000 THEN
TVNbre9000% = 1VNbre9000% + 1 NoMatr1ce%
=
TVNbre9000%P9000(NoMatrtce%). NoPotltlon = MIDS(A$, 5, 4)
P9000(NoMab1ce%).Nord = VAL(MIDS(A$, 9, 8))
P9000(NoMatrtce%).Est
=
VAL(MID$(A$, 19, 8))P9000(NoMatrtce%). Elevation = V AL(MIDS(A$, 29, 8)) P9000(NoMatrtce"). Code = MID$(A$, 39, 8)
NombreShotl% = NombreShots% + 1
ELSE
NoMatrtce% = Job(NJ%). Polnteur + noahtv% · 1 000 Shot(NoMatrtce%).NoPoaiUon = MID$(A$. 5, A1) Shot(NoMatrtce%).Nord
=
VAL(MID$(A$. 9, 8))Shot(NoMatrtce%).Eat = VAL(MID$(A$, 19, 8)) Shot(NoMatrtce%).Eievatton = VAL(MIDS(AS, 29, 8))
Shot(NoMatrlce%). Code = MIDS(A$, 39, 8) NombreShots% = NombreShot8% + 1 END IF
END IF
AnAchler: IF NOT EOF(1) THEN GOTO AutreRecord CLOSE #1
IF teat$ = •o2TV" OR teatpre$ = 1
02TV" THEN Nsta%
=
Nsta% · 1GOTO TVOk END IF
PHShot = VAL(Shot(Job(NJ%).Polnteur + TVNbre% · 1).NoPoaltlon) IF (staNum% + 2) PHShot THEN
Nsta% = Nsta% · 1 END IF
TVOk:
Job(NJ%). NoDsta = Nsta%
Job(NJ%). No9000 = F1 Nbre9000% FOR I = 1 TO F1 Nbre9000%
NoMatr1ce%
=
Job(NJ%). Potnteur + F1 Nbre% + I · 1 Shot(NoMatr1ce%). stattonNo=
P9000(1). stattonNo Shot(NoMatr1ce%). NoPoaltlon = P9000(1). NoPoaltlon Shot(NoMatr1ce%). HauteurMire = P9000(1). HauteurMire Shot(NoMatr1ce%). Code = P9000(1). CodeShot(NoMatr1ce%). F1 Dlatance = P9000(I). F1 Dlltance Shot(NoMatrtce%). F1 Vertical = P9000(1). F1VerUcal Shot(NoMatrtce%). F1 Hor1zontal
=
P9000(1). F1 Hor1zontal Shot(NoMatrtce%). MCDtatance = P9000(1). MC Distance Shot(NoMab1ce%). MCVerUcaJ = P9000(1). MCVertlcaJ Shot(NoMatrtce%).MCHor1zontal=
P9000(1).MCHor1zontal Shot(NoMatrtce%). Nord = P9000(1). NordShot(NoMatr1ce%).E8t = P9000(1).Est
Shot(NoMatrtce%). Elevation
=
P9000(1). ElevationNEXT I
Job(NJ%). NbreShF1 = F1 Nbre% + F1 Nbre9000% Job(NJ%).NbreShMC = MCNbre% + MCNbre9000% Job(NJ%).NbreSh1V
=
TVNbre% + TVNbre9000%Job(NJ%). Reste = F1 Nbre% · TVNbre% NbJob% = NbJob% + 1
NJ% = NJ% + 1
IF Job(NJ% · 1).NbreShTV Job(NJ% · 1).NbreShF1 THEN DenaN = Job(NJ% · 1).NbreSh1V
ELSE
DenaN = Job(NJ% - 1 ).NbreShF1 END IF
IF NJ% NBsbler THEN GQTQ AutrnJgb
Job(NJ%).Polnteur = Job(NJ% · 1).Polnteur + DeltaN RchlerEdlte$ = •out•
IF ((F1 Nbre% + 2) I (TVNbre% + 1)) 1 THEN AchlerTOP$ = •out•
PRINT : PRINT • H6 Oh, 9a y est, faltes une touche• w$ = 11
WHILE w$ = •• wS
=
INKEYS WENDCALL vision
IF CorrecUons$ = •out• OR Rchlert$ = •out• THEN CALL sauvegarde
ELSE
IF Rchlera$ •ou1• THEN RchlerAnal$ = Achler.ASC$(1) END IF
NoEdltlon: CLOSE
I
Sous-programme •fichier
.dxr
I
Une autre partie imJJOrtante du programme, c'est le module de creation de fichiers compatibles, et done acceptables par Autocad. Ce sous-programme est essential car il permet l'utilisation direct du logiciel de dessin technique pour traiter les donnees et commencer les plans. On evite ainsi d'avoir a entrer les points una una l'aide du clavier, comme cela se faisait avant I' acquisition de la station totale. Egalement, la beaute de cette operation reside dans le fait que les coordonnees d'un point au champ seront les memes que celles qu'affichera Autocad une fois le transfert effectue. Cela nous r:>er· mettra de travailler en echelle reelle dans Autocad (merveilleux pour les mesures de distance entre deux points).
Autocad repr8sente un puissant et tres flexible outil de design et de preparation des plans finaux. 11 est done avantageux de s'en servir le plus tot possible dans le processus de design. Cela explique l'importance de ce module de creation, car on devait disposer le plus rapidement possible d'un outil nous permettant de transferer les donnees du calepin electronique dans Autocad afin de beneficier du maximum d'economie de temps que la station totale devait apporter. Bref, on parte ici de la justification et du recouvrement des
coats
du nouvel equipement.Pour accomplir cette tache, j'ai con~u un sous-programme qui cree un
fichier au format DXF, qui est de type ASCII et qu'Autocad utilise pour echanger avec d'autres logiciels, a partir des coordonnees renfermees dans les fichiers du calepin. Pour arriver a cette fin, il faut d'abord placer un pream-bule assez considerable dans le fichier DXF (toutes ces donnees sont stocktles dans le fichier BASE.DXF et recopier dans le fichier cree), qui donnera a Autocad toutes les indications concernant les variables et les parametres du dessin ainsi produit. Car il s'agit bien d'un dessin a part entiere que l'on retrouve dans le fichier DXF. Chaque coordonnee est done representee par une petitecroix dont
I'
intersection (plus aiseea
saisir de maniere precise dans Autocad) E!quivaut a la position exacte du point pris au champ. De plus, afin de J:>ermettre une identification rapide, le texte de l'elevation (ex.: 50.78), donton peut choisir la grosseur et l'orientation en fonction de la proximite des differents points, apparaltra
a
proximite de la croix. Chaque point sera aussi reprt3sente sur une couche ("layer") de couleur spt9cifique au code don ne lors du releve au champ.Voila en gros ce que realise le sous-programme "fichier.dxf• a I' aide d'un classeur de code et des lectures et ecritures sur fichiers s8quentiels. 11 est aussi a noter que le fichier DXF, qui sera appele dans Autocad par la fonction DXFI N, se revele etre tres volumineux. Car on se sert ici du texte pour faire la descrip-tion d'un dessin.
Exemple d'une infime partie du contenu d'un fichier DXF
,
END SEC ~ 0 SECTION 2 BLOCKS 0 ENDSEC 0 SECTION 2 ENTITIES 0 TEXT 8 BATlMENT 10 19s.t.371 20 1977.959 40 2 1 48.73 50 45 0Portion aggrandie (zoom) du dessin obtenu dans Autocad
a
partir d'un fichier DXF cree par le sous-programme "fichier.dxf':SUB flchler.dxf
CLOSE
CLS
PRINT 'CREATION DU FlCHIER DXF POUR AUTOCAD' PRINT : PRINT
PRINT • Flchler
a
convertlr: •, AchlerAnaJ$: PRINT INPUT 'Hauteur du texte dans Autocad'; HTINPUT 'Angle de rotation du texte•; Angle INPUT •auelle version d' Autocad'; Version$
IF Version$
=
'2.17' THEN Base$=
'BASE2. DXP ELSE Base$=
'BASE. DXPCA= .017453
ANG = Angle * CA
ANGT = ANG + .2573
OXFS = LEFT$(FichlerFinal$, LEN(FichlerFinal$) · 4) + •.oXP PRINT : PRINT : PRINT I
TEXT$ = 'TEXT'
UNE$
=
'UNE•Achler prodult •. DXFS
ON ERROR GOTO DXFAbsent OPEN Base$ FOR INPUT AS #1 IF AbsentDXFS = •ou1• THEN
AbsentDXF$ = 'Non• GOTO AnDXF
END IF
OPEN OXF$ FOR OUTPUT AS #2
utbate: INPUT #1, b$
IF NOT EOF(1) THEN GOTO CopleBue ELSE GOTO FermeBue CopleBase: PRINT #2, b$
GOTO utbase
FermeBase: CLOSE #1 FOR J = 1 TO NbJob%
FOR I = Job(J). Polnteur TO Job(J + 1 ). Polnteur · 1 IF Shot(l). Nord 0 THEN
NO = INT(1 000 * Shot( I). Nord): NO = NO /1 000 EO = INT(1 000 * Shot(l). Eat): EO = EO /1 000 ELVO
=
INT(100 * Shot(I).Eievatlon)ELVO = ELVO /100: EL V$ = STR$(ELVO)
LONGE = LEN(ELV$): ELVF$ = RIGHT$(ELV$, LONGE · 1) CODE1 $ = LEFT$(Shot(l). Code, 1)
CODE2$ = LEFll(Shot(l). Code, 2)
XT = EO· (1.985 *HT* COS(ANGn): XT = INT(1000 * XT) /1000
YT
=
NO · (1.985 *HT* SIN(ANGT)): YT = INT(1000 * YT) /1000 Delta = HT * . 2: Delta = INT(1 00 * Delta) /1 00XL 1
=
EO · Delta: YL 1=
NO + DeltaXL.2 = EO + Delta: YL2 = NO · Delta
XL3 = EO · Delta: YL3 = NO · Delta XL.4
=
EO + Delta: Vl4=
NO + DeltaPT$ = 'PT"
IF COOE1 $ = rr" THEN LA VER$ = 'TERRAIN•: GOTO Quellelayer IF CODE1$ = •p THEN LAYER$
=
'FOSSE•: GOTO Quellelayer IF CODE2$ = •eo• THEN LA VER$ = •eo•: GOTO QuellelayerIF CODE1S
=
•A• THEN LAYERS=
•ARBRE•: GOTO Quellelayer IF CODE2S=
•RN• THEN LAYERS=
•RN•: GOTO Quellelayer IF CODE1 S=
•e• THEN LA YEAS=
1BAT1MENT": GOTO Quellelayer
IF CODE2S = •eH• THEN LAYER$ = •cHEMIN•: GOTO Quellelayer LA VER$ = 1RESTE•
Quellelayer: PRINT #2, TEXTS
PRINT #2, 8 PRINT #2, LAYERS PRINT #2, 10 PRINT #2, XT PRINT#2, 20 PRINT #2, YT PRINT#2, 40 PRINT#2, HT PRINT#2, 1 PRINT #2, ELVF$ PRINT -#2, 50 PRINT #2, Angle PRINT #2, 0 PRINT #2, UNES PRINT #2, 8 PRINT #2, PT$ PRINT #2, 10 PRINT #2, XL 1 PRINT #2, 20 PRINT #2, VL 1 PRINT #2, 11 PRINT -#2, XL2 PRINT #2, 21 PRINT #2, VL2 PRINT #2, 0 PRINT #2, UNES PRINT#2, 8 PRINT #2, PT$ PRINT #2, 10 PRINT #2, XL3 PRINT -#2, 20 PRINT #2, VL3
TOPO.BAS
Page 35
PRINT #2. 11 PRINT #2. XL4 PRINT #2. 21 PRINT #2, YL4 PRINT#2, 0 END IF NEXT I NEXT) PRINT #2, ·eNDsec· PRINT#2, 0 PRINT #2.
•eop
CLOSE#2PRINT : PRINT : PRINT •Pressez una touche pour retoumer au menu principal• w$ = •• WHILEw$ = 11 w$ = INKEY$ WEND AnDXF: CLOSE END SUB
I
Sous-programme •tichier _xye
I
Ce module cree
a
partlr de spt9clfications r~ues parses arguments (au nombre de trois) un fichier au format ASCII et lisible par le loglciel Land-Improve. Ce format est beaucoup plus simple que le DXF, car il faut simple-ment placer les coordonnees de taus les points passant le test du code de selection dans une structure de ligne precise. Je n'en dirai pas plus pour l'instant car j'en reparlerai lors de la description du sous-programme .. lan-dimprove ...Exemple d'un flchler XYE: XVE SDR2: LOISELL T 2119.098 1964.338 48.238 0 1013 2140.319 1988.180 48.173 0 1015 2097.889 1983.814 48.112 0 1020 2108.8411979.569 48.134 0 1021 2118.953 1975.605 48.2-40 0 1 022 2121.217 1983.131 48.397 0 1023 2113.715 1988.170 48.349 0 1 024 2110.390 1990.822 48.407 0 1025 2053.138 2034.347 -48.634 0 1035 1988.1 ~ 1992.918 47.611 0 1040 1938.958 2001.262 -47.385 01042 0. 000 0. 000 0. 000 3 END
SUB flchler.xye (Nom.XYE$, Code.XYE$, lmpoouN$)
PRINT • Flchler produtt •, Nom.XVES PRINT : PRINT
NomXVE$
=
LEFT$(Nom.XVE$, LEN(Nom.XVE$) · 4) LongCode%=
LEN(Code.XYE$)ON ERROR GOTO lmprtmanteFermee
IF lmpOouN$ = •o• THEN LPRINT Nom.XVE$
IF lmpOouN$ = •o• THEN LPRINT 'Code de aelectton: •, Code.XVE$: LPRINT ..
OPEN Nom.XVE$ FOR OUTPUT AS #2
PRINT #2, 'XVE'
Entete$ = 1SDR2:
I + NomXVES PRINT #2, Entete$.
FOR J = 1 TO NbJob%
FOR I = Job(J). Polnteur TO Job(J + 1 ). Polnteur · 1
IF Shot(l). Nord 0 THEN
IF Code.XVE$ = 'Tour THEN GOTO Ecrtture PLC ode$ = LEFT$( Shot( I). Code, 1)
IF Code.XVE$ = 1
Saufl" AND PlCode$ .,.. THEN GOTO Ecrtture IF Code.XVE$ = •Autres• AND PLCode$ .,.. AND PLCode$ •p THEN
GOTO Ecrtture END IF
IF LEFT$(Shot(l). Code, LongCode%) Code.XVE$ THEN GOTO NCP ES = Shot(l). Eat
NO = Shot(l). Nord EL = Shot(l). Elevation
PO = VAL(Shot(I).NoPosltlon)
Ecrtture: FORMATS= 1#1/I.####J'II.######.#### QJ'II1
PRINT #2, USING FORMATS; ES; NO; EL; 0; PO
Posl$ = Shot( I). NoPosltlon
IMPRESS=' \####.### IU#I.######.### \ \1
IF lmpOouN$ = •o• THEN
LPRINT USING IMPRESS; Shot( I). NoPosltlon, ES, NO, EL, Shot(l). Code END IF NCP: END IF NEXT I NEXTJ AN$ = I #.### #.### #.### # \ \1 PRINT #2, USING AN$; 0; 0; 0; 3; •END•
CLOSE#2
IF lmpOouN$ = 101 THEN LPRINT : LPRINT : LPRINT : LPRINT CLOSE
I
Sous-programme •impression•
I
C'est une simple routine pour permettre la sortie sur papier c•printout") des coordonnees des points d'un fichier du calepin electronique. Cela est es-sential fJOUr preserver une copie sur un supf)Ort autre que magnetique, en cas d'effacement des fichiers. c;a J)ermet aussi d'avoir une liste rapide
a
consul-ter en cas de doute sur la valldite de certains f)Oints.SUB Impression
CLS: PRINT
PRINT •IMPRESSION DU ACHIER DU CALEPIN ELECTRONIQUE• PRINT •eN FORMAT X, V,ELEV,CODE,NO•
PRINT : PRINT
ON ERROR GOTO lmprlmanteFermee
PRINT I Nom du flchler
a
lmprlmer: I ' Achlerflnal$ PRINTINPUT • Appuyer une touche de a que l'lmprtmante eat prtte•; Allume$
LPRINT •coORDONNEES X, V, ELV DU ACHIER: •, AchlerAnal$ LPRINT
FOR J = 1 TO NbJob%
FOR 1 = Job(J). Polnteur TO Job(J + 1 ). Polnteur · 1 IF Shot(l). Nord 0 THEN
ES = Shot( I). Est NO = Shot(l). Nord EL
=
Shot(I).Eievatlon CO$ = Shot(l). CodePO
=
VAL(Shot(I).NoPosttlon)FORMAT$ = '##=##.### tt //##.IF#####.###\ \ tt 1/ d JCf'
LPRINT USING FORMAT$; ES, NO, EL, CO$, PO END IF
NEXT I NEXT)
PRINT : PRINT
-PRINT •Prettez una touche pour retoumer au menu principal•
wS = .. WHILE W$ = .. W$ = INKEYS WEND END SUB
!sous-programme •landimprove•j
Land I m prove est un logiciel americain de modelisation topometrique dont le bureau a fait I' acquisition et qui permet entre autres le design de plans de drainage et d'irrigation. C'est un peu la version secteur prive de MacDraln, mais en plus sophistique, je crois. Aussi, malgre ses possibilites impression-nantes, ses outils de dessin et de manipulation sont d'une convivialite archa·ique et ralentlssent grandement le processus de design. Bref, mol per-sonnellement, je ne l'aime pas vraiment. Je suis plutot pour le traitement in-formatique adapte (lire programme fait sur mesure) des donnees et le transfert immecliat dans Autocad. Mais un ingenieur du bureau preferait travailler avec Landlmprove, il m'a done fallu lui ecrire une routine produisant des fichiers lisibles par ce logiciel. Ce qui fut fait avec le resultat suivant: un selecteur de codes qui permet d'isoler les points de differents types (ex.: avec seulement
les terrains, code
ur•,
Landlmprove fait une triangulation donnant descour-bes de niveau plus homogenes que celles produites quand les
tosses,
codeup•, sont aussi consideres) et des appels au sous- programme .. fichier .xye .. qui
produira les fichiers au format Landlmprove selon la configuration des codes choisie.
SUB landlmprove
lntroll: CLS
PRINT rrRANSFORMAllON DU RCHIER DU CALEPIN ELECTRONIQUE• PRINT •eN RCHIER .XYE UTIUSABLE SUR LANDIMPROVE•
PRINT 11
: PRINT ••
-PRINT 'Rchler . aac
a
traHer: •; FlchlerRnal$ PRINT : PRINT : PRINTPRINT •choiX de conflgurauons des flchlers .XYE produlb: • PRINT : PRINT
PRINT • 1) Un seut flchter .XYE contenant tous tes potnta• PRINT
PRINT • 2) Deux flchlers dltf6rents: TerraJn(T) et Autres• PRINT
PRINT • 3) Trots flchters dlfferents: TerraJn(T), Fosse(F) et Autres• PRINT
PRINT I 4) Nombre de flchlers que VOU8 dealrez ( selecUons par lea codes )1
PRINT : PRINT
INPUT • Votre cholx (1, 2, 3 ou 4)'; CCg$
IF CCg$ •1• AND CCg$ •2• AND CCg$ •a• AND CCg$ •4• THEN GOTO lntroll
END IF PRINT
INPUT 'Impression du(dea) flchter(s)
a
l'lmprlmante (OIN)1; lmpresslonU$
tmpresslonU$ = UCASES(ImpresslonUS)
Nom$ = LEFTS(Rchlerflnal$, LEN(RchlerflnaJ$) · 4)
LongFF% = LEN(Nom$)
SELECT CASE CCg$ CASE 111
CLS: LOCATE 2, 1: PRINT "TOUT DANS UN SEUL ACHIER .XYE•
PRINT : PRINT NomXS
=
NomS + 1.XYE1
CALL flchler.xye(NomXS, "Tour. tmpresatonU$) CASE 1
21
CLS : LOCATE 2, 1
PRINT 1UN RCHIER POUR LES TERRAINS•: PRINT : PRINT
IF Longf'F% 7 THEN
NomXS = LEFT$(Nom$, 7) + "T.XVE• ELSE
NornXS = Nom$ + "T.XYE1
END IF
CALL flchler.xye(NomX$, rr', lmpreaslonUS)
PRINT • ET UN POUR LE RESTE•: PRINT : PRINT
IF Longf'F% 8 THEN
Nom><$ = LEFT$(Nom$, 6) + 'ST.XYE• ELSE
Nom><$ = Nom$ + 'ST.XYE' END IF
CALL flchler.xye(NomXS, •saurr, lmpresslonUS) CASE '3'
CLS: LOCATE 2, 1
PRINT 'UN FlCHIER POUR LES TERRAINS': PRINT : PRINT IF LongFF% 7 THEN
Nom><$ = LEF11(NomS, 7) + 'TJ<VE' ELSE
Nom><$ = Nom$ + 'T.XYE' END IF
CALL flchler.xye(NornX$, 'T', lmpresslonU$)
PRINT ' UN AUTRE POUR LES FOSSES': PRINT : PRINT IF LongFF% 7 THEN
Nom><$ = LEF11(Nom$, 7) + 'F.xve• ELSE
NomX$ = Nom$ + 'F.XYE' END IF
CALL flchler.xye(NomXS, 'P, lmpresslonU$)
PRINT • ET ENFlN POUR LE RESTE': PRINT : PRINT IF LongFF% 5 THEN
NomX$ = LEFT$(Nom$, 6) + 'STF.XYE' ELSE
Nom><$ = Nom$ + 'STF.XYE' END IF
CAU flchler.xye(NomX$, 'Autres', lmpresslonU$) CASE '41
CLS : PRINT 'SELECTIONS PAR LES CODES•: PRINT : PRINT Ncode: LOCATE 2, 1
INPUT 'Code de selection, quatre lettres maximum •; CodeSelect$ PRINT
CodeSelect$ = UCASES(CodeSelect$) LongCD%
=
LEN(CodeSelect$)IF LongCD% 4 THEN
CLS : PRINT 'Pas plus de quatre letlres ... •: PRINT : GOTO Ncode END IF
Lmax% = 8 · LongCD% IF LongFF% Lmax% THEN
ELSE
NomXS = NomS + Code Select$ + • .xve•
END IF
CALL flchler.xye(Norn><$, CodeSelect$, lmpresslonU$)
Aselect INPUT •D'au1res silecUons a faJre sur la mime flchler (OIN)'; Autre$ Autre$ = UCASE$(Autre$)
IF Autre$ = •o• THEN CLS : GOTO Ncode IF Autre$ •N• THEN GOTO Aselect
END SELECT
PAINT : PAINT
PAINT •Preaaez una touche pour retoumer au menu prtnclpaJ•
w$ = 11 WHILEw$ = 11 w$ = INKEY$ WEND END SUB
I
Sous-programme •menuprincipal•l
11 effectue l'affichage des options du programme et enclenche l'appel du sous- programme correspondent au choix de l'utlllsateur.ll s'assure aussl qu'll
y
a bien un fichier du calepin Sdite et mis en memolre avant de permettreracces aux routines de creation et d'lmpression de flchlers. SUB menuprtnclpal
SCREEN 10
WINDOW SCREEN (0, 25)·(80, 0) CLS : RANDOMIZE TIMER
LOCATE 1, 1: PAINT • Eh oul, on m'appelle ... •; xo = 40: yO = 12
FOR I = 1 TO 10
rangee
=
3 + INT(RND * 19): colonna=
5 + INT(RND * 87) LOCATE rangee, colonne: PAINT rroPO•;IF i 1 THEN UNE (x01 yO)-(colonnel rangee) CIRCLE (colonnel rangee)~ .6
CIRCLE ( colonne + 21 rangee · . 5), 7, , I I • 2 FOR J
=
1 TO 1 0: k=
k + 1: NEXT Jxo = colonne: yO = rangee NEXT I
LOCATE 251 1: PRINT • FaJtes une touche ... •;
w$ = ..
WHILEw$ = .. w$ = INKEY$ WEND
EncoreMenu: SCREEN 0: CLS
PRINT •PROGRAMME TOPO : MENU' PRINT : PRINT : PRINT
IF AchlerEdlte$ = •out• THEN PRINT I
PRINT I PRINT END IF
Rchler editS : •; RchlerAnal$
PRINT •1 Edition et fusion de flchler1 .ASC': PRINT IF AchlerEdlte$ = 'Out• THEN
PRINT '2 Impression (Print) du flchler edlt8': PRINT END IF
IF RchlerEdlte$ = 'Out• THEN PRINT '3
PRINT END IF
Creation dlun flchler dXf pour Autocad'
IF RchlerEdlte$ = •out• THEN
PRINT '4 Creation des nchlers .xye pour Landlmprove• PRINT END IF PRINT'S PRINT'S PRINT PRINT
Retour momentane au DOS (Shell)': PRINT Sortie du programme TOPO': PRINT
WHILE AS •s• AS= INKEY$
IF AS = •1• THEN CALL edition: GOTO EncoreMenu IF A$ = 1
41
AND AchlerEdlteS = •out• THEN CALL landlmprove: GOTO EncoreMenu IF A$ = •a• AND AchlerEdlte$ = •out• THEN CALL flchler.dXf: GOTO EncoreMenu IF A$ = •2• AND AchlerEdlteS = •out• THEN CALL lmpresalon: GOTO EncoreMenu IF A$ = •s• THEN CALL retour. dos: GOTO EncoreMenu
WEND
END SUB
I
Sous- programme •nettoie•l
Une seule utilite pour cette routine: le remise
a
zero des cellules des differentes matrices avant une autre edition d'un fichier du calepinelectroni-que. SUB nettole FOR I = 0 TO NShob% Shot(l). station No = 0 Shot(l). NoPosltlon = •• Shot(l). HauteurMire =
o
Shot(l). F1 Distance = 0 Shot(l). F1 Vertical =o
Shot( I). F1 Hortzontal = 0Shot( I). MCDiatance = 0
Shot(l). MCVertlcal = 0
Shot(I).MCHortzontal = 0
Shot(l). Nord = 0 Shot(l). Eat = 0 Shot( I). Elevation = 0
Shot( I). Code = ••
NEXT I
END SUB
I
Sous-programme •retour _dos•
I
11 arrive souvent qu'on ne se rappelle plus ou (dans quel sous-directorie) est situe le fichier que l'on veut editer. Ou tout simplement on veut sortir du programme FXJUr verifier le contenu d'un autre fichier. 11 faut alors preserver les donnees mises en memoire et avoir acces au commandes du DOS. La procedure .. retour.dos .. permetdonc une sortie momentane dans la DOS, FXJUr revenir au programme des que l'on donne la commande EXIT. Toute l'information traitee avant la sortie au DOS aura alors ete preserves.
SUB retour. dos
CLS
PRINT I Vous voila dans l•envtronnement oos•
PRINT I'J'apez EXIT pour revenlr dans TOPO•
SHELL
END SUB
I
Sous- programme •sauvegarde•l
Le programme TOPO permet la correction et la fusion des fichiers du calepin electronique. Pour eviter le reprise des corrections
a
chaque edition, ilfaut pouvoir sauver les releves corriges sur disquette. 11 en va de meme lors de la fusion de releves. Pour y parvenir, j'ai choisi de sauver seulement les lig-nes qui contiennent les coordonnees finales de chacun des points. Cela evite de rebatir une structure aussi complexe que le fichier du calepin et permet
I'
edition ulterieure des donnees et la creation des fichiers compatibles. Maisil
ne sera plus possible d'y apporter des corrections angulaires,a
mains de repartir du fichier original.SUB sawegarde
CLS
SCREEN 0
PRINT •sAUVEGARDE• PRINT : PRINT : PRINT IF Correctlo118$ •out• THEN
PRINT • A molns que vous ne preclslez 'NON', lea Jobs fuslonnees• ELSE
PRINT • A molns que vous ne preclslez 'NON', lea corrections apportees• END IF
PRINT •seront sawees dans le flchler : •; Achlerflnal$ PRINT
INPUT 'Voulez -vous la sawegarde du flchler corrlge•; Corrlge$
Corrlge$ = UCASE$(Corrlge$)
IF Corrtge$ = •NoN• THEN
IF AchlersS •out• THEN Achlerflnal$ = Achler.ASC$(1)
GOTO RnSauve END IF
PRINT : PRINT : PRINT
PRINT • Sauvegarde de •; Achlerflnal$
OPEN Achlerflnal$ FOR OUTPlTT AS #1
PRINT : PRINT • Un petit Instant, 9a s'ra pas long ... •
PRINT #1, Rchlerflnal$
FOR I = 1 TO NbJob%
FOR k = Job(l). Polnteur TO Job( I + 1 ). Polnteur · 1
IF Shot(k). Nord 0 THEN
PrelimS =
•oaw
+ Shot(k). NoPosiUonNO = Shot(k). Nord
ES = Shot(k). Est
EL = Shot(k). Elevation
Code$
=
Shot(k). CodeForTOPO$ = "\ \####.### ####.### ###.### \ \1
PRINT #1, USING ForTOPO$; PrelimS; NO; ES; EL; Code$
END IF NEXTk NEXT I PRINT
PRINT •
ea
y'est, pressez une touche pour retoumer au menu principal'w$ = ..
WHILEw$ = ..