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

VBA cho AutoCad-Hãy cùng tham gia trao đổi

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

Diễn đàn CadViet hình như đó là sân chơi của Lisp thì phải, có lẽ đúng thật! -_- .Anh em vô đây đa số là yêu cầu Lisp chứ VBA thì rất ít.Vì vậy mình mạo muội thành lập cái chủ đề này mong rằng sẽ khuấy đảo được những anh em có lòng đam mê với VBA và đặc biệt là VBA cho Autocad.

Những anh em nào mới học VBA hoặc đã có kiến thức về nó hãy mạnh dạn trao đổi để anh em cùng học hỏi nhé!

Chúc Topic VBA cho Cad ngày càng phát triển.

Chúc mọi người luôn vui vẻ!

  • Like 1
  • Vote tăng 4

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

Nếu anh em có thắc mắc thì hãy mạnh dạn Post lên cũng như mạnh dạn đưa những yêu cầu của anh em lên nhé để mọi người cùng thảo luận

Hy vọng Topic VBA sẽ cùng tranh đua với Topic Lisp.

Chúc CadViet ngày càng phát triể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

Trước tiên cám ơn mọi người đã tham gia. Mình có 1 vấn đề như thế này:

 Khi plot bằng vba trong cad getpoint và Plot. nhưng khi plot có những bản vẽ thì nó hiện đúng cái window mà mình bắt 2 điểm

 có những bản vẽ thì nó bị lệch ra khỏi chỗ khác. Mình cũng ko biết tại sao?

 ThisDrawing.ActiveLayout.SetWindowToPlot Pt1, Pt2

 ThisDrawing.ActiveLayout.GetWindowToPlot Pt1, Pt2

  hix. nhưng cũng bản vẽ lỗi đấy copy sang NewDrawing thì lại ok

~ Ah : Bạn nào có ý tưởng gì về VBA cho cad va excel thi post lên a e cùng trao đổi nhé

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình thì không rành về VBA cho Cad hay Excel lắm. Tuy nhiên, có học qua môn Tự động hóa thiết kế (tin học xây dựng) cũng chỉ là cưỡi ngựa xem hoa thôi. Gửi cho diễn đàn một ít tài liệu vậy. Dung lượng hơi lớn (bao gồm giáo trình, ví dụ và Video hướng dẫn), link http://www.mediafire.com/download/pe0zj09bj2mzgoh/ForStudent1.rar

http://www.mediafire.com/download/7lfloh75roq0k4c/ForStudent2.rar

  • 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

Cho em được hỏi một vấn đề quen thuộc: dùng VBA trao đổi dữ liệu dạng bảng biểu giữa AutoCAD và Excel

 

1. Xuất dữ liệu bảng số liệu từ ACAD sang Excel (điều này quen thuộc - trên diễn đàn đã nhiều lần đề cập đến!!!).

2. Phun bảng số liệu từ Excel vào ACAD có định dạng cụ thể: chiều rộng; chiều dài của từng cell, chiều cao chữ... (*)

 

Áp dụng cho bảng biểu kích thước bất kỳ, sau khi chuyển từ ACAD sang Excel sẽ tự động lưu lại những thông tin (*), khi xuất ngược lại sẽ áp dụng. Nếu phun lần đầu thì mình tự định nghĩa các tham số định dạng này trên file Excel trước khi phun vào ACAD.

 

Chân thành cám ơn và mong chờ hồi âm!

  • 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

các anh cho em hỏi. vì em mới học vab trong cad

có nhiều Module trong 1 file thì  trong lisp thì làm sao thực hiện lệnh gọi các module đó vậy

em có kèm theo file đính kèm.

Mong các anh em hướng dẫn cho. Cảm ơn

http://www.cadviet.com/upfiles/3/14895_hoi.rar

của bạn đây nhé!

http://www.cadviet.com/upfiles/3/37575_1_vehinh.lsp

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 em được hỏi một vấn đề quen thuộc: dùng VBA trao đổi dữ liệu dạng bảng biểu giữa AutoCAD và Excel

 

