Chuyển đến nội dung
Diễn đàn CADViet
Detailing

[Thảo luận] Điều khiển AutoCAD bằng VC++ (ObjectARX)

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

Theo kinh nghiệm của mình, Nếu bạn làm những công việc sử dụng nhiều đến danh sách (như thêm, bớt, chèn) thì lisp làm chậm thậm chí không làm đc, vì Lisp không có con trỏ. Còn những công việc thao tác trên đối tượng thì cũng chấp nhận đc. Ngày trước, có khi mình phải chờ hàng giờ để Lisp tạo danh sách. Sau đó, chuyển qua Arx thấy nhanh hơn, mình thấy Arx nhanh hơn Lisp từ 7 đến 10 lần đối với những công việc xử lý dữ liệu tương đối vừa phải. Đối với những dữ liệu lớn không nên dùng Lisp. Nhưng mình vẫn thích dùng Lisp hơn trong phần lớn công việc, đụng đâu viết đó. Còn Arx đôi lúc báo lỗi tùm lum chắng biết mô mà lần.

 

Nói đến Arx, đối với dân nghiệp dư đôi lúc nó cũng là một nỗi ám ảnh. Ngay như mình thử sd bản VS2005 và làm theo hd của detailing, lúc biên dịch nó báo lỗi

 

và việc phát triển thêm một dialog mới (bằng cách sd MFC) trên một vi dụ sẵn có của bộ ARX2007 cũng khó thành công.

 

Cũng theo hướng dẫn của Detailing, mình làm trên VS2008 cũng gặp khó khăn. Khi chạy VC++2008 thì bình thường, nhưng khi cài phần ArxWizards.msi của arx2010 vào thì vs2008 không khởi động được. Đã vậy, thửa mở một vị dụ sẵn có (testdb) biên dịch thử, nó báo lỗi :

 

Thế mới điên chứ, đúng là nghiệp dư. Mình chưa viết gì của mình cả mà đã báo lỗi rồi, chẳng biết đâu mà lần.

Chào bạn,

Ý các bạn ở trên là so sánh lisp với VBA ko phải so với ARX

Như post đầu tiên mình đã nói, code trong topic này dùng VS2008 SP1 và CAD 2010 (R18) nên bạn dùng VS2005 (dành cho CAD R17) thì đương nhiên là ko build dc.

Để cài VS2008 và SP1 và dùng dc ObjectARX Wizard trong bộ SDK bạn cần remove tất cả hotfix củ VS trong máy (Microsoft có tool làm chuyện này) nhưng mình thử thì ko hiệu quả. Do đó mình làm như sau: cài win lại (mình dùng win 7 32 bit) (ko update bất cứ thứ gì từ auto update cả) -> cài CAD2010 -> cài VS2008 -> cài SP1 -> cài ARX Wizards.msi

 

p/s: 2 lỗi trên của bạn mình cũng đã gặp lúc mới cài ARX wizard và tìm hiểu thì cách giải quyết như sau:

  1. Lỗi này do bạn chưa khai báo folder chứa inc file trong VS (cài ARX wizards trên win 64 bit cũng bị lỗi này)
  2. Lỗi do chưa cài SP1 của VS 2008

 

Good luck!

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

Chào bạn,

Ý các bạn ở trên là so sánh lisp với VBA ko phải so với ARX

Như post đầu tiên mình đã nói, code trong topic này dùng VS2008 SP1 và CAD 2010 (R18) nên bạn dùng VS2005 (dành cho CAD R17) thì đương nhiên là ko build dc.

Để cài VS2008 và SP1 và dùng dc ObjectARX Wizard trong bộ SDK bạn cần remove tất cả hotfix củ VS trong máy (Microsoft có tool làm chuyện này) nhưng mình thử thì ko hiệu quả. Do đó mình làm như sau: cài win lại (mình dùng win 7 32 bit) (ko update bất cứ thứ gì từ auto update cả) -> cài CAD2010 -> cài VS2008 -> cài SP1 -> cài ARX Wizards.msi

 

p/s: 2 lỗi trên của bạn mình cũng đã gặp lúc mới cài ARX wizard và tìm hiểu thì cách giải quyết như sau:

  1. Lỗi này do bạn chưa khai báo folder chứa inc file trong VS (cài ARX wizards trên win 64 bit cũng bị lỗi này)
  2. Lỗi do chưa cài SP1 của VS 2008

Good luck!

