Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
sir_nguyenhd

(Nhờ giúp đỡ)- Chèn block bằng VBA

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

Dear các bác

Em đang tìm hiểu về VBA on Autocad. Ví dụ đầu tiên của em là chèn một block từ một thư mục định sẵn vào bản vẽ cad hiện hành.

Code em viết như sau:

 

 

Private Sub cmd_chenblock_Click()

 

Dim block As AcadBlockReference

Dim diemchen(0 To 2) As Double

Dim duongdan As String

diemchen(0) = 0

diemchen(1) = 0

diemchen(2) = 0

 

'Thiet lap duong dan cua wblock

duongdan = "c:\blockvidu.dwg"

 

Set block = ThisDrawing.ModelSpace.InsertBlock(diemchen, duongdan, 1#, 1#, 1#, 0#)

 

 

End Sub

 

Private Sub cmd_thoat_Click()

Unload Me

 

End Sub

 

Với code trên, nó sẽ chèn block theo đúng tọa độ xy(0,0).

Tuy nhiên, em không biết chèn block theo tọa độ bằng cách pick chuột vào một điểm bất kỳ trên màn hình như thế nào

(Em đã đọc về lệnh GetPoint- nhưng không hiểu cách dùng)

Mong các bác giúp đỡ em, để em có thể tiếp tục các bước khác trong quá trình tìm hiểu VBA

 

Cảm ơn các bác nhiều lắm lắm.

 

P/S: Sau khi ấn nút chèn block, em phải tạo thêm nút Thoát (unload me) vì khi Form vẫn cứ hiện lên thì không thể tác động lên màn hình cad được. Các bác giúp em cả vấn đề này nữa nhé.

Nếu bác nào có chương trình mẫu, ví dụ mẫu, có thể upload lên để em tham khảo được không?

 

Thank you so much!

S.Nguyen

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 thêm đoạn sau vào Sub:

Dim block As AcadBlockReference
Dim insertionPnt As Variant
insertionPnt = ThisDrawing.Utility.GetPoint(, "Chon vi tri can chen: ")
Dim duongdan As String
'Thiet lap duong dan cua wblock
duongdan = "C:\Block.dwg"
Set block = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, duongdan, 1, 1, 1, 0)

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 thêm đoạn sau vào Sub:

Dim block As AcadBlockReference
Dim insertionPnt As Variant
insertionPnt = ThisDrawing.Utility.GetPoint(, "Chon vi tri can chen: ")
Dim duongdan As String
'Thiet lap duong dan cua wblock
duongdan = "C:\Block.dwg"
Set block = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, duongdan, 1, 1, 1, 0)

 

Thanks Mr. Nguyen Ngoc Son

Em đã update cách của bác và chương trình đã chạy rồi.

Tuy nhiên, chi tiết hơn một tí nữa.

Giả sử chương trình cùng với file cad được đặt chung một thư mục.

Em muốn sử dụng lệnh: App. Path &"\block.dwg"

Code sẽ là:

duongdan=App.Path &"\block.dwg"

Tuy nhiên khi load, chương trình báo lỗi ở chính dòng lệnh này.

Các bác giúp em xem câu lệnh này bị sai ở chỗ nào nhé

Chân thành cảm ơ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

Em muốn sử dụng lệnh: App. Path &"\block.dwg"

Code sẽ là:

duongdan=App.Path &"\block.dwg"

Tuy nhiên khi load, chương trình báo lỗi ở chính dòng lệnh này.

Các bác giúp em xem câu lệnh này bị sai ở chỗ nào nhé

Bạn sửa lại như sau xem thử:

duongdan=ThisDrawing.Path & "\block" & ".dwg"

Không được bạn cứ pm tại đây. Vì hiện tại mình ko có Cad để check

Thâ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

Bạn sửa lại như sau xem thử:

duongdan=ThisDrawing.Path & "\block" & ".dwg"

Không được bạn cứ pm tại đây. Vì hiện tại mình ko có Cad để check

Thân !

 

Thank Mr. Nguyen Ngoc Son

Mình đã thử cách của bạn, tuy nhiên code vẫn báo lỗi.