1. Xuất dữ liệu bảng số liệu từ ACAD sang Excel (điều này quen thuộc - trên diễn đàn đã nhiều lần đề cập đến!!!).

2. Phun bảng số liệu từ Excel vào ACAD có định dạng cụ thể: chiều rộng; chiều dài của từng cell, chiều cao chữ... (*)

 

Áp dụng cho bảng biểu kích thước bất kỳ, sau khi chuyển từ ACAD sang Excel sẽ tự động lưu lại những thông tin (*), khi xuất ngược lại sẽ áp dụng. Nếu phun lần đầu thì mình tự định nghĩa các tham số định dạng này trên file Excel trước khi phun vào ACAD.

 

Chân thành cám ơn và mong chờ hồi âm!

Bạn đưa vd cụ thể lên đi.

  • 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

Trước tiên mình nói về vấn đề phun Table từ Excel vào Acad:

Mình có sẵn một file Excel: Test (đính kèm), trong đó có mô tả:

 

1- Phần tạo Layer, ở phần màu xanh mình sẽ nhập vào định nghĩa Layer.

2- Phần tiếp theo mình sẽ định Layer cho các đối tượng: fram; line và text, định chiều cao text vào các ô màu xanh.

3- Nhập vào chiều cao từng dòng và chiều rộng từng cột vào các ô màu xanh tưng ứng.

4- Xuất qua Acad --> chuyển vào môi trường Acad và pick chọn một điểm gốc (mặc định là gốc tọa độ nếu nil)

 

Kết quả trả ra giống như file Acad: Test (đính kèm)

 

File đính kèm bài viết:

Test.xls:   http://www.cadviet.com/upfiles/3/121840_test.rar

Test.dwg: http://www.cadviet.com/upfiles/3/121840_test.dwg

 

Trân trọng cám ơn sự quan tâm của anh em!

  • 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

Mình thấy trong Lisp có hàm ssget ( chọn đối tượng ) --> trong vba không có --> mình thử xây dựng 1 hàm gần giống như kiểu ssget  như sau :

Sub ssget()
    Dim ssetObj As AcadSelectionSet
    Dim entity As AcadEntity
        Set ssetObj = ThisDrawing.PickfirstSelectionSet
        If ssetObj.Count Then
            ...........................
        Else
            Set ssetObj = ThisDrawing.SelectionSets.Add("#")
            If Err <> 0 Then
               Set ssetObj = ThisDrawing.SelectionSets("#"): ssetObj.Clear
            End If
        ssetObj.SelectOnScreen
        ...............................
End Sub

Nếu mà code trên chạy trong môi trường vba thì không vấn đề gì : * thuộc tính pickfirstSelectionset hoạt động bình thường

nhưng nếu ta thử gọi macro trên bằng lisp thì thuộc tính pickfristSelectionset không thể hoạt động : hàm báo lỗi nil 

(defun C:6()
      (command "-vbarun" "ssget")
)

---> Mình vẫn chưa tìm ra được nguyên nhân và cách khắc phục, mong các bạn yêu thích vba trong autocad chia sẻ ,trao đổi thêm về vấn để trên !

thanks! <----------- cảm ơn mọi người đã dành thời gian đọc bài viết 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

Mình thấy trong Lisp có hàm ssget ( chọn đối tượng ) --> trong vba không có --> mình thử xây dựng 1 hàm gần giống như kiểu ssget  như sau :

Sub ssget()
    Dim ssetObj As AcadSelectionSet
    Dim entity As AcadEntity
        Set ssetObj = ThisDrawing.PickfirstSelectionSet
        If ssetObj.Count Then
            ...........................
        Else
            Set ssetObj = ThisDrawing.SelectionSets.Add("#")
            If Err <> 0 Then
               Set ssetObj = ThisDrawing.SelectionSets("#"): ssetObj.Clear
            End If
        ssetObj.SelectOnScreen
        ...............................
End Sub

Nếu mà code trên chạy trong môi trường vba thì không vấn đề gì : * thuộc tính pickfirstSelectionset hoạt động bình thường

