Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 44

B¸o c¸o Chuyªn ®Ò I – LËp tr×nh MDL

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

MDL – “MicroStation Development Language được giới thiệu trong


Microstation v.4 năm 1991 như là một giải pháp cho việc phát triển một cách
chuyên nghiệp những ứng dụng của Microstation. Với mục đích là để thiết kế
framework đi đầu mà có đủ sức mạnh tạo ra cả những ứng dụng đơn giản cho
khách hàng cũng như những ứng dụng trong thương mại, những ứng dụng này
hoàn toàn thích hợp với hệ thống Microstation, nghĩa là trông giống và có vẻ
như hợp thành một thể thổng nhất với Microstation. Một công cụ có thể thay thế
cho MicroCSL hoặc UCM và đó chính là MDL.
MDL có cách viết mã độc lập, đó là lí do tại sao sự tham chiếu tới bất kì
hệ thống chức năng phụ thuộc nào đều hầu như bị xoá hoặc thay thế bởi các
chức năng rộng hơn của MDL. Tuy nhiên hiện nay, mục tiêu của Microstation
chỉ là chạy trên nền Windows.
MDL là một thế mạnh của Microstation về khía cạnh lập trình. Để phát
triển các ứng dụng chuyên nghiệp trong Microstation chúng ta cần nắm được
những yếu tố cơ bản của lập trình MDL. Bài báo cáo này đưa ra cơ sở lý thuyết
và một chương trình minh họa cho việc lập trình bằng MDL.

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

1. Tổng quan về MDL

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 :

Tên tiện ích Mô tả


Làm cho các tiện ích được sử dụng trong biên dịch,
Bmake liên kết tự động, và xây dựng tài nguyên cho các ứng
dụng phức tạp.
Là chương trình biên dịch được sử dụng để dịch file
Mcomp
nguồn MDL.
Các thư viện được sử dụng để quản lý tệp hình ảnh
Mlib
trong file thư viện.
Linker được dùng để kết hợp các đối tượng vào
Mlink
chương trình.
Chương trình dịch tài nguyên được dùng để biên dịch
Rcomp
tài nguyên nguồn.
Rlib Thư viện tài nguyên được dùng để trộn nhiều file tài

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

nguyên vào một file.


Dùng để tạo ra sự mô tả các kiểu cho một nhóm các
Rsctype hàm built-in được sử dụng trong biểu ngữ C trong
runtime.

- Các kiểu file nguồn :

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.

Kiểu API # File fdf Tiền tố trong hàm Chú giải


API
B-spline 152 msbsplin.fdf mdlBspline_ Dùng để thiết lập và
functions quản lí B-spline
Accudraw 1 mdllib.fdf mdlAccudraw_ để Accudraw đạt
được sự tối ưu
Cell functions 42 mscell.fdf mdlCell_ Dùng để đọc, lặp lại,
tạo thành, thực hiện
mdlCellIterator_
hoặc xoá các cell

Shared Cell 21 msscell.fdf mdlSharedCell_ trong thư viện cell, và

functions để đặt các cell vào


file design

Element 2 changetrack.fdf mdlChangeTrack_ Cho phép giám sát


