Đế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

#1 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 18 April 2012 - 10:35 PM

Những bài mình post sau đây là những gì mình đã và đang học cái món này nên chắc chắn sẽ có nhiều sai sót, mong mọi người cùng nhau thảo luận.
Trước hết mình dùng VS2008 SP1 + ObjectARX SDK 2010 + test trên AutoCAD 2010
Bộ cài ObjectARX 2010 được cung cấp free bới Autodesk ở đây: http://download.auto...4_and_32Bit.exe

Bài học đầu tiên cho các ngôn ngữ lập trình bao giờ cũng là "Hello world" vậy mình cũng ko dám "xé rào", làm 1 cái Hello world để biết C++ và AutoCAD làm việc với nhau như thế nào. Với mục đích nhanh - gọn - lẹ mình dùng luôn wizard của AutoCAD

1. Chọn ObjectARX/DBX/OMF project từ project type của VS
Hình đã gửi

2. Nhập Registered developer Symbol
Hình đã gửi

3. Ở bảng project type chọn ObjectARX (AutoCAD Extension)
Hình đã gửi

4. Không thay đổi gì cả cứ bấm Next thôi
Hình đã gửi

5. Chọn No MFC support (chỉ là hello world thôi, ko cần ai support cả Hình đã gửi)
Hình đã gửi

6. Không thay đổi gì cả cứ bấm Next thôi
Hình đã gửi

7. Không thay đổi gì cả cứ bấm Next thôi
Hình đã gửi

8. Sau khi kết thúc wizard (bấm Finish) nhìn vào solution explorer ta thấy wizard đã tạo cho ta một số file cần thiết đồng thời thết lập luôn các linker, setting, ...
Hình đã gửi

9. Dùng toolbar của Autodesk để tạo command
Hình đã gửi

10. Right click trên cửa sổ ObjectARX Commands -> chọn New sau đó nhập các thông tin cần thiết
Hình đã gửi

11. Sau khi bấm OK trong file acrxEntryPoint.cpp ta thấy xuất hiện dòng code khai báo tên lệnh và 1 function chứa code của command
Hình đã gửi

12. Add thêm dòng code này vào function mới tạo ra để hiện dòng "Welcome to ObjectARX!" trên Command của AutoCAD

acedPrompt(_T("Welcome to ObjectARX!"));



13. Mở CAD lên và load lệnh thử xem thế nào (muốn dùng debug để tự mở cad thì phải add đường dẫn đến acad.exe trong properties của project)
Hình đã gửi

OK! thế là mình đã kết nối C++ với AutoCAD dc rồi
  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#2 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 18 April 2012 - 10:40 PM

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







  • 3

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#3 cvmem

cvmem

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 19 April 2012 - 10:26 AM

Chao Detailing!
Cho minh hoi cau này dc ko, bạn là dân xây dựng hay lập trình? VN CONCRETE DETAILING bạn tạo bằng AutoCad.NET àh hay ObjectArx? ^^
  • 0

#4 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 19 April 2012 - 10:58 AM

Chao Detailing!
Cho minh hoi cau này dc ko, bạn là dân xây dựng hay lập trình? VN CONCRETE DETAILING bạn tạo bằng AutoCad.NET àh hay ObjectArx? ^^

trả lời câu hỏi của bạn:
Mình là KSXD và VN CONCRETE DETAILING dc viết bằng AutoCAD .NET + 1 ít C++
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#5 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 19 April 2012 - 04:38 PM

hà hà. đặt gạch hóng các bài tiếp theo của Detailing!
Detailing cho mình hỏi chút. Vì sao bạn lại học cùng lúc 2 ngôn ngữ này: ObjectArx và AutoCAD.NET. Phải chăng mỗi ngôn ngữ này có những điểm yếu không thể thỏa mãn lập trình viên nên bắt buộc lập trình viên phải kết hợp 2 ngôn ngữ này cho chương trình của mình.
  • 0

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


#6 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 19 April 2012 - 09:38 PM

hà hà. đặt gạch hóng các bài tiếp theo của Detailing!
Detailing cho mình hỏi chút. Vì sao bạn lại học cùng lúc 2 ngôn ngữ này: ObjectArx và AutoCAD.NET. Phải chăng mỗi ngôn ngữ này có những điểm yếu không thể thỏa mãn lập trình viên nên bắt buộc lập trình viên phải kết hợp 2 ngôn ngữ này cho chương trình của mình.