nhưng nếu ta thử gọi macro trên bằng lisp thì thuộc tính pickfristSelectionset không thể hoạt động : hàm báo lỗi nil 

(defun C:6()
      (command "-vbarun" "ssget")
)

---> Mình vẫn chưa tìm ra được nguyên nhân và cách khắc phục, mong các bạn yêu thích vba trong autocad chia sẻ ,trao đổi thêm về vấn để trên !

thanks! <----------- cảm ơn mọi người đã dành thời gian đọc bài viết của mình 

bạn đưa nguyên code lên coi nhé để mình xem thử,chứ Code viết như trên không hiểu đc lắm.Thực ra trong VBA đối tượng SelectionSet làm việc rất hiệu quả đó chứ.Các bộ lọc của nó cũng tương đương với bên Lisp.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

bạn đưa nguyên code lên coi nhé để mình xem thử,chứ Code viết như trên không hiểu đc lắm.Thực ra trong VBA đối tượng SelectionSet làm việc rất hiệu quả đó chứ.Các bộ lọc của nó cũng tương đương với bên Lisp.

Cảm ơn bạn đã quan tâm đến vấn đề của mình : mình ví dụ luôn như sau :

Sub Example_PickfirstSelectionSet()
    ' This example lists all the objects in the pickfirst selection set.
    ' Before running this example, create some objects in the active
    ' drawing and select those objects. The objects currently selected
    ' in the active drawing will be returned in the pickfirst selection set.
            
    Dim pfSS As AcadSelectionSet
    Dim ssobject As AcadEntity
    Dim msg As String
    msg = vbCrLf
    
    Set pfSS = ThisDrawing.PickfirstSelectionSet
    For Each ssobject In pfSS
        msg = msg & vbCrLf & ssobject.ObjectName
    Next ssobject
    MsgBox "The Pickfirst selection set contains: " & msg
    
End Sub

*  Ý mình là hàm Ssget trong lisp --> cho phép chọn trước 1 đối tượng , còn trong vbarun có lẽ không làm được điều này !

 

==> Bạn thử làm theo các bước sau :

* Chọn trước mấy đối tượng trong bản vẽ :

* Trong trình soạn thảo vba : ấn F5 run code trên :====> code sẽ liệt kê hết tên các đối tượng được chọn trước trên bản vẽ

* Nhưng nếu trên autocad : bạn gõ lệnh : vbarun --> run code ở trên ==> code trên hoàn toàn không hoạt động

** Mình cũng không hiểu tại sao ???

==> Không có lẽ trong VBA ta không có cách nào lựa chọn các đối tượng trước khi thực hiện lệnh ???

ví dụ : như lệnh copy trong autocad : ta có thể chọn trước đối tượng rồi gõ lệnh copy

* Nhưng trong vba : kiểu gì ta cũng phải chọn lại đối tượng sau khi gõ lệnh ???? 

mình thử viết 1 đoạn code để thay đổi màu các đối tương như sau :

Sub ssget()
    Dim ssetObj As AcadSelectionSet
    Dim entity As AcadEntity
    On Error Resume Next
        Set ssetObj = ThisDrawing.PickfirstSelectionSet
        If ssetObj.Count Then
            For Each entity In ssetObj
                entity.color = 8
            Next
        Else
            Set ssetObj = ThisDrawing.SelectionSets.Add("#")
            If Err <> 0 Then
               Set ssetObj = ThisDrawing.SelectionSets("#"): ssetObj.Clear
            End If
            ssetObj.SelectOnScreen
            For Each entity In ssetObj
                entity.color = 8
            Next
        End If
End Sub

==> Nó hoàn toàn không " mạnh " bằng hàm ssget trong lisp  như sau :

(defun c:test ()
(setq ss (ssget))
(command "chprop" ss "" "c" "8" "")
)

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 đã kiểm nghiệm như bạn nói.Đúng là với VBA chúng ta phải chọn đối tượng sau khi gõ lệnh.

Nhìn bạn minh họa với Autolisp và VBA, có vẻ VBA dài dòng quá nhỉ trong khi đó Lisp chỉ vài dòng là ok ngay.

