Đến nội dung


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

AutoCAD với Excel


  • Please log in to reply
199 replies to this topic

#161 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 04 April 2010 - 11:44 PM

Tôi không mở được file excel, lỗi khi giải nén.
Xem qua file dwg thấy việc tạo các đối tượng của bạn không có mối liên hệ gì với nhau giữa đoạn ống và ký hiệu hai đầu, tuy nhiên để điền được các số liệu dọc 2 bên tuyến ống ta có thể căn cứ vào vị trí của 2 thông số đầu mút, chỉ đẹp khi tuyến ống là không bị cong.
Vì chưa mở được file Excel nên chưa biết dữ liệu của bạn được tổ chức nthees nào do đó cũng chưa đưa ra được giải pháp cụ thể.


Cảm ơn anh/chị! Đây là link file excel.
Nhờ anh/chị xem giúp!
  • 0
http://khuyen.space

#162 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 06 April 2010 - 10:48 AM

Chào các anh chị!
Hôm nay em muốn nhờ các anh chị giúp em về liên kết giữa Autocad với Excel với mục đích như sau:
Em có 1 file Autocad vẽ sẵn các đường ống (được đánh số nút tại 2 đầu)
http://www.4shared.c...0f46/cad_3.html
Và 1 file Excel mà phần số liệu cần quan tâm được tô màu:
http://www.cadviet.c...les/2/excel.rar
Em muốn các số liệu ở excel được viết vào cad (một cách nhanh nhất) sao cho mỗi đoạn ống được viết 6 số liệu: chiều dài, lưu lượng, đường kính, vận tốc, độ dốc, tổn thất.
3 số liệu ở phía trên ống, gồm: chiều dài, lưu lượng, đường kính.
3 số liệu ở phía dưới ống, gồm: vận tốc, độ dốc, tổn thất.
Nếu ống nằm thẳng đứng thì (chiều dài, lưu lượng, đường kính) nằm bên trái ống, (vận tốc, độ dốc, tổn thất) nằm bên phải ống.

Em xin chân thành cảm ơn!


Bạn dùng thử xem có được không.
http://www.mediafire.../ThongSoOng.rar
  • 1
Clear sky!

MF Rock collection.

#163 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 07 April 2010 - 10:12 AM

Bạn dùng thử xem có được không.
http://www.mediafire.../ThongSoOng.rar


Cảm ơn anh anhcos rất nhiều!
Em đã sử dụng với Phương án I - đúng như em mong muốn. Nhưng khi sang Phương án II thì lại không sử dụng được.
Sau khi chọn xong thông số ở bảng Excel, phần mềm chuyển sang cad và yêu cầu người sử dụng chọn tuyến ống, nhưng em chọn mãi mà phần mềm vẫn báo: Chưa có.
(Em đã sửa lại các polyline cho cắt qua các text)
Nhờ anh xem giùm! Em cảm ơn!

File mô tả
http://www.cadviet.c...iles/2/mltn.zip
  • 0
http://khuyen.space

#164 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 07 April 2010 - 01:59 PM

Nhưng khi sang Phương án II thì lại không sử dụng được.

Em cứ quét khối chọn khu vực chứa STT cùng các dữ liệu tuyến ống trong sheet LL-PA2, rồi chạy chương trình lại là dc.
  • 1
Clear sky!

MF Rock collection.