hà hà, cái này mình cũng chỉ "mót" thôi (em mượn từ này của bác Bình nhé) chắc gì đã đúng, nếu bạn nào có kinh nghiệm gì thì sửa giúp nhe. Thank All!

hì hì, trước 2 cái này mình còn sử dụng Autolisp lisp, VBA, VB nữa, mỗi thứ có cái hay riêng, tùy lúc mà xài ví dụ như:
  • lisp : ưu điểm: nhanh gọn, viết xong là xài liền, tính tương thích cao - nhược điểm: tạo giao diện khó, khó phát triển, debug cũng rắc rối
  • VBA : ưu điểm: tạo giao diện dễ dàng, xài activeX ngon, lập trình OOP ko hoàn toàn - nhược điểm: bảo mật kém, chạy chậm, tạo giao diện tuy dễ nhưng tính tùy biến ko cao
  • VB: ưu điểm như VBA, bảo mật khá hơn nhưng lại chậm nhất so với 2 thứ trên
  • AutoCAD .NET: ưu điểm giao diện đẹp, lập trình OOP , chạy nhanh nhất so với các thứ trên, bảo mật tạm dc - nhược điểm: dùng VS để build, phụ thuộc vào version CAD, ko tạo custom entity dc
  • ARX: lập trình OOP, chạy nhanh nhất, là thứ duy nhất tạo dc custom entity, bảo mật OK - nhược điểm: Khó, tạo giao diện phức tạp, phụ thuộc vào version CAD, code ko tốt chương trình dễ bị crash


Trên đây là những thứ gọi là "kinh nghiệm" của mình trong quá trình học tập cũng như làm việc. Nếu bạn nào có ý kiến khác thì cùng nhau thảo luận.
  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#7 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 19 April 2012 - 09:47 PM

post trước chúng ta đã thêm được Line vào bản vẽ với các điểm được dịnh nghĩa trước trong code. Để thuận tiện hơn chương trình cần tương tác với người dùng để nhận các giá trị nhập.
để 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: MyCircle với mục đích vẽ 1 circle với tâm và bán kính do người dùng nhập vào
Sau khi thêm lệnh MyCircle 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 MyCircle test thử nào

Hình đã gửi

Ngoài ra còn các hàm lấy giá trị khác như:

acedGetInt -------------- Gets an integer value
acedGetReal -------------- Gets a real value
acedGetDist -------------- Gets a distance
acedGetAngle -------------- Gets an angle (oriented to 0 degrees as specified by the ANGBASE variable)
acedGetOrient -------------- Gets an angle (oriented to 0 degrees at the right)
acedGetPoint -------------- Gets a point
acedGetCorner -------------- Gets the corner of a rectangle
acedGetKword -------------- Gets a keyword (see the description of keywords later in this section)
acedGetString -------------- Gets a string




  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#8 duy267

duy267

    biết vẽ point

  • Members
  • PipPip
  • 96 Bài viết
Điểm đánh giá: 7 (bình thường)

Đã gửi 19 April 2012 - 10:19 PM

hà hà, cái này mình cũng chỉ "mót" thôi (em mượn từ này của bác Bình nhé) chắc gì đã đúng, nếu bạn nào có kinh nghiệm gì thì sửa giúp nhe. Thank All!

hì hì, trước 2 cái này mình còn sử dụng Autolisp lisp, VBA, VB nữa, mỗi thứ có cái hay riêng, tùy lúc mà xài ví dụ như:

  • lisp : ưu điểm: nhanh gọn, viết xong là xài liền, tính tương thích cao - nhược điểm: tạo giao diện khó, khó phát triển, debug cũng rắc rối
  • VBA : ưu điểm: tạo giao diện dễ dàng, xài activeX ngon, lập trình OOP ko hoàn toàn - nhược điểm: bảo mật kém, chạy chậm, tạo giao diện tuy dễ nhưng tính tùy biến ko cao
  • VB: ưu điểm như VBA, bảo mật khá hơn nhưng lại chậm nhất so với 2 thứ trên
  • AutoCAD .NET: ưu điểm giao diện đẹp, lập trình OOP , chạy nhanh nhất so với các thứ trên, bảo mật tạm dc - nhược điểm: dùng VS để build, phụ thuộc vào version CAD, ko tạo custom entity dc
  • ARX: lập trình OOP, chạy nhanh nhất, là thứ duy nhất tạo dc custom entity, bảo mật OK - nhược điểm: Khó, tạo giao diện phức tạp, phụ thuộc vào version CAD, code ko tốt chương trình dễ bị crash