Cám ơn bạn đã chỉ điểm, nhưng hiện mình đang sd bộ vc++6 vc++2000 để chạy arx2000 và 2006 nên kg thể gỡ bỏ nó đi đc. Hơn nữa, hướng dẫn của bạn đã có từ arx2007 nên arx2010 nó cũng vậy thôi. Lỗi ở đây một là do mình còn kém (nghiệp dư) và do trình biên dịch C++ khá phức tạp. Ngay khi sd các bản cũ cũng vậy. Khi sd vc++2000 để biên dịch một vi dụ trên arx2004 thì báo lỗi nhưng cũng ví dụ đó trên arx2006 lại đc.

Mình định sd vc++2008 và arx2010 để tham gia viết một số hàm với bạn cho vui nhưng hiện giờ mình đang bị lỗi như vậy nên chưa làm gì đc. Mình đi mua đĩa VC2008 SP1 nhưng họ bảo chỉ có VC2008 thôi, không rõ tải bộ SP1 ở đâu nữa,

Khi cài đặt ARX wizards đến khung đối thoại này thì nhập cái gì mình không hiểu

37170_arx1.jpg

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ạn đã chỉ điểm, nhưng hiện mình đang sd bộ vc++6 vc++2000 để chạy arx2000 và 2006 nên kg thể gỡ bỏ nó đi đc. Hơn nữa, hướng dẫn của bạn đã có từ arx2007 nên arx2010 nó cũng vậy thôi. Lỗi ở đây một là do mình còn kém (nghiệp dư) và do trình biên dịch C++ khá phức tạp. Ngay khi sd các bản cũ cũng vậy. Khi sd vc++2000 để biên dịch một vi dụ trên arx2004 thì báo lỗi nhưng cũng ví dụ đó trên arx2006 lại đc.

Mình định sd vc++2008 và arx2010 để tham gia viết một số hàm với bạn cho vui nhưng hiện giờ mình đang bị lỗi như vậy nên chưa làm gì đc. Mình đi mua đĩa VC2008 SP1 nhưng họ bảo chỉ có VC2008 thôi, không rõ tải bộ SP1 ở đâu nữa,

Khi cài đặt ARX wizards đến khung đối thoại này thì nhập cái gì mình không hiểu

37170_arx1.jpg

Sp1 bạn download ở đây: http://www.microsoft.com/en-us/download/details.aspx?id=13276

hộp thoại yêu cầu bạn nhập tiếp đầu cho các ứng dụng của bạn (của AutoCAD là acdb hay ads) bạn muốn nhập gì cũng dc.

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 cập nhật code và kết quả test ở post cũ. và đây là các file dùng để test:

http://www.cadviet.com/upfiles/3/83237_testspeed.rar

load bằng lệnh AP (các file lsp, dvb, arx) trừ file dll load bằng lệnh NETLOAD

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ác code khác thì e không có ý kiến gì vì bị tịt, riêng code lisp thì e nghĩ nên đổi thành :

(repeat 10000 ....) ^^

Ngoài ra, để so sánh tốc độ chuẩn hơn nữa, ta nên test khi nó có vài đặc điểm như màu sắc, layer, linetype ^^ Em tin là lúc đó Lisp yêu dấu sẽ có vị trí khác. Hề

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ác code khác thì e không có ý kiến gì vì bị tịt, riêng code lisp thì e nghĩ nên đổi thành :

(repeat 10000 ....) ^^

Ngoài ra, để so sánh tốc độ chuẩn hơn nữa, ta nên test khi nó có vài đặc điểm như màu sắc, layer, linetype ^^ Em tin là lúc đó Lisp yêu dấu sẽ có vị trí khác. Hề

Mình đã test qua while và repeat, kết quả là tương đương nhau :D, mấy trường hợp khác chắc để mở topic riêng dể test thêm.

riêng phần so sánh giữa các ngôn ngữ thì đây là kết quả benchmark của Autodesk:

acad-api-benchmarks.png

  • 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

Trong các chương trình đồ họa nói chung và AutoCAD nói riêng thì cái quan trọng nhất vẫn là selection, phải thực hiện được việc chọn đối tượng thì các việc khác mới làm dc. Post này mình xem qua cách chọn đối tượng và duyệt qua các đối tượng trong tập chọn.

Đoạn code sau chọn tất cả các đối tượng trong bản vẽ và chuyển nó thành màu RED

ads_name ss, ent;

long ilast;

 

if(acedSSGet(_T("A"), NULL, NULL, NULL, ss)!=RTNORM)

{

acutPrintf(_T("\nNo entities found"));

return;

}

acedSSLength(ss, &ilast)

for (long i=0;i<ilast;i++)