mọi sự thay đổi trong
change
file DGN
tracking
Element 20 mselemen.fdf mdl..._create Dùng cho sự tạo
creation thành các đối tượng (
Arc, Circle, Cone,
Curve, Ellipse, Line,
LineString,

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

thành các điểm liên


kết trong kích thước,
các đường và các cell
dùng chung
Element 34 mslinkge.fdf mdlLinkage_ Cho phép gắn kết,
linkage thay đổi, xoá hoặc
tách các gói cơ sở dữ
liệu của các đối tượng
Multi-line 21 msmline.fdf mdlMline_ Dùng để thiết lập và
elements thay đổi các đối
tượng đa đường
Measurments 8 msmisc.fdf mdlMeasure_ Lấy các thuộc tính
functions kích thước cơ bản của
sự miêu tả các đối
tượng
Transient 14 mstrnsnt.fdf mdlTransient... Cung cấp API cho các
elements đối tượng chuyển tiếp
Dimensioning 23 msdim.fdf mdlDim_ Dùng cho các thao tác
element trên kích thước của
28 msdimstyle.fdf mdlDimStyle_
Function đối tượng
Nested 30 msdisplaypath.h mdlDisplayPath_ Cho phép quản lí
nhiều trường hợp của
Element
đối tượng trong các
instances
file hoặc cell tham
presentation
chiếu
Element 30 elementref.h elementRef_ Cho phép nhận dạng
reference duy nhất một đối

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

tượng trong session


Surface 7 mselemen.fdf mdlSurface_ Dùng cho các thao tác
creation bề mặt
Patterining 8 msmisc.fdf mdlPattern_
Mesh 71 msmdlmesh.fdf mdlMesh_ Dùng cho các khía
elements cạnh hình học

b. Tìm kiếm đối tượng

Loacate 40 mslocate.fdf mdlLocate_ Cho phép định vị các đối


elements mdlAutoLocate_ tượng
Scanning 62 msscan.fdf mdlScan_ API dùng để quét file
cho các đối tượng
msscancrit.fdf mdlScanCriteria_
Snapping 19 mslocate.fdf mdlSnap Cho phép bắt các đối
tượng bằng cách thăm
mdlAccuSnap_
dò Các điểm hoặc tự
động khi con chuột đi
qia các đối tượng
Hit list 10 mshitpath.h mdlHitPath_ Tìm kiếm đối tượng theo
cách gần các điểm kiểm
tra nhất

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

Matrix 26 msmdlmatrix.fdf mdlMatrix_ Đáp ứng như một


storage container cho các ma
trận số
Embedded 165 embedded....fdf jdmlEmbedded.... Cung cấp nhiều loại
Arrays linear container có giá
trị
Dynamic 13 msdarray.fdf mdlDArray_... cung cấp các mảng
arrays động đơn
String List 37 msstrlst.h mdlStringList_ Cho phép sử dụng danh
sách các chuỗi như một
rmgrstrl.h strlist_
mảng động

d. Giao diện người dùng

Input 23 msinput.fdf mdlInput_ API dùng cho việc quản lí


handling đầu vào
functions
Output 47 msoutput.fdf mdlOutput_ API dùng cho các thông
handling điêp đầu ra

State control 21 msstate.fdf mdlState_ Cho phép thực hiện các


hàm điều khiển trạng thái
Windows 87 mswindow.fdf mdlWindow_ uản lí hệ điều hành
functions window một cách tổng
quát
Function key 9 msmisc.fdf mdlFuncKey_ Điều khiển thực đơn Func

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

e.. Tài nguyên

Resource 25 msrmgr.h mdlResource_ API cho quản lý tài nguyên


management
Parse 10 msparse.fdf mdlParse_ Hàm Command table
command
table

f. Thao tác

C Expression 18 mscexpr.fdf mdlCExpression Cho phép đánh giá

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

_ biểu thức C trong


runtime
BASIC 3 msbasic.fdf mdlBasic_ Sử dụng cho macro của
interface BASIC
inter 19 extprg.fdf mdlExternal_ Cho phép chương trình
program bên ngoài giao tiếp với
extprg_
communicati Microstation
on
Dynamic link 14 dlmsys.fdf dlmSystem_ Cho phép thao tác giữa
modules DLM(DLL) và MDL

g. Hệ thống

MDL 85 mssystem.fdf mdlSystem_ API cho các hàm hệ


system thống khác nhau, điều
khiển các sự kiện và
các biến
Undo API 9 msundo.fdf mdlUndo_ quản lí các hàm
redo/undo
Version 2 msver.fdf mdlVersion_ Tách các thông tin về
các bản đang chạy
hiện thời của
MicroStation
License API 14 mslicens.fdf mdlLicense_ Cho phép truy vấn
các thông tin bản
quyền

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

Active 4 msmisc.fdf mdlParams_ Thay đổi các tham số


setting của Microstation
functions

3.2. Tổng quan về các biến built-in.


API của MDL không chỉ chứa các hàm mà còn bao gồm một tập hợp các
biến toàn cục mà bạn có thể truy nhập vào trong ứng dụng MDL của bạn. Các
biến này như là bộ nhớ dùng chung giữa Microstation và các ứng dụng MDL.
Mặc dù tên và kiểu của các biến toàn cục này đã được chương trình biên dich
của Microstation biết nên bạn không cần khai báo rõ ràng chúng trong chương
trình nhưng để lập trình tốt thì nên khai báo các biến đó như là các biến ngoài.
Rất nhiều các biến built-in là kiểu cấu trúc hoặc kiểu hợp (union), chẳng
hạn như biến tcb (terminal control block) là một con trỏ trỏ đến cấu trúc lưu
thông tin về file design hiện thời..
Bảng dưới đây liệt kê một số kiểu biến cơ bản với tên, mô tả và tệp tiêu
đề chứa nó.

Variable Type Description


dgnBuf MSElement* Giữ thông tin của các đối tượng hiện
thời trong dgnBuf.

statedata MSStateData Chứa các thông tin trong hàm trạng


thái hiện thời, được định nghĩa trong
global.h
Tcb Tcb* “Terminal Control Block” giữ tất cả

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

các thông tin trong file DGN hiện


thời, được định nghĩa trong tcb.h
Mgds_modes Mgds_modes Chứa các thông tin về sự thực thi hiện
thời của MicroStation, được định
nghĩa trong global.h
graphConfig MSGraphConfig Chứa các cấu hình đồ hoạ, được định
nghĩa trong global.h
mdlCommandNumber long Chứa số lệnh của ứng dụng MDL gần
nhất
userPrefsP UserPrefs* Chứa các thói quen khác nhau của
người sử dụng, được định nghĩa trong
userpref.h
mgdsPrompt[35] char Giữ các bài text treong dấu nhắc, mặc
định là "uStn>"
render_designLightP void* Cho phép định nghiã các độ sáng
thích hợp, được định nghĩa trong
light.h
msTransientElmP TransDescrP Mục đích chung cho sự miêu tả tạm
thời
mdlErrno int Số lỗi cho các hàm MDL khác nhau

4. Tạo file .bat để dịch chương trình nguồn 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.

Thêm mdl\bin directory vào đường đẫn.


(đường dẫn tới
Ví dụ :
BMAKEWIN.EXE)
Set path=%path%;C:\win32app\ustation\mdl\bin

Thiết lập biến môi trường MS (Đường dẫn tới


Ví dụ: Set MS=C:\win32app\ustation MicroStation)
Thiết lập biến môi trường BMAKE_OPT
Ví dụ: (đường dẫn tới
SetBMAKE_OPT=- MDL.MKI)
IC:\win32app\ustation\mdl\include

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

3. Từ thư mục C:\...\YOURAPP gõ :

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

thông báo : "Building C:\win32app\ustation\mdlapps\YOURAPP.ma" Thông


báo này sẽ hiện ra khoảng 4 dòng trước dòng cuối cùng được đưa ra bởi
chương trình biên dịch.
6. Cuối cùng, trong Microstation load chương trình YOURAPP.

Phần II : Chương trình minh họa

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

Chương trình sử dụng các hàm chính sau :


- Hàm double Phvi(double XM,double YM,double XH,double YH) để
tính phương vị của một cạnh.
- Hàm int File_Read(void) đọc file đầu vào.
- Hàm int File_getFile(char *filename,char *defaultExtension,char
*prompt) nhận file được nhập vào.
- Hàm int File_pushButtonHook(DialogItemMessage *dimP) hiển thị
các mức móc nối trong hộp thoại mở file.
- Hàm int File_unloadFunction(void) có chức năng unload một hàm.
- Hàm int File_dialogBoxHook để nhận hộp thoại.
Một số hàm MDL dùng trong chương trình:
- Tạo đường :
int mdlLineString_create
(
MSElementUnion *out, /* tạo đường */
MSElementUnion *in, /* kiểu đối tượng */
Dpoint3d *points, /* điểm nút */
int numVerts, /* số điểm nút */
);
- Hiển thị đối tượng:
void mdlElement_display
(
MSElement *element, /* => element to be displayed */
int drawMode /* => drawing mode */
);
- Thêm một đối tượng vào file dgn :
ULong mdlElement_add

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

- Hàm đóng hội thoại


boolean mdlDialog_closeCommandQueue /* <= TRUE nếu lỗi */
(
DialogBox *db /* hộp thoại cần đóng */
);
- Khai báo các mức móc nối trong hộp thoại
#include <dlogitem.h>
boolean mdlDialog_hookPublish /* TRUE nếu lỗi */
(
int nHooks, /* mức móc nối trong mảng kế tiếp */
DialogHookInfo *hooks /* mảng của item & dialog hooks */
);
- Mở tài nguyên
#include <mdl.h>
#include <rscdefs.h>
#include <mdlerrs.h>
int mdlResource_openFile /* <= SUCCESS */

(
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

int sizeHashTable, /* => usually 0 */


int global /* => TRUE or FALSE */
);

- Đăng ký một con trỏ cấu trúc sử dụng như trong C


boolean mdlDialog_publishComplexVariable /* <= TRUE if error */
(
void *setP, /* => symbol set to publish variable in */
char *structName, /* => structure "tag" name */
char *variableName, /* => name of variable */
void *variableP /* => address of variable */
);
- Thiết lập một hàm do người dùng định nghĩa
MdlFunctionP mdlSystem_setFunction
(
int type, /* => class of user function */
MdlFunctionP function /* => function in MDL program */
);

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

PHỤ LỤC : MÃ NGUỒN CHƯƠNG TRÌNH


1. file.mc
#include <mselems.h>
#include <msdefs.h>
#include <global.h>
#include <scanner.h>
#include <msinputq.h>
#include <userfnc.h>
#include <mdl.h>
#include <cexpr.h>
#include <rscdefs.h>
#include <dlogbox.h>
#include <dlogitem.h>
#include <dlogids.h>
#include <tcb.h>
#include <cmdlist.h>
#include <refernce.h>
#include <stdio.h>
#include <string.h>

#if defined (MSVERSION) && (MSVERSION >= 0x550)


#include <mscell.fdf>
#include <msscell.fdf>
#include <msmisc.fdf>
#include <msoutput.fdf>
#include <mselemen.fdf>
#include <mselmdsc.fdf>
#include <mscurrtr.fdf>
#include <msstate.fdf>
#include <mssystem.fdf>
#include <msrmatrx.fdf>
#include <mstmatrx.fdf>
#include <msvec.fdf>
#include <msrsrc.fdf>

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"

#pragma Version 1:0:0

#ifdef unix
char sepchar = '/';
#else
char sepchar = 92;
#endif

#define pi 3.14159

//Bien toan cuc


Public File_Params params;

/*------------------------------------------------------+
| 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

linePts[0].x = x-31; linePts[0].y = y;


linePts[0].z=fc_zero;
linePts[1].x = x+31; linePts[1].y = y;
linePts[1].z=fc_zero;
if (mdlLineString_create(&line,NULL, linePts,
2)==SUCCESS)
{
mdlElement_display (&line,
NORMALDRAW);
mdlElement_add (&line);
}
linePts[0].x = x; linePts[0].y = y+31;
linePts[0].z=fc_zero;
linePts[1].x = x; linePts[1].y = y-31;
linePts[1].z=fc_zero;
if (mdlLineString_create(&line,NULL, linePts,
2)==SUCCESS)
{
mdlElement_display (&line,
NORMALDRAW);
mdlElement_add (&line);
}
}
}
if (mdlView_fit(0,NULL)==SUCCESS) mdlView_updateSingle(0);
fclose(in);
}
//===============================================================
Private double Phvi(double dy,double dx)
{
double anpha;
if (dx == 0)
{
if (dy > 0) anpha = pi/2;
else anpha = 3*pi/2;

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;

/*if ((fin = fopen (params.asciiFile, "r")) == NULL)


{
sprintf(buffer, TXT_FileNotOpened, params.asciiFile);
mdlDialog_openAlert (buffer);

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

for (n=1; n<=tdg; n++)


{
char tendg[80];
double dg_x, dg_y;
fscanf(fin, "%s %lf %lf", tendg, &dg_x, &dg_y);
strcpy(dgoc[n].ID,tendg);
dgoc[n].x=dg_x;
dgoc[n].y=dg_y;
fprintf(fout, "%s %.5lf %.5lf\n", dgoc[n].ID, dg_x, dg_y);
}

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

for (i=1; i<=td; i++)


{
char stt[80];
int dd,ph;
double kc,goc;
fscanf(fin, "%s %d %d %lf", stt, &dd, &ph, &kc);
goc = (dd + ph/60)*pi/180;
XX = dgoc[g1].x + kc*cos(goc+pv);
YY = dgoc[g1].y + kc*sin(goc+pv);
fprintf(fout, "%s %.5lf %.5lf\n", stt, XX, YY);//Luu toa do cac
diem chi tiet da dc tinh ra file
}
n++;
}

fclose(fin);
fclose(fout);
return SUCCESS;

//==============Nhan file duoc nhap vao===========================


Private int File_getFile(char *filename,char *defaultExtension,char *prompt)
{
int stringLength;
char dir[MAXDIRLENGTH], localSpec[MAXFILELENGTH];

//Thay doi vung


mdlFile_getcwd (dir, MAXDIRLENGTH);
stringLength = strlen (dir);
if (dir[stringLength-1] != sepchar)
{
dir[stringLength] = sepchar;
dir[stringLength+1] = 0;
}

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);

//Khai bao de truy cap dialog manager


setP = mdlCExpression_initializeSet (VISIBILITY_DIALOG_BOX |
VISIBILITY_DEBUGGER, 0, FALSE);
mdlDialog_publishComplexVariable (setP, "File_params", "params", &params);

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

typedef struct File_params


{
int Tyle;
char asciiFile[MAXFILELENGTH];

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;

typedef struct Diemgoc


{
char ID[80];
double x;
double y;
}DG;

#endif

3. filetxt.h
/*----------------------------------------------------------------------+
| |
| file.h |
| |
+----------------------------------------------------------------------*/
#define TXT_DialogTitle "Tinh toa do diem chi tiet"

#define TXT_File "File"


#define TXT_pBtn_Select "...."
#define TXT_pBtn_Run "~Phun diem"
#define TXT_pBtn_Cancel "~Noi diem"

#define TXT_AsciiFile "Duong dan:"

#define TXT_0_200 "1:200"


#define TXT_1_500 "1:500"
#define TXT_2_1000 "1:1000"
#define TXT_3_2000 "1:2000"
#define TXT_4_5000 "1:5000"
#define TXT_Tyle "Ty le: "

#define TXT_SelectFile "Chon file "


#define TXT_FileNotOpened "Khong the mo file <%s>"

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

#define TXT_Processing "Dang xu ly dong - %-ld"


#define TXT_LinesProcessed "Da xu ly %ld dong trong file"

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

NOHOOK, NOARG, 132, "%s", "%s", "", "",


NOMASK, TEXT_NOCONCAT, TXT_AsciiFile,
"params.asciiFile"
};

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%