Haizzzzaaa!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Cảm ơn bạn đã quan tâm đến vấn đề của mình : mình ví dụ luôn như sau :

Sub Example_PickfirstSelectionSet()
    ' This example lists all the objects in the pickfirst selection set.
    ' Before running this example, create some objects in the active
    ' drawing and select those objects. The objects currently selected
    ' in the active drawing will be returned in the pickfirst selection set.
            
    Dim pfSS As AcadSelectionSet
    Dim ssobject As AcadEntity
    Dim msg As String
    msg = vbCrLf
    
    Set pfSS = ThisDrawing.PickfirstSelectionSet
    For Each ssobject In pfSS
        msg = msg & vbCrLf & ssobject.ObjectName
    Next ssobject
    MsgBox "The Pickfirst selection set contains: " & msg
    
End Sub

*  Ý mình là hàm Ssget trong lisp --> cho phép chọn trước 1 đối tượng , còn trong vbarun có lẽ không làm được điều này !

 

==> Bạn thử làm theo các bước sau :

* Chọn trước mấy đối tượng trong bản vẽ :

* Trong trình soạn thảo vba : ấn F5 run code trên :====> code sẽ liệt kê hết tên các đối tượng được chọn trước trên bản vẽ

* Nhưng nếu trên autocad : bạn gõ lệnh : vbarun --> run code ở trên ==> code trên hoàn toàn không hoạt động

** Mình cũng không hiểu tại sao ???

==> Không có lẽ trong VBA ta không có cách nào lựa chọn các đối tượng trước khi thực hiện lệnh ???

ví dụ : như lệnh copy trong autocad : ta có thể chọn trước đối tượng rồi gõ lệnh copy

* Nhưng trong vba : kiểu gì ta cũng phải chọn lại đối tượng sau khi gõ lệnh ???? 

mình thử viết 1 đoạn code để thay đổi màu các đối tương như sau :

Sub ssget()
    Dim ssetObj As AcadSelectionSet
    Dim entity As AcadEntity
    On Error Resume Next
        Set ssetObj = ThisDrawing.PickfirstSelectionSet
        If ssetObj.Count Then
            For Each entity In ssetObj
                entity.color = 8
            Next
        Else
            Set ssetObj = ThisDrawing.SelectionSets.Add("#")
            If Err <> 0 Then
               Set ssetObj = ThisDrawing.SelectionSets("#"): ssetObj.Clear
            End If
            ssetObj.SelectOnScreen
            For Each entity In ssetObj
                entity.color = 8
            Next
        End If
End Sub

==> Nó hoàn toàn không " mạnh " bằng hàm ssget trong lisp  như sau :

(defun c:test ()
(setq ss (ssget))
(command "chprop" ss "" "c" "8" "")
)

Đoạn code bt ko có vấn đề gi cả nhưng cách thao tác của bạn chưa đúng vì:

-khi bạn chọn đối tượng xong, xong rồi bạn go lệnh vbarun thì nó thoat đối tượng ra rồi

-ban thử chọn đối tượng xong vào alt + F11 rồi ấn nút hình tam giác ý code chạy bình thường

Còn để so sánh vba với Lisp thì nó là cả 1 vấn đề nan giải. ai quen cái gì thì dùng cái đấy thôi.

Riêng mình thì mình thích vba hơn vì nó ứng dụng cả trong excel nữa.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

 

 

Đoạn code bt ko có vấn đề gi cả nhưng cách thao tác của bạn chưa đúng vì:

-khi bạn chọn đối tượng xong, xong rồi bạn go lệnh vbarun thì nó thoat đối tượng ra rồi

-ban thử chọn đối tượng xong vào alt + F11 rồi ấn nút hình tam giác ý code chạy bình thường

Còn để so sánh vba với Lisp thì nó là cả 1 vấn đề nan giải. ai quen cái gì thì dùng cái đấy thôi.

Riêng mình thì mình thích vba hơn vì nó ứng dụng cả trong excel nữa.

