Makra w MicroStation
Transkrypt
Makra w MicroStation
Andrzej Borowiecki Wybrane zagadnienia z programowania dla geodetów. Kraków 2009 1 1. Programowanie w Visual Basicu Programy w Visual Basic dla MicroStation można tworzyć na różne sposoby: zarejestrować wykonywane ręcznie czynności lub napisać program według własnego pomysłu. Rejestracja czynności wykonywanych ręcznie – tak utworzony program powtarza jeden identyczny ciąg czynności, ale dla początkujących programistów jest podstawą do napisania bardziej zaawansowanej procedury. Po wybraniu opcji Utwórz makro Basic podaje się nazwę i opis: 2 Na ekranie pojawia się paleta przycisków znanych z wielu urządzeń (Play Pauza Stop). Kiedy wciśnięty jest przycisk Play każda czynność, którą wykonujemy w MicroStation jest rejestrowana i zapisywana w postaci ciągu poleceń w języku Visual Basic. Tu narysowano linię. Po zakończeniu rysunku naciska się przycisk STOP. Taki program można następnie modyfikować. Program pisany samodzielnie ma zwykle inną strukturę – występują w nim funkcje i procedury. 3 PRZYKŁAD PROGRAMU ZAREJESTROWANEGO AUTOMATYCZNIE I NASTĘPNIE MODYFIKOWANEGO. Wybrano narzędzie do rysowania linii i połączono dwa dowolnie wybrane punkty. W wyniku rejestracji tych czynności powstał następujący program: ' program łączy linią 2 punkty Sub main Dim startPoint As MbePoint Dim point As MbePoint, point2 As MbePoint ' Wyślij polecenie MbeSendCommand "PLACE SMARTLINE " ' Współrzędne w jednostkach głównych startPoint.x = 0.626387# startPoint.y = 1.851924# startPoint.z = 0.000000# ' Wyślij punkt danych do bieŜącego polecenia point.x = startPoint.x point.y = startPoint.y point.z = startPoint.z MbeSendDataPoint point, 1% point.x = startPoint.x + 0.965968# point.y = startPoint.y + 0.657395# point.z = startPoint.z MbeSendDataPoint point, 1% ' Wyślij przywrócenie do bieŜącego polecenia MbeSendReset End Sub Ważną rolę odgrywają tu zmienne typu MbePoint: startPoint, point i point2. Pozwalają one określić lokalizację punktu ze współrzędnych. W wielu zadaniach wystarczy tylko jedna z nich np. point. Zmienna typu MbePoint określa 3 współrzędne x, y i z. Jeżeli rysujemy mapę wystarczają tylko dwie x i y. W uproszczonej wersji program łączący 2 punkty o współrzędnych np. (0,0) i (100,200) można napisać tak: ' program łączy linią 2 punkty Sub main Dim point As MbePoint ' Wyślij polecenie MbeSendCommand "PLACE SMARTLINE " ' Wyślij punkt danych do bieŜącego polecenia point.x = 0 point.y = 0 MbeSendDataPoint point, 1% point.x = 200 point.y = 100 MbeSendDataPoint point, 1% ' Wyślij przywrócenie do bieŜącego polecenia MbeSendReset End Sub Kończące program polecenie MbeSendReset oznacza zakończenie pracy z narzędziem – tu narzędziem jest Place Smartline służące do rysowania linii. 4 WPROWADZANIE DANYCH Z KLAWIATURY Taki program wykonuje tylko jedną czynność – łączy linią punkty o współrzędnych (0,0) i (100,200), jednak mimo swej prostoty może być bardzo przydatny pod warunkiem, że będzie w nim możliwość zmiany współrzędnych łączonych punktów. Współrzędne można wprowadzać ręcznie z klawiatury wykorzystując polecenie MbeInputBox: x1s = MbeInputBox("Podaj x1", "0.00", "Podaj X dla pierwszego punktu ") y1s= MbeInputBox("Podaj y1", "0.00", "Podaj Y dla pierwszego punktu ") x2s = MbeInputBox("Podaj x2", "0.00", "Podaj X dla drugiego punktu ") y2s = MbeInputBox("Podaj y2", "0.00", "Podaj Y dla drugiego punktu ") x1=val(x1s) y1=val(y1s) x2=val(x2s) y2=val(y2s) Funkcja val zamienia wczytany ciąg znaków na liczbę. 5 Program w tej postaci pozwala łączyć linią dowolne dwa punkty, których współrzędne podajemy z klawiatury: Zadanie 1. Wykorzystując powyższy program narysować kwadrat, prostokąt i trójkąt. Przed przystąpieniem do rysowania należy przygotować na kartce współrzędne narożników. 6 RYSOWANIE OKRĘGU: MbeSendCommand "PLACE CIRCLE ICON " Okrąg można narysować kilkoma metodami: 1a. względem środka - wskazując na środek okręgu i na punkt na obwodzie jeżeli nie jest zaznaczona średnica: MbeSendCommand "PLACE CIRCLE ICON " MbeSendCommand "IGEN CONSTRAIN RADIUS UNLOCK " MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 0& MbeSendCommand "PLACE CIRCLE ICON " point.x = ys point.y = xs MbeSendDataPoint point, 1% point.x = y1 point.y = x1 MbeSendDataPoint point, 1% 7 1b. względem środka - wskazując tylko na środek okręgu, jeżeli wpisana jest średnica MbeSendCommand "PLACE CIRCLE ICON " MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 0& MbeSendCommand "IGEN CONSTRAIN RADIUS LOCK " MbeSendCommand "IGEN CONSTRAIN RADIUS 1.0000" ' Wyślij punkt danych do bieżącego polecenia point.x = ys point.y = xs MbeSendDataPoint point, 1% 2. względem krawędzi – wskazując 3 punkty na obwodzie, przez które musi przejść okrąg MbeSendCommand "PLACE CIRCLE ICON " MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 1& MbeSendCommand "PLACE CIRCLE ICON " point.x = y1 point.y = x1 MbeSendDataPoint point, 1% point.x = y2 point.y = x2 MbeSendDataPoint point, 1% point.x = y3 point.y = x3 MbeSendDataPoint point, 1% 3. względem średnicy – wskazując dwa punkty wyznaczające średnicę MbeSendCommand "PLACE CIRCLE ICON " MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 2& MbeSendCommand "PLACE CIRCLE ICON " point.x = y1 point.y = x1 MbeSendDataPoint point, 1% point.x = y2 point.y = x2 MbeSendDataPoint point, 1% Wyboru metody dokonuje się za pomocą polecenia: - względem środka: MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 0& - względem krawędzi MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 1& - względem średnicy MbeSetAppVariable "IGEN", "tcb->msToolSettings.igen.placeCircleMode", 2& 8 Przykład: Program rysuje trójkąt w oparciu o współrzędne wprowadzone z klawiatury, a następnie rysuje okrąg opisany na tym trójkącie: Struktura programu: Program składa się z kilku procedur: czytaniexy - procedura pozwala wprowadzić z klawiatury współrzędne wierzchołków trójkąta rysunek3 - procedura wykonująca rysunek trójkąta; okrąg – procedura wykonująca rysunek okręgu opisanego na trójkącie sir - środek okręgu i promień 9 Główna część programu (znajduje się zawsze na końcu): '*********************************** MAIN ********************************* sub main czytaniexy rysunek3 okrag sir end sub 10 Na początku programu zadeklarowane są zmienne typu Public, które są dostępne w całym programie – w każdej procedurze. W procedurach czytaniexy i sir zadeklarowane są zmienne lokalne tekstowe – typu string i rzeczywiste podwójnej precyzji double. Zmienne lokalne – dostępne są tylko w tej procedurze, w której zostały zadeklarowane. Zadanie 3. Uzupełnić program o procedurę, która obliczy i wyświetli na ekranie pole trójkąta i pole koła o promieniu r. 11 CZYTANIE DANYCH Z PLIKU I ZAPISYWANIE WYNIKÓW DO PLIKU RAPORTU Nazwa pliku jest zmienną typu string, może zawierać również ścieżkę dostępu, np. ”D:\miłocin\dane.txt” Program powinien umożliwić każdorazowo podanie nazwy pliku: plik_dane = MbeInputBox("Podaj nazwę pliku z danymi ", "D:\dane.txt", "WCZYTYWANIE DANYCH ") Otwarcie pliku wykonuje się za pomocą instrukcji OPEN: OPEN plik_dane for Input as #1 Input – czytanie danych OPEN plik_dane for Output as #1 Output – zapisywanie danych do pliku OPEN plik_dane for Append as #1 Append – dopisywanie do pliku Po zakończeniu pracy z plikiem należy go zamknąć instrukcją: Close #1 Czytanie danych z pliku umożliwia instrukcja Input: Input #1, nr, x, y 12 Otwarcie pliku tekstowego Jeżeli chcemy czytać dane z pliku tekstowego, na przykład o nazwie plikd – otwieramy go do czytania (Input) instrukcją: Open plikd For Input As #1 Jeżeli chcemy zapisywać wyniki do pliku tekstowego, na przykład o nazwie plikw – otwieramy go do pisania (Output) instrukcją: Open plikw For Output As #2 Czytanie danych z pliku tekstowego W dalszym ciągu programu każdy otwarty plik jest identyfikowany przez swój numer. Na przykład instrukcja czytania danych z pliku o numerze 1 ma następującą postać: Input #1, Nr, x, y Zamykanie pliku tekstowego Każdy plik tekstowy po wykorzystaniu należy zamknąć instrukcją Close zawierającą numer tego pliku. Na przykład: Close #1 13 Przeglądanie pliku tekstowego o nieokreślonej długości: Instrukcja While Not EOF(n)… Wend Pierwsza jej część: While Not EOF(1) oznacza: Dopóki Nie Koniec pliku (1). Jeżeli program nie natrafi na koniec pliku nr 1, wykonywane są dalsze instrukcje aż do linii zawierającej Wend, po czym program wraca na początek pętli do linii While Not EOF(1) . Ważne jest, żeby wewnątrz pętli While Not EOF(1) ... Wend znajdowała się instrukcja czytania z pliku (INPUT #1, lista zmiennych ) na przykład: Input #1, nr, x,y która czyta kolejne wiersze pliku tekstowego, co prowadzi w efekcie do natrafienia na koniec pliku. Bez tej instrukcji pętla While Not EOF(1) ... Wend będzie działała w nieskończoność. While Not EOF(1) ….. Input #1, nr, x,y … … Wend 14 Instrukcja powtarzania: For ... To ... Next Zapis For i = 1 To pk oznacza: Dla i zmieniającego się od 1 do pk. Dla kaŜdej , kolejnej wartości i wykonywane są wszystkie instrukcje programu zawarte między linią For i linią Next i. Czyli zostaną one wykonane pk razy. Open PLIKD For Input As #1 For i = 1 To pk ………….. Input #1, Nr, X, Y XP(i)=X YP(i)=Y ………….. Next i Zmienną i nazywamy zmienną sterującą. Musi ona być zmienną całkowitą – typu integer. Ta sama operacja wykonana za pomocą instrukcji While Not EOF Open PLIKD For Input As #1 i=0 While Not EOF(1) i=i+1 Input #1, nr, x, y XP(i)=X YP(i)=Y Wend 15 Struktura programu: Program może być bardzo długi. (na przykład program - stosowany w amerykańskich łodziach podwodnych - do rozpoznawania dochodzących z otoczenia dźwięków - ma ponad 2 miliony wierszy). Aby ogarnąć taki długi program niezbędne jest dzielenie go na procedury i funkcje. Informatycy uważają, że procedura powinna się w całości mieścić na monitorze komputera. Jeżeli się nie mieści – trzeba ją podzielić na części. Główna część programu - procedura sub Main - mogłaby w każdym programie wyglądać tak samo: '*********************** MAIN ******************* sub Main dane przetwarzanie wyniki end sub Procedura dane będzie zawierać odwołanie do procedur – zależnie od rozwiązywanego zadania. Na przykład w zadaniu kiedy obliczamy i kartujemy pikiety pomierzone metodą ortogonalną musimy wczytać współrzędne punktów osnowy, wyniki pomiarów, oraz schemat połączeń. Ważne jest żeby każda procedura lub funkcja była zdefiniowana przed jej pierwszym wywołaniem. Dlatego z funkcjonowaniem programu zapoznajemy się czytając go od końca: 16 Kartowanie pikiet pomierzonych metodą ortogonalną B α li hi P A X Pi = X A + li ⋅ cos α AB − hi ⋅ sin α AB YPi = YA + l ⋅ sin α AB + hi ⋅ cos α AB 17 '*********************** DANE***************** sub dane osnowa pikiety linie end sub '*********************** MAIN ******************* sub Main dane przetwarzanie wyniki end sub Dane dla programu są zapisane w plikach tekstowych, dlatego ich czytanie zaczyna się zawsze od pytania o nazwę pliku. Wielkość pliku nie jest z góry narzucona dlatego zmienne tablicowe, w których zapisuje się wartości odczytane z pliku, są na bieżąco dopasowywane do liczby danych za pomocą instrukcji Redim, opcja Preserve zabezpiecza wczytane wcześniej dane przed skasowaniem. redim preserve xo(ios) Zmienne w programie można podzielić na globalne – dostępne w całym programie – deklarowane za pomocą instrukcji Public Public nro() as integer, xo() as double, yo() as double i lokalne – deklarowane i dostępne tylko w określonej procedurze za pomocą instrukcji Dim: sub linie Dim plik_lin as string Dim i as integer 18 Przykładowa procedura czytająca numery i współrzędne punktów osnowy: '*********************** OSNOWA ************************* sub osnowa dim plik_osn as string dim i as integer plik_osn = MbeInputBox("Podaj nazwę pliku z danymi osnowy", "D:\osnxy.txt", "WCZYTYWANIE DANYCH OSNOWY ") open plik_osn for input as #1 ios=0 while not eof(1) ios=ios+1 redim preserve nro(ios) redim preserve xo(ios) redim preserve yo(ios) input #1, nro(ios), xo(ios), yo(ios) wend close #1 end sub Zmienna globalna ios określa liczbę punktów osnowy, jej wartość jest zwiększana o 1 po odczytaniu kolejnego wiersza z pliku tekstowego, równocześnie zwiększany jest rozmiar tabel instrukcją redim. Plik tekstowy z danymi osnxy.txt , zapisanymi w formacie ANSI może wyglądać na przykład tak: 1001 1000.00 1002 1040.00 1000.00 1000.00 19 Druga procedura czyta wyniki pomiarów, np. rzędne i odcięte, z pliku pomort.txt : 1 2 3 4 5 1.98 3.04 5.99 7.02 9.97 9.02 5.96 6.98 4.01 5.03 '*********************** PIKIETY ************************* sub pikiety dim plik_pik as string dim i as integer plik_pik = MbeInputBox("Podaj nazwę pliku z wynikami pomiarów", "D:\pomort.txt", "WCZYTYWANIE WYNIKÓW POMIARÓW ") open plik_pik for input as #1 ipik=0 while not eof(1) ipik=ipik+1 redim preserve nrp(ipik) redim preserve odc(ipik) redim preserve rze(ipik) input #1, nrp(ipik),odc(ipik),rze(ipik) wend close #1 end sub 20 Trzeci plik z danymi zawiera numery punktów, które należy połączyć: linie.txt (linie do narysowania od punktu do punktu): 1 2 3 4 itd. 2 3 4 5 Procedura sub linie wczytuje dane dotyczące linii do narysowania: '*********************** LINIE ************************* sub linie dim plik_lin as string dim i as integer plik_lin = MbeInputBox("Podaj nazwę pliku połączeń", "D:\linie.txt", "WCZYTYWANIE PLIKU POŁĄCZEŃ ") open plik_lin for input as #1 ilin=0 while not eof(1) ilin=ilin+1 redim preserve odp(ilin) redim preserve dop(ilin) input #1, odp(ilin),dop(ilin) wend close #1 end sub 21 Kolejnym etapem działania programu jest przetwarzanie danych: '*********************** PRZETWARZANIE ********************* sub przetwarzanie xy_pikiet kartowanie linie end sub Kolejne procedury wykonują następujące czynności: xy_pikiet - obliczenie współrzędnych pikiet z metody ortogonalnej B α li hi P A X Pi = X A + li ⋅ cos α AB − hi ⋅ sin α AB YPi = YA + l ⋅ sin α AB + hi ⋅ cos α AB kartowanie – punktów osnowy i pikiet, łącznie z ich opisaniem linie – połączenie wskazanych punktów linią 22 '***************************** XY_PIKIET **************************************** sub xy_pikiet Dim xa as double, ya as double, l as double, s as double,cs as double, sn as double Dim az as double Redim xp(ipik): Redim yp(ipik) xa=xo(1):ya=yo(1) az= azymut(xo(1),yo(1),xo(2),yo(2)) for i=1 to ipik l=odc(i):h=rze(i) sn=sin(az/200*pi) cs=cos(az/200*pi) xp(i)=xa+l*cs-h*sn yp(i)=ya+l*sn+h*cs next i end sub W procedurze sub xy_pikiet do obliczenia azymutu boku osnowy pomiarowej wykorzystana została funkcja azymut: Function Azymut(xa as double, ya as double, xb as double, yb as double) as double Dim dx as double, dy as double, az as double dx=xb-xa: dy=yb-ya if dx=0 then if dy<0 then az=300 if dy>0 then az=100 else az=atn(dy/dx)*200/pi end if if dx<0 then az=az+200 if az<0 then az=az+400 azymut=az end function 23 Kartowanie punktów osnowy i pikiet składa się z dwóch czynności: - narysowanie kółka na punkcie o określonych współrzędnych - wstawienie napisu zaczepionego na tych samych współrzędnych MbeSendCommand "PLACE CIRCLE ICON " MbeSendCommand "IGEN CONSTRAIN RADIUS 0.3" point.x = yo(i) point.y = xo(i) MbeSendDataPoint point, 1% MbeSendReset MbeSendCommand "PLACE TEXT" MbeSendCommand cstr(nro(i)) point.x = yo(i) point.y = xo(i) MbeSendDataPoint point, 1% MbeSendReset 24 '*********************** KARTOWANIE OSNOWY *********************************** sub kart_osnowy Dim point As MbePoint Dim i as integer for i= 1 to ios MbeSendCommand "PLACE CIRCLE ICON " MbeSendCommand "IGEN CONSTRAIN RADIUS 0.3" point.x = yo(i) point.y = xo(i) MbeSendDataPoint point, 1% MbeSendReset MbeSendCommand "PLACE TEXT" MbeSendCommand cstr(nro(i)) point.x = yo(i) point.y = xo(i) MbeSendDataPoint point, 1% MbeSendReset next i end sub '*********************** KARTOWANIE PIKIET ********************************* sub kart_pikiet Dim point As MbePoint Dim i as integer for i= 1 to ipik MbeSendCommand "PLACE CIRCLE ICON " MbeSendCommand "IGEN CONSTRAIN RADIUS 0.1" point.x = yp(i) point.y = xp(i) MbeSendDataPoint point, 1% MbeSendReset MbeSendCommand "PLACE TEXT" MbeSendCommand cstr(nrp(i)) point.x = yp(i) point.y = xp(i) MbeSendDataPoint point, 1% MbeSendReset next i end sub 25 Rysunek powstaje przez połączenie linią punktów wymienionych w pliku połączeń: '************************* RYSOWANIE LINII************************** sub rys_linie Dim point As MbePoint Dim i1 as integer, i2 as integer for i= 1 to ilin i1=odp(i): i2=dop(i) MbeSendCommand "PLACE SMARTLINE “ point.x = yp(i1) point.y = xp(i1) MbeSendDataPoint point, 1% point.x = yp(i2) point.y = xp(i2) MbeSendDataPoint point, 1% MbeSendReset next i end sub 26 Wynikiem działania programu jest - oprócz mapy – plik tekstowy raportu zawierający informacje o wykonanym zadaniu: '************************ WYNIKI - RAPORT **************** sub wyniki raport_plik raport_osnowa raport_pomiary raport_xy close #1 end sub Plik raportu zawiera informacje o punktach osnowy pomiarowej, wykonanych pomiarach i obliczonych współrzędnych pikiet. '*************** RAPORT NAZWA PLIKU ****************************** sub raport_plik() Dim plikr as string ' Pytanie o nazwę pliku raportu plikr=MbeInputBox("Podaj nazwę pliku raportu","D:\raport1.txt","PLIK RAPORTU") Open plikr for Output as #1 end sub '*************** RAPORT OSNOWA ****************************** sub raport_osnowa() Dim i as integer Print #1, "Dane punkty osnowy" Print #1, "Nr X Y" for i=1 to ios print #1,nro(i), format$(xo(i),"0.00"), format$(yo(i),"0.00") next i Print #1," " end sub '*************** RAPORT POMIARY ****************************** sub raport_pomiary() Dim i as integer Print #1, "Miary ortogonalne" Print #1, "Nr Odcieta Rzedna" for i=1 to ipik print #1,nrp(i), format$(odc(i),"0.00"), format$(rze(i),"0.00") next i Print #1," " end sub 27 '*************** RAPORT WSPÓŁRZĘDNE PIKIET ************************* sub raport_xy() Dim i as integer Print #1, "Obliczone współrzędne pikiet" Print #1, "Nr X Y" for i=1 to ipik print #1,nrp(i), format$(xp(i),"0.00"), format$(yp(i),"0.00") next i Print #1," " end sub Raport: Dane punkty osnowy Nr X Y 1001 1000.00 1000.00 1002 1040.00 1040.00 Miary ortogonalne Nr Odcieta Rzedna 1 1.98 9.02 2 3.04 5.96 3 5.99 6.98 4 7.02 4.01 5 9.97 5.03 6 11.03 -5.98 ...... Obliczone współrzędne pikiet Nr X Y 1 995.04 1007.76 2 997.91 1006.39 3 999.29 1009.19 4 1002.14 1007.79 5 1003.51 1010.59 6 1012.04 1003.56 ....... 28 Kartowanie pikiet pomierzonych metodą biegunową 0g α AB β0 βi B α AP = α AB − β 0 + β i P A li X Pi = X A + li ⋅ cos α AP YPi = YA + l ⋅ sin α AP Pomiarami są kąty βi oraz długości li . Program jest bardzo podobny do programu dla pomiaru metodą ortogonalną , musi jednak uwzględniać różnice w sposobie pomiaru pikiet i we wzorach na obliczenie ich współrzędnych. 29 Obliczanie miar ortogonalnych B α li hi Pi A li = ∆y APi ⋅ sin α AB + ∆x APi cos α AB hi = ∆y APi ⋅ cos α AB − ∆x APi sin α AB 30 Obliczanie miar biegunowych B α AP α AB A βi P li β i = α AP − α AB 2 2 li = ∆y AP + ∆x AP 31 Czytanie numerów puktów i ich współrzędnych z mapy Program ten pozwala na odczytanie z rysunku mapy współrzędnych zaprojektowanych punktów. Numery punktów i ich współrzędne zapisywane są we wskazanym pliku tekstowym. Znajduje to zastosowanie w przygotowaniu miar realizacyjnych dla wyniesienia w teren projektu. 32 Zapisane w pliku tekstowym numery i współrzędne punktów projektu posłużą następnie do obliczenia: -miar ortogonalnych lub -miar biegunowych które pozwolą wytyczyć projektowane punkty w oparciu o isniejącą osnowę realizacyjną. '******************************* MAIN ************************ Sub Main Dim plikxy as string plikxy=MbeInputBox("Podaj nazwę pliku do zapisania współrzędnych", "D:\pikietyxy.txt","WSPÓŁRZĘDNE PIKIET") Open plikxy For Output As #1 pikiety close #1 MbeMessageBox "Dane w pliku "+plikxy End Sub 33 34 W procedurze tej występuje zmienna o nazwie: pikieta zadeklarowana na wstępie programu jako zmienna globalna, typu MbePoint: Type MbePoint x as double y as double z as double End Type Public pikieta as MbePoint 35 36 '************************* WSKAŻ PUNKT ************************************ Sub Wskaz_Punkt (Nr as string, Pkt as MbePoint, opis as string) Dim accepted As Integer Dim elem As New MbeElement 'defines an object called elem in which we 'will keep our element Dim filePos As Long Dim status As Integer MbeSendCommand "NOECHO" MbeWriteCommand opis accepted = FALSE While NOT accepted MbeStartLocate MbeWritePrompt "Select element..." MbeGetInput MBE_DataPointInput, _ MBE_ResetInput, _ MBE_CommandInput, _ MBE_KeyInInput Select Case MbeState.InputType Case MBE_CommandInput MbeSendLastInput Exit Sub Case MBE_KeyinInput MbeSendLastInput Exit Sub End Select MbeSendLastInput filePos = elem.fromLocate() if elem.type<>17 then exit sub 'While we've found an element that we haven't yet accepted While MbeState.CmdResult = MBE_AcceptQuery AND _ NOT accepted MbeWritePrompt "Accept/Reject" MbeGetInput MBE_DataPointInput, _ MBE_ResetInput, _ MBE_CommandInput, _ MBE_KeyInInput MbeSendLastInput 37 Select Case MbeState.InputType Case MBE_ResetInput filePos = elem.fromLocate() 'Because MbeStartLocate automatically finds another 'element if there is one at the same place. Case MBE_DataPointInput accepted = TRUE Case MBE_CommandInput MbeSendLastInput Exit Sub Case MBE_KeyinInput MbeSendLastInput Exit Sub End Select Wend Wend if elem.type=17 then if elem.getstring(Nr)=Mbe_Success then If elem.getOrigin (pkt) = MBE_Success Then 'print point.x 'print point.y 'print Opis end if end if end if MbeSendCommand "Null" MbeSendCommand "ECHO" MbeWriteCommand "" MbeWritePrompt "" MbeWriteStatus "Finished MACRO " End Sub 38 Po uruchomieniu procedury Wskaż_punkt - w lewym dolnym rogu ekranu wyświetlane są komunikaty: Pikieta>Select element Należy wtedy kliknąć myszą na numer pikiety. Pikieta>Accept/Reject Jeżeli akceptujemy zaznaczoną pikietę należy kliknąć po raz drugi. Jeżeli odrzucamy pikietę klikamy prawym klawiszem myszy. Aby zakończyć program wystarczy kliknąć na element nie będący numerem pikiety – pojawi się wtedy komunikat: 39 Na koniec program wyświetla informację o miejscu zapisania pliku: Fragment pliku tekstowego z zapisanymi danymi odczytanymi z rysunku: 40