Trong thời gian vừa qua, chúng em đã đặt được cái nền cơ bản, tạo nền tảng vững chắc
để phát triển tiếp sau này. Với khối lượng mã nguồn đã chuyển được, chương trình cĩ thể được phát triển tiếp, chuyển đổi nhiều hơn nữa các chức năng mạnh mẽ của GRASS5, phần mềm mà đến bây giờ đã được phát triển đến phiên bản 5.7, một cách trọn vẹn.
KHOA CNTT Ờ
ĐH KHTN
Tài Liệu Tham Khảo
Albrecht, J. : GTZ-handbook GRASS. Vechta, Germany, 1992 Hoặc xem tại địa chỉ sau:
http://www.laum.uni-hannover.de/iln/grass/
Byars, B.W., Clamons, S.F. : GRASS 4.2 Reference Manual. Waco, U.S.A, 1997 Hoặc xem tại địa chỉ sau:
http://www.baylor.edu/~grass/
Fox, J. : RIM database system. Installers manual. University of Washington, 1989
Fox, J. : RIM database system. Users manual. University of Washington, 1989
Harmon, V., Shapiro, M. : GRASS tutorial: Image processing. CERL, Champaign, Illinois, 1992
Jensen, J. R. : Introductory Digital Image Processing: A remote sensing perspective. Second Edition. New Jersey, 1996
Larson, M., Shapiro, M., Tweddale, S. : Performing map calculations on GRASS data :
r.mapcalc programming tutorial. CERL, Champaign, Illinois, 1991 Hoặc xem tại địa chỉ sau:
http://www.laum.uni-hannover.de/iln/grass/
Lillesand, Th. M., Kiefer, R. W. : Remote sensing and image interpretation. New York, 1994.
Neidig, C.A., Gerdes, D., Kos, Ch. : GRASS 4.0 map digitizing manual: v.digit. CERL, Champaign, Illinois, 1991.
Neteler, M. : Das GRASS Handbuch. Ein problemorientierter Leitfaden. 3. Auflage, Hannover, Germany, 1998.
Phiên bản trước cĩ tại:
http://www.laum.uni-hannover.de/iln/grass/handbuch/
Shapiro, M., Westerveld, J. : GRASS programmer's manual. CERL, Champaign, Illinois, 1991.
Shapiro, M., Westerveld, J. : GRASS user's manual. CERL, Champaign, Illinois, 1991.
KHOA CNTT Ờ
ĐH KHTN
Phụ Lục
Một số kỹ thuật chuyển đổi
ẳ Kỹ thuật ReDirect Output Stream
Kỹ thuật này dùng để chuyển hướng lại output, thay vì xuất ra dịng stdout, chúng ta sẽ
chuyển hướng sang một ListBox. Sử dụng kỹ thuật này chủ yếu để bắt lấy output của các hàm printf(..), fprintf(..), tạo dễ dàng cho việc xử lý.
Chi tiết của kỹ thuật này, xem trong mã nguồn chương trình.
ẳ Kỹ thuật xử lý PAD của GRASS
Khi tạo hay xử lý trên cửa sổ XWindow thì GRASS cĩ sử dụng xâu liên kết đơi PAD...(cấu trúc xâu PAD và các xử lý trên xâu đĩ được định nghĩa độc lập trong 2 file pad.h và pad.c trong thư mục device/lib)
Khi cần thao tác trên cửa sổ XWindow, các hàm R_xxx_Pad sẽđược gọi.
Các hàm R_xxx_Pad này sẽ thực hiện bằng cách gửi sự kiện cùng với tham số dữ liệu kèm theo sự kiện đĩ vào file fifo.1a, khi đĩ, bộ xử lý command (thread) sẽ đĩn lấy sự
kiện và dữ liệu kèm theo này để xử lý bằng cách gọi lại các hàm PAD chuẩn đã được
định nghĩa ở trên như create_pad(), find_pad() v.v... để thực hiện và trả kết quả xử lý
được về (bằng cách ghi vào file fifo.1b).
PAD chẳng qua là một xâu kép như sau:
pad1 <=> pad2 <=> pad3 <=> ...<=> pad n
KHOA CNTT Ờ
ĐH KHTN
Mỗi PAD cĩ một tên định danh riêng, và một danh sách liên kết ITEM
Mỗi danh sách liên kết ITEM lại nắm giữ một xâu LIST, mỗi phần tử LIST cĩ giá trị
riêng.
Bởi vậy, thường hay cĩ câu sau đây:
"...duyệt hết các Item của Pad này " "...duyệt hết các List của Item này "
Ởđây, xâu này bắt đầu bằng biến con trỏ tồn cục "padlist" trong file pad.c Và pad được khởi tạo ban đầu create_pad("").
Hàm create_pad (char *name) :
Để tạo ra một PAD mới cĩ tên là name, rồi gắn nĩ vào đầu xâu
pad_mới <=> pad1 <=> pad2 <=> ...<=> pad n
Hàm find_pad (char *name) :
Trả về con trỏđến một phần tử pad cĩ tên là name trong xâu, nếu cĩ.
Sự Kiện PAD_GET_ITEM:
Để lấy giá trị của tồn bộ danh sách LIST trong ITEM của PAD hiện tại (currentPad). Cụ thể là sau khi gửi sự kiện PAD_GET_ITEM với tham số là tên của Item (chẳng hạn như là "cur_w" )
KHOA CNTT Ờ
ĐH KHTN
_send_ident(PAD_GET_ITEM); //gửi sự kiện
_send_text("cur_w"); //gửi tiếp tham số là tên của Item.
_get_char(&result); // ghi thực sự vào file và nhận lại kết quả
... // Tới đây thì thread chạy ngầm bên kia của chúng ta // sẽ bắt lấy và xử lý Sự Kiện này
RECTEXT(text, text_size); /* đọc lên tham sốđược kèm theo:
tên của Item, cụ thểởđây là chuỗi "cur_w" */ if (curpad == NULL){ // nếu khơng tồn tại Pad hiện tại
RESULT(NO_CUR_PAD); // thì trả về kết quả error break;
}
item = find_item(curpad, text); // tìm trong danh sach Items
// của current pad items cĩ tên là // text if (item == NULL) { RESULT(NO_ITEM); // nếu khơng tìm thấy thì // trả về kết quả error break; }
RESULT(OK); // đã tìm thấy Item cĩ tên như thế, //trả về kết quả OK trước!
for (list = item->list; list != NULL; list = list->next) //duyệt List if (*list->value) //của Item vừa tìm thấy
SENDTEXT(list->value); // ghi liên tục vào file chuỗi // danh sách các giá trị của List SENDTEXT(""); // kết thúc bằng ký hiệu rỗng ""
/* Tới đây thì kết thúc Thread bắt sự kiện này */
...
if (result == OK) // nếu mà kết quả trả về là OK
get_list(list, count); // lấy lên danh sách giá trị của List vừa được // ghi vào hồi nãy ở trên ....
D_New_Window(name, top, bottom, left, right):
KHOA CNTT Ờ
ĐH KHTN
Hàm này dùng để tạo ra một pad mới cĩ tên là "full_screen", sau đĩ chọn nĩ là Pad hiện hành, sau đĩ, thiết lập giá trị ITEM cĩ tên "d_win" của nĩ các giá trị top, bottom, right, left của cửa sổ cần tạo. Sau đĩ, gọi hàm D_Show_Window để show ra màn hình...
Các hàm khác đều tương tựẦ.
HẾT