Trên đây là những thứ gọi là "kinh nghiệm" của mình trong quá trình học tập cũng như làm việc. Nếu bạn nào có ý kiến khác thì cùng nhau thảo luận.

Thật là thán phục bác, có mỗi cái lisp mà em còn chưa học hết mà bác lại biết đến nhiều ngôn ngữ như vậy. Bái phục! bái phục.
  • 0

#9 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 19 April 2012 - 10:49 PM

Thật là thán phục bác, có mỗi cái lisp mà em còn chưa học hết mà bác lại biết đến nhiều ngôn ngữ như vậy. Bái phục! bái phục.

Bạn này quá khen rồi. Biết mỗi thứ 1 chút chứ có rành cái nào đâu, mình còn phải học hỏi các bạn nhiều. Biết nhiều nhưng chẳng cái nào ra hồn cả cũng như ko biết gì :D sách thì mỗi cuốn đọc vài trang giới thiệu cho gọi là biết thôi. :P
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#10 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 08 May 2012 - 10:29 PM

post này mình tìm hiểu về cách thức thay đổi thuộc tính (properties) của entity có sẵn trên bản vẽ, cụ thể là màu của đối tượng sẽ thay đổi theo giá trị do user nhập vào (integer)


ads_name ssname;
ads_point pt;
int res;

for (;;)
{
res = acedEntSel(_T("\nSelect an entity: "), ssname, pt);
if(res==RTNORM) break;
if(res==RTCAN)
{
acedSSFree(ssname);
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! ***"));

acedSSFree(ssname);
pEnt->close();


và đây là kết quả:
Hình đã gửi
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#11 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 15 May 2012 - 10:17 PM

Ôi post thứ 500, ko ngờ mình post + comment trên CADViet nhiều đến vậy :D
code sau mình tạo layer theo tên do ng dùng nhập vào và với màu mặc định: RED

AcDbLayerTable *pLyrTbl = NULL;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLyrTbl, AcDb::kForRead);

ACHAR *LyrName = new ACHAR;
acedGetString(TRUE, _T("\nEnter new layer name: "), LyrName);
if (!pLyrTbl->has(LyrName))
{
pLyrTbl->upgradeOpen();
AcDbLayerTableRecord *plyrRec = new AcDbLayerTableRecord;
plyrRec->setName(LyrName);

AcCmColor color;
color.setColorIndex(1);
plyrRec->setColor(color);

plyrRec->setIsFrozen(FALSE);
plyrRec->setIsOff(FALSE);
plyrRec->setIsLocked(FALSE);

pLyrTbl->add(plyrRec);
plyrRec->close();
acutPrintf(_T("\nLayer %s is created."), LyrName);
}else
{
acutPrintf(_T("\nLayer %s already exists."), LyrName);
}
LyrName = NULL;
pLyrTbl->close();


  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#12 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 16 May 2012 - 10:36 PM

Ôi bệnh, nhức đầu! thế mà đọc cái này lại ko bị gì, nghĩ cũng lạ thật :D
hôm qua mình đã "dạo" qua LayerTableLayerTableRecord rồi, hôm nay "ghé" vào BlockTableBlockTableRecord xem sao. Đoạn code sau tạo ra 1 block tên "SampleBlock" trong Database (BlockTable) của bản vẽ nếu chưa có và insert block đó vào bản vẽ tại vị trí do người dùng chọn.
Block "SampleBlock" gồm 1 circle và 1 text "ARX" giữa

const ACHAR *BlkName = _T("SampleBlock");
AcDbBlockTable *pbt = NULL;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pbt, AcDb::kForRead);

AcDbObjectId Blkid;