#165 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 06:11 PM

Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.
Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào
Sub InsertText()
Dim Ex As Excel.Application
Set Ex = GetObject(, "Excel.Application")
Dim I As Long
Dim StaPoint(0 To 2) As Double
Dim EndPoint(0 To 2) As Double
Dim MidPoint As Variant
Dim AlgPoint As Variant
Dim Ang As Double
Dim Dis As Double
Dim SS As AcadSelectionSet
For Each SS In ThisDrawing.SelectionSets
If SS.Name = "New_Selection" Then SS.Delete: Exit For
Next
Set SS = ThisDrawing.SelectionSets.Add("New_Selection")
Dim Code(1) As Integer
Dim Value(1) As Variant
Dim StrValue1$, StrValue2$
Dim Txt As AcadText
Dim TxtIns As AcadText
Code(0) = 0: Code(1) = 1: Value(0) = "TEXT"
I = 11
With Ex
While .Cells(I, 18).Value <> ""
StrValue1 = Split(.Cells(I, 18).Value, "-")(0)
StrValue2 = Split(.Cells(I, 18).Value, "-")(1)
Value(1) = StrValue1
SS.Select acSelectionSetAll, , , Code, Value
If SS.Count = 0 Then GoTo BoQua
Set Txt = SS.Item(0)
StaPoint(0) = Txt.insertionPoint(0)
StaPoint(1) = Txt.insertionPoint(1)
StaPoint(2) = Txt.insertionPoint(2)
SS.Clear
Value(1) = StrValue2
SS.Select acSelectionSetAll, , , Code, Value
If SS.Count = 0 Then GoTo BoQua
Set Txt = SS.Item(0)
EndPoint(0) = Txt.insertionPoint(0)
EndPoint(1) = Txt.insertionPoint(1)
EndPoint(2) = Txt.insertionPoint(2)
SS.Clear
Ang = ThisDrawing.Utility.AngleFromXAxis(StaPoint, EndPoint)
Dis = Math.Sqr((StaPoint(0) - EndPoint(0)) ^ 2 + (StaPoint(1) - EndPoint(1)) ^ 2) / 2
MidPoint = ThisDrawing.Utility.PolarPoint(StaPoint, Ang, Dis)
MidPoint = ThisDrawing.Utility.PolarPoint(MidPoint, Ang + 1.57079633, 10)
AlgPoint = MidPoint
Set TxtIns = ThisDrawing.ModelSpace.AddText(.Cells(I, 19).Value & "-" & .Cells(I, 20).Text & "-" & .Cells(I, 21).Value, MidPoint, 20)
TxtIns.Rotation = Ang
TxtIns.Alignment = acAlignmentCenter
TxtIns.TextAlignmentPoint = AlgPoint

MidPoint = ThisDrawing.Utility.PolarPoint(MidPoint, Ang - 1.57079633, 52)
AlgPoint = MidPoint
Set TxtIns = ThisDrawing.ModelSpace.AddText(.Cells(I, 22).Value & "-" & .Cells(I, 23).Text & "-" & .Cells(I, 24).Value, MidPoint, 20)
TxtIns.Rotation = Ang
TxtIns.Alignment = acAlignmentCenter
TxtIns.TextAlignmentPoint = AlgPoint
BoQua:
I = I + 1
Wend
End With
End Sub
Tiếp theo:
- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)
- Mở file Excel chứa dữ liệu để VBA đọc.
- Trong cửa sổ của VBA nhấn F5 để chạy.
Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.
  • 1

#166 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 07 April 2010 - 08:44 PM

Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.
Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào
Tiếp theo:
- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)
- Mở file Excel chứa dữ liệu để VBA đọc.
- Trong cửa sổ của VBA nhấn F5 để chạy.
Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.


Xin cảm ơn anh/chị đã giúp em!
Em không thực hiện được với lý do như sau:

Hình đã gửi
  • 0
http://khuyen.space

#167 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 April 2010 - 09:24 PM

Chào em svba
Code sau Tue_NV viết dưới sự trợ giúp của Elpanov Evgeny và sự chia sẻ của anh gia bach. Xin chân thành cảm ơn Elpanov Evgeny và cảm ơn anh gia bach đã chia sẻ
-> Khi chạy Lisp yêu cầu :
1. Các Pline đơn (độ rộng width=0) phải cắt qua nút ống
2. Tạo 1 Sheet tương ứng chứa các dữ liệu của Excel -> Có thể dùng hàm = để liên kết như Sheet1 trong file Excel dưới đây và Lisp lấy Sheet1 này làm cơ sở tính toán
Nếu muốn Lisp tính toán với Sheet khác thì hãy thay tên Sheet trong Code Lisp ở dòng :
(setq sheet "Sheet1"); ten sheet cua Excel
Thay "Sheet1" bởi tên Sheet của mình và chú ý viết đúng chữ Hoa và chữ thường trong Excel phải giống như trong Lisp nhé.
Đây là file Excel :
http://www.cadviet.c.../2/excel1_1.rar

