Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
82 replies to this topic

#21 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 23 May 2012 - 08:47 AM

Hôm nay, tự nhiên thắc mắc vì sao mình sử dụng ARX làm gì cho phức tạp nhỉ? Do nghe người ta đồn nó chạy nhanh lắm??? :P
.............


ARX là thứ "cao cấp" chỉ dành cho "pro" (nghĩa đen). Chi phí sử dụng cao (Visual Studio, C++ ...)
Với vietnamese thi Visual Studio có thể "mua" đuợc, nhưng C++ (tích hợp con trỏ) thì không phải ai cũng đủ khả năng "trỏ" tới.

Trong khi đó Lisp là "cơm bình dân" cho mọi nguời, dễ code , dễ sử dụng nên chậm cũng là bình thuờng?!

Với .Net, trong t/hợp này nếu khai báo kiểu hằng (const, static ..) thì tốc độ cũng giảm gần 1 nữa ?

Command: test
start at 5/23/2012 8:24:08 AM
duration: 00:00:00.4062500
Command: test1
start at 5/23/2012 8:24:10 AM
duration: 00:00:00.2031250
Command: test
start at 5/23/2012 8:24:11 AM
duration: 00:00:00.4218750
Command: test1
start at 5/23/2012 8:24:12 AM
duration: 00:00:00.2187500
Command: test
start at 5/23/2012 8:24:13 AM
duration: 00:00:00.4218750
Command: test1
start at 5/23/2012 8:24:14 AM
duration: 00:00:00.2187500
Command: test
start at 5/23/2012 8:24:16 AM
duration: 00:00:00.4218750
Command: test1
start at 5/23/2012 8:24:17 AM
duration: 00:00:00.2343750
code .NET

static Point3d cen = new Point3d(0.0, 0.0, 0.0);
const double rad = 0.5;
[CommandMethod("test")]
public static void test()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
for (int i = 0; i < 10000; i++)
{
using (Circle cir = new Circle())
{
cir.Center = new Point3d(0.0, 0.0, 0.0);
cir.Radius = 5.0;
btr.AppendEntity(cir);
tr.AddNewlyCreatedDBObject(cir, true);
}
}
tr.Commit();
}
}
[CommandMethod("test1")]
public static void test1()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
for (int i = 0; i < 10000; i++)
{
using (Circle cir = new Circle())
{
cir.Center = cen;
cir.Radius = rad;
btr.AppendEntity(cir);
tr.AddNewlyCreatedDBObject(cir, true);
}
}
tr.Commit();
}
}

  • 1

#22 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 23 May 2012 - 08:55 AM

Dòng getvar CDate 10000 lần làm lisp trên của bác Thanh chậm đi. Về tốc độ tạo mới đối tượng thì Lisp khó lòng thua VBA được

getvar CDate 1 lần thôi Két à.
Thuờng thì " tốc độ tạo mới đối tượng thì Lisp khó lòng thua VBA ", nhưng trong t/h cụ thể này kết quả làm buồn lòng các "fan của Lisp" rồi.
  • 2

#23 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 23 May 2012 - 09:12 AM

Srr các bác e đọc nhầm ^^. Nhưng bỏ nó đi là hiệu quả khác rồi ạ.
Em vẫn giữ quan điểm VBA modify 1 đối tượng nhanh hơn so với lisp, nhưng tạo mới thì cũng như Visual lisp, nó phải làm 2 thao tác, 1 là tạo mới đối tượng với thuộc tính cơ bản mặc định, sau nữa mới là chỉnh đối tượng đó theo ý mình.
Còn so với Net và Arx thì khỏi ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#24 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 09:13 AM

Dòng getvar CDate 10000 lần làm lisp trên của bác Thanh chậm đi. Về tốc độ tạo mới đối tượng thì Lisp khó lòng thua VBA được

Cái này hôm trước tính lấy thời gian trong lisp nhưng sau đó lấy bằng .NET để xài chung cho tất cả nhưng lại quên xóa dòng này.
Thanks Ket.


ARX là thứ "cao cấp" chỉ dành cho "pro" (nghĩa đen). Chi phí sử dụng cao (Visual Studio, C++ ...)
Với vietnamese thi Visual Studio có thể "mua" đuợc, nhưng C++ (tích hợp con trỏ) thì không phải ai cũng đủ khả năng "trỏ" tới.

