Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
10 replies to this topic

#1 sir_nguyenhd

sir_nguyenhd

    biết zoom

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

Đã gửi 17 July 2012 - 05:04 PM

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
  • 0

#2 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 17 July 2012 - 09:15 PM

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)

  • 0

#3 sir_nguyenhd

sir_nguyenhd

    biết zoom

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

Đã gửi 18 July 2012 - 08:25 AM

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

#4 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 18 July 2012 - 07:37 PM

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

#5 sir_nguyenhd

sir_nguyenhd

    biết zoom

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

Đã gửi 18 July 2012 - 07:54 PM

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
  • 0

#6 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 18 July 2012 - 08:42 PM

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
  • 0

#7 sir_nguyenhd

sir_nguyenhd

    biết zoom

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

Đã gửi 18 July 2012 - 09:11 PM

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
  • 0

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 18 July 2012 - 09:17 PM

Bạn đọc bài về late binding của bác anhcos trên diễn đàn nhé
  • 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


#9 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 18 July 2012 - 09:22 PM

Nick mình Yahoo: nguyenngocson_uct
  • 0

#10 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 18 July 2012 - 09:27 PM

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
  • 0

#11 qdzung

qdzung

    biết zoom

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

Đã gửi 15 August 2012 - 07:12 PM

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.c...hkprogram_1.zip
  • 0