Như các bạn đã biết, việc phát triển một phần mềm đã vô cũng phức tạp đặc biệt trong các ngành kĩ thuật như xây dựng, cơ khí, đặc biệt hơn là ngành đóng tàu chúng ta luôn phải làm việc với các mặt phức tạp như mặt NURBS, B-pline.....việc lập trình đã phức tạp huống chi còn điểu khiển chúng. Để tạo ra các đường Spline, mặt NURBS ..... đòi hỏi sử dụng các công thức toán học. Như vây để giảm bớt việc tạo các mặt, đường chúng ta sử dụng các ngôn ngữ được Autodesk phát triển và đưa vào phần mềm AutoCAD như Vuisual LISP, VBA(Visual Basic for Applicaytion), ARX, Reactor .......ngày nay được phát triển lên AutoCAD.net. Như vậy sử dụng các lệnh tạo mặt, tạo đường và tận dụng các ngôn ngữ ở trên chúng ta có thể hoàn toàn giải quyết được các công việc thường lặp đi lặp lại hàng ngày. Ví dụ như: Tính diện tích của các đường sườn tại các đường nước khác nhau chúng ta đòi hỏi phải qua nhiều công việc vậy tại sao không sử dụng 1 click cho ra kết quả ngay và giảm được thời gian tính toán trên AutoCAD. Ngoài ra, còn giải quyết được các công việc như tính toán các thông số tính nổi trực tiếp ngay trên AutoCAD không cần phải thông qua các bảng tính toán phức tạp và cho phép vẽ các đồ thị trực tiếp ngay trên AutoCaD. Việc tận dụng lại các lệnh của AutoCAD đã giảm bớt quá trình lập trình Ví dụ như: phần mềm ShipContructor được phát triển dựa trên công nghệ ARx OBjectARX.........hoàn toàn giải quyết được bài toán thiết kế công nghệ ngay trên phần mềm AutoCAD. Như vậy nhận thấy tầm quan trọng của các vấn đề tôi đã nêu trên hôm nay tôi sẽ viết bài giới thiệu về các ngôn ngữ được AutoDESK phát triển cho AutoCAD cụ thể như sau:
Ngôn ngữ AutoLISP: AutoLisp được phát triển từ XLISP là ngôn ngữ lập trình trên môi trường AutoCAD và được công bố phiên bản đầu tiên 2.18 vào tháng 01 năm 1986. Cùng với sự phát triển của AutoCAD các phiên bản của Autolisp ngày càng được hoàn thiện với nhiều tính năng mới, có thể kể đến một vài phiên bản tiêu biểu như sau:
- Chính thức giới thiệu phiên bản 2.5 tích hợp vào AutoCAD R7 với một số tính tăng cơ bản về các tương tác với đối tượng trong bản vẽ
- Phiên bản 2.6 tích hợp vào AutoCAD R7 với chức năng 3D và một số hàm mới getcorner, getkword, và initget.
- Phiên bản tích hợp vào AutoCAD R12 giới thiệu một số hàm GUI (Graphic User Interface) và ngôn ngữ điều khiển hộp thoại DCL (Dialog Control Language).
- Phiên bản Visual LISP™ giới thiệu cùng với AutoCAD R14 là một môi trường phát triển Autolisp độc lập, trực quan với sự hỗ trợ của các công cụ gỡ rối.
- Visual LISP™ được chính thức tích hợp vào AutoCAD 2000 và từ đó đến nay được bổ sung nhiều tích năng mới.
Nhược điểm:
- Hình thức bên ngoài không hấp dẫn.
- Cú pháp khó hiểu.
- Hạn chế, không có trình biên dịch.
- Ngôn ngữ trung gian nên thực thi chậm.
- Hầu như không thể tương tác với hệ thống.
- Việc phát triển giao diện chương trình khó khăn đòi hỏi thông qua ngôn ngữ DCL hoặc VBA
- Không cho phép đóng gói chương trình ở dạng exe mà phải copy đoạn lệnh vào file autocad.lsp hoặc VBA, Lognet.....
Ưu điểm :
- Cho phép thực thi chương trình ngay trên AutoCAD
- Là ngôn ngữ lập trình bậc cao cho phép truy nhập sâu vào cơ sở dữ liệu của AutoCAD. sử dụng các đối tượng và điều khiển đối tượng
- Làm việc rất tốt và dễ dàng với điểm và các yếu tố hình học.
- Rất mềm dẻo, không khắt khe.
- Không cần trình dịch - lập trình và thực hiện lệnh.
- Chạy được trên tất các các hệ điều hành với cùng 1 file Lisp.
- Quản lý đối tượng với List - một kiểu dữ liệu với nhiều ưu điểm vượt trội trong quản lý tọa độ điểm.
- Mã nguồn mở và cộng đồng phát triển Autolisp rất rộng lớn.
Programing pick up point on Area of Draw AutoCAD(Author: Bùi Công Lộc)
AutoCAD.net
Từ AutoCAD 2010, VBA không còn bao gồm trong gói cài đặt AutoCAD. Nếu bạn muốn tiếp tục sử dụng nó cho 2010 bạn sẽ cần phải lên trang chủ của AutoCAD tải về và cài đặt VBA Enabler. (Có thể) trong tương lai AutoCAD thậm chí sẽ không hỗ trợ VBA ?! ( do Microsoft ngưng cung cấp)
AutoCAD cung cấp nhiều cách khác nhau để truy xuất DataBase thông qua các API khác nhau (API viết tắt của Application Programming Interfaces : giao diện lập trình ứng dụng).
VD : AutoLISP và ARX (C++ interface)
Trong khi đó AutoCAD Visual Basic for Applications gọi tắt là VBA giao tiếp với AutoCAD thông qua giao diện ActiveX Automation.
Microsoft giới thiệu Môi trường Net (.NET Framework) cho phép bạn có thể sử dụng bất kỳ ngôn ngữ lập trình để tạo ra một ứng dụng .
Thông qua .Net, các AutoCAD .NET API cho phép bạn thao tác với giao diện Acad và các tập tin.
AutoCAD .NET API gồm các tập tin DLL khác nhau chứa một loạt các lớp(classes), cấu trúc(structures), phương thức(methods) và các sự kiện( events) cung cấp truy cập vào các đối tượng trong một file bản vẽ hoặc các ứng dụng AutoCAD.
Các DLL này bao gồm trong gói cài đặt AutoCAD, và mặc nhiên đuợc tự động cài đặt cùng với AutoCAD.
Mỗi tập tin DLL chứa các thành phần của các thư viện khác nhau.
Có hai DLL chính là :
- AcDbMgd.dll : cung cấp các thư viện (hàm) để làm việc với các đối tuợng trong bản vẽ.
- AcMgd.dll : cung cấp các thư viện (hàm) để làm việc với các ứng dụng AutoCAD.
Truớc khi sử dụng các AutoCAD .NET API, chúng ta phải tham chiếu (Add reference) các DLL này vào project
Thuận lợi của AutoCAD .NET API là bạn có thể sử dụng bất kì thư viện nào viết trên Môi trường Net.
Code tương tự tôi viết trên VB.net dựa trên công nghệ(COM) AutoCAD .net
- Ngoài ra còn việc xây dựng các menu ngữ cảnh ICON chương trình được hỗ trợ với các hàm khác nhau các bạn có thể tham khảo code tạo menu chương trinh trong AutoCAD như sau:
Các sản phầm đơn giản nhất được viết bởi ngôn ngữ AutoLISP
- Tính toán trọng lượng thép tấm
Ngôn ngữ AutoLISP: AutoLisp được phát triển từ XLISP là ngôn ngữ lập trình trên môi trường AutoCAD và được công bố phiên bản đầu tiên 2.18 vào tháng 01 năm 1986. Cùng với sự phát triển của AutoCAD các phiên bản của Autolisp ngày càng được hoàn thiện với nhiều tính năng mới, có thể kể đến một vài phiên bản tiêu biểu như sau:
- Chính thức giới thiệu phiên bản 2.5 tích hợp vào AutoCAD R7 với một số tính tăng cơ bản về các tương tác với đối tượng trong bản vẽ
- Phiên bản 2.6 tích hợp vào AutoCAD R7 với chức năng 3D và một số hàm mới getcorner, getkword, và initget.
- Phiên bản tích hợp vào AutoCAD R12 giới thiệu một số hàm GUI (Graphic User Interface) và ngôn ngữ điều khiển hộp thoại DCL (Dialog Control Language).
- Phiên bản Visual LISP™ giới thiệu cùng với AutoCAD R14 là một môi trường phát triển Autolisp độc lập, trực quan với sự hỗ trợ của các công cụ gỡ rối.
- Visual LISP™ được chính thức tích hợp vào AutoCAD 2000 và từ đó đến nay được bổ sung nhiều tích năng mới.
Nhược điểm:
- Hình thức bên ngoài không hấp dẫn.
- Cú pháp khó hiểu.
- Hạn chế, không có trình biên dịch.
- Ngôn ngữ trung gian nên thực thi chậm.
- Hầu như không thể tương tác với hệ thống.
- Việc phát triển giao diện chương trình khó khăn đòi hỏi thông qua ngôn ngữ DCL hoặc VBA
- Không cho phép đóng gói chương trình ở dạng exe mà phải copy đoạn lệnh vào file autocad.lsp hoặc VBA, Lognet.....
Ưu điểm :
- Cho phép thực thi chương trình ngay trên AutoCAD
- Là ngôn ngữ lập trình bậc cao cho phép truy nhập sâu vào cơ sở dữ liệu của AutoCAD. sử dụng các đối tượng và điều khiển đối tượng
- Làm việc rất tốt và dễ dàng với điểm và các yếu tố hình học.
- Rất mềm dẻo, không khắt khe.
- Không cần trình dịch - lập trình và thực hiện lệnh.
- Chạy được trên tất các các hệ điều hành với cùng 1 file Lisp.
- Quản lý đối tượng với List - một kiểu dữ liệu với nhiều ưu điểm vượt trội trong quản lý tọa độ điểm.
- Mã nguồn mở và cộng đồng phát triển Autolisp rất rộng lớn.
Programing pick up point on Area of Draw AutoCAD(Author: Bùi Công Lộc)
- Code:
(defun c:l2d ()
(setq tenk (getstring "Nhap ten Suon ; Duong Nuoc ; Cat Doc : "))
(setq rong t)
(setq tdx (list)
tdy (list))
(while rong
(progn
(setq p1 (getpoint "\nChon mot diem:"))
(if p1
(progn
(setq tdx (append (list (rtos (car p1) 2 2)) tdx )
)
(setq tdy (append (list (rtos (cadr p1) 2 2)) tdy )
)
(setq rong t)
)
(setq rong nil)
)
)
)
(setq tdx (reverse tdx)
tdy (reverse tdy))
(princ tenk)
(princ "\n")
(princ "Toa do X")
(princ "\n")
(princ tdx)
(princ "\n")
(princ "Toa do Y")
(princ "\n")
(princ tdy)
(princ "\n")
(alert "Chuong trinh duoc viet boi - Bui Cong Loc ")
)
AutoCAD.net
Từ AutoCAD 2010, VBA không còn bao gồm trong gói cài đặt AutoCAD. Nếu bạn muốn tiếp tục sử dụng nó cho 2010 bạn sẽ cần phải lên trang chủ của AutoCAD tải về và cài đặt VBA Enabler. (Có thể) trong tương lai AutoCAD thậm chí sẽ không hỗ trợ VBA ?! ( do Microsoft ngưng cung cấp)
AutoCAD cung cấp nhiều cách khác nhau để truy xuất DataBase thông qua các API khác nhau (API viết tắt của Application Programming Interfaces : giao diện lập trình ứng dụng).
VD : AutoLISP và ARX (C++ interface)
Trong khi đó AutoCAD Visual Basic for Applications gọi tắt là VBA giao tiếp với AutoCAD thông qua giao diện ActiveX Automation.
Microsoft giới thiệu Môi trường Net (.NET Framework) cho phép bạn có thể sử dụng bất kỳ ngôn ngữ lập trình để tạo ra một ứng dụng .
Thông qua .Net, các AutoCAD .NET API cho phép bạn thao tác với giao diện Acad và các tập tin.
AutoCAD .NET API gồm các tập tin DLL khác nhau chứa một loạt các lớp(classes), cấu trúc(structures), phương thức(methods) và các sự kiện( events) cung cấp truy cập vào các đối tượng trong một file bản vẽ hoặc các ứng dụng AutoCAD.
Các DLL này bao gồm trong gói cài đặt AutoCAD, và mặc nhiên đuợc tự động cài đặt cùng với AutoCAD.
Mỗi tập tin DLL chứa các thành phần của các thư viện khác nhau.
Có hai DLL chính là :
- AcDbMgd.dll : cung cấp các thư viện (hàm) để làm việc với các đối tuợng trong bản vẽ.
- AcMgd.dll : cung cấp các thư viện (hàm) để làm việc với các ứng dụng AutoCAD.
Truớc khi sử dụng các AutoCAD .NET API, chúng ta phải tham chiếu (Add reference) các DLL này vào project
Thuận lợi của AutoCAD .NET API là bạn có thể sử dụng bất kì thư viện nào viết trên Môi trường Net.
Code tương tự tôi viết trên VB.net dựa trên công nghệ(COM) AutoCAD .net
- Code:
Public Class Class1
<CommandMethod("1")> _
Public Sub HelloWorld()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
ed.WriteMessage("\nChào mừng đến với http://tauthuy.forumvi.com")
End Sub
<CommandMethod("getPoint")> _
Public Sub Asdkcmd1()
Dim prPointOptions As PromptPointOptions = New PromptPointOptions("\nChọn điểm :")
Dim prPointRes As PromptPointResult
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
prPointRes = ed.GetPoint(prPointOptions)
If prPointRes.Status <> PromptStatus.OK Then
Return
End If
ed.WriteMessage("\nTọa độ diểm : " &; prPointRes.Value.ToString)
End Sub
<CommandMethod("getDistance")> _
Public Sub getdistance()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim prDistOptions As PromptDistanceOptions = New PromptDistanceOptions("\nSelect first point:")
Dim prDistRes As PromptDoubleResult
prDistRes = ed.GetDistance(prDistOptions)
If prDistRes.Status <> PromptStatus.OK Then
Return
End If
ed.WriteMessage("\nKhoảng cách là : " &; prDistRes.Value.ToString)
End Sub
End Class
- Ngoài ra còn việc xây dựng các menu ngữ cảnh ICON chương trình được hỗ trợ với các hàm khác nhau các bạn có thể tham khảo code tạo menu chương trinh trong AutoCAD như sau:
- Code:
***POP2
**EDIT
ID_MnEdit [&Edit]
ID_U [&Undo Ctrl+Z]_u
ID_Redo [&Redo Ctrl+Y]^C^C_mredo 1
[--]
ID_Cutclip [Cu&t Ctrl+X]^C^C_cutclip
ID_Copyclip [&Copy Ctrl+C]^C^C_copyclip
ID_Copybase [Copy with &Base Point Ctrl+Shift+C]^C^C_copybase
ID_Copylink [Copy &Link]^C^C_copylink
ID_Pasteclip [&Paste Ctrl+V]^C^C_pasteclip
ID_Pastebloc [Paste as Bloc&k Ctrl+Shift+V]^C^C_pasteblock
ID_Pastehlnk [Paste as &Hyperlink]^C^C_pasteashyperlink
ID_Pasteorig [Paste to Original Coor&dinates]^C^C_pasteorig
ID_Pastesp [Paste &Special...]^C^C_pastespec
[--]
ID_Erase [Cle&ar Del]^C^C_erase
ID_SelAll [Se&lect All Ctrl+A]^C^C_ai_selall
[--]
ID_Links [&OLE Links...]^C^C_olelinks
[--]
ID_TextFind [&Find...]^C^C_find
***POP3
**VIEW
ID_MnView [&View]
ID_Redrawall [&Redraw]'_redrawall
ID_Regen [Re&gen]^C^C_regen
ID_Regenall [Regen &All]^C^C_regenall
[--]
ID_MnZoom [->&Zoom]
ID_ZoomRealt [&Realtime]'_zoom ;
[--]
ID_ZoomPrevi [&Previous]'_zoom _p
ID_ZoomWindo [&Window]'_zoom _w
ID_ZoomDynam [&Dynamic]'_zoom _d
ID_ZoomScale [&Scale]'_zoom _s
ID_ZoomCente [&Center]'_zoom _c
ID_ZoomObjec [O&bject]'_zoom _o
[--]
ID_ZoomIn [&In]'_zoom 2x
ID_ZoomOut [&Out]'_zoom .5x
[--]
ID_ZoomAll [&All]'_zoom _all
ID_ZoomExten [<-&Extents]'_zoom _e
ID_MnPan [->&Pan]
ID_Pan [Real&time]'_pan
ID_PanPick [&Point]'_-pan
[--]
ID_PanLeft [&Left]^P'_-pan (trans (list (* -0.2 (getvar "viewsize")) 0) 0 1) ;^P
ID_PanRight [&Right]^P'_-pan (trans (list (* 0.2 (getvar "viewsize")) 0) 0 1) ;^P
ID_PanUp [&Up]^P'_-pan (trans (list 0 (* 0.2 (getvar "viewsize"))) 0 1) ;^P
ID_PanDown [<-&Down]^P'_-pan (trans (list 0 (* -0.2 (getvar "viewsize"))) 0 1) ;^P
ID_Dsviewer [Aerial Vie&w]'_dsviewer
[--]
ID_CleanScreen [$(if,$(and,$(getvar,CleanScreenState),1),!.)&Clean Screen Ctrl+0]$M=$(if,$(and,$(getvar,CleanScreenState),1),^C^C_CleanScreenOFF,^C^C_CleanScreenON)
[--]
ID_MnTiledVi [->&Viewports]
ID_Ai_tiledv [&Named Viewports...]^C^C_+vports 1
[--]
ID_VportsSav [N&ew Viewports...]^C^C_+vports 0
ID_VportsSin [&1 Viewport]^C^C$M=$(if,$(eq,$(getvar,tilemode),1),^C^C_-vports _si,^C^C_-vports)
ID_Vports2 [&2 Viewports]^C^C_-vports _2
ID_Vports3 [&3 Viewports]^C^C_-vports _3
ID_Vports4 [&4 Viewports]^C^C_-vports _4
ID_VportsRes [$(if,$(eq,$(getvar,tilemode),1),~)&Polygonal Viewport]^C^C_-vports _p
ID_VportsDel [$(if,$(eq,$(getvar,tilemode),1),~)&Object]^C^C_-vports _o
[--]
ID_VportsJoi [<-$(if,$(eq,$(getvar,tilemode),0),~)&Join]^C^C_-vports _j
ID_Ddview [&Named Views...]^C^C_view
ID_MnViewpoi [->$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),~,)&3D Views]
ID_Ddvpoint [V&iewpoint Presets...]^C^C_ddvpoint
ID_VpointTri [&Viewpoint]^C^C_vpoint ;
ID_MnPlanView [->&Plan View]
ID_PlanCurre [&Current UCS]^C^C_plan ;
ID_PlanWorld [&World UCS]^C^C_plan _w
ID_PlanUCS [<-&Named UCS]^C^C_plan _u
[--]
ID_VpointTop [&Top]^C^C_-view _top
ID_VpointBot [&Bottom]^C^C_-view _bottom
ID_VpointLef [&Left]^C^C_-view _left
ID_VpointRig [&Right]^C^C_-view _right
ID_VpointFro [&Front]^C^C_-view _front
ID_VpointBac [Bac&k ]^C^C_-view _back
[--]
ID_VpointSW [&SW Isometric]^C^C_-view _swiso
ID_VpointSE [S&E Isometric]^C^C_-view _seiso
ID_VpointNE [&NE Isometric]^C^C_-view _neiso
ID_VpointNW [<-N&W Isometric]^C^C_-view _nwiso
ID_3dorbit [$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),~,)3D Or&bit]'_3dorbit
[--]
ID_Hide [&Hide]^C^C_hide
ID_MnPersShad [->$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),~,)&Shade]
ID_2doptim [&2D Wireframe]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _2)
ID_Wireframe [&3D Wireframe]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _3)
ID_Hidden [&Hidden]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _h)
ID_Flat [&Flat Shaded]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _f)
ID_Gouraud [&Gouraud Shaded]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _g)
ID_FlatEdges [Fla&t Shaded, Edges On]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _l)
ID_GourEdges [<-Gouraud &Shaded, Edges On]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),^C^C_shademode,^C^C_shademode _o)
ID_MnRender [->$(if,$(and,$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),~,)R&ender]
ID_Render [&Render...]^C^C_render
[--]
ID_Scene [&Scene...]^C^C_scene
ID_Light [&Light...]^C^C_light
ID_Rmat [&Materials...]^C^C_rmat
ID_Matlib [Materials Librar&y...]^C^C_matlib
ID_Setuv [M&apping...]^C^C_setuv
[--]
ID_Backgroun [&Background...]^C^C_background
ID_Fog [&Fog...]^C^C_fog
ID_Lsnew [Landscape &New...]^C^C_lsnew
ID_Lsedit [Landscape &Edit...]^C^C_lsedit
ID_Lslib [Lands&cape Library...]^C^C_lslib
[--]
ID_Rpref [&Preferences...]^C^C_rpref
ID_Stats [<-S&tatistics...]^C^C_stats
Các sản phầm đơn giản nhất được viết bởi ngôn ngữ AutoLISP
- Tính toán trọng lượng thép tấm