có lẽ bạn chưa hiểu ý mình lắm, mình đang nói đến thuộc tính pickfirstslectionset --> không có "ý nghĩa" trong cửa sổ vbarun, vì khi ta gõ vbarun thì các đối tượng được chọn trước sẽ được giải phóng hết!<--- mọi người đang thảo luận về giải pháp khắc phục -

 

Để khắc phục ta có thể dùng kết hợp visual Lisp --> như vậy cú pháp của nó sẽ có kiểu như vậy :

(vl-load-com)(vla-runmacro (vlax-get-acad-object) "your macro")

--> với kiểu như trên thì bạn có thể hoàn toàn chọn đối tượng trước --> rồi thực hiện lệnh

 

ps: Lisp là ngôn ngữ thông dịch,( nó kết hợp với một số hàm có sẵn trong cad,) còn VBA là ngôn ngữ lập trình hướng đối tượng <---- 

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 mình hỏi 1 vấn đề nữa để anh em thảo luận ,nâng cao kiến thức:

Trong quá trình lập trình vba trong auotcad : 

* có bạn nào đã dùng  acadDictionary chưa --> nó có khác gì scripting.dictionary  không ?

*ưu điểm của 2 cái trên như thế nào !

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chủ đề này cũng từng có rồi. Các bạn cứ phát triển nhé!

bạn có thể gửi link của các chủ đề "đã từng có " này không ? để mọi người cùng tham khảo!

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

Gửi mọi người chương 6 - "Một Số Hàm Nhập Dữ Liệu "do mình tham khảo từ các sách khác nhau viết ra.Mong mọi người góp ý.

Thanks and Best Regardshttp://www.cadviet.com/upfiles/3/37575_chng_6_các_hàm_nhp_liu.pdf

Tài liệu rất có ích --> thanks bạn vì điều này !!!

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

Gửi mọi người chủ đề "Làm Việc với đối tượng SelectionSet" trong VBA, hy vọng nó sẽ hữu ích cho anh em.

http://www.cadviet.com/upfiles/3/37575_chng_8_i_tng_selectionset.pdf

  • 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

 

 

Gửi mọi người chủ đề "Làm Việc với đối tượng SelectionSet" trong VBA, hy vọng nó sẽ hữu ích cho anh em.

http://www.cadviet.com/upfiles/3/37575_chng_8_i_tng_selectionset.pdf

Trong file bạn có ghi 1 đoạn code thêm mói 1 đối tượng selectionsets:---> theo mình viết như thế này gọn hơn:

 


Sub Ex_Addselectionset()
    Dim ssetObj As AcadSelectionSet
    On Error Resume Next
    With ThisDrawing.SelectionSets
        .Item("Kira").Delete
        Set ssetObj = .Add("Kira")
    End With
End Sub
Chỉnh sửa theo HungDHXD
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trong file bạn có ghi 1 đoạn code thêm mói 1 đối tượng selectionsets:---> theo mình viết như thế này gọn hơn:

Cảm ơn sự góp ý của bạn.Việc tạo mới đối tượng SelectionSet đúng là có rất nhiều cách thức để tạo.Cách của bạn đúng là ngắn gọn và súc tích.

Mình sẽ bổ sung vào trong giáo trình của mình.

Chúc bạn vui vẻ!

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

Tiện đây em xin hỏi ở đây có bác nào quan tâm đến thuật toán tạo lưới tam giác delaunay không ạ, bác nào đã từng làm rồi chỉ dạy cho em đôi điều với.

Giả dụ mình có 1 file txt chứa tọa độ điểm, sau khi đã phun lên được màn hình cad để thành các điểm, vậy làm thế nào để tạo được lưới tam giác delaunay từ những điểm này 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

mình mời học VBA nên chưa rành lắm. cho mình hỏi tí.

làm sao để lấy dữ liệu từ textbox ra để xử lí. mình đã làm thử 1 chương trình nhưng ko thể nhập đc dữ liệu khi chạy chương trình. ai biết chỉ giúp với nhé.

mình đã thử VBA trong exel và ko bị gì. nhập dữ liệu vào textbox bt nhưng VBA trong CAD thì ko đ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

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

×