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ị

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.autodesk.com/akdlm/esd/dlm/objectarx/ObjectARX_2010_Win_64_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

untitled-1.jpg

 

2. Nhập Registered developer Symbol

untitled-2.jpg

 

3. Ở bảng project type chọn ObjectARX (AutoCAD Extension)

untitled-3.jpg

 

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

untitled-4.jpg?w=497&h=415

 

5. Chọn No MFC support (chỉ là hello world thôi, ko cần ai support cả cool.png)

untitled-5.jpg

 

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

untitled-6.jpg?w=493&h=414

 

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

untitled-7.jpg

 

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

untitled-8.jpg?w=361&h=368

 

9. Dùng toolbar của Autodesk để tạo command

untitled-9.jpg

 

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

untitled-10.jpg

 

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

untitled-11.jpg

 

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)

1.gif

 

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

  • 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

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

2-11.gif

 

 

 

 

 

 

  • Vote tăng 3

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

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? ^^

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

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++

  • 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

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.

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

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ư:

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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.

  • 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

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:

 

3_11.jpg?w=487

 

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

3-1.gif?w=640

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

 

 

 

  • 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

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ư:

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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.

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

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

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 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ả:

1.gif?w=640

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

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

 

4.gif?w=640

  • 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

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.

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

  • 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

Đ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

  • 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

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

  • 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

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

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

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.

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

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

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

  • 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

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

  • 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

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.

  • 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

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 ^^

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

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!

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á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.

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

×