pbt->getAt(BlkName, Blkid);
if(Blkid.isNull())
{
AcDbBlockTableRecord *pbtr = new AcDbBlockTableRecord;
pbtr->setName(BlkName);
pbt->upgradeOpen();
pbt->add(Blkid, pbtr);

//Add entity to Block
AcDbCircle *pcircle = new AcDbCircle;
pcircle->setCenter(AcGePoint3d(0,0,0));
pcircle->setRadius(10);
pcircle->setColorIndex(253);
pbtr->appendAcDbEntity(pcircle);
pcircle->close();

AcDbText *ptext = new AcDbText;
ptext->setTextString(_T("ARX"));
ptext->setHeight(5);
ptext->setAlignmentPoint(AcGePoint3d(0,0,0));
ptext->setHorizontalMode(AcDb::kTextCenter);
ptext->setVerticalMode(AcDb::kTextVertMid);
ptext->setColorIndex(2);
pbtr->appendAcDbEntity(ptext);
ptext->close();

pbtr->close();
}

AcGePoint3d ptInsert;
if (acedGetPoint(NULL, _T("\nSelect insertion point: "),
asDblArray(ptInsert)) != RTNORM)
return;

AcDbBlockReference *pBlk = new AcDbBlockReference;
pBlk->setBlockTableRecord(Blkid);
pBlk->setPosition(ptInsert);

AcDbBlockTableRecord *pModel;
pbt->getAt(ACDB_MODEL_SPACE, pModel, AcDb::kForWrite);
pbt->close();

pModel->appendAcDbEntity(pBlk);
pModel->close();
pBlk->close();


Hình đã gửi
  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#13 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 18 May 2012 - 06:40 PM

Những bài mình post sau đây là những gì mình đã và đang học cái món này nên ....

Cám ơn các bài viết của bạn. Rất hay và bài bản. Nói chung tài liệu về lập trình Arx khá ít nên đề tài của bạn sẽ giúp ích cho nhiều bạn muốn học Arx. Chính mình cũng vậy. Trước đây mình làm Arx bằng cách lấy 1 file mẫu rồi làm thêm thôi. Hiện nay mình khá bận và lớn tuổi nên cũng ít nghiên cứu về Arx và cả C++. Mình có một vài file CT cũ dự định chuyển lên phiên bản cao hơn nhưng chưa đc. Hồi trước mình làm trên Cad14, sau đó chuyển qua Cad2002 và 2006, những bản sau mình không chuyển được vì có nhiều thay đổi quá. Mình định nhờ bạn chuyển lên giúp không biết có được không. Email của mình là trungngamy@yahoo.com. Nếu được bạn có thể cho mình biết địa chỉ mail của bạn để mình gởi nhờ bạn giúp. Mình chỉ nhờ bạn chuyển giúp mình một dự án nhỏ rồi mình sẽ dựa vào đó làm những cái khác. Cám ơn bạn trước.
  • 0

#14 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 18 May 2012 - 07:40 PM

Cám ơn các bài viết của bạn. Rất hay và bài bản. Nói chung tài liệu về lập trình Arx khá ít nên đề tài của bạn sẽ giúp ích cho nhiều bạn muốn học Arx. Chính mình cũng vậy. Trước đây mình làm Arx bằng cách lấy 1 file mẫu rồi làm thêm thôi. Hiện nay mình khá bận và lớn tuổi nên cũng ít nghiên cứu về Arx và cả C++. Mình có một vài file CT cũ dự định chuyển lên phiên bản cao hơn nhưng chưa đc. Hồi trước mình làm trên Cad14, sau đó chuyển qua Cad2002 và 2006, những bản sau mình không chuyển được vì có nhiều thay đổi quá. Mình định nhờ bạn chuyển lên giúp không biết có được không. Email của mình là trungngamy@yahoo.com. Nếu được bạn có thể cho mình biết địa chỉ mail của bạn để mình gởi nhờ bạn giúp. Mình chỉ nhờ bạn chuyển giúp mình một dự án nhỏ rồi mình sẽ dựa vào đó làm những cái khác. Cám ơn bạn trước.

