Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 replies to this topic

#1 Skywings

Skywings

    biết lệnh erase

  • Members
  • PipPipPip
  • 102 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 14 January 2013 - 09:07 AM

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 ^^!
  • 0

#2 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 14 January 2013 - 11:11 AM

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
}


  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#3 Skywings

Skywings

    biết lệnh erase

  • Members
  • PipPipPip
  • 102 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 14 January 2013 - 12:13 PM

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
}


Bài viết đã được chỉnh sửa nội dung bởi Skywings: 14 January 2013 - 09:43 PM

  • 0

#4 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1432 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 14 January 2013 - 01:40 PM

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


  • 1

#5 Skywings

Skywings

    biết lệnh erase

  • Members
  • PipPipPip
  • 102 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 14 January 2013 - 08:20 PM

Rất cám ơn bác Gia_bach đã hướng dẫn thêm cách dùng biến trong C# :).
  • 0

#6 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 20 January 2013 - 11:44 AM

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!
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#7 Skywings

Skywings

    biết lệnh erase

  • Members
  • PipPipPip
  • 102 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 25 January 2013 - 10:12 PM

Cám ơn bác Detailing, sáng thêm ra được chút nữa rùi :D.
  • 0