Professional Documents
Culture Documents
Bao Cao1
Bao Cao1
MỤC LỤC
Mở đầu
Phần I. Cơ sở lý thuyết
1. Tổng quan về MDL
2. MDL framework
3. MDL API
4. Cách tạo file .bat để dịch chương trình nguồn MDL
Phần II. Chương trình minh hoạ
Kết luận
Phụ lục : mã nguồn của chương trình
1
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Mở đầu
2
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Phần I: Cơ sở lý thuyết
MDL dùng C làm nền tảng và sử dụng các tính năng cần thiết như chương
trình dịch, linker, runtime, giao diện đồ họa người dùng... để phát triển
Microstation.
MDL cho phép phát triển những ứng dụng có khả năng tương tác với nhau
chạy trên MicroStation và nhưng ứng dụng này thoạt nhìn có vẻ giống như là
một phần của MicroStation. Thực tế, các chức năng MicroStation chính là
những ứng dụng của nó.
Phát triển các ứng dụng có khả năng thích nghi với các chuẩn phẩn cứng
khác nhau. MDL loại bỏ ở mức độ cho phép những hệ đồ hoạ phụ, hệ điều hành
và CPU. Việc chuyển các ứng dụng của MDL sang một hệ phần cứng khác chỉ
đơn thuần là việc chuyển các file nguồn và xây dựng lại. Đồng thời cho phép
sắp xếp những thông tin về giao diện để để dịch sang những ngôn ngữ khác
nhau một cách hiệu quả.
Ứng dụng của MDL là có thể kết hợp chặt chẽ với MicroStation. Đối với
người sử dụng, các lệnh hoặc các thao tác MDL không thể phân biệt với các
lệnh bên trong của MicroStation. Thực tế, nhiều tính năng của các sản phẩm
MicroStation cơ bản được thực hiện như phần mở rộng của MDL. Với những
lập trình viên thương mại, một tập hợp các chương trình liên kết có thể được xây
dựng trên một kiểu modular để cung cấp mức kết hợp như nhau trong tất cả các
chương trình MDL.
3
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
MDL sử dụng ngôn ngữ lập trình C tiêu chuẩn. Sử dụng C có nhiều thuận
lợi. Ví dụ: những lập trình viên biết sử dụng C thì luôn được chuẩn bị để bắt đầu
ngay lập tức. Còn những lập trình không có kinh nghiệm sử dụng thì không thể
lấy được những nguồn tài liệu dồi dào như sách vở, thiết bị hỗ trợ máy tính…
Các ưu điểm mà MDL mang lại :
- Sự thực hiện hoàn thiện của C. Chương trình biên dịch của MDL biên
dịch các file gốc của C thành các code giả được hiểu bởi MicroStation.
- Chương trình thông dịch code giả trong MicroStation thực hiện các
chương trình MDL.
- Một môi trường phát triển hoàn thiện bao gồm các công cụ sau:
- Trình biên dịch C, thư viện và bộ kết nối
- Chương trình biên dịch tài nguyên và thư viện
- Chương trình gỡ rối
- Tạo thành chương trình
Môi trường runtime cung cấp các hàm tiêu chuẩn của hệ điều hành như
truy nhập file, quản lí và bảo vệ bộ nhớ.
MDl cung cấp công cụ cho việc phát triển giao diện đồ hoạ của người sử
dụng không phụ thuộc vào hệ thống bao gồm các hộp thoại, menu kéo xuống và
menu mẫu. Công cụ giao diện của người sử dụng đảm bảo rằng mã các hộp
thoại luôn chạy trên tất cả các hệ thống.
MDL có nhiều lợi ích khác. Ví dụ: nó được thiết kế để tạo thành các ứng
dụng dễ dàng chuyển từ nền MicroStation sang hệ thống khác. Trong nhiều
trường hợp, việc chuyển đổi chỉ bao gồm viêc chuyển file nguồn sang hệ thống
mới và xây dựng lại. MDL cũng cho phép các dữ liệu liên quan đến người sử
4
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
dụng được tổ chức do đó người lập trình ứng dụng có thể thiết lập các ứng dụng
cho những thị trường không sử dụng tiếng Anh
2. MDL Framework
- State machine engine : Microstation hoạt động như một bộ máy trạng
thái. Nó theo dõi tất cả các sự kiện như là sự kiện đầu vào bằng bàn phím, chuột,
các sự kiện biến đổi trạng thái, sự kiện thời gian, và các sự kiện khác. Khi một
sự kiện xuất hiện, Microstation kiểm tra trạng thái của nó và tác động trở lại sự
kiện.
- MDL runtime : là tập hợp con của MDL framework, nó hỗ trợ sự thực
thi (nhưng không phải sự phát triển) của ứng dụng MDL. MDL runtime bao gồm
MDL Virtual Machine, MDL debugger, MDL task manager, quản lý tài nguyên,
quản lý hộp thoại, quản lý tác vụ của hệ thống và các dịch vụ khác.
Môi trường runtime bao gồm hơn 1750 hàm built-in (gắn liền) , các hàm
này là một phần của hệ thống MicroStation. Hàm built-in chạy với tốc độ biên
dịch cao nhất và là các hàm giống nhau được điều khiển bởi các lệnh bên trong
của MicroStation . Những hàm built-in này cần thiết cho các ứng dụng chạy
liên tục trong MicroStation và các ứng dụng khác. Người lập trình MDL sử
dụng những công cụ như người phát triển MicroStation để tạo thành các lệnh.
Truy nhập vào các biến built-in. Hầu hết dữ liệu toàn cục của
MicroStation là có sẵn cho các chương trình MDL như các biến built-in. Những
file nguồn định nghĩa cấu trúc dữ liệu của biến built-in.
Chương trình quản lí tài nguyên cho phép bạn phân tách các mã và dữ
liệu ứng dụng. Nó điều khiển dữ liệu không thực sự nằm trong chương trình C.
Chương trình quản lí tài nguyên này bao gồm ngôn ngữ giống như C để định
5
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
nghĩa dữ liệu, chương trình biên dịch tài nguyên để định nghĩa sự biên dịch, và
các hàm built-in trong thư viện của MDL để truy nhập vào dữ liệu chứa trong
các file nguồn. Kiểu quản lí dữ liệu bởi chương trình quản lí tài nguyên bao hàm
các hộp thoại, thông điệp và lời nhắc.
- MDL virtual machine : đặc tính không phụ thuộc vào nền phần cứng
thực sự là một trong những lý do vì sao mã nguồn MDL không được biên dịch
trực tiếp vào các chỉ thị của CPU mà hơn thế lại được đưa vào code giả được
6
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
biên dịch bởi MicroStation MDL virtual machine. Điều đó nghĩa là chuơng trình
MDL không thể chạy được ngoài môi trường Microstation.
MDL virtual machine đóng vai trò là giao diện hay lớp trung gian giữa p-
code nhị phân MDL và bộ vi xử lý (hay nền hệ điều hành) nơi thực hiện các chỉ
thị của chương trình.
- MDL debuger : Bentley thiết kế cùng với Virtual Machine chương trình
gỡ rối theo dòng lệnh không phụ thuộc vào platform. Nhưng không may đó là
điểm yếu của MDL framework. Chương trình debuger có thể thực hiện các tác
vụ cần thiết, nhưng chỉ thân thiện khi hoạt động theo kiểu “command-line”. Nếu
bạn thích gõ lệnh hơn là click chuột thì bạn có thể hài lòng với lập trình MDL.
Dù vậy, bạn sẽ thấy các kinh nghiệm gỡ rối với các ứng dụng MDL là rất hữu
ích.
- MDL Utilities :
7
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Kiểu file Mô tả
Được tham chiếu đến như tệp tiêu đề hay tệp include.
.h
Tệp tiêu đề được khai báo trong file .mc, .mt và .r.
Được tham chiếu đến như tệp ứng dụng, đây là file
nguồn nơi tất cả các tài nguyên được liên kết với nhau
.ma
trong một ứng dụng. File ứng dụng có thể được tạo ra
bởi mlink hay rlib.
.mc Được tham chiếu đến như nguồn MDL.
Được tham chiếu đến như makefile, dược đọc bởi
.mke
bmake để biết cách thức xây dựng một ứng dụng.
Được tham chiếu đến như file thư viện, được tạo ra và
.ml
cập nhật bởi mlib.
Được tham chiếu đến như map file, được tạo ra bởi
.mm mlink.
Được tham chiếu đến như file đối tượng, được tạo ra
.mo
bởi mcomp. Những file này là đầu vào của mlink.
Được tham chiếu đến như file chương trình. Đây là
một kiểu file tài nguyên mà có thể trộn với các tài
.mp
nguyên khác sử dụng rlib.File chương trình được tạo ra
bởi mlink.
8
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Được tham chiếu đến như type file, file nguồn dược sử
dụng để tạo định nghĩa kiểu cho các biểu thức C trong
.mt
hàm built-in. rsctype đọc type file và tạo ra file tài
nguyên nguồn
Được tham chiếu đến như file tài nguyên nguồn, chẳng
.r hạn như sự mô tả hộp thoại, bảng lệnh...rcomp đọc các
file tài nguyên nguồn và tạo ra file tài nguyên.
Được tham chiếu đến như file tài nguyên, rcomp tạo ra
.rsc
các file tài nguyên này.
3. MDL API
Giao diện lập trình ứng dụng MDL, viết tắt là MDL API, là một tập hợp
các hàm và biến được khai báo mà trong đó Microstation cung cấp chủ yếu cho
người lập trình phần mềm. Thư viện MDL API là một trong những phần cốt lõi
của MDL framework. Các hàm của MDL API thuờng được coi như các hàm gắn
liền (built-in) bởi vì bản thân nó chỉ được thấy ở bên trong các thủ tục của
Microstation. Các hàm built-in giống như thế được các lập trình viên sử dụng để
phát triển các thành phần thiết yếu của Microstation. Bởi vậy, khi là một người
lập trình MDL, bạn có cũng các khả năng để điều khiển Microstation như
Bentley đã làm.
MDL API là một API phức tạp nhất trong các API của Bentley như
Microstation Basic, JMDL....MDL runtime và các hàm API cư trú trong một tập
hợp các thư viện liên kết động (DLL), do đó nó được thực thi trực tiếp. Điều này
là rất quan trọng cho quá trình hoạt động. Một số thư viện API (khoảng 14) được
9
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
thiết kế như là Thư viện dùng chung của Microstation (Microstation Shared
Libraries-MSL) đã được biên dịch.
Chúng ta có thể chia các hàm API thành 4 nhóm:
- Hàm của cơ chế CAD
- Hàm của ứng dụng và hệ thống
- Hàm cơ sở dữ liệu
- Giao diện người dùng đồ họa (GUI)
Thông thường, các hàm đó có cấu trúc chung như sau :
mdl + lĩnh vực + gạch dưới + thao tác
Ví dụ: mdlFile_create, mdlLineString_create.
Việc thực hiện MDL được diễn ra như sau : mã nguồn viết bằng ngôn ngữ
C sẽ được chương trình biên dịch chuyển thành pseudocodes (code giả - viết tắt
là p-code) được thông dịch bởi Microstation runtime. MDL API tồn tại trong cả
mã nguồn của Microstation như DLL hoặc trong MSL được thông dịch. MDL có
10
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
thể tương tác với các module liên kết động (DLM). Tất cả các thành phần này
chạy trong tiến trình của Microstation.
3.1. Tổng quan về các hàm built-in trong API của MDL.
a. Hàm các đối tượng có thể hiển thị được.
11
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
PointString, Shape,
Surface, Text,
TextNode,
ComplexChain)
Element 13 mselemen.fdf mdl..._extract Để tách thông tin từ
information các đối tượng cụ thể.
extraction
Element 43 mselemen.fdf mdlElement_ Dùng cho thao tác
common trên các đối tượng
functions đơn phổ biến
Element 4 msmisc.fdf mdlIntersect_ Đáp ứng như API cho
intersection các đối tượng giao
nhau
Element 4 msmisc.fdf mdlModify_ Cho phép thay đổi các
modification đối tượng đơn hoặc
sự miêu tả các đối
tượng
Element 105 mselmdsc.fdf mdlElmdscr_ Dùng để thực hiện
descriptor các thao tác với các
mdlCopyContext_
functions đối tượng thành phần
trong các đối tượng
phức tạp
Element 5 msmisc.fdf mdlClip_ Cho phép liên kết các
clipping đối tượng
Element 23 msassoc.fdf mdlAsoc_ Cung cấp sự truy cập
association vào khả năng liên kết
các đối tượng để tạo
12
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
13
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
c. Hàm container
14
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
15
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
key
Dialog box 705 msdialog.fdf mdlDialog_ API cho hộp thoại và danh
and Dialog mục thoại
ditemlib.fdf
item functions
msritem.fdf
htmllib.fdf
miscilib.fdf
..and otheres
View 193 msview....fdf mdlView.... Cho phép xem và quản lý
handling các nhóm xem
Digitizer 3 msinput.fdf mdlDigitize_ Điều khiển sự kiện số hóa
function
f. Thao tác
16
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
g. Hệ thống
17
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
18
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
19
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Để biên dịch ứng dụng của MDL, "YOURAPP" (điền tên ứng dụng vào
đây), ta làm theo các bước sau:
Chú ý: Thư mục chứa file sẽ đúng nếu MicroStation được cài đặt sử dụng
thư mục mặc định. Nếu như bạn sử dụng các thư mục mặc định khác để cài đặt
MicroStation, cần điều chỉnh đường dẫn cho đúng.
1. Ba biến sau cần được thiết lập. Nó có thể được thiết lập trong
AUTOEXEC.BAT, System Setup Tool hoặc trong file batch và file script
chạy trong các lệnh shell.
Chú ý: Trong dòng BMAKE_OPT trên, có dấu trừ và chữ i viết hoa (- I)
không có dấu cách từ BMAKE_OPT tới cuối dòng.
2. Trong DOS, thay đổi thư mục dẫn đến file chứa mã nguồn (ví dụ như
YOURMAP.mc, YOURMAP.h, v.v.). Trong trường hợp này, gõ như sau:
cd\...\YOURAPP
20
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
bmakewin -a YOURAPP.MKE
4. Chương trình biên dịch sẽ đưa ra những câu cảnh báo như "...does not
have an ANSI function declaration". Trong Microstation 95, trình biên dịch
MDL được thiết kế lại để nghiêm khắc hơn trong việc đưa ra cảnh báo.
5. Nếu trình ứng dụng dược biên dịch, chương trình biên dịch sẽ đưa ra
Chương trình có chức năng chính là tính toán tọa độ điểm đo chi tiết từ
file số liệu đầu vào, hiển thị các điểm đó lên file dgn trong Microstation và tạo
ra file tọa độ các điểm chi tiết.
Chương trình gồm các file :
- file.mc : là file nguồn
- file.h và filetxt.h : là 2 tệp tiêu đề.
- filetyp.r và filedlg.r: là 2 file tài nguyên
- filetyp.mt
- File số liệu đo chi tiết đầu vào.
- File bat để chạy chương trình.
21
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
22
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
(
MSElement *element /* đối tượng cần thêm*/
);
- Lấy tên thư mục hiện thời vào bộ đệm :
void mdlFile_getcwd
(
char *workingDirectoryP, /* giá trị nhận vào */
int bufferSize /* kích thước bộ đệm */
);
- Mở hộp thoại chọn file
int mdlDialog_fileOpen
(
char *fileName, /* tên file */
RscFileHandle rFileH, /* điều khiển file tài nguyên*/
int resourceId, /* ID tài nguyên */
char *suggestedFileName, /* tên gợi ý */
char *fileFilter, /* bộ lọc file */
char *defaultDirectory, /* thư mục gốc */
char *dialogTitle /* tiêu đề hộp thoại */
);
- Thông điệp mở hộp thoại
#include <dlogids.h>
int mdlDialog_openMessageBox /* <= luôn là ACTIONBUTTON_ */
(
long dialogId, /* Dialog Id của thông điệp được tạo */
char *stringP, /* Chuỗi hiển thị trong thông điệp */
long whichIcon /* Id của ký hiệu vẽ trong thông điệp */
);
23
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
(
RscFileHandle *rfHandle, /* <= Resource File Handle */
char *fileName, /* => Name of File to open */
ULong fileAttrMask /* => file attributes bit mask */
);
- Khởi tạo
#include <mdl.h>
void *mdlCExpression_initializeSet
(
unsigned long visibilityFlag, /* => visibility mask */
24
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
25
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Kết luận
MDL là một môi trường phát triển hoàn chỉnh, cho phép các ứng dụng lợi
dụng tối đa khả năng của Microstation CAD engine. MDL có thể được dùng để
phát triển các tiện ích đơn giản, những yêu cầu của khách hàng, hay những ứng
dụng trong thương mại đòi hỏi cần sự tinh vi, chi tiết.
Trên đây chúng ta đã tìm hiểu ngôn ngữ MDL để lập trình trong
Microstation. Đây là một hướng phát triển các ứng dụng chuyên nghiệp trong
Microstation để mang lại hiệu quả cao trong công việc. Chuơng trình minh họa
còn đơn giản và có nhiều thiếu sót nên sẽ được nghiên cứu phát triển trong thời
gian sắp tới để có thể hoàn thiện hơn.
26
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
27
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
#include <msparse.fdf>
#include <msdialog.fdf>
#include <mscexpr.fdf>
#include <msfile.fdf>
#include <ditemlib.fdf>
#endif
#include "file.h"
#include "filetxt.h"
#ifdef unix
char sepchar = '/';
#else
char sepchar = 92;
#endif
#define pi 3.14159
/*------------------------------------------------------+
| Hien thi diem do chi tiet |
|
|
+------------------------------------------------------*/
Private void Hienthi()
{
MSElementUnion text, line;
Dpoint3d linePts[2], ptxt[1], pt[3];
TextSizeParam txtSize;
TextParam txtParam;
TextEDField edFields[2];
28
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
TextEDParam edParam;
FILE *in = NULL;
int i;
char id;
double x,y;
mdlState_clear();
in=fopen("XY.kq","r");
while (!feof(in))
{
fscanf(in,"%s %lf %lf\n",&id,&y,&x);
x=x*100;
y=y*100;
//text
if(!feof(in))
{
ptxt[0].x=x+50;
ptxt[0].y=y+50;
ptxt[0].z=fc_zero;
txtSize.mode=TXT_BY_TILE_SIZE;
txtSize.size.width=50;
txtSize.size.height=50;
txtParam.font=3;
txtParam.just=-2;
txtParam.style=-1;
txtParam.viewIndependent=FALSE;
if (mdlText_create (&text, NULL,&id, ptxt,&txtSize,
NULL, &txtParam, NULL) == SUCCESS)
{
mdlElement_display (&text,
NORMALDRAW);
mdlElement_add (&text);
}
//dau chu thap
29
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
30
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
}
else
{
anpha=dy/dx;
if (dx<0) anpha=atan(anpha)+pi;
else
{
if (dy<0) anpha=atan(anpha)+2*pi;
else anpha = atan(anpha);
}
}
return anpha;
}
/*------------------------------------------------------\
| Doc file va tinh toa do diem chi tiet |
|
|
\------------------------------------------------------*/
Private int File_Read(void)
{
FILE *fin=NULL, *fout=NULL;
DG dgoc[50];
char *buffer;
double XX=0, YY=0, pv;
int trd, tdg, td;
int n;
double dx,dy;
31
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
return SUCCESS;
}*/
fin=fopen("D:\\TNT\\Tamtn\\sl1.dat","r");
fout = fopen("XY.kq","w");
fscanf(fin, "%d %d\n", &tdg, &trd);//tdg: tong so diem goc; trd : tong so
tram do
n=1;
while (n<=trd)
{
char ddm[80], ddh[80];
int i,g1=0,dh1=0;
fscanf(fin, "%s %s %d", ddm, ddh, &td); //ddm la diem dat may , ddh
la diem dinh huong, td la tong so diem chi tiet tai tram do
for (i=1; i<=tdg; i++)
{
if(strcmp(dgoc[i].ID,ddm)==0) {g1=i;}
if(strcmp(dgoc[i].ID,ddh)==0) {dh1=i;}
if (g1!=0 && dh1!=0) break;
}
dx=dgoc[dh1].x-dgoc[g1].x;
dy=dgoc[dh1].y-dgoc[g1].y;
pv = Phvi(dy,dx);
32
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
fclose(fin);
fclose(fout);
return SUCCESS;
33
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
//Mo dialog
if (mdlDialog_fileOpen (localSpec, NULL, 0, NULL, defaultExtension,dir, prompt))
return SUCCESS;
else
strcpy (filename, localSpec);
return SUCCESS;
//------------------------------------------------------------------------------
Private int File_pushButtonHook(DialogItemMessage *dimP)
{
DialogItem *db;
int chon;
static boolean OK = FALSE;
dimP->msgUnderstood = TRUE;
switch (dimP->messageType)
{
case DITEM_MESSAGE_BUTTON:
{
switch (dimP->dialogItemP->rawItemP->itemHookArg)
{
case PUSHBUTTONID_Select:
{
File_getFile (params.asciiFile,
"*.dat", TXT_SelectFile);
mdlDialog_itemsSynch (dimP->db);
break;
}
case PUSHBUTTONID_Run:
{
File_Read();
34
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
Hienthi();
break;
}
case PUSHBUTTONID_Quit:
{
//Dong hop hoi thoai
/*mdlDialog_openMessageBox(DIALOGID_MsgBoxYesNo,"Ban co
muon thoat khoi chuong trinh", MSGBOX_ICON_INFORMATION);
if (chon == ACTIONBUTTON_YES
&& OK == TRUE)
mdlDialog_closeCommandQueue (dimP->db);
else return SUCCESS;*/
mdlDialog_closeCommandQueue (dimP->db);
break;
}
}
}
default:
{
dimP->msgUnderstood = FALSE;
break;
}
}
return SUCCESS;
//============================================================
Private int File_unloadFunction(void)
{
mdlState_startDefaultCommand ();
return FALSE;
35
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
//============================================================
Private int File_dialogBoxHook
(
DialogMessage *dmP //dung cho nhan hop thoai
)
{
int status;
dmP->msgUnderstood = TRUE;
switch (dmP->messageType)
{
case DIALOG_MESSAGE_DESTROY:
{
//Thoat ra khoi hop hoi thoai MDL
mdlDialog_cmdNumberQueue (FALSE, CMD_MDL_UNLOAD,
mdlSystem_getCurrTaskID(), TRUE);
break;
}
default:
{
dmP->msgUnderstood = FALSE;
break;
}
}
return SUCCESS;
}
//============================================================
Private DialogHookInfo uHooks[] =
{
{HOOKDIALOGID_DialogBox, File_dialogBoxHook},
{HOOKITEMID_PushButton, File_pushButtonHook},
36
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
};
//------------------------------------------------------------------------------------------------
//Chuong trinh chinh
int main( void )
{
RscFileHandle rfHandle;
char *setP;
//Khai bao cac muc moc noi trong hop hoi thoai
mdlDialog_hookPublish (sizeof(uHooks)/sizeof(DialogHookInfo), uHooks);
//Mo tai nguyen cua bang va hop hoi thoai cua chuong trinh
mdlResource_openFile (&rfHandle, NULL, FALSE);
params.asciiFile[0] = 0;
params.Tyle = 2;
//thoat chuong trinh
mdlSystem_setFunction (SYSTEM_UNLOAD_PROGRAM, File_unloadFunction);
//Mo dialog
mdlDialog_open (NULL, DIALOGID_File);
return SUCCESS;
}
2. file.h
//Tao file
#ifndef __fileH__
#define __fileH__
#include <msdefs.h>
#include <basetype.h>
37
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
#define TL200 1
#define TL500 2
#define TL1000 3
#define TL2000 4
#define TL5000 5
#define DIALOGID_File 1
#define HOOKDIALOGID_DialogBox 1
#define HOOKITEMID_ToggleButton 2
#define HOOKITEMID_PushButton 3
#define OPTIONBUTTONID_Format 1
#define PUSHBUTTONID_Select 1
#define PUSHBUTTONID_Run 2
#define PUSHBUTTONID_Quit 3
#define TEXTID_AsciiFile 20
/*----------------------------------------------------------------------+
| |
| Resource Type and ID for UserPrefs |
| |
+----------------------------------------------------------------------*/
#define RTYPE_File 'File'
#define RSCID_File 1
38
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
} File_Params;
#endif
3. filetxt.h
/*----------------------------------------------------------------------+
| |
| file.h |
| |
+----------------------------------------------------------------------*/
#define TXT_DialogTitle "Tinh toa do diem chi tiet"
39
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
4. filetyp.r
#include "datadef.h"
#include "cexprrsc.h"
CexprName 0 = {"File_params"};
CexprName 1 = {"Tyle"};
CexprName 2 = {"asciiFile"};
CexprName 3 = {"Diemgoc"};
CexprName 4 = {"ID"};
CexprName 5 = {"x"};
CexprName 6 = {"y"};
CexprNamedStructures 1 =
{{
{0, 0, 1694677681}, /* File_params */
{1, 3, 1308633781}, /* Diemgoc */
}};
/* struct File_params */
CexprType 0 = {18, 132, 0, 0, 0};
/* struct Diemgoc */
CexprType 1 = {18, 96, 1, 3, 0};
CexprMemberList 0 =
{{
{0xfffe, 0, 1, 0x240005c1}, /* Tyle */
{0xc0008001, 4, 2, 0x5700cc01}, /* asciiFile */
}};
CexprMemberList 1 =
{{
40
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
{0xc0005001, 0, 4, 0xd0000d6}, /* ID */
{0xfff7, 80, 5, 0x78000078}, /* x */
{0xfff7, 88, 6, 0x79000079}, /* y */
}};
5. filedlg.r
#include <rscdefs.h>
#include <cmdclass.h>
#include <dlogbox.h>
#include <dlogids.h>
#include <msdefs.h>
#include "File.h"
#include "Filetxt.h"
DialogBoxRsc DIALOGID_File =
{
DIALOGATTR_DEFAULT | DIALOGATTR_SINKABLE , 56*XC, 11*YC,
NOHELP, MHELP, HOOKDIALOGID_DialogBox, NOPARENTID, TXT_DialogTitle,
{
{{1*XC, 1*YC, 48*XC, 4*YC}, GroupBox, 0, ON, 0, TXT_File, ""},
{{12*XC, 2*YC, 35*XC, 2*YC}, Text, TEXTID_AsciiFile, ON, 0, TXT_AsciiFile, ""},
{{50*XC, 2*YC,5*XC, 0}, PushButton, PUSHBUTTONID_Select, ON, 0, TXT_pBtn_Select, ""},
{{40*XC, 6*YC, 9*XC, 0}, OptionButton, OPTIONBUTTONID_Format, ON, 0, TXT_Tyle, ""},
{{5*XC, 8*YC, 8*XC, 0}, PushButton, PUSHBUTTONID_Run, ON, 0, TXT_pBtn_Run, ""},
{{35*XC, 8*YC, 8*XC, 0}, PushButton, PUSHBUTTONID_Quit, ON, 0, TXT_pBtn_Cancel, ""},
}
};
DItem_OptionButtonRsc OPTIONBUTTONID_Format =
{
NOSYNONYM, NOHELP, MHELP, NOHOOK,
NOARG, TXT_Tyle,
"params.Tyle",
41
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
{
{NOTYPE, NOICON, NOCMD, LCMD, TL200, NOMASK, ON, TXT_0_200},
{NOTYPE, NOICON, NOCMD, LCMD, TL500, NOMASK, ON, TXT_1_500},
{NOTYPE, NOICON, NOCMD, LCMD, TL1000, NOMASK, ON, TXT_2_1000},
{NOTYPE, NOICON, NOCMD, LCMD, TL2000, NOMASK, ON, TXT_3_2000},
{NOTYPE, NOICON, NOCMD, LCMD, TL5000, NOMASK, ON, TXT_4_5000},
}
};
DItem_PushButtonRsc PUSHBUTTONID_Select =
{
NOT_DEFAULT_BUTTON, NOHELP, LHELPCMD,
HOOKITEMID_PushButton, PUSHBUTTONID_Select, NOCMD, LCMD, "",
TXT_pBtn_Select
};
DItem_PushButtonRsc PUSHBUTTONID_Run =
{
NOT_DEFAULT_BUTTON, NOHELP, LHELPCMD,
HOOKITEMID_PushButton, PUSHBUTTONID_Run, NOCMD, LCMD, "",
TXT_pBtn_Run
};
DItem_PushButtonRsc PUSHBUTTONID_Quit =
{
NOT_DEFAULT_BUTTON, NOHELP, LHELP,
HOOKITEMID_PushButton, PUSHBUTTONID_Quit, NOCMD, MCMD, "",
TXT_pBtn_Cancel
};
DItem_TextRsc TEXTID_AsciiFile =
{
NOCMD, LCMD, NOSYNONYM, NOHELP, LHELPCMD,
42
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
6. filetyp.mt
#include "File.h"
publishStructures (File_params);
publishStructures (Diemgoc);
7. file .bat
set MS=C:\Win32app\ustation
set BMAKE_OPT= -I%MS%\mdl\include
set BMAKE_OPT1= -I%MS%\mdl\include\stdlib
set PATH=;%MS%;%MS%\mdl\bin;%PATH%
43
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m
B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL
44
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m