3. Tuyến ống phải tương ứng với điểm đầu và cuối
Đây là Code chạy với file Excel đã Link. svba chạy thử và cho ý kiến nhé.

http://www.cadviet.c.../svba_excel.rar
  • 1

#168 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 10:13 PM

Xin cảm ơn anh/chị đã giúp em!
Em không thực hiện được với lý do như sau:

Bạn đã bổ sung thư viện Excel cho VBA chưa?
"Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK"
Trước khi chạy nhớ mở file dữ liệu lên và chọn đúng Sheet chứa dữ liệu tương ứng.
Nếu số liệu của bạn lưu trong Acces hoặc tổ chức lại thì tôi có thể truy xuất trực tiếp không cần mở file Excel.
  • 1

#169 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 10:28 PM

Chào em svba
Code sau Tue_NV viết dưới sự trợ giúp của Elpanov Evgeny và sự chia sẻ của anh gia bach. Xin chân thành cảm ơn Elpanov Evgeny và cảm ơn anh gia bach đã chia sẻ
-> Khi chạy Lisp yêu cầu :
1. Các Pline đơn (độ rộng width=0) phải cắt qua nút ống
2. Tạo 1 Sheet tương ứng chứa các dữ liệu của Excel -> Có thể dùng hàm = để liên kết như Sheet1 trong file Excel dưới đây và Lisp lấy Sheet1 này làm cơ sở tính toán
Nếu muốn Lisp tính toán với Sheet khác thì hãy thay tên Sheet trong Code Lisp ở dòng :
(setq sheet "Sheet1"); ten sheet cua Excel
Thay "Sheet1" bởi tên Sheet của mình và chú ý viết đúng chữ Hoa và chữ thường trong Excel phải giống như trong Lisp nhé.
Đây là file Excel :
http://www.cadviet.c.../2/excel1_1.rar

3. Tuyến ống phải tương ứng với điểm đầu và cuối
Đây là Code chạy với file Excel đã Link. svba chạy thử và cho ý kiến nhé.

http://www.cadviet.c.../svba_excel.rar

Hay quá, xem cái hàm GET_xl_sheet thấy cú pháp truy xuất y chang VB, nhưng có lẽ do không phải là con đẻ của lão Bill nên việc thiết lập các thủ tục code phức tạp thật.
  • 0

#170 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 07 April 2010 - 10:31 PM

Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.
Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào

Tiếp theo:
- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)
- Mở file Excel chứa dữ liệu để VBA đọc.
- Trong cửa sổ của VBA nhấn F5 để chạy.
Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.


Cách này có tác dụng, nhưng phải chọn text STT rất nhiều lần, và có một số text STT SẼ PHẢI CHỌN 2 LẦN.
Ví du như: đoạn ống 106-107 và 100-107.
  • 0
Clear sky!

MF Rock collection.

#171 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 10:41 PM

Cách này có tác dụng, nhưng phải chọn text STT rất nhiều lần, và có một số text STT SẼ PHẢI CHỌN 2 LẦN.
Ví du như: đoạn ống 106-107 và 100-107.

Nguyên lý làm việc như sau:
- Đọc số liệu trong file Excel để xác định ký hiệu điểm đầu, điểm cuối (106-107 và 100-107)
- Tìm trong bản vẽ text có giá trị như ký hiệu đã xác định được ở trên dồng thời xác định điểm chèn 2 ký hiệu đó
- Tính điểm giữa của 2 đầu
- Viết thông số vào vị trí tương ứng.
Tất cả đều làm tự động, bạn có cần phải chọn gì đâu.
Để tránh nhầm lẫn thì các ký hiệu trên bản vẽ phải là duy nhất, không được trùng.
  • 0