rcomp -i%MS%\mdl\include D:\TNT\Tamtn\filedlg.r -oD:\TNT\Tamtn\filedlg.rsc


rsctype -i%MS%\mdl\include -i%MS%\mdl\include\stdlib D:\TNT\Tamtn\filetyp.mt D:\TNT\Tamtn\file.h
-oD:\TNT\Tamtn\filetyp.r
rcomp -i%MS%\mdl\include D:\TNT\Tamtn\filetyp.r -oD:\TNT\Tamtn\filetyp.rsc
mcomp -i%MS%\mdl\include -i%MS%\mdl\include\stdlib D:\TNT\Tamtn\file.mc
mlink -aD:\TNT\Tamtn\file.mp D:\TNT\Tamtn\file.mo
rlib -oD:\TNT\Tamtn\dct.ma D:\TNT\Tamtn\filedlg.rsc D:\TNT\Tamtn\filetyp.rsc D:\TNT\Tamtn\file.mp

8. File số liệu vào sl1.dat


32
TT3 2330904.101 502704.299
TT4 2330810.256 502682.613
TT5 2330812.076 502582.525
TT4 TT5 17
299 220 20 46.9
300 231 26 61.4

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

301 230 19 63.0


302 239 07 61.7
303 234 33 46.1
304 251 13 58.7
TT4 TT3 26
325 81 29 31.2
327 76 21 31.1
359 201 36 16.2
360 136 57 37.0
361 193 13 22.7

9. File số liệu ra XY.kq


TT3 2330904.10100 502704.29900
TT4 2330810.25600 502682.61300
TT5 2330812.07600 502582.52500
299 2330846.72578 502712.10139
300 2330849.75765 502729.61917
301 2330851.62258 502730.12938
302 2330842.99039 502734.91357
303 2330838.02667 502719.40974
304 2330830.37305 502737.75821
325 2330808.07328 502713.73656
327 2330810.79246 502713.70837
359 2330796.82741 502673.55137
360 2330778.53696 502701.66300
361 2330789.85538 502672.65787

44
SV : NguyÔn Mai Ph¬ng - TrÇn NhËt T©m

You might also like