QUẢNG CÁO ĐẦU TRANG

Collapse

Thông báo

Collapse
No announcement yet.

Cac cao thu VBA chi gium cho!!!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Ðề: Cac cao thu VBA chi gium cho!!!

    Các bác cho em hỏi làm sao khai báo VBA for Cad để ta có thể:
    + đọc được dữ liệu trên 1 file Excel cho trước (ví dụ lấy giá trị ở cell(1,1) của file C:\Data1.xls gán vào acad.textstring)
    + mở và ghi tiếp (append) vào 1 file Excel cho trước (ví dụ lấy giá trị ở acad.textstring gán vào cell(2,1) của file C:\Data2.xls)
    Em làm mãi mà không được, các anh hướng dẫn em

    Ghi chú


    • #17
      Ðề: Cac cao thu VBA chi gium cho!!!

      Nguyên văn bởi ThangCoi
      Bác dùng Form.Show để gọi form đó lên ! Vấn đề là dòng chữ của bác tạo ra trong MsgBox hay là đối tượng text tromg cad !
      You thử chạy xem nhé Alt + F8 run CallForm
      Em có gửi quyển sách VBA for ACD trong
      ftp://gilligan.globat.com/Thanh%20vien/Thangcoi/
      Bác lấy tham khảo thêm nhé ! Nó hay phết !
      Cám ơn bác, em hiểu cách gọi cho form hiện lên rồi! Hay thật, VBA quả là hay nhưng em chưa nắm được các hàm tương tác với đối tượng trong bản vẽ. Ví dụ khi em ấn OK trong form thì lần này nó sẽ chèn 1 đoạn text hoặc 1 đường line trực tiếp vào bản vẽ hiện hành như thế nào? Nhờ bác cho em thêm 1 ít minh họa đc ko! Cám ơn rất nhiều, em đang tập VBA để viết vài cái ứng dụng nho nhỏ trong Cad!

      Ghi chú


      • #18
        Ðề: Cac cao thu VBA chi gium cho!!!

        Nguyên văn bởi ThangCoi
        Anh Việt Anh ơi ! Cho em hỏi chút !
        Giả sử ta có một đối tượng text tại một vị trí xác định (Đã biết toạ độ điểm chèn) Làm sao có thể chọn được đối tượng này và xoá nó đi ạ !
        Mình thấy bài post này đã mấy ngày mà chưa thấy anh Việt Anh trả lời, chắc là anh ấy còn bận nhiều việc, để mình mạn phép trả lời cho bạn nha. Mình chỉ là gà VBA thôi, chỉ đi sưu tầm những đoạn code mà cảm thấy hay hay thôi nên đoạn code này mình chế ra chắc còn nhiều thiếu sót, mong mọi người tham khảo và cho ý kiến để lần sau post mang tính chuyên nghiệp hơn (bạn down file gửi kèm, riêng file Data1.xls bạn copy vào ổ D: nha). Have fun
        Code:
        Option Explicit
        Dim x1 As Object
        Dim x2 As Object
        Dim ss1 As AcadSelectionSet
        Dim vt As AcadText
        Dim h, c As Integer
        Dim sht_Data1
        Public Sub Xoa_text_khi_biet_diem_chen()
        On Error Resume Next
        'Mo file Data1.xls co chua toa do diem chen text (D:\Data1.xls)
        Set x1 = CreateObject("Excel.Application")
        Set x2 = x1.Workbooks.Open(FileName:="D:\Data1.xls", UpdateLinks:=0)
        ActiveWorkbook.RunAutoMacros Which:=xlAutoOpen
        x1.Visible = False
        Set sht_Data1 = x2.Worksheets("Sheet1")
        sht_Data1.Activate
        'Chon text tren ban ve
        Set ss1 = ThisDrawing.SelectionSets.Add("s1")
        ss1.SelectOnScreen
        'Doc so lieu tu file Data1.xls va so sanh voi text da chon
        For Each vt In ss1
        h = 1
        Do While sht_Data1.Cells(h, 1).text <> ""
        h = h + 1
        If Format(vt.InsertionPoint(0), "0.0000") = Format(sht_Data1.Cells(h, 1).text, "0.0000") And_ Format(vt.InsertionPoint(1), "0.0000") = Format(sht_Data1.Cells(h, 2).text, "0.0000") And_ Format(vt.InsertionPoint(2), "0.0000") = Format(sht_Data1.Cells(h, 3).text, "0.0000") Then
        vt.Delete
        End If
        Loop
        Next
        ss1.Delete
        x1.Close
        End Sub
        Attached Files

        Ghi chú


        • #19
          Ðề: Cac cao thu VBA chi gium cho!!!

          xin chào, chủ đề này thật sự làm tôi quan tâm. Tôi đang vướng mắc vấn đề này.: Tôi vẽ một đường tròn và tạo hatch cho nó, tôi muốn chọn lại 2 đối tượng này (đường tròn và hatch) thì kô biết viết code nhu thế nào nhỉ? Trong AutoLisp thì có thể xử lý đc bằng "p" (previous) và "l" (last). Kô biết trong VBA phải làm sao đây!

          Ghi chú


          • #20
            Ðề: Cac cao thu VBA chi gium cho!!!

            Nếu bạn không muốn dùng cách lựa chọn đối tượng cũng không sao, ta chỉ cần thay thế đoạn code "For Each vt In ss1" bởi "For Each vt In ThisDrawing.ModelSpace" (khi đó tất cả các text trên bản vẽ sẽ được chọn). Đã test và OK.

            Ghi chú


            • #21
              Ðề: Cac cao thu VBA chi gium cho!!!

              Nguyên văn bởi vietha209
              If Format(vt.InsertionPoint(0), "0.0000") = Format(sht_Data1.Cells(h, 1).text, "0.0000") And_ Format(vt.InsertionPoint(1), "0.0000") = Format(sht_Data1.Cells(h, 2).text, "0.0000") And_ Format(vt.InsertionPoint(2), "0.0000") = Format(sht_Data1.Cells(h, 3).text, "0.0000") Then
              vt.Delete
              End If
              Kinh nghiệm của tôi khi kiểm tra việc tọa độ các điểm có trùng nhau hay không thường tôi không so sánh bằng "=" mà so sánh hiệu hai số có nhỏ hơn một gia số cho trước hay không. Ví dụ
              If Abs(a-b)<0.00001 then
              ............
              End if
              Thay vì
              If a=b then
              ............
              End if
              Vì rằng khi lấy tọa độ điểm, AutoCad hay làm tròn số nên việc so sánh bằng rất hay dẫn đến sai số.

              Việc để nhận lại một đối tượng trên Cad mà mình đã dùng VBA để vẽm tôi ít khi dùng cách so sánh tọa độ nà thường làm theo cách: Ghi vào đối tượng vẽ một Extend Data để về sau nhận dạng lại đối tượng này hoặc dùng chính Handle của đối tượng(Mỗi một đối tượng của Cad được Cad cấp cho một Handle là kiểu số nguyên và duy nhất). Về sau muốn nhận dạng đối tượng này chỉ cần gọi hàm HandleToObject là đối tượng sẽ nhận chính xác, tiết kiệm rất nhiều thời gian hơn là vòng lặp so sánh tọa độ.
              '=====================================================
              Xin lỗi các anh em vì việc trả lời muộn, dạo này đúng là công việc hơi nhiều, cộng thêm "VỠ ĐÊ" nên ít có thời gian đọc và trả lời bài viết.
              Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
              Email : cncc.jsc@gmail.com

              Ghi chú


              • #22
                Ðề: Cac cao thu VBA chi gium cho!!!

                Nguyên văn bởi ThangCoi
                Theo em được biết (Tức la trong sự hiểu biết của em) thì VBA nhận đối tượng theo tên ví dụ như AcadLine, AcadHatch .... Nên để chọn đối tượng đấy ta chỉ gọi tên nó ra là xong !

                'Ham------------------------------------------------------
                Function KC2Diem(Diem1 As Variant, Diem2 As Variant)
                KC2Diem = 0
                If IsEmpty(Diem1) = True Or IsEmpty(Diem2) = True Then Exit Function
                KC2Diem = Sqr((Diem1(0) - Diem2(0)) ^ 2 + (Diem1(1) - Diem2(1)) ^ 2)
                End Function

                '-----------------------------------------------------------
                Sub CreateHatch()
                Dim hatchObj As AcadHatch 'Đối tượng được đặt tên là hatchObj
                Dim Traloi
                ' Create the associative Hatch object
                Set hatchObj = ThisDrawing.ModelSpace.AddHatch(0, "ANSI31", True)
                ' Vẽ đối tượng hatchObj vữa đặt tên
                ' Create the outer boundary for the hatch. (a circle)
                Dim outerLoop(0 To 0) As AcadEntity
                StaP = ThisDrawing.Utility.GetPoint(, vbCrLf & "Diem 1")
                EndP = ThisDrawing.Utility.GetPoint(, vbCrLf & "Diem 2")
                Set outerLoop(0) = ThisDrawing.ModelSpace.AddCircle(StaP, KC2Diem(StaP, EndP))
                ' Gán tên outerLoop(0) cho đối tượng là đường tròn
                ' Append the outerboundary to the hatch
                ' object, and display the hatch
                hatchObj.AppendOuterLoop (outerLoop)
                hatchObj.Evaluate
                ThisDrawing.Regen True
                Traloi = MsgBox("Ban co chan chan muon xoa duong tron di khong", vbYesNo, "Canh Bao")
                If Traloi = vbYes Then ' User chose Yes.
                outerLoop(0).Delete
                'Tác động Delete đến đối tượng đường tròn outerLoop(0)
                End If
                End Sub
                cám ơn nhé, nhưng đoạn code này của bạn chỉ chọn lại được đường tròn để xóa đi chứ kô chọn lại được một lúc cả hatch và đường tròn!

                Ghi chú


                • #23
                  Ðề: Cac cao thu VBA chi gium cho!!!

                  Nguyên văn bởi PMXD
                  Việc để nhận lại một đối tượng trên Cad mà mình đã dùng VBA để vẽ tôi ít khi dùng cách so sánh tọa độ nà thường làm theo cách: Ghi vào đối tượng vẽ một Extend Data để về sau nhận dạng lại đối tượng này hoặc dùng chính Handle của đối tượng(Mỗi một đối tượng của Cad được Cad cấp cho một Handle là kiểu số nguyên và duy nhất). Về sau muốn nhận dạng đối tượng này chỉ cần gọi hàm HandleToObject là đối tượng sẽ nhận chính xác, tiết kiệm rất nhiều thời gian hơn là vòng lặp so sánh tọa độ.
                  Em chưa hiểu rõ ý của anh lắm nên muốn hỏi lại anh cho rõ thêm: Với một đối tượng trên Cad mà mình đã dùng VBA để vẽ thì ta gọi tên của nó ra ngay cho nhanh (ví dụ lineobj, textobj, splineobj...) chứ tại sao lại fải đặt cho nó 1 handle rồi lại gọi lại đối tượng qua handle đó. Em đã tham khảo help file của Cad và vẫn gặp phải vấn đề như vậy. Anh giải thích giùm em nha/

                  Ghi chú


                  • #24
                    Ðề: Cac cao thu VBA chi gium cho!!!

                    Xin hỏi mọi người, làm thế nào để có thể truy cập vào việc sửa các thông số của 1 block (mà có gắn các thuộc tính đi kèm như số lượng kích thước thép khối lượng... giống như trong lisp để lập bảng thống kê thép). Thanks very much

                    Ghi chú


                    • #25
                      Ðề: Cac cao thu VBA chi gium cho!!!

                      Bạn dùng chức năng .GetAttributes của đối tượng BlockRef là OK.

                      Ghi chú


                      • #26
                        Ðề: Cac cao thu VBA chi gium cho!!!

                        Tiện đây cho em xin hỏi trong vba em muốn làm cho dòng chữ tự động cuộn lên trên giống như chương trình diêt Virut Bkav thì làm thế nào. Bác nào biết thì chỉ giúp em.

                        Ghi chú


                        • #27
                          Ðề: Cac cao thu VBA chi gium cho!!!

                          Việc để nhận lại một đối tượng trên Cad mà mình đã dùng VBA để vẽm tôi ít khi dùng cách so sánh tọa độ nà thường làm theo cách: Ghi vào đối tượng vẽ một Extend Data để về sau nhận dạng lại đối tượng này hoặc dùng chính Handle của đối tượng(Mỗi một đối tượng của Cad được Cad cấp cho một Handle là kiểu số nguyên và duy nhất). Về sau muốn nhận dạng đối tượng này chỉ cần gọi hàm HandleToObject là đối tượng sẽ nhận chính xác, tiết kiệm rất nhiều thời gian hơn là vòng lặp so sánh tọa độ.

                          Bác PMXD ơi cho em xin hỏi, em cũng rất quan tâm đến HandleToObject nhưng ko biết cách sử dụng hàm này. Bác có thể lấy 1 ví dụ nho nhỏ thôi để giúp em hiểu hơn đc ko ạ. Em xin cám ơn bác rất là nhiều.

                          Ghi chú


                          • #28
                            Ðề: Cac cao thu VBA chi gium cho!!!

                            Nguyên văn bởi tuyetnhi
                            làm cho dòng chữ tự động cuộn lên trên giống như chương trình diêt Virut Bkav.
                            Cái này khó quá à... ế....ế.... không fải em muốn câu bài đâu

                            Ghi chú


                            • #29
                              Ðề: Cac cao thu VBA chi gium cho!!!

                              Đã lâu không quay lại post bài hỏi về VBA, hôm nay lại có hứng thú đột xuất. Vậy xin hỏi các anh trong diễn đàn là VBA trong Cad có thể đưa ra thành lệnh tắt như lệnh của Cad được không, chứ như em đang dùng đây, thì cứ alt+tab --->F5 để run, sau đó lại làm lại như trên. Những cái tiện ích nhỏ nhỏ thì làm vậy rất mất công,

                              Ghi chú


                              • #30
                                Ðề: Cac cao thu VBA chi gium cho!!!

                                Nguyên văn bởi vietha209
                                Đã lâu không quay lại post bài hỏi về VBA, hôm nay lại có hứng thú đột xuất. Vậy xin hỏi các anh trong diễn đàn là VBA trong Cad có thể đưa ra thành lệnh tắt như lệnh của Cad được không, chứ như em đang dùng đây, thì cứ alt+tab --->F5 để run, sau đó lại làm lại như trên. Những cái tiện ích nhỏ nhỏ thì làm vậy rất mất công,
                                Cái này thì tiểu muội biết rất là rõ nhưng tiểu muội sẽ ko có chỉ đâu....vì nhìn cái biểu tượng của anh là thấy ghét rồi.Có một người bên thư viện phần mềm đã làm được chuyện này anh có thể liên lạc nhờ người đó chỉ xem sao.Nếu đến bước đường cùng thì bạn hãy kèm theo file hướng dẫn cách thêm Menu chỉ dẫn cho ng khác dùng chương trình của bạn là được rồi, còn việc thêm Menu để chạy 1 lệnh nào đó thì chắc bạn dư sức rồi?Có một cách khác là bạn gửi chương trình cho tiểu muội thì tiểu muội có thể xem xét lại và tạo cho bạn lệnh tắt phù hợp với tính năng chương trình, trong Cad rất khó tạo lệnh tắt vì hay đụng độ lắm.Vậy nhé!
                                Last edited by tuyetnhi; 22-03-2007, 08:53 PM.

                                Ghi chú

                                Working...
                                X