#172 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 12 April 2010 - 03:33 AM

Mình có vài góp ý sau:

1) Nội dung cụ thể bạn làm mình không quan tâm vì nó chẳng phải chuyên ngành của mình. Ngoài ra, các chương trình VB nói chung có một nhược điểm chí mạng: phụ thuộc quá nhiều vào cái đám Libraries -> phụ thuộc vào version của Excel, VB lẫn Acad. Điều đó có nghĩa là, cái bạn làm chạy rất tốt trên máy bạn nhưng khi share cho ai đó thì chưa chắc họ dùng được. Ví dụ, bản thân mình muốn thử chương trình của bạn cũng phải vào Tools - References khai báo lại AutoCAD Type Library. Nếu không, chương trình cứ báo error!
Chính vì thế, đã từ lâu mình không có hứng thú lập trình bằng VB nữa mà chuyển sang "chơi" với Lisp.
Nếu bạn có ý phát triển theo hướng này thì nên chú ý đến vấn đề Version và Libraries

2) Về hình thức, bạn đừng bố trí các cell lung tung như vậy mà tập trung nó lại theo một trật tự hợp lý. Trong đó, các cell dành cho nhập liệu gom vào 1 chỗ. Ví dụ như hình sau:

Hình đã gửi

Trong đó:
- Các cells màu xanh lá cây là dành cho user nhập liệu
- Tất cả các cells khác, sau khi gán công thức và hoàn thiện thì lock chúng lại (dùng tính năng protection của Excel). User không thể sửa đổi bất cứ cái gì trong các cells này (nội dung, hình thức lẫn vị trí)
- Các cells ghi kết quả trung gian, ví dụ như kết quả toạ độ các điểm, cho chúng Hide luôn
- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!
Như vậy, file Excel của bạn có dáng dấp của một Application hoàn chỉnh, sử dụng thân thiện và hiệu quả hơn, không bao giờ xảy ra tình trạng user thao tác sai làm mất các công thức đã được gán.
Mà cho dù bạn không có ý phổ biến, tự chế tự dùng đi nữa, chính bạn cũng cảm thấy thoải mái và hiệu quả hơn khi sử dụng.
......

Chào cả nhà
Đọc các bài viết của các bác trong topic này, mình thấy rất bổ ích, hữu dụng trong quá trình Nhập - xuất dữ liệu giữa EXCEL và ACAD. Và khi đọc bài viết của bác ssg trên đây, mình có chổ thắc mắc mà chưa biết làm cách nào để có thể làm được nó.
- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!
Như vậy thì theo lời của bác ssg, cái button "Send to AutoCAD" được tạo như thế nào để có thể export sang CAD và như lời bác ssg ở trên thì không cần biết Macro hay Visual Basic vẫn có thể làm được cái này?

Tue_NV vẫn chưa ngộ ra được chổ này vì trình độ còn hạn chế. Mong bác ssg và các bác trên diễn đàn chỉ giúp cách tạo button "Send to AutoCAD" như trên.
Tue_NV xin chân thành cảm ơn.
  • 0

#173 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1434 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 12 April 2010 - 11:31 AM

Chào cả nhà
Đọc các bài viết của các bác trong topic này, mình thấy rất bổ ích, hữu dụng trong quá trình Nhập - xuất dữ liệu giữa EXCEL và ACAD. Và khi đọc bài viết của bác ssg trên đây, mình có chổ thắc mắc mà chưa biết làm cách nào để có thể làm được nó.
- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!
Như vậy thì theo lời của bác ssg, cái button "Send to AutoCAD" được tạo như thế nào để có thể export sang CAD và như lời bác ssg ở trên thì không cần biết Macro hay Visual Basic vẫn có thể làm được cái này?