{

acedSSName(ss, i, ent);

AcDbObjectId entId = AcDbObjectId::kNull;

acdbGetObjectId(entId, ent);

AcDbEntity *pEnt;

// Change entity color to red

acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite);

pEnt->setColorIndex(1);

pEnt->close();

}

acedSSFree(ss);

acutPrintf(_T("\nColor of %d Entities was changed to RED"), ilast);

tương tự như lisp, VBA hay .NET hàm acedSSGet cũng có các tham số quy định cách chọn: P, W, WP, CP, ...

  • 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

Trong các chương trình đồ họa nói chung và AutoCAD nói riêng thì cái quan trọng nhất vẫn là selection, phải thực hiện được việc chọn đối tượng thì các việc khác mới làm dc. Post này mình xem qua cách chọn đối tượng và duyệt qua các đối tượng trong tập chọn.

Đoạn code sau chọn tất cả các đối tượng trong bản vẽ và chuyển nó thành màu RED

 

tương tự như lisp, VBA hay .NET hàm acedSSGet cũng có các tham số quy định cách chọn: P, W, WP, CP, ...

Cám ơn detailing, mình đã tải về và chạy đc. Tuy nhiên chỉ với các ví dụ mẫu của arx2010.

Mình vẫn chưa chạy đc arx2010 cho một dự án mới. Nó vẫn báo lỗi sau :

Error 1 fatal error C1083: Cannot open include file: 'arxHeaders.h': No such file or directory d:\ws\objectarx 2010\baitap\arxproject1\arxproject1\stdafx.h 49 ArxProject1

Bạn xem giúp mình nhé.

 

Về code đổi màu của bạn, mình góp một vài ý sau :

ads_name ss, ent;

long ilast;

acedSSFree(ss);//Dòng này không nên vì lúc đó bạn chưa gán địa chỉ cho biến ss, việc xoá nó có thể dẫn đến xung đột bộ nhớ.

//Bạn chỉ có thể xoá nó sau khi đã thực hiện một hàm chọn đối tượng THÀNH CÔNG (if (ads_ssget("x",NULL,NULL,NULL,ss)==RTNORM )

// hoặc bạn đã gán nó, VD : ads_ssadd(ss, NULL, NULL)

acedSSGet(_T("A"), NULL, NULL, NULL, ss); //ở vị trí này bạn nên kiểm tra việc chọn đối tượng có thành công không

if(acedSSLength(ss, &ilast)!=RTNORM) //chứ kg cần kiểm tra ở đây

{

acedSSFree(ss) ;//việc xóa nó ngay tại đây là kg hợp lý vì theo cú pháp của bạn, nó đang nill

acutPrintf(_T("\nNo entities found"));

return;

}

for (long i=0;i<ilast;i++)

{

acedSSName(ss, i, ent);

AcDbObjectId entId = AcDbObjectId::kNull;

acdbGetObjectId(entId, ent);

AcDbEntity *pEnt;

// Change entity color to red

acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite);

pEnt->setColorIndex(1);

pEnt->close();

}

acedSSFree(ss);

acutPrintf(_T("\nColor of %d Entities was changed to RED"), ilast);

 

Với việc đổi màu của đối tượng có thể làm như Lisp, mình có thể viết code đổi màu trên như sau :

void vd5()

{

ads_name ss;

if (ads_ssget (_T("x"),NULL,NULL,NULL,ss)==RTNORM) {

ads_command(RTSTR,_T("_.change"),RTPICKS,ss,RTSTR,_T(""),RTSTR,_T("p"),RTSTR,_T("c"),RTSHORT,1,RTSTR,_T(""),RTNONE);

ads_ssfree(ss);

}

}

Việc duyệt qua đối tượng cũng có thể làm như lisp, tức dùng hàm ads_ssname, ...

Có thể đây là thế mạnh của C++ và Arx, nó có thể cho viết xen kẻ giữa lập trình thủ tục và lớp, còn VB.net hay C#.net thì bắt buộc phải lập trình thông qua lớp (class)

  • 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

Cám ơn detailing, mình đã tải về và chạy đc. Tuy nhiên chỉ với các ví dụ mẫu của arx2010.

Mình vẫn chưa chạy đc arx2010 cho một dự án mới. Nó vẫn báo lỗi sau :

Error 1 fatal error C1083: Cannot open include file: 'arxHeaders.h': No such file or directory d:\ws\objectarx 2010\baitap\arxproject1\arxproject1\stdafx.h 49 ArxProject1

Bạn xem giúp mình.

 

Với việc đổi màu của đối tượng có thể làm như Lisp, mình có thể viết code đổi màu trên như sau :

