Đến nội dung


Hình ảnh
* * - - - 3 Bình chọn

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


  • Please log in to reply
53 replies to this topic

#1 dinhvantrang

dinhvantrang

    biết lệnh copy

  • Members
  • PipPipPip
  • 117 Bài viết
Điểm đánh giá: 26 (tàm tạm)

Đã gửi 29 July 2013 - 02:15 PM

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


  • 3

Thanks and Best Regards

Skype : dinhvantrang73


#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 29 July 2013 - 06:20 PM

Vote up 


  • 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


#3 tienhoang8686

tienhoang8686

    biết vẽ circle

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

Đã gửi 30 July 2013 - 12:01 PM

mình đã từng học. nói chung là không giúp gì được nhiều... thêm dâuddầu thêm thôi


  • 0

Chúng Tôi Cung Cấp tru den chieu sang Mẫu mã Trụ đèn trang trí sân vườn giá tốt nhất thị trường, Thiết kế tru den cao ap chiếu sáng công trình


#4 dinhvantrang

dinhvantrang

    biết lệnh copy

  • Members
  • PipPipPip
  • 117 Bài viết
Điểm đánh giá: 26 (tàm tạm)

Đã gửi 30 July 2013 - 03:14 PM

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!


  • 0

Thanks and Best Regards

Skype : dinhvantrang73


#5 Anlee

Anlee

    biết zoom

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

Đã gửi 31 July 2013 - 11:15 AM

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é


  • 0

#6 tuanthuasac

tuanthuasac

    biết vẽ line

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

Đã gửi 31 July 2013 - 01:49 PM

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...ForStudent1.rar

http://www.mediafire...ForStudent2.rar


  • 1

#7 Anlee

Anlee

    biết zoom

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

Đã gửi 01 August 2013 - 02:23 PM

Thanks bạn tuanthuasac đã chia sẻ.


  • 0

#8 tinquocnguyen

tinquocnguyen

    Chưa sử dụng CAD

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

Đã gửi 01 August 2013 - 04:00 PM

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


  • 0

#9 tinquocnguyen

tinquocnguyen

    Chưa sử dụng CAD

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

Đã gửi 01 August 2013 - 04:02 PM

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.c...3/14895_hoi.rar


  • 0

#10 dvlam

dvlam

    Chưa sử dụng CAD

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

Đã gửi 01 August 2013 - 05:21 PM

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!


  • 2

#11 dinhvantrang

dinhvantrang

    biết lệnh copy

  • Members
  • PipPipPip
  • 117 Bài viết
Điểm đánh giá: 26 (tàm tạm)

Đã gửi 02 August 2013 - 07:20 AM

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.c...3/14895_hoi.rar

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

http://www.cadviet.c...75_1_vehinh.lsp


  • 0

Thanks and Best Regards

Skype : dinhvantrang73


#12 Anlee

Anlee

    biết zoom

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

Đã gửi 06 August 2013 - 09:03 AM

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.


  • 1

#13 dvlam

dvlam

    Chưa sử dụng CAD

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

Đã gửi 08 August 2013 - 08:55 PM

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.c...121840_test.rar

Test.dwg: http://www.cadviet.c...121840_test.dwg

 

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


  • 2

#14 HungDHXD

HungDHXD

    biết vẽ ellipse

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

Đã gửi 19 August 2013 - 04:01 PM

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 


  • 0

#15 dinhvantrang

dinhvantrang

    biết lệnh copy

  • Members
  • PipPipPip
  • 117 Bài viết
Điểm đánh giá: 26 (tàm tạm)

Đã gửi 19 August 2013 - 04:25 PM

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.


  • 0

Thanks and Best Regards

Skype : dinhvantrang73


#16 HungDHXD

HungDHXD

    biết vẽ ellipse

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

Đã gửi 19 August 2013 - 05:21 PM

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" "")
)

  • 0

#17 dinhvantrang

dinhvantrang

    biết lệnh copy

  • Members
  • PipPipPip
  • 117 Bài viết
Điểm đánh giá: 26 (tàm tạm)

Đã gửi 27 August 2013 - 03:59 PM

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!


  • 0

Thanks and Best Regards

Skype : dinhvantrang73


#18 Anlee

Anlee

    biết zoom

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

Đã gửi 27 August 2013 - 04:12 PM

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.


  • 0

#19 HungDHXD

HungDHXD

    biết vẽ ellipse

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

Đã gửi 04 September 2013 - 08:19 AM

 


 

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


  • 0

#20 HungDHXD

HungDHXD

    biết vẽ ellipse

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

Đã gửi 04 September 2013 - 08:26 AM

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 !


  • -1