Tue_NV vẫn chưa ngộ ra được chổ này vì trình độ còn hạn chế. Mong bác ssg và các bác trên diễn đàn chỉ giúp cách tạo button "Send to AutoCAD" như trên.
Tue_NV xin chân thành cảm ơn.

Tue_NV hiểu nhầm ý của bác ssg rồi. Mong muốn của bác ssg trong bài viết trên tạm hiểu là : Với bất kỳ Application hoàn chỉnh (viết bằng LISP, VBA, VB ...) khi thực thi nó thì người sử dụng chỉ cần nhập số liệu đầu vào rồi bấm ENTER (ngồi uống cafe, ...) chờ kết quả.
- Người sử dụng không cần biết Macro hay Visual Basic là cái quỷ quái gì!.
- các việc khác là của Lập trình viên (khai báo Libraries ...)
- Application càng hoàn chỉnh thì mức độ can thiệp (setting) của người sử dụng càng ít. (User chỉ ngồi rung đùi, cafe-thuốc lá rùi phán ... ứng dụng này chuối quá!)

Tuy nhiên khi Nhập - xuất dữ liệu giữa EXCEL và ACAD bằng VBA chắc chắn phải sử dụng thư viện liên kết để truy xuất ứng dụng. Do đó việc khai báo Libraries là việc bắt buộc (phụ thuộc vào hệ thống có cài đặt các phiên bản Excel hay Acad tuơng ứng hay không).
Viết bằng LISP thì không cần khai báo Libraries, nhưng có hạn chế là phải khai báo địa chỉ truy xuất dữ liệu truớc. (tên Sheet, địa chỉ Cell ...)

Về cách tạo button "Send to AutoCAD" như trên, Tue_NV tham khảo bài viết của Phiphi : http://www.cadviet.c...o...ost&p=85887
+ Right click any ToolBar and choose Control ToolBox.
+ Click the CommandButton and click and drag in your worksheet to position and size it.
+ Right click the button and choose View Code.
+ Change the code.
+ Press Alt+F11 to return to your workbook.
+ Click the Design icon (top left) in the Control Toolbox to exit design mode, and close the ToolBox.
+ Make some selections and click the button.

Trong đó phần Change the code là quan trọng nhất. Đó là phần việc của Programer
  • 1

#174 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 13 April 2010 - 05:15 AM

Chào Phiphi
Sáng nay đọc bài của Phiphi rồi nhưng trên Cty không có Office nên đành chịu.

Đây là file Excel có 3 ô lệnh :
- Xuat sang ACAD : xuất sang Acad cel A3:A5
- Xuat sang ACAD B3:B50 : xuất sang Acad cel B3:B5
- Xuat sang ACAD C3:C50 : xuất sang Acad cel C3:C5

Chú ý : chỉ xuất 3 cell đầu tiên của cột sang CAD.
Bác có thể vào vào Visual Basic Editor sửa lại cho phù hợp với công việc, cũng đơn giản thôi.
"Option 4" tui để dành cho bác "ngâm cứu."
Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand".

Link file Excel

Chào anh gia_bach
Rất cảm ơn anh đã nhiệt tình giúp đỡ. Em đã chạy file EXCEL của anh gửi ở trên -> Kết quả rất tốt. Nhưng tại sao máy tính của em có cài CAD2004 và CAD2008 thì CAD2008 chạy được, nhưng CAD2004 lại chạy không được. Kết quả chạy với CAD2004 thì hiện ra hộp thoại Microsoft Visual Basic lại hiện ra và báo dòng lỗi
Run-time error '13' :
Type mismatch