void vd5()

{

ads_name ss;

if (ads_ssget (_T("x"),NULL,NULL,NULL,ss)==RTNORM) {

ads_command(RTSTR,_T("_.change"),RTPICKS,ss,RTSTR,_T(""),RTSTR,_T("p"),RTSTR,_T("c"),RTSHORT,1,RTSTR,_T(""),RTNONE);

ads_ssfree(ss);

}

}

Lỗi trên là do ARX wiz chưa add dc inc path vào VS bạn vào Tool Options chỉnh như sau:83237_inc.png

Về code đổi màu đối tượng, bạn dùng ads_command (tương tự như hàm (command) trong autolisp hay sendcommand trong VBA và sendstringtoexcute trong .NET để giao hết phần việc còn lại cho AutoCAD xử lý cách này có ưu thế là code ngắn thôi

Tuy nhiên nếu mình muốn edit thêm vài thuộc tính nữa ví dụ như bán kính đường tròn, layer, Block position, start poit hay end point của Line, .... thì duyệt qua tập hợp và cast nó về acdbEntity thì có lẽ sẽ tiện hơn và nhanh hơn.

Thanks bạn!

  • 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

Mình đã test qua while và repeat, kết quả là tương đương nhau :D, mấy trường hợp khác chắc để mở topic riêng dể test thêm.

riêng phần so sánh giữa các ngôn ngữ thì đây là kết quả benchmark của Autodesk:

Acad%20API%20benchmarks.png

Ủng hộ Detailing 1 fiếu cho việc lập topic so sánh. Ngoài ra vì diễn đàn này đang có 1 đội ngũ con chiên của LISP khá hùng hậu nên có thể test bằng 2 fép thử: Autolisp và Visual lisp (Hiện có khá nhiều tranh cãi về vấn đề này, một số tài liệu mình đọc được khẳng định Visual lisp chậm hơn Autolisp và khuyên lập trình viên hãy sử dụng Autolisp nếu có thể. Nhưng một số tài liệu khác thì cho rằng điều ngược lại mới đúng, phép thử trên của bạn và kết quả của autodesk trên đây phần nào khẳng định lại điều đó)

Ngoài ra phép thử với visual lisp cũng có thể dùng để đánh giá thực tế VBA khi chuyển về Visual lisp tốc độ thay đổi thế nào?

  • 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

mình edit post #32 theo góp ý của bạn TRUNGNGAMY. Thanks bạn!

 

Cám ơn bạn rất nhiều, nhờ sự hường dẫn của bạn, mình đã làm đc. Trước đây, mỗi lần quay lại Arx và nhìn thấy mấy vd lập trình theo lớp, mình thấy ngán quá. Vả lại, lúc đó mình của chưa biên dịch đc trên arx2010 nên cũng kg hứng thú. Có lẽ mình sẽ theo bạn để học lại arx theo class cho nó "bài bản và chuyên nghiệp". Tuy vậy, lập trình theo hàm tương đối nhanh và dễ, nhất là đối với những bạn thông thạo Lisp muốn học.

Cái khó của mình là làm sao chuyển một số khá lớn khung đối thoại đã lập trên arx2006 bằng MFC qua arx2010. Thật ra, việc quản lý khung đối thoai của C++(trước khi có C++.net) là kém nhất trong các ngôn ngữ bậc cao (theo mình), đối với C#, VB, Delphi thì rất là đơn giản.

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ạn rất nhiều, nhờ sự hường dẫn của bạn, mình đã làm đc. Trước đây, mỗi lần quay lại Arx và nhìn thấy mấy vd lập trình theo lớp, mình thấy ngán quá. Vả lại, lúc đó mình của chưa biên dịch đc trên arx2010 nên cũng kg hứng thú. Có lẽ mình sẽ theo bạn để học lại arx theo class cho nó "bài bản và chuyên nghiệp". Tuy vậy, lập trình theo hàm tương đối nhanh và dễ, nhất là đối với những bạn thông thạo Lisp muốn học.

Cái khó của mình là làm sao chuyển một số khá lớn khung đối thoại đã lập trên arx2006 bằng MFC qua arx2010. Thật ra, việc quản lý khung đối thoai của C++(trước khi có C++.net) là kém nhất trong các ngôn ngữ bậc cao (theo mình), đối với C#, VB, Delphi thì rất là đơn giản.

Chào bạn,

Chúc mừng bạn đã cài dc ARX trên máy, hy vọng bạn có những post chia sẻ với mọi người. Ngoài ra mình cũng có ý như sau: thế mạnh của lập trình ObjectARX (dùng C++) thì việc dùng con trỏ (pointer) làm cho chương trình chạy nhanh hơn là 1 thế mạnh nhưng cái hay của C++ chính là lập trình hướng đối tượng. Chúc bạn sớm quen với tư duy lập trình mới.

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

Post trước chúng ta đã liên kết C++ và AutoCAD được rồi, hiện thông báo rồi, vậy làm sao thêm đối tượng vào database của bản vẽ đây?

để tiết kiệm thởi gian mình dùng toolbar của AutoCAD để thêm 1 lệnh mới vào file acrxEntryPoint.cpp với tên: MyLine với mục đích vẽ 1 line từ điểm (0,0,0) đến điểm (100,100,0)

Sau khi thêm lệnh Myline vào thì trong file acrxEntryPoint.cpp sẽ có thêm dòng định nghĩa tên lệnh và 1 function để chứa code thưc hiện lệnh đó ta thêm đoạn code sau đây vào:

 

2-11.jpg

OK, bây giờ build và đánh lệnh Myline test thử nào

Bạn lập trình hướng đối tượng nhìn hoa cả mắt, trong khi với yêu cầu này mà lập trình hàm quả đơn giản:

void spoint(ads_point p, ads_real x, ads_real y, ads_real z)

{

p[0]=x;

p[1]=y;

p[2]=z;

}

void vd()

{

ads_point p1,p2;

spoint(p1,0,0,0);

spoint(p2,100,100,0);

ads_command (RTSTR,_T("_.line"),RTPOINT,p1,RTPOINT,p2,RTSTR,_T(""),RTNONE);

}

Mình sẽ cố học hường đối tượng, nhưng cũng viết dạng lập trình hàm để các bạn khác tham khảo

  • 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
Bạn lập trình hướng đối tượng nhìn hoa cả mắt, trong khi với yêu cầu này mà lập trình hàm quả đơn giản:

void spoint(ads_point p, ads_real x, ads_real y, ads_real z)

{

p[0]=x;

p[1]=y;

p[2]=z;

}

void vd()

{

ads_point p1,p2;

spoint(p1,0,0,0);

spoint(p2,100,100,0);

ads_command (RTSTR,_T("_.line"),RTPOINT,p1,RTPOINT,p2,RTSTR,_T(""),RTNONE);

}

Chào bạn,

Việc sử dụng hệ thống hàm ads trong lập trình ObjectARX sẽ giúp các lisper cảm thấy quen thuộc hơn, tuy nhiên với những người đã dùng .NET (đặc biệt là C# có syntax ~ C++) thì lập trình hướng đối tượng sẽ thấy dễ dàng hơn trong việc kiểm soát code của mình.

Một điều nữa: bạn hãy thử vẽ 10000 (mười ngàn) CIRCLE bằng ads_command thì sẽ thấy dc nhược điểm của ads_command

Đây là bảng so sánh tốc độ của các API dùng trong lập trình CAD (có kể đến ads và adsrx)

compare.png

  • 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

Chào bạn,

Việc sử dụng hệ thống hàm ads trong lập trình ObjectARX sẽ giúp các lisper cảm thấy quen thuộc hơn, tuy nhiên với những người đã dùng .NET (đặc biệt là C# có syntax ~ C++) thì lập trình hướng đối tượng sẽ thấy dễ dàng hơn trong việc kiểm soát code của mình.

Một điều nữa: bạn hãy thử vẽ 10000 (mười ngàn) CIRCLE bằng ads_command thì sẽ thấy dc nhược điểm của ads_command

Đây là bảng so sánh tốc độ của các API dùng trong lập trình CAD (có kể đến ads và adsrx)

compare.png

Nhìn thấy cái bảng so sánh của bạn là mình đã muốn học rồi. Trước đây mình làm trên Lisp thấy chậm. Sau đó vô tình ra nhà sách thấy cuốn "Autocad và kỹ thuật lập trình ứng dụng" mua về và làm theo, thấy hiệu quả đáng kể nhưng rất khổ sở vì C khá khó (mình lập trình C chỉ vì Arx chứ mình kg muốn học C). Việc lập trình khung đối thoại và CSDL mình phải dùng Delphi thông qua DLL. Sau này VC chuyển qua VC.net thấy có dễ hơn khi lập trình trên khung đối thoại và CSDL nhưng các CT của mình chủ yếu dựa vào MFC nên cũng khó. Với lại, muốn hiểu được hệ thống class của Arx cũng kg đơn giản. Nhìn thấy bảng phân lớp của nó là muốn xỉn rồi. Tuy nhiên, trước đây mình tự mày mò một mình, bây giờ có sự hỗ trợ của bạn và CADVIET đôi khi mình sẽ học được. Có thể lúc nào đó rãnh rỗi, bạn giới thiệu qua hệ thống lớp của Arx cho mình và các bạn tham khảo nhé.

Cám ơn bạn rất nhiều

  • 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

Có thể lúc nào đó rãnh rỗi, bạn giới thiệu qua hệ thống lớp của Arx cho mình và các bạn tham khảo nhé.

Cám ơn bạn rất nhiều

Mình cũng là tự mò + đi "mót" (từ này của bác Bình mình thấy thể hiện đúng bản chất của cái sự học này nên mượn tạm :D) thôi.

Dưới đây là hệ thống các thư viện chính của Objext ARX và chức năng của nó

  • AcRx Object and Class Management (RXAPI.LIB)
  • AcRx AutoCAD Memory Management (RXHEAP.LIB)
  • AcEd AutoCAD Editor Facilities (ACEDAPI.LIB)
  • AcDb AutoCAD Database (ACAD.LIB)
  • AcGi AutoCAD Graphics Interface (ACGIAPI.LIB)
  • AcGe AutoCAD Geometry Library (LIBACGE.LIB)
  • AcGe External ACIS Curve and Surface Classes (LIBACGEX.LIB)
  • ADS Function Set (ACAD.LIB)

  • 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

ads_name ssname;

acedSSFree(ssname);

ads_point pt;

int res;

for (; ;)

{

res = acedEntSel(_T("\nSelect an entity: "), ssname, pt);

if(res==RTNORM) break;

if(res==RTCAN) return;

}

AcDbObjectId objId;

AcDbObject *pObj = NULL;

AcDbEntity *pEnt = NULL;

acdbGetObjectId(objId, ssname);

if(acdbOpenObject(pEnt, objId, kForRead)== Acad::eOk)

{

int icolor;

if(acedGetInt(_T("\nInput color by integer: "), &icolor)==RTNORM)

{

pEnt->upgradeOpen();

pEnt->setColorIndex(icolor);

}

}else

acutPrintf(_T("\n*** Can't edit this entity! ***"));

pEnt->close();

Bạn cho mình hỏi tý, việc sd tiền tố ads_ và aced có khác nhau kg, mặc dù đối số vẫn như cũ. Trước đây mình thấy dùng ads_, sau đó thấy chuyển thành aced và một số tiền tố khác nữa. Kg biết chỉ là sự thay đổi cú pháp hay có ý nghĩa gì khác. VD như bạn dùng acedSSFree(ssname) , cách cũ là ads_ssfree(ssname).

 

Góp ý : Mình thấy bạn dùng hàm acedSSFree cho biến ssname chưa khởi gán là kg đúng, hơn nữa, hàm ads_ssfree chỉ dủng để xóa tập hợp đã có chứ kg dùng cho ename. Trước đây, việc dùng hàm này kg cẩn thận dễ làm cho máy treo. Kg biết bây gờ đã cải thiện gì chưa.

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

Bạn cho mình hỏi tý, việc sd tiền tố ads_ và aced có khác nhau kg, mặc dù đối số vẫn như cũ. Trước đây mình thấy dùng ads_, sau đó thấy chuyển thành aced và một số tiền tố khác nữa. Kg biết chỉ là sự thay đổi cú pháp hay có ý nghĩa gì khác. VD như bạn dùng acedSSFree(ssname) , cách cũ là ads_ssfree(ssname).

 

Góp ý : Mình thấy bạn dùng hàm acedSSFree cho biến ssname chưa khởi gán là kg đúng, hơn nữa, hàm ads_ssfree chỉ dủng để xóa tập hợp đã có chứ kg dùng cho ename. Trước đây, việc dùng hàm này kg cẩn thận dễ làm cho máy treo. Kg biết bây gờ đã cải thiện gì chưa.

Trong ObjectARX 2010 thì ads_ssfree là #define của acedSSFree trong file adsmigr.h trong thư mục inc của ObjectARX. Ngoài ra còn rất nhiều hàm ads khác được define bằng aced nên cách dùng là như nhau. Tuy nhiên vẫn còn một số hàm vẫn nằm trong adsdlg.h như: ads_start_list, ads_add_list, ...

Theo mình biết thì hàm acedSSFree sẽ giải phóng 1 selecction set khỏi AutoCAD (nếu có) nên việc Free 1 selection set (chưa có) vẫn ko hại gì (mình đã test và kết quả của acedSSFree(ads_name) ngay sau khi khai báo ads_name= RTNORM). Tuy nhiên việc làm này là "dư" và trong C++ "dư" đôi khi đồng nghĩ với "sai" vậy tốt nhất là bỏ nó đi :D

p/s: tất cả code ở trên mình đã build và test trước khi post nên nếu bạn copy về build vẫn chạy.

  • 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

Đối với selection thì việc lọc đối tượng khi thực hiện việc chọn cũng rất quan trọng giúp tăng độ chính xác cũng như giảm thời gian chọn đối tượng. Post này mình giới thiệu cách lọc đối tượng khi tạo selection, có 2 cách tạo filters (resbuf). Dưới đây mình tạo resbuf theo 2 cách cùng làm 1 nhiệm vụ là lọc các đối tượng là LINE và nằm trong Layer 0

 

Cách 1:

struct resbuf rbLine, rbLayer;

 

rbLayer.restype = 8;

rbLayer.resval.rstring = _T("0");

rbLayer.rbnext = NULL;

 

rbLine.restype = 0;

rbLine.resval.rstring = _T("LINE");

rbLine.rbnext = &rbLayer;

 

ads_name ss;

 

int err = acedSSGet(NULL, NULL, NULL, &rbLine, ss);

if(err!= RTNORM)

return;

 

long sslength;

acedSSLength(ss, &sslength);

 

acutPrintf(_T("\n%d Entities was selected"), sslength);

acedSSFree(ss);

 

Cách 2:

struct resbuf *resb = acutBuildList(

RTDXF0, _T("LINE"),

8, _T("0"),

0);

ads_name ss;

 

int err = acedSSGet(NULL, NULL, NULL, resb, ss);

acutRelRb(resb);

if(err!= RTNORM)

return;

 

long sslength;

acedSSLength(ss, &sslength);

 

acutPrintf(_T("\n%d Entities was selected"), sslength);

acedSSFree(ss);

 

Các bạn tham khảo thêm về DXF code để biết các restype và resval có thể dùng để lọc đối tượng. chú ý các giá trị có kiểu floating point (resval.rreal) và kiểu integer (resval.rint), ...

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

Đối với selection thì việc lọc đối tượng khi thực hiện việc chọn cũng rất quan trọng giúp tăng độ chính xác cũng như giảm thời gian chọn đối tượng. Post này mình giới thiệu cách lọc đối tượng khi tạo selection, có 2 cách tạo filters (resbuf). Dưới đây mình tạo resbuf theo 2 cách cùng làm 1 nhiệm vụ là lọc các đối tượng là LINE và nằm trong Layer 0

 

 

Mình thấy hai cái code của bạn chưa ổn lắm nên góp ý một tý.

cách 1:

struct resbuf rbLine, rbLayer;

 

rbLayer.restype = 8;

rbLayer.resval.rstring = _T("0");

rbLayer.rbnext = NULL;

 

rbLine.restype = 0;

rbLine.resval.rstring = _T("LINE");

rbLine.rbnext = &rbLayer;

 

ads_name ss;

 

int err = acedSSGet(NULL, NULL, NULL, &rbLine, ss);

if(err!= RTNORM)

//bạn phải giải phóng rbLine ở đây vì nó đã đc khởi tạo trước dù việc gọi hàm ssget có thành công hay kg;

return;

 

acutRelRb(resb);//Có lẽ bạn nhầm tên biến resb

long sslength;

acedSSLength(ss, &sslength);

 

acutPrintf(_T("\n%d Entities was selected"), sslength);

acedSSFree(ss);

 

Cách 2:

 

struct resbuf *resb = acutBuildList(RTDXF0, _T("LINE"),8, _T("0"),0); //Cách dùng bộ lọc này gọn hơn nhỉ

ads_name ss;

 

int err = acedSSGet(NULL, NULL, NULL, resb, ss);

if(err!= RTNORM)

//tương tự, bạn phải giải phóng resb ở đây.

return;

 

acutRelRb(resb);

long sslength;

acedSSLength(ss, &sslength);

 

acutPrintf(_T("\n%d Entities was selected"), sslength);

acedSSFree(ss);

Việc giải phóng một resbuf * (ví dụ : resbuf *reb) đã khởi tạo là bình thường, nhưng giải phóng resbuf (ví dụ : resbuf reb) kg biết có ổn kg (lâu lắm mình cũng ít dùng resbuf). Việc giải phóng biến trong C quả rất phức tạp. Khi bạn chạy thử kg thấy lỗi cũng chưa hẳn đã chắc ăn. Ví dụ bạn khai báo ads_name name, sau đó bạn chưa khởi tạo mà giả phóng ngay (vd : ads_ssfree(name) ) có thể gặp lỗi, vì khi đó name có thể chứa rác, mà rác đó vô tình trùng một địa chỉ của biến khác mà với một chương trình nhò, bạn chưa thấy hậu quả của nó.

 

Bạn và các bạn có thể viết hoặc hướng dẫn giúp mình cách lồng các khung đối thoại chuẩn của Cad như ô Preview trong khung thoại Select File thường thấy trong lệnh Open vào trong khung đối thoại do mình tạo ra hay không. Trong khung đối thoại thông thường mình có thể đưa vào cây thư mục và danh sách file, nhưng làm thế nào đưa đc ô Preview của Cad (để khi mình click và tên file thì thấy cái ảnh của nó như Cad vậy) thì mình chịu. Xin cám ơn.

  • 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

 

Mình thấy hai cái code của bạn chưa ổn lắm nên góp ý một tý.

 

Việc giải phóng một resbuf * (ví dụ : resbuf *reb) đã khởi tạo là bình thường, nhưng giải phóng resbuf (ví dụ : resbuf reb) kg biết có ổn kg (lâu lắm mình cũng ít dùng resbuf). Việc giải phóng biến trong C quả rất phức tạp. Khi bạn chạy thử kg thấy lỗi cũng chưa hẳn đã chắc ăn. Ví dụ bạn khai báo ads_name name, sau đó bạn chưa khởi tạo mà giả phóng ngay (vd : ads_ssfree(name) ) có thể gặp lỗi, vì khi đó name có thể chứa rác, mà rác đó vô tình trùng một địa chỉ của biến khác mà với một chương trình nhò, bạn chưa thấy hậu quả của nó.

 

Bạn và các bạn có thể viết hoặc hướng dẫn giúp mình cách lồng các khung đối thoại chuẩn của Cad như ô Preview trong khung thoại Select File thường thấy trong lệnh Open vào trong khung đối thoại do mình tạo ra hay không. Trong khung đối thoại thông thường mình có thể đưa vào cây thư mục và danh sách file, nhưng làm thế nào đưa đc ô Preview của Cad (để khi mình click và tên file thì thấy cái ảnh của nó như Cad vậy) thì mình chịu. Xin cám ơn.

Thanks bạn,

code 1: resbf là giá trị nên ko cần Relrb

code 2, mình RelRb (pointer) trước khi xét err status 1 lần cho 2 trường hợp.

Mình đã sửa lại code ở post trên.

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

Chào Detailing và các bạn.

Mình thử kiếm trong Arx một số hàm tương tự như trong Lisp (acet-, vl, vla ...)

VD : ACET-SS-TO-LIST, ACET-GEOM-OBJECT-END-POINTS,vlax-curve-getClosestPointTo , ...

nhưng kg thấy đâu cả. Kg biết nó có hay kg và tham khảo ở đâu. Mong đc các bạn chỉ dẫn.

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

Chào Detailing và các bạn.

Mình thử kiếm trong Arx một số hàm tương tự như trong Lisp (acet-, vl, vla ...)

VD : ACET-SS-TO-LIST, ACET-GEOM-OBJECT-END-POINTS,vlax-curve-getClosestPointTo , ...

nhưng kg thấy đâu cả. Kg biết nó có hay kg và tham khảo ở đâu. Mong đc các bạn chỉ dẫn.

Sau khi cài ObjectARX SDK, bác vào thư mục docs (vd : C:\ObjectARX 2010\docs), open file arxdoc.chm

- vào tab Content chọn topic ObjectARX Reference để tìm theo class

- hay tab Search, nhập các hàm (method) cần tìm.15454_arx_guide.jpg

  • 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

Chào Detailing và các bạn.

Mình thử kiếm trong Arx một số hàm tương tự như trong Lisp (acet-, vl, vla ...)

VD : ACET-SS-TO-LIST, ACET-GEOM-OBJECT-END-POINTS,vlax-curve-getClosestPointTo , ...

nhưng kg thấy đâu cả. Kg biết nó có hay kg và tham khảo ở đâu. Mong đc các bạn chỉ dẫn.

Chào bạn,

vl, vla, vlax là các hàm acet giống như 1 bộ thông dịch giữa lisp và ARX do Autodesk viết để support cho các Vlisp/lisp developer nên đương nhiên là bạn tìm ko thấy rồi :D

Nếu thấy cần những hàm đó bạn có thể viết lại dựa trên công dụng của nó

  • 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


×