Trong khi đó Lisp là "cơm bình dân" cho mọi nguời, dễ code , dễ sử dụng nên chậm cũng là bình thuờng?!

Với .Net, trong t/hợp này nếu khai báo kiểu hằng (const, static ..) thì tốc độ cũng giảm gần 1 nữa ?

ARX cũng chỉ là công cụ thôi, ko thể nói xài Revit là pro còn xài AutoCAD là Amateur dc. :D
với .NET (VBA hay ARX) nếu xài const/static như bạn gia_bach nói thì đúng là cải thiện dc về tốc độ nhưng lisp thì ko có const nên sẽ bị thiệt thòi :D
Nhưng để tăng tốc độ mà dùng nhiều static/const sẽ dẫn đến tình trạng chiếm tài nguyên ko chịu trả -> Hệ thống hết tài nguyên -> chậm cả hệ thống.
Thanks bạn!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#25 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 23 May 2012 - 11:24 AM

Cái này hôm trước tính lấy thời gian trong lisp nhưng sau đó lấy bằng .NET để xài chung cho tất cả nhưng lại quên xóa dòng này.
Thanks Ket.


ARX cũng chỉ là công cụ thôi, ko thể nói xài Revit là pro còn xài AutoCAD là Amateur dc. :D
với .NET (VBA hay ARX) nếu xài const/static như bạn gia_bach nói thì đúng là cải thiện dc về tốc độ nhưng lisp thì ko có const nên sẽ bị thiệt thòi :D
Nhưng để tăng tốc độ mà dùng nhiều static/const sẽ dẫn đến tình trạng chiếm tài nguyên ko chịu trả -> Hệ thống hết tài nguyên -> chậm cả hệ thống.
Thanks bạn!

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

Error 1 fatal error C1083: Cannot open include file: 'arxHeaders.h': No such file or directory d:\ws\objectarx 2007\bai tap\bt1\arxproject1_helooword\arxproject1_helooword\stdafx.h 49

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 :

Error 1 fatal error C1083: Cannot open include file: 'type_traits': No such file or directory d:\ws\objectarx 2010\inc\acarray.h 93 testdb

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.
  • 0

#26 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 12:24 PM

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:
  • 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)
  • Lỗi do chưa cài SP1 của VS 2008

Good luck!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#27 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 23 May 2012 - 05:17 PM

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:

  • 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)
  • 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
Hình đã gửi
  • 0

#28 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 07:26 PM

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
Hình đã gửi

Sp1 bạn download ở đây: http://www.microsoft...s.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.
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#29 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 07:51 PM

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.c...7_testspeed.rar
load bằng lệnh AP (các file lsp, dvb, arx) trừ file dll load bằng lệnh NETLOAD
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#30 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 23 May 2012 - 09:14 PM

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ề
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#31 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 11:10 PM

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:
Hình đã gửi
  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#32 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 23 May 2012 - 11:20 PM

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, ...
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#33 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 24 May 2012 - 01:17 AM

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(&quot;x&quot;,NULL,NULL,NULL,ss)==RTNORM )
// hoặc bạn đã gán nó, VD : ads_ssadd(ss, NULL, NULL)

acedSSGet(_T(&quot;A&quot;), 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, &amp;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(&quot;\nNo entities found&quot;));
return;
}
for (long i=0;i&lt;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-&gt;setColorIndex(1);
pEnt-&gt;close();
}
acedSSFree(ss);
acutPrintf(_T(&quot;\nColor of %d Entities was changed to RED&quot;), 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)
  • 1

#34 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 24 May 2012 - 08:20 AM

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:Hình đã gửi
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!
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#35 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 24 May 2012 - 08:28 AM

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

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#36 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 24 May 2012 - 08:51 AM

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:
Hình đã gửi

Ủ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?
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#37 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 24 May 2012 - 06:46 PM

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.
  • 0

#38 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 24 May 2012 - 10:27 PM


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.
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#39 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 25 May 2012 - 01:55 AM

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:

Hình đã gửi

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


  • 1

#40 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 25 May 2012 - 09:20 AM

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)
Hình đã gửi
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341