Cách khắc phục làm sao thì thiệt tình em chưa được biết. Và những đoạn Code trong Visual Basic Editor có thể tham khảo ở đâu vậy anh? Em còn 1 vấn đề nữa là làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD với dụng ý lập trình của User
Ví dụ : Một chương trình vẽ hình chữ nhật đơn giản :
Hình đã gửi
-> Sau khi quét dữ liệu cạnh dài và cạnh ngắn của hình chữ nhật hoặc có thể là chương trình chọn dữ liệu cho mình luôn -> User nhấn nút Send to CAD -> thì lập tức chương trình cho mình qua CAD để chọn điểm góc trái, bên dưới để vẽ hình chữ nhật

Những điểm này là Tue_NV chưa biết, muốn tìm tài liệu để học tập thêm. Rất mong nhận được sự giúp đỡ của anh gia_bach cùng mọi người.
Tue_NV xin chân thành cảm ơn
  • 0

#175 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1434 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 13 April 2010 - 12:29 PM

Chào anh gia_bach
Rất cảm ơn anh đã nhiệt tình giúp đỡ. Em đã chạy file EXCEL của anh gửi ở trên -> Kết quả rất tốt. Nhưng tại sao máy tính của em có cài CAD2004 và CAD2008 thì CAD2008 chạy được, nhưng CAD2004 lại chạy không được. Kết quả chạy với CAD2004 thì hiện ra hộp thoại Microsoft Visual Basic lại hiện ra và báo dòng lỗi
Run-time error '13' :
Type mismatch

Cách khắc phục làm sao thì thiệt tình em chưa được biết. Và những đoạn Code trong Visual Basic Editor có thể tham khảo ở đâu vậy anh? Em còn 1 vấn đề nữa là làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD với dụng ý lập trình của User
Ví dụ : Một chương trình vẽ hình chữ nhật đơn giản :
Hình đã gửi
-> Sau khi quét dữ liệu cạnh dài và cạnh ngắn của hình chữ nhật hoặc có thể là chương trình chọn dữ liệu cho mình luôn -> User nhấn nút Send to CAD -> thì lập tức chương trình cho mình qua CAD để chọn điểm góc trái, bên dưới để vẽ hình chữ nhật

Những điểm này là Tue_NV chưa biết, muốn tìm tài liệu để học tập thêm. Rất mong nhận được sự giúp đỡ của anh gia_bach cùng mọi người.
Tue_NV xin chân thành cảm ơn

1.Microsoft Visual Basic lại hiện ra và báo dòng lỗi
- lỗi này SSG đã viết ở trên :
Ngoài ra, các chương trình VB nói chung có một nhược điểm chí mạng: phụ thuộc quá nhiều vào cái đám Libraries -> phụ thuộc vào version của Excel, VB lẫn Acad. Điều đó có nghĩa là, cái bạn làm chạy rất tốt trên máy bạn nhưng khi share cho ai đó thì chưa chắc họ dùng được. Ví dụ, bản thân mình muốn thử chương trình của bạn cũng phải vào Tools - References khai báo lại AutoCAD Type Library. Nếu không, chương trình cứ báo error!
trong file Excel, AutoCAD Type Library là CAD2008 nên chỉ chạy trên CAD2008, các phiên bản khác thì ...

2. làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD
dùng method : Active.Selection
trong Sub CommandButton3_Click(), bạn thay đoạn dưới đây
For Each cell In Worksheets("Commands").Range("C3:C5").Cells
s = cell.Value & vbCr
doc.SendCommand (s)
Next

bằng
For Each cell In Selection.Cells
s = cell.Value & vbCr
doc.SendCommand (s)
Next

sẽ thấy sự khác biệt.

3. Code trong Visual Basic Editor có thể tham khảo ở đâu
ở đây : http://www.cadviet.c...o...ost&p=90541
  • 1

#176 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 13 April 2010 - 01:57 PM

Ngoài ra, các chương trình VB nói chung có một nhược điểm chí mạng: phụ thuộc quá nhiều vào cái đám Libraries -> phụ thuộc vào version của Excel, VB lẫn Acad. Điều đó có nghĩa là, cái bạn làm chạy rất tốt trên máy bạn nhưng khi share cho ai đó thì chưa chắc họ dùng được. Ví dụ, bản thân mình muốn thử chương trình của bạn cũng phải vào Tools - References khai báo lại AutoCAD Type Library. Nếu không, chương trình cứ báo error!