Cho mình hỏi bạn một chút nữa nhé: Giả sử chương trình của mình viết hoàn thành. Vậy có thể đóng gói thành exe để cài đặt cho các máy khác không

Nếu không thể thì có lẽ mình phải chuyển hướng, mình định viết bằng VB6, chạy độc lập so với Cad. Khi đó, muốn chèn block, chỉ cần chạy file exe của VB để hiện hộp thoại. Sau đó click combobox, chọn block muốn chèn.

Bạn tư vấn cho mình nhé

Thank bạn nhiều

P/S: Bạn có Skype name không vậy. Nếu không phiền thì cho mình skype name nhé, hoặc add skype name của mình: evpcnguyen

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

Theo mình lỗi phát sinh do bạn không thể Insert chính bản vẽ bạn đang vẽ vào (chính nó) được?

Nếu vậy bạn phải có đoạn Code chèn block có tên khác nhau từ thư viện vào bản vẽ đang thực thi?

File VBA(.dvb) là code mã nhúng nghĩa là nó chỉ chạy được trên nền Cad thôi!

Ý bạn viết bằng VB6 rất hay có thể chạy độc lập => Khả thi

Nếu có Code VBA chuyển VB6 => Đơn giản

PM: nguyenngocson_uct

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

Theo mình lỗi phát sinh do bạn không thể Insert chính bản vẽ bạn đang vẽ vào (chính nó) được?

Nếu vậy bạn phải có đoạn Code chèn block có tên khác nhau từ thư viện vào bản vẽ đang thực thi?

File VBA(.dvb) là code mã nhúng nghĩa là nó chỉ chạy được trên nền Cad thôi!

Ý bạn viết bằng VB6 rất hay có thể chạy độc lập => Khả thi

Nếu có Code VBA chuyển VB6 => Đơn giản

PM: nguyenngocson_uct

 

Theo mình lỗi phát sinh do bạn không thể Insert chính bản vẽ bạn đang vẽ vào (chính nó) được?

Nếu vậy bạn phải có đoạn Code chèn block có tên khác nhau từ thư viện vào bản vẽ đang thực thi?

File VBA(.dvb) là code mã nhúng nghĩa là nó chỉ chạy được trên nền Cad thôi!

Ý bạn viết bằng VB6 rất hay có thể chạy độc lập => Khả thi

Nếu có Code VBA chuyển VB6 => Đơn giản

PM: nguyenngocson_uct

 

Dear Mr. Son

Thanks for your reply

Mình hiểu ý bạn khi chuyển code từ vba sang vb6

Hình như thay ThisDrawing=AcadApp.ActiveDocument (Dim AcadApp as Object)

Mình đã thử trên VB6, thấy cũng chạy tốt bạn ạ

Tuy nhiên, do không được học một chút nào về VB, chỉ là tự tìm hiểu, khai thác trên Internet nên code viết hơi lung tung, hơi thừa thì phải (mặc dù vẫn chạy theo đúng ý)

Bạn có rành nhiều về VB6 vs Autocad không vậy? Mình có thể trao đổi. Vì trên diễn đàn ít thấy có nhiều bài về vấn đề này.

PS:

+ Nickname trên của bạn là cho Yahoo hay Skype vậ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

Dear Mr. Son

Mình hiểu ý bạn khi chuyển code từ vba sang vb6

Hình như thay ThisDrawing=AcadApp.ActiveDocument (Dim AcadApp as Object)

Đơn giản như sau:

Khai báo

Public moACAD As Object

Public moDWG As Object

Set moDWG = moACAD.ActiveDocument

Sau đó: Trong VBA có ThisDrawing thay bằng moDWG

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 có viết một chương trình để Link data base từ Excel và chạy trên CAD.

Nếu bạn muốn tham khảo thì có thể load về chạy thử :D

Nhớ kiểm tra Thư viện (Tools ---> references --> check vào thư viện CAD hiện tại đang dùng).

Có gì cứ mail cho mình : qdzung@gmail.com

 

 

http://www.cadviet.com/upfiles/3/31227_hkprogram_1.zip

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

Đăng nhập để thực hiện theo  

×