/

17 tháng 3, 2013

Bài 9: Tương tác với AutoCAD

Xin chào,

Trong bài trước, tôi đã trình bày cách tạo một tập đối tượng. Bài này tôi sẽ chỉ ra cách mà bạn có thể tương tác với AutoCAD sử dụng các hàm toàn cục và lấy thông tin như số lượng, toạ độ, biến hệ thống...

Gọi lệnh

ObjectARX cung cấp cho chúng ta hai hàm toàn cục cho phép chúng ta gọi lệnh đã đăng ký từ trước. Chức năng này rất hữu ích giúp người dùng tiến hành quá trình nhanh chóng mà không đòi hỏi thủ tục phức tạp. Ngay cả khi phương thức này rất đơn giản, nhưng bạn nên tránh sử dụng nó trong nhứng tiến trình lớn và phức tạp. Nó cũng có thể gây ra những vấn đề khi gắn với các sự kiện.


Hai hàm được cung cấp là acedCmd()acedCommand(). Hàm đầu tiên gọi lệnh command thông qua biến danh sách resbuf, nó sẽ cung cấp thông tin cho mọi tham số dòng lệnh. Hàm thứ hai sẽ nhận kiểu biến, giá trị biến, ... của tham số, nó sẽ tái lập lại cách bạn thực hiện lệnh từ dòng nhắc. Dưới đây là hai khai báo của các hàm kể trên:
int acedCmd(const struct resbuf * rbp);
int acedCommand(int rtype, ... unnamed);
Để xây dựng danh sách resbuf, sử dụng acedCmd() ta có hàm acutBuildList() sẽ xây dựng danh sách liên kết một cách đơn giản. Bạn chỉ cần đưa giá trị vào theo từng cặp với mã code dùng để miêu tả kiểu và và kết thúc danh sách với giá trị 0 hoặc RTNONE. Một cách thực hành hay là xóa nhắc lệnh, gọi hàm acedCommand(RTNONE), sau khi đã xuất hiện dòng lệnh. Đừng quên giải phóng bộ nhớ đã sử dụng, khi sử dụng con trỏ resbuf, thông qua hàm tiện ích auctRelRb() để tránh tốn bộ nhớ. Có nhiều cách để sử dụng các hàm này và tôi sẽ chỉ cho bạn biết một vài trong số đó:

acedCmd():

a) Di chuyển thực thể cuối cùng được tạo ra dựa vào điểm cơ bản (0,0,0):
ads_point pt;
pt[0] = pt[1] = pt[2] = 0.0;
struct resbuf *Mv;
Mv = acutBuildList(RTSTR,_T("_MOVE"),RTSTR,_T("_LAST"),RTSTR,_T(""),
RTPOINT,pt,RTSTR,PAUSE,0);
acedCmd(Mv);
acedCommand(RTNONE);
acutRelRb(Mv);
b) Gọi lệnh nguyên bản "redraw":

struct resbuf *cmdlist;
cmdlist = acutBuildList(RTSTR, _T("_REDRAW"), 0);
acedCmd(cmdlist);
acedCommand(RTNONE);
acutRelRb(cmdlist);

acedCommand():

a) Gọi lệnh ZOOM và tạo dừng cho người dùng nhập liệu:

acedCommand(RTSTR, _T("Zoom"), RTSTR, PAUSE, RTNONE);

b) Tạo ra cả Line và Hình tròn:

acedCommand(RTSTR, _T("circle"), RTSTR, _T("10,10"),RTSTR, PAUSE,
RTSTR, _T("line"), RTSTR, _T("10,10"), RTSTR, _T("20,20"),
RTSTR, _T(""), 0);

Biến hệ thống

Chương trình của bạn rất có thể sẽ cần phải truy cập vào biến hệ thống của AutoCAD để đọc hoặc ghi. ObjectARX cung cấp hai hàm liên quan với biến hệ thống sử dụng cấu trúc resbuf để truy nhập và thay đổi giá trị. Đó là hàm acedGetVar()acedSetVar() có cấu trúc sau đây:
int acedGetVar(const ACHAR * sym,struct resbuf * result);
int acedSetVar(const ACHAR * sym,const struct resbuf * val);
Tham số đầu tiên là tên biến, tiếp đến là con trỏ resbuf dùng để thiết lập hoặc lấy thông tin. Ví dụ sau đây chỉ ra cách để lấy bán kính bo tròn FILLET được lưu trữ thông qua biến hệ thống:

struct resbuf rb, rb1;
acedGetVar(_T("FILLETRAD"), &rb);
rb1.restype = RTREAL;
rb1.resval.rreal = 1.0;
acedSetVar(_T("FILLETRAD"), &rb1);

Việc xác định đúng kiểu của resbuf là rất quan trọng. Trong
trường hợp này, bán kính Fillet là một sốt thực, có kiểu là RTREAL:

Hàm đầu vào người dùng

Có những hàm toàn cục cho phép tương tác với người dùng thông qua giao diện dòng lệnh. Mỗi một hàm có thể sử dụng một mình hoặc đi cùng với những hàm khác. Bảng sau đây mô tả cách làm việc của các hàm:
acedGetInt
Lấy một số nguyên
acedGetReal
Lấy một số thực
acedGetDist
Lấy khoảng cách
acedGetAngle
Lấy góc đo (Hướng 0 độ được xác định bởi biến ANGBASE)
acedGetOrient
Lấy góc đo (Hướng 0 độ ở bên phải)
acedGetPoint
Lấy một điểm
acedGetCorner
Lấy một góc của hình chữ nhật
acedGetKword
Lấy từ khóa
acedGetString
Lấy một chuỗi ký tự

Mỗi một hàm đều trả vệ một mã kết quả là một số nguyên được định nghĩa như sau:

RTNORM
Người dùng nhập sai giá trị
RTERROR
Hàm gặp lỗi
RTCAN
Người dùng nhấn ESC
RTNONE
Người dùng chỉ nhập ENTER
RTREJ
AutoCAD từ chối lệnh vì không hợp lệ
RTKWORD
Người dùng nhập từ khóa hoặc từ tùy ý

AutoCAD cho phép bạn phòng tránh việc nhập sai giá khị khi người dùng phản ứng lại với các hàm input. Tính năng này có thể tạo ra thông qua hàm acedInitGet() có thể nhận một hoặc kết hợp giữa các giá trị sau:


RSG_NONULL
Không cho phép người dùng bỏ trống
RSG_NOZERO
Không cho phép nhập giá trị = 0
RSG_NONEG
Không cho phép nhập giá trị âm
RSG_NOLIM
Không kiểm tra giới hạn bản vẽ, thậm chí khi biến kiểm tra giới hạn LIMCHECK bật
RSG_DASH
Sử dụng đường nét gạch khi vẽ đường cao su hoặc hình chữ nhật bao
RSG_2D
Bỏ qua tọa độ Z của điểm 3D (áp dụng với acedGetDist())
RSG_OTHER
Cho phép người dùng nhập bất cứ giá trị nào

Ví dụ sau đây trình bày cách yêu cầu một giá trị lớn hơn không:

int age = -1;
acedInitGet(RSG_NONULL RSG_NOZERO RSG_NONEG, NULL);
acedGetInt(_T("Ban bao nhieu tuoi? "), &age);

Kết thúc bài 9!


Link nguồn: Arxdummies

Không có nhận xét nào:

Đăng nhận xét