Dùng VB theo kiểu late binding thì không phụ thuộc vào bất kỳ version nào của Office hay AutoCAD cả.
Mọi thứ đều khai báo là kiểu Object.
  • 0
Clear sky!

MF Rock collection.

#177 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 13 April 2010 - 02:43 PM

Dùng VB theo kiểu late binding thì không phụ thuộc vào bất kỳ version nào của Office hay AutoCAD cả.
Mọi thứ đều khai báo là kiểu Object.


Chưong trình trên viết đã lâu rồi nên còn nhiều lỗi và không tương thích với các véion sinh sau đẻ mụôn của CAD.
Tuy nhiên những chtr sau này của tôi sẽ luôn luôn tương thích với bất kỳ version tuơng lai nào của CAD.
Thank ssg.

Rất mong bác Anhcos chia sẻ thêm vấn đề này. Tue_NV thấy hay lắm
Cảm ơn bác Anhcos và anh gia_bach thật nhiều :undecided:
  • 0

#178 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 13 April 2010 - 07:33 PM

Việc Add references Excel trong Cad ta có thể sử dụng hàm sau:
Application.VBE.ActiveVBProject.References.AddFromGuid(guid, major, minor)
Tuy nhiên việc xác định được guid, major, minor lại là cái khó.
Trên máy tôi cài cad 2007, Office2003(11) thì các thông số như sau
guid = "{00020813-0000-0000-C000-000000000046}"
major = 1
minor = 5
Nếu trong Module ta có đoạn mã
Application.VBE.ActiveVBProject.References.AddFromGuid "{00020813-0000-0000-C000-000000000046}", 1, 5
Thì người sử dụng không cần phải Add References nữa.
Tương tự trong Excel ta có đoạn mã bổ sung thư viện Cad 2007 như sau:
Application.VBE.ActiveVBProject.References.AddFromGuid "{851A4561-F4EC-4631-9B0C-E7DC407512C9}",1,0
Theo tôi nghĩ, nếu ta có thể liệt kê được hết các thông số này của các đời Excel và Cad thì có thể giải quyết được vấn đề bằng phương pháp loại trừ lỗi.
Mọi người cùng nghiên cứu xem có khả thi không nhé.
NOTE: In Office 2002 or later, the TRUST ACCESS TO VISUAL BASIC PROJECT box MUST be checked, or the code will not work. (This box is located in Tools|Options|Security|Macro Security|Trusted Publishers) - Vẫn hơi khó chịu.
  • 0

#179 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 13 April 2010 - 08:24 PM

Việc sử dụng Visual basic hoặc Visual studio (không phải VBA for AutoCAD) để giao tiếp với AutoCAD mà không phụ thuộc vào phiên bản đang cài đặt trên máy bằng kỹ thuật late bingding - có nghĩa là liên kết muộn.

Kỹ thuật này không đòi hỏi phải thêm vào bất kỳ các reference nào nhằm liên kết với Acad or Excel. Tuy nhiên cần phải có sự liên kết với Acad or Excel or Word or có thể bất kỳ một chương trình nào (VD: notepad)

VD khi khai báo biến như sau:

Dim myEntity as Object
Thì kiểu đối tượng của myEntity sẽ không thay đổi cho đến khi nó được gán giá trị mới, tức là KIỂU CỦA BIẾN CHỈ ĐƯỢC XÁC ĐỊNH VÀO THỜI ĐIỂM THỰC THI MÃ.

Xem các câu lệnh sau, xem như biến AcadApp đại diện cho chương trình AutoCAD đang thực thi

1. myEntity = AcadApp.ActiveDocument
Thì kiểu của biến myEntity sẽ là kiểu Document của AutoCAD