Chào bạn,
Cám ơn bạn đã động viên nhưng mình thực sự chưa đủ khả năng để thực hiện việc bạn nhờ ở trên. Nếu được bạn hãy tạo 1 topic [Yêu cầu] để những ng có khả năng có thể giúp bạn.
Ngoài ra mình nghĩ bạn cũng khá rành về món này, hy vọng bạn có những post chia sẻ kiến thức của mình với mọi người trong topic này.
Trong các post của mình nếu bạn thấy sai sót đừng ngại chỉ ra giúp mình và mọi người nhé.
Thanks bạn rất nhiều!
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#15 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 21 May 2012 - 07:53 PM

Đoạn code sau có chức năng tạo thêm 1 TextStyle mới cho bản vẽ với tên "SampleStyle" (nếu chưa có) với font : ARIAL và chiều cao =10 sau đó set TextStyle đó thành Current.

ACHAR *StyleName = _T("SampleStyle");
AcDbTextStyleTable *pstbt = NULL;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pstbt, AcDb::kForRead);

if(!pstbt->has(StyleName))
{
AcDbTextStyleTableRecord *pstRec = new AcDbTextStyleTableRecord;
pstRec->setName(StyleName);
pstRec->setFont(_T("Arial"), Adesk::kFalse,Adesk::kFalse, 0, 0);
pstRec->setTextSize(10);
pstbt->upgradeOpen();
pstbt->add(pstRec);
pstRec->close();
acutPrintf(_T("\nLayer %s is created"), StyleName);
}else
{
acutPrintf(_T("\nTextStyle %s already exists."), StyleName);
}
pstbt->close();
struct resbuf rb;
rb.restype = RTSTR;
rb.resval.rstring = StyleName;

acedSetVar(_T("TEXTSTYLE"), &rb);


Ngoài ra còn có các symbol table sau:
  • Linetype Table
  • Dimension Style Table
  • View Table
  • Viewport Table
  • UCS Table
  • Registered Applications Table

  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#16 Detailing

Detailing

    biết lệnh imageclip

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

Đã gửi 22 May 2012 - 09:37 PM

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
OK, vậy làm 1 cái test thử xem nó chạy nhanh đến mức nào và có đáng để "gặm" tiếp ko.
Do chỉ biết có vài thứ nên biết bao nhiêu xài bấy nhiêu.
yêu cầu test là tạo ra 10000 (mười ngàn) CIRCLE có bán kính R=5 tại điểm O(0,0,0)
Sau đây là kết quả test


Command: _vbarun
start at 5/23/2012 7:38:24 PM
duration: 00:00:02.7230000
Command: cir_lisp

start at 5/23/2012 7:38:33 PM((0 . "CIRCLE") (10 0.0 0.0 0.0) (40 . 5.0))

Command:
duration: 00:00:03.1740000
Command: CIR_net

start at 5/23/2012 7:38:41 PM
duration: 00:00:00.8580000
Command: cir_arx

start at 5/23/2012 7:38:49 PM
duration: 00:00:00.4250000


Và đây là các "test thủ" lưu ý: trong code .NET có phần tính thời gian và tất cả các command trên đều dùng đoạn code đó để tính thời gian thực hiện.

code lisp:

(defun C:Cir_LISP ()
(setq i 0)
(while (< i 10000)
(progn
(setq i (+ i 1))
(entmake
'((0 . "CIRCLE")
(10 0.0 0.0 0.0)
(40 . 5.0)
)
)
)
)
)
code VBA

Public Sub Cir_VBA()
Dim center(2) As Double
Dim r As Double
Dim i As Integer

r = 5
center(0) = 0: center(1) = 0: center(2) = 0
For i = 1 To 10000
ThisDrawing.ModelSpace.AddCircle center, r
Next

End Sub

code ARX

AcGeVector3d vecNormal = AcGeVector3d::kZAxis;
AcGePoint3d pt(0, 0, 0);
ads_real radius = 5;

AcDbDatabase *db = acdbHostApplicationServices()->workingDatabase();
AcDbBlockTable *bt = NULL;
db->getSymbolTable(bt, AcDb::kForRead);

AcDbBlockTableRecord *btrModel = NULL;
bt->getAt(ACDB_MODEL_SPACE, btrModel,AcDb::kForWrite);
bt->close();
for (int i=0;i<10000;i++)
{
AcDbCircle *acCircle = new AcDbCircle(pt, vecNormal, radius);
btrModel->appendAcDbEntity(acCircle);
acCircle->close();
}
btrModel->close();

Code .NET


