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

Podobne dokumenty