2. myEntity = AcadApp.ActiveDocument.SelectionSets
Thì kiểu của biến myEntity sẽ là kiểu SelectionSets của bộ tập chọn trong bản vẽ hiện hành.

Như vậy ta có thể truy xuất đến các thuộc tính và hàm của đối tượng myEntity sau khi gán giá trị cho nó.
Ở câu lệnh 1 ta có thể viết câu lệnh này
Dim myPaper as Object = myEntity.PaperSpace 'code VS

Nhưng không thể sử dụng nó ở câu lệnh thứ 2, vì đó không phải là thuộc tính của SelectionSets, mà có thể dùng
Dim Count as Integer = myEntity.Count 'code VS

Liên kết với Acad, Excel, Word như sau:
Dim AcadApp, ExcelApp, WordApp as Object

'VB
On error resume next
Set AcadApp = GetObject(,"Acad.Application")'Liên kết với bản AutoCad đang chạy
If err <> 0 then
Set AcadApp = CreateObject("Acad.Application")'tạo bản AutoCad mới
endif

'VS
Try
AcadApp = GetObject(,"Acad.Application")'Liên kết với bản AutoCad đang chạy
Catch
AcadApp = CreateObject("Acad.Application")'tạo bản AutoCad mới
End Try

Với Excel or Word chỉ cần thay thế Acad.Application --> Excel.Application or Word.Application
  • 2
Clear sky!

MF Rock collection.

#180 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 15 April 2010 - 10:41 AM

Chào các anh chị!
Hôm nay em muốn nhờ các anh chị giúp em về liên kết giữa Autocad với Excel với mục đích như sau:
Em có 1 file Autocad vẽ sẵn các đường ống (được đánh số nút tại 2 đầu)
http://www.4shared.c...0f46/cad_3.html
Và 1 file Excel mà phần số liệu cần quan tâm được tô màu:
http://www.cadviet.c...les/2/excel.rar
Em muốn các số liệu ở excel được viết vào cad (một cách nhanh nhất) sao cho mỗi đoạn ống được viết 6 số liệu: chiều dài, lưu lượng, đường kính, vận tốc, độ dốc, tổn thất.
3 số liệu ở phía trên ống, gồm: chiều dài, lưu lượng, đường kính.
3 số liệu ở phía dưới ống, gồm: vận tốc, độ dốc, tổn thất.
Nếu ống nằm thẳng đứng thì (chiều dài, lưu lượng, đường kính) nằm bên trái ống, (vận tốc, độ dốc, tổn thất) nằm bên phải ống.

Em xin chân thành cảm ơn!


Bạn thử dùng cái này
Mở file Acad
Active sheet có phương án muốn xuất
Bấm Alt+F8 chạy macro "ExcelToAcad"

Vì không thể có thuật toán tốt cho vị trí text nên ctrình chọn điểm giữa của 2 điểm node
và Offset 2 bên theo khoảng cách trong name "TextOffset"
Kết quả xuất lấy row của name "chdai" và column của các name
"luuluong", "dkinh", "dodoc", "vantoc" va name "doday" do tôi thêm vào ở sheet PA1.
- Y/c trên là "tổn thất", nhưng trong file cad lại là "Độ đầy" ??

Nếu sheet PA2 có row và column khác với sheet PA1 thì kết quả sẽ sai.
Vì vậy bạn bỏ sheet PA2, copy lại sheet PA1=>PA2 thì cả 2 PA có cùng name

Trong file cad, các text của node có style là "p", tuy nhiên có 2 text khác không phải là
số, vì vậy nếu text có chiều dài >4 sẽ bị loại, nếu text có chiều dài <=4 mà không phải
số thì chương trình sẽ lỗi.

Tôi có thêm vào các name là
TextOffset : khoảng cách Text so với trục
Ang1, Ang2: Giới hạn góc để xoay Text 180 độ
Nếu bạn dùng tiện và cần customize các yêu cầu khác thì gửi lại file excel mới.
  • 2