Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Skywings

[Hỏi] Cách lưu giá trị biến để tái sử dụng trong lập trình với AutoCAD.NET?!

Các bài được khuyến nghị

Mình đang tìm hiểu AutoCAD.NET qua C#, có điều mình thắc mắc là làm sao lưu giá trị của 1 hoặc nhiều biến cho lần gọi lệnh tiếp theo, hoặc các lệnh khác có thể dùng được như biến toàn cục (global var) trong AutoLISP? Các bác có kinh nghiệm xin hướng dẫn mình ^^!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

C# hay .NET lập trình theo hướng đối tượng (OOP) nên ko có khái niệm biến "toàn cục" tuy nhiên nếu bạn muốn lưu các biến để có thể sử dụng giữa các lần gọi hàm hay truyền dữ liệu giữa các lần gọi hàm bạn có thể tạo 1 static class chứa các giá trị cần lưu hoặc tạo các static variable trong class chứa các command hoặc bạn có thể lưu các biến như các Field (non static) của class chứa command, ...

một ví dụ nhỏ như sau:

public static class A

{

static int st_int = 0;

}

 

public class command

{

[command method ("abc")]

public void changeStaticVar

{

int getstVar = classA.st_int; // return 0

classA.st_int = 1;

}

 

 

[command method ("def")]

public void changeStaticVar

{

int getstVar = classA.st_int; // return 1 nếu run command abc trước, nếu chưa sẽ return 0

}

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn bác Detailing đã giúp đỡ. Do mới nhập môn, nên chưa hiểu lắm phần khai báo static, public, private... ^^! Ví dụ của bác rất cụ thể, thks so much :D!

 

Trong quá trình test đoạn code của bác Detailing, mình phát hiện vấn đề nho nhỏ (chắc bác Detailing viết vội quá ^^) nên mạo muội sửa lại chút xíu ^^!

 

public static class A

{

public static int st_int = 0; // Cần public biến st_int

}

public class command

{

[command method ("abc")]

public void changeStaticVar

{

int getstVar = A.st_int; // return 0

A.st_int = 1;

}

[command method ("def")]

public void changeStaticVar

{

int getstVar = A.st_int; // return 1 nếu run command abc trước, nếu chưa sẽ return 0

}

Chỉnh sửa theo Skywings

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình đang tìm hiểu AutoCAD.NET qua C#, có điều mình thắc mắc là làm sao lưu giá trị của 1 hoặc nhiều biến cho lần gọi lệnh tiếp theo, hoặc các lệnh khác có thể dùng được như biến toàn cục (global var) trong AutoLISP? Các bác có kinh nghiệm xin hướng dẫn mình ^^!

 

C# hay .NET lập trình theo hướng đối tượng (OOP) nên ko có khái niệm biến "toàn cục"

.........

 

Tham khảo cách khai báo và sử dụng biến "toàn cục" theo mục đích sử dụng (lưu giá trị của 1 biến cho lần gọi lệnh tiếp theo)

public class command

{

// khai báo biến delta "trong phạm vi class command"

public double delta;

[CommandMethod("SetAndSaveVar")]

public void SetAndSaveVar()

{

Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

if (delta == new double()) delta = 100;

PromptDistanceOptions pDisOpts = new PromptDistanceOptions("");

pDisOpts.Message = "\nNhập khoảng cách : ";

pDisOpts.DefaultValue = delta;

pDisOpts.AllowNone = true;

PromptDoubleResult pIntRes = ed.GetDistance(pDisOpts);

if (pIntRes.Status == PromptStatus.OK)

{

delta = pIntRes.Value;

}

ed.WriteMessage("\nGiá trị của biến delta = " + delta.ToString());

}

}

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cách của Gia_bach là Field (non static) trong class command và chỉ các method trong class command mới có thể sử dụng, các method ở class khác vẫn phải gọi command.delta. Nếu một command trong class khác vd command1 truy xuất biến delta trước khi class command được tạo sẽ dẫn đến lỗi "Object Reference not set ...". Để tránh lỗi đó thì nên khai báo static cho biến đó. lưu ý vói bạn là biến static có kiểu kế thừa từ class object cần được tạo ra ngay khi khai báo tránh lỗi object reference ở trên.

Thông thường các biến được coi là "toàn cục" nên đặt trong class kế thừa interface IExternalApplication

Biến toàn cục (global var) trong Autolisp thực chất chính là 1 field của active drawing và phạm vi hoạt động là trong chính drawing đó (Session). C# hay .NET có thể hoạt động ở cấp Drawing hoặc Application nên tùy theo cách dùng mà bạn có thể khai báo theo các cách như trên.

Good luck!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×