double r = 5d;
Point3d pt = Point3d.Origin;
Database db = HostApplicationServices.WorkingDatabase;
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 = pt;
cir.Radius = r;

btr.AppendEntity(cir);
tr.AddNewlyCreatedDBObject(cir, true);
}
}

tr.Commit();
}
Hàm tính thời gian được add vô event / reactor của bản vẽ bắt các sự kiện start command/ start lisp và end command/ end lisp.
Đoạn code tính thời gian:

public void Initialize()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.CommandWillStart += new CommandEventHandler(acDoc_CommandWillStart);
acDoc.LispWillStart += new LispWillStartEventHandler(acDoc_LispWillStart);
acDoc.CommandEnded += new CommandEventHandler(acDoc_CommandEnded);
acDoc.LispEnded += new EventHandler(acDoc_LispEnded);
}

void acDoc_LispEnded(object sender, EventArgs e)
{
endStopwatch();
}

void acDoc_CommandEnded(object sender, CommandEventArgs e)
{
endStopwatch();
}

void acDoc_LispWillStart(object sender, LispWillStartEventArgs e)
{
startStopwatch();
}

void acDoc_CommandWillStart(object sender, CommandEventArgs e)
{
startStopwatch();
}

DateTime begin;
private void startStopwatch()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
begin = DateTime.Now;
string mess = string.Format("\nstart at {0}", begin);
ed.WriteMessage(mess);
}

private void endStopwatch()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
TimeSpan duration = DateTime.Now.Subtract(begin);
ed.WriteMessage("\nduration: {0}", duration);
}

public void Terminate()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.CommandWillStart -= new CommandEventHandler(acDoc_CommandWillStart);
acDoc.LispWillStart -= new LispWillStartEventHandler(acDoc_LispWillStart);
acDoc.CommandEnded -= new CommandEventHandler(acDoc_CommandEnded);
acDoc.LispEnded -= new EventHandler(acDoc_LispEnded);
}

  • 2

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#17 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

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

Choáng quá! Lisp chậm hơn gần 10 lần, và tệ nhất bọn; .NET chậm hơn 2 lần
Kết quả trên còn chưa phản ánh đúng tốc độ thực sự của arx do quá trình tính toán đươc thực hiện thông qua 1 hàm .NET, chưa kể đến việc phép thử dành cho arx còn thực hiện cuối cùng. Như vậy thực tế còn nhanh hơn nữa. Buồn cho em lisp :D
  • 0

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


#18 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 - 08:16 AM

Choáng quá! Lisp chậm hơn gần 10 lần, và tệ nhất bọn; .NET chậm hơn 2 lần
Kết quả trên còn chưa phản ánh đúng tốc độ thực sự của arx do quá trình tính toán đươc thực hiện thông qua 1 hàm .NET, chưa kể đến việc phép thử dành cho arx còn thực hiện cuối cùng. Như vậy thực tế còn nhanh hơn nữa. Buồn cho em lisp

Mình đã test >3 lần và tất cả kết quả đều giống nhau :D với lại tất cả xài chung 1 phép thử nên sai số có thể xem như bằng nhau. Mình cũng ko ngờ lisp lại chậm nhất. Trước khi test mình đã vẽ 1 circle để tránh trường hợp CAD phải load circle làm chậm lệnh đàu tiên, có thể trong thao tác với danh sách và modify entity lisp sẽ nhanh hơn VBA, Khi nào rảnh test tiếp.
  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#19 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 May 2012 - 08:39 AM

Mình đã test >3 lần và tất cả kết quả đều giống nhau :D với lại tất cả xài chung 1 phép thử nên sai số có thể xem như bằng nhau. Mình cũng ko ngờ lisp lại chậm nhất. Trước khi test mình đã vẽ 1 circle để tránh trường hợp CAD phải load circle làm chậm lệnh đàu tiên, có thể trong thao tác với danh sách và modify entity lisp sẽ nhanh hơn VBA, Khi nào rảnh test tiếp.

Nhìn kết quả test mà buồn cho lisp, dù thông tin trước đây đã biết điều đó phần nào.
Detailing cố gắng test thêm nhiều kiểu (như màu đỏ ở trên) để xem có gì gỡ gạc được cho lisp không nhé!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#20 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 - 08:47 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
  • 1

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