• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Cách lập trình VB.NET trong MicroStation !!

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Năm 26/02/2009 4:22 pm

Tên bài viết: Cách lập trình VB.NET trong MicroStation
Tác giả: Dragons
Cấp độ bài viết: Chưa đánh giá
Tóm tắt: Việc lập trình trên MicroStation ( chương trình chuẩn để lưu trữ bản đồ đo BTNMT quy định) hiện nay rất hiếm bài hướng dẫn, có thể nói là không có ! tính đến thời điểm này 26-02-2009. Nhất là trên công nghệ .NET !. Mặc dù những chương trình, ứng dụng, các xử lý mở rộng.... chạy trên nền MicroStation có không ít ! Nhưng làm cách nào để viết được trên MicroStation thì không được phổ biến rộng rãi -> sẽ rất thiệt thòi cho anh em sử dụng MicroStation so với anh em sử dung AutoCad !! ( MiCroStation là anh em khác cha, khác mẹ so với AutoCad nhưng nói về sức mạnh design thì ngang ngửa nhau ! Nhất là các phiên bản mới sau này ! :) )


Trong quá trình làm việc tui đã đụng tới MicroStation tui tìm tài liệu Code trên nó mà không thấy -> nên đã tự ngâm cứu -> được một ít kết quả:
Xin giới thiệu cùng các anh em Design trên MicroStation một vài "mấu chốt" và ví dụ để có thể lập trình trên nó như sau:
Trong máy phải cài MicroStation v8 hoặc XM trở lên:
Lưu ý: Các bạn phải biết cơ bản về lập trình nhé, trên VB6, VBA, VB.NET ....... !!!!
B1: Add thư viện vào:
Hinh1.JPG
Hình 1

Sao khi Add vào thì trong danh sách thư viện sẽ thấy
Hinh1_1.JPG
Hinh1_1.JPG (18.3 KiB) Đã xem 17719 lần

B2: Khai báo
Khai báo dòng này
Hinh2.JPG

B3: Khởi tạo (mở) một bản vẽ:
  1.  Private Sub BTN_KHOITAO_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_KHOITAO.Click 
  2. Dim Obj_app As MicroStationDGN.Application
  3. Obj_app = CreateObject("MicroStationDGN.Application")
  4. Obj_app.OpenDesignFile(VITRI_FILE)
  5. Obj_app.Visible = True
  6. End Sub

B4: Một vài code ví dụ
a) Liệt kê tất cả các lớp trong bản vẽ
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click       
  2. Dim MI As MicroStationDGN.Application
  3. Dim lop As Levels
  4. Dim tenlop As String = ""
  5. MI = CreateObject("MicroStationDGN.Application")
  6. MI.Visible = True        'MI.OpenDesignFile("D:\Hoc_tap\Thuc_tap\VBasic\Lap trinh VBA Microstation\kE KHUNG MAU\GIOI_HAN_TPHCM.dgn") 
  7. Obj_app.OpenDesignFile(VITRI_FILE)
  8. lop = MI.ActiveDesignFile.Levels
  9. Dim solop As Integer = lop.Count
  10. For i As Int32 = 1 To solop 
  11. tenlop = tenlop & ", " & lop.Item(i).Name
  12.  Next
  13.  MsgBox(tenlop)
  14. End Sub


b) Đổi màu tất cả các đối tượng trong bản vẽ
  1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
  2. 'Mở file roài đổi màu
  3. Obj_app = CreateObject("MicrostationDGN.Application")        'Obj_app.OpenDesignFile("D:\Hoc_tap\Thuc_tap\VBasic\Lap trinh VBA Microstation\kE KHUNG MAU\GIOI_HAN_TPHCM.dgn") 
  4. Obj_app.OpenDesignFile(VITRI_FILE)
  5. Dim oElScan As ElementScanCriteria 
  6. Dim oElEnum As ElementEnumerator
  7. Dim oEl As Element 
  8. oElScan = New ElementScanCriteria
  9. oElScan.ExcludeAllColors()
  10. oElScan.IncludeColor(1) 
  11. oElEnum = Obj_app.ActiveModelReference.Scan(oElScan) 
  12. oElEnum.Reset() 
  13. While oElEnum.MoveNext 
  14. oEl = oElEnum.Current 'Change the color of the element 
  15. oEl.Color = 210 
  16. oEl.Redraw(MsdDrawingMode.msdDrawingModeNormal)
  17.  oEl.Rewrite() 
  18.  End While 
  19.  Obj_app.Visible = True
  20.  End Sub

c) Đổi màu theo đối tượng, ở đây ví dụ là đối tượng Text
  1.  Private Sub BTN_MAU_TEXT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_MAU_TEXT.Click
  2. Dim DOITUONG As TextElement
  3. Dim DOITUONG_SCAN As ElementScanCriteria
  4. Dim TEXT_CHON As ElementEnumerator 
  5. Dim DEM As Long = 0        ' Dim mang As System.Array 
  6.  DOITUONG_SCAN = New ElementScanCriteria 
  7.  With DOITUONG_SCAN   
  8.   .ExcludeAllTypes() 'Loại trừ tất cả các loại đối tượng             .IncludeType(MsdElementType.msdElementTypeText) 'Chỉ lấy đối tượng nào là text thôi(dòng này bắt buộc phải có dòng trên) 
  9.  End With   
  10. TEXT_CHON = Obj_app.ActiveModelReference.Scan(DOITUONG_SCAN)
  11.  'mang = TEXT_CHON.BuildArrayFromContents 
  12.   With TEXT_CHON   
  13.    .Reset() 
  14.  While .MoveNext 
  15.  DOITUONG = .Current 
  16.  If DEM Mod 2 = 0 Then 
  17.  DOITUONG.Color = 1 
  18.  Else   
  19. DOITUONG.Color = 7
  20.   End If     
  21.  DOITUONG.TextStyle.Height = 250 
  22.  DOITUONG.TextStyle.Width = 150
  23.  DOITUONG.TextStyle.Font = DAT_FONT("#182") 'Khi dùng để vẽ hoặc sữa các đối tượng như 2 dòng dưới thì quá trình xử lý sẽ chậm
  24. DOITUONG.Redraw() 'phải có 
  25. DOITUONG.Rewrite() '2 dòng này text mới hiển thị lưu được thông tin 
  26.  DEM += 1 
  27.  End While 
  28.  End With 
  29. End Sub

d) Vẽ một đường line
  1. Dim DUONG As LineElement
  2. Dim A1, A2 As Point3d 
  3. A1.X = 513.456 
  4. A1.Y = 104.0915
  5. A2.X = 560.2601
  6.  A2.Y = 158.2088
  7. DUONG = Obj_app.CreateLineElement2(Nothing, A1, A2)
  8.  DUONG.Redraw()
  9. Obj_app.ActiveModelReference.AddElement(DUONG) 
  10.  '============== 
  11.  A1.X = 560.2601
  12. A1.Y = 158.2088 
  13. A2.X = 638.7545 
  14.  A2.Y = 113.3548 
  15. DUONG = Obj_app.CreateLineElement2(Nothing, A1, A2) 
  16. DUONG.Redraw() 
  17. Obj_app.ActiveModelReference.AddElement(DUONG)
  18.  '==============
  19. A1.X = 638.7545
  20. A1.Y = 113.3548
  21. A2.X = 546.6089
  22. A2.Y = 55.8247
  23. DUONG = Obj_app.CreateLineElement2(Nothing, A1, A2)
  24. DUONG.Redraw() 
  25. Obj_app.ActiveModelReference.AddElement(DUONG) 
  26.  '============== 
  27. A1.X = 546.6089
  28. A1.Y = 55.8247 
  29. A2.X = 513.456
  30. A2.Y = 104.0915
  31. DUONG = Obj_app.CreateLineElement2(Nothing, A1, A2)
  32. DUONG.Redraw() 
  33. Obj_app.ActiveModelReference.AddElement(DUONG)
  34. End Sub

e) Xử lý các đối tượng trong Fence
  1. Dim BAO As Fence
  2. Dim DT_CHON As ElementEnumerator
  3. Dim DT As Element 
  4. BAO = Obj_app.ActiveDesignFile.Fence
  5. If BAO.IsDefined Then DT_CHON = BAO.GetContents 
  6.  Do While DT_CHON.MoveNext 
  7.  DT = DT_CHON.Current 
  8.   With DT 
  9.  .Color = 2 
  10.  .Redraw(MsdDrawingMode.msdDrawingModeNormal)
  11.  .Rewrite() 
  12.  End With 
  13.  Loop            '            Obj_app.ActiveDesignFile.Save() 
  14. End If 

f) Tạo một đối tượng Text
  1.  Dim TEN As TextElement = ""   
  2. Dim LOAITEXT As TextStyle = Nothing
  3. Dim FONTCHU As Font = Nothing 
  4. Dim TOADO As Point3d 
  5. Dim GOC As Matrix3d
  6. TOADO.X = 570196.6627 
  7. TOADO.Y = 1252820.4014
  8. TOADO.Z = 0 
  9. GOC.RowX = TOADO
  10. TEN.Text = ("HUYNHPHILONG") 
  11.  LOAITEXT.IsBold = True
  12. LOAITEXT.let_Font(FONTCHU.Name) ' TEN = Obj_app.CreateTextElement1(Nothing, "HUYNH PHI LONG", TOADO, Nothing) 
  13. Obj_app.ActiveModelReference.AddElement(TEN)
  14. Obj_app.ActiveDesignFile.Save()

g) Tạo một cái Cell có text
  1. Sub CreateOrphanCell()        'Dim eleCell As CellElement 
  2.  Dim vertices(0 To 3) As Point3d 'Khai báo mảng chứa 4 điểm, dùng để tạo một Shape 4 điểm
  3.  Dim ele(0 To 2) As Element 'Khai báo một mảng chứa 2 đối tượng
  4. Dim KIEUCHU As Font 
  5.  ele(0) = Obj_app.CreateLineElement2(Nothing, xy(0, 5), xy(10, 5)) 
  6. vertices(0) = xy(551169.2372, 1250949.4319) 
  7. vertices(1) = xy(554580.5976, 1250955.0892) 
  8. vertices(2) = xy(554586.5067, 1247498.5345) 
  9. vertices(3) = xy(551174.7769, 1247492.8921) 
  10.  ele(1) = Obj_app.CreateShapeElement1(Nothing, vertices, MsdFillMode.msdFillModeUseActive) 'Gán Shape với tọa độ tương ứng cho đối tượng 1 
  11.  Obj_app.ActiveSettings.TextStyle.Color = 1 
  12.  Obj_app.ActiveSettings.Color = 1 
  13. KIEUCHU = Obj_app.ActiveDesignFile.Fonts.Find(MsdFontType.msdFontTypeWindowsTrueType, "Times New Roman")
  14. ele(2) = Obj_app.CreateTextElement1(Nothing, "C-48-21-(102)", DIEM_GIUA_SHAPE_4(554580.5976, 1250955.0892, 551174.7769, 1247492.8921), Nothing)              Obj_app.ActiveModelReference.AddElement(ele(1))        Obj_app.ActiveModelReference.AddElement(ele(2))

g) Vẽ đường theo kiểu xác định
  1.  Dim KIEUDUONG As LineStyle 
  2. Dim DS_TEN, CHUOI As String
  3. DS_TEN = "" 
  4. CHUOI = "*" & InputBox("Tên kiểu đường chứa chữ:", "Nhập tên đường", "l") & "*" 
  5.  KIEUDUONG = Nothing   
  6.  Do 
  7.  KIEUDUONG = Obj_app.ActiveDesignFile.LineStyles.Find(CHUOI, KIEUDUONG) 
  8. If KIEUDUONG Is Nothing Then Exit Do            'Debug.Print(oFont.Name) 
  9.  If DS_TEN = "" Then
  10.  DS_TEN = KIEUDUONG.Name
  11.  Else 
  12.  DS_TEN = DS_TEN & "; " & KIEUDUONG.Name 
  13.  End If 
  14.  Loop 
  15.  MsgBox("Danh sách các tên kiểu đường hiện có trong thư viện là:" & vbNewLine & DS_TEN, vbInformation, "Kết quả")

h) Hàm đặt font và lớp hiện hành
  1.  Private Sub DAT_FONT_HIENHANH(ByVal TEN_FONT As Object) 
  2.   'Thủ tục thiết lập font hiện hành cho bản vẽ 
  3.  'Tên Font có thể là dạng String hoặc số đều được 
  4.  'VD: "Times New Roman" hoặc 180,200........ 
  5.  Obj_app.CadInputQueue.SendCommand("ACTIVE FONT " & TEN_FONT)
  6.  End Sub 
  7.  Private Function DAT_FONT(ByVal TEN_FONT As Object) As Font 
  8.  'Hàm trả về font để gán vào đối tượng cần 
  9.  'Tên Font có thể là dạng String hoặc số đều được 
  10.  'VD: "Times New Roman" hoặc "#180","#200"........(Lưu ý: Nếu gọi font bằng số thì phải có dấu # đặt trước kèm theo) 
  11.  Dim FONT As Font 
  12.  FONT = Obj_app.ActiveDesignFile.Fonts.Item(TEN_FONT) 
  13.  Return FONT
  14.  End Function

i) Vẽ hình chữ nhật dựa vào 4 điểm
  1. Private Sub VE_KHUNG(ByVal DIEM() As Point3d) 
  2.  Dim KHUNG As ShapeElement
  3.  KHUNG = Obj_app.CreateShapeElement1(Nothing, DIEM, MsdFillMode.msdFillModeNotFilled)  'nếu có lỗi chưa khởi tạo đối tượng thì phải nhấn nút khởi tạo trên màn hình
  4.  KHUNG.LineStyle = DAT_KIEU_DUONG(1) 
  5.  KHUNG.LineWeight = 0 
  6.  KHUNG.Level = DAT_LOP("#6") 
  7.   KHUNG.Color = 4 
  8. Obj_app.ActiveModelReference.AddElement(KHUNG) 
  9.  KHUNG.Redraw() 
  10.  End Sub

j) Ví dụ tổng hợp về tạo một text
  1.  Private Function DIEM_GIUA_SHAPE_4(ByVal X_2 As Double, ByVal Y_2 As Double, ByVal X_4 As Double, ByVal Y_4 As Double) As Point3d 
  2.  'Lấy tâm của Shape 4 đỉnh dùng cho khung mảnh bản đồ ( đánh số theo chiều kim đồng hồ: 1, 2, 3, 4)        'Tham số đầu vào là tọa độ của điểm 2 và 4 
  3.  Return Obj_app.Point3dFromXY(X_4 + ((X_2 - X_4) / 2), Y_4 + ((Y_2 - Y_4) / 2)) 
  4. End Function

  1. Private Sub VE_TEXT(ByVal PH As String, ByVal DIEM() As Point3d)        Dim TOADO As Point3d        Dim TEXT As TextElement  
  2.  TOADO = DIEM_GIUA_SHAPE_4(DIEM(1).X, DIEM(1).Y, DIEM(3).X, DIEM(3).Y) 
  3.  TEXT = Obj_app.CreateTextElement1(Nothing, PH, TOADO, Nothing) 'Tạo đối tượng text        TEXT.TextStyle.Font = DAT_FONT("#180") 
  4. TEXT.TextStyle.Height = 1300
  5. TEXT.TextStyle.Width = 1300 
  6. TEXT.Color = 4 
  7. TEXT.Level = DAT_LOP("#6") 'Đặt lớp cho đối tượng text         Obj_app.ActiveModelReference.AddElement(TEXT) 'Thêm đối tượng text vừa tạo vào bản vẽ        TEXT.Redraw() 'Vẽ ra 
  8. End Sub

k) Thủ tục tắt mở lớp ở View chỉ định
  1.   Sub TAT_MO_LOP(ByVal sTEN_LOP As String, ByVal viewIndex As Integer)
  2.         'Thủ tục tắt mở lớp ở View chỉ định
  3.         Dim oLevel As Level
  4.         Dim oView As View
  5.  
  6.         oLevel = Obj_app.ActiveDesignFile.Levels(sTEN_LOP) 'Xác định lớp
  7.         oView = Obj_app.ActiveDesignFile.Views(viewIndex) 'Xác định View để thao tác
  8.  
  9.         If oView.IsLevelShown(oLevel) Then 'Nếu lớp đang mở
  10.             oView.HideLevel(oLevel) 'thì tắt
  11.         Else 'ngược lại
  12.             oView.ShowLevel(oLevel)
  13.         End If
  14.         ' Now make the view reflect the change
  15.         oView.Redraw()
  16.     End Sub

...........................................
Các anh em nào quan tâm thì hy vọng những đoạn Code trên sẽ giúp ít được phần nào !!
Nếu được thì anh em ( các bác chuyên dùng MicroStation để design) có thể phát triển thêm để cải thiện hiệu quả làm việc của mình !!!.
Các bạn quan tâm có thể tham khảo tài liệu trong đây:
MicroStationVBA.rar
(1.45 MiB) Đã tải 5427 lần

hoặc tại đây nhanh gọn, đầy đủ: http://downloads.ziddu.com/download/23676738/MicroStationVBA.rar.html
Còn tiếp tục: Có một Project đơn giản mình sẽ làm mẫu ở bên dưới :)
Sửa lần cuối bởi Dragons vào ngày T.Ba 01/07/2014 7:16 pm với 10 lần sửa.



HTV
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 87
Ngày tham gia: T.Sáu 04/04/2008 3:32 pm

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi HTV » T.Hai 07/09/2009 8:12 pm

Hay lắm. Đúng cái tôi đang cần cảm ơn bạn Dragons.
Còn nữa ko Pots lên đi bạn, cái vụ này rất hiếm và chỉ dân trong ngành mới biết sử dụng thôi.
Ngoài MicroStation bạn có biết lập trình ArcGis Engine ko? tôi đang nghiên cứu nó mà tài liệu tìm nổ coi mắt ra ko thấy, nếu bạn có thì share cho tôi với, tôi xin cảm ơn và hậu tạ.

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Kasper » T.Năm 17/06/2010 10:57 am

Tôi cũng đang nghiên cứu vấn đề này. Thanks bạn đã share :D
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Năm 15/07/2010 8:31 am

hi !
Được các bác quan tâm đến vấn đề có thể nói là hiếm người nghiên cứu, chưa phổ biến lắm này thật là hay !
Hy vọng có nhiều người quan tâm đến.

PS:
Sao thấy avatar của bác kasper giống phần mềm diệt virus Kaspersky thế ? Có phải bác làm trong đó không nhỉ ?
Sự thông cảm là chiếc chìa khoá vàng mở vào trái tim của người khác.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Ba 03/08/2010 8:50 am

Admin ơi sao bài của tui post lên đây bây giờ mất hết định dạng của VB.net vậy ? Chỉ toàn là những dòng code màu xanh thôi vậy ?
Sự thông cảm là chiếc chìa khoá vàng mở vào trái tim của người khác.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Hai 09/08/2010 5:35 pm

Dragons đã viết:Admin ơi sao bài của tui post lên đây bây giờ mất hết định dạng của VB.net vậy ? Chỉ toàn là những dòng code màu xanh thôi vậy ?

Nhờ Admin sữa dùm mấy cái dòng code mà tui đã post lên cho nó tô màu theo kiểu VB.net với. ^:)^ Để như thế xấu quá.
Sự thông cảm là chiếc chìa khoá vàng mở vào trái tim của người khác.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Bảy 27/08/2011 11:51 am

Chào bạn !
Kỹ năng tạo tâm thửa mình ko chuyên !
Theo ý mình là nên làm bên ngôn ngữ mới VB.net !, như mình gợi ý ở trên hoặc VBA ở phiên bản > hơn MicrostationSE ! (Tài liệu mình có đính kèm bên trên)
VB. net có rất nhiều lợi thế !
Trong MicroSE hình như chỉ hỗ trợ MDL thôi ! Nó ko hỗ trợ nhiều cho người lập trình.
Mò mẫm để học phê lắm và ko phù hợp với thời đại nữa !

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi tungcan5diop » T.Ba 30/08/2011 1:20 pm

bạn Dragons có thể gửi kèm 1 vd nhỏ về cái này để mọi người tham khảo được không?(DLL+ 1 vd để minh họa các kiến thức cơ bản )
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

HTV
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 87
Ngày tham gia: T.Sáu 04/04/2008 3:32 pm

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi HTV » T.Sáu 09/03/2012 10:01 am

Thanks Dragons!
Bạn cho mình hỏi: Làm thế nào để tích hợp VB.Net vào MicroStation V8 dc, ví dụ như thêm một menu chẳng hạn, khi click vào menu thì nó chạy code. Rất mong bạn giúp đỡ.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Năm 24/05/2012 3:30 pm

Chào bạn HTV !
Thắc mắc của bạn mình cũng chưa biết nữa. Nếu muốn làm việc trực tiếp trên giao diện của Microstation thì bạn có thể dùng VBA của nó.
Trên VB.net thì mình chỉ dùng thư viện của nó để để xử lý các file *.dgn thôi.

dynamicsamcom
Bài viết: 2
Ngày tham gia: T.Sáu 29/06/2012 10:05 am

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi dynamicsamcom » T.Sáu 29/06/2012 10:10 am

Help???

Các pác cho em hỏi cái. Hiện tại em dùng C#(2008). Cài microstaion V8i.
Ko hiểu tại sao bây giờ sử dụng cái thư viện của nó bị lỗi.

MicroStationDGN.Font oFont = MI.ActiveDesignFile.Fonts.Find(MsdFontType.msdFontTypeMicroStation, "Vnarial", null);
thì thông báo oFont=null; ko lấy được font ra ?

Pác nào cao thủ chỉ cho em với.

dynamicsamcom
Bài viết: 2
Ngày tham gia: T.Sáu 29/06/2012 10:05 am

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi dynamicsamcom » T.Sáu 29/06/2012 3:32 pm

error ?

MI.ActiveDesignFile.Save();

tbao: "The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))"

Pác nào cao thủ giải thích cho em với.

tuan.hoangminh
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Bảy 16/05/2009 12:44 am
Has thanked: 2 time
Been thanked: 1 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi tuan.hoangminh » CN 16/12/2012 6:07 pm

Chào các bác!
Đã lâu rồi không có dịp trở lại diễn đàn không biết chủ đề này có còn ai quan tâm nữa không?
Cảm ơn bác Dragon đã post bài. Nhưng cũng chỉ tại cái ông Bộ TN&MT thôi. Thực ra ai cũng muốn cái mới mẻ hơn hợp xu thế thời đại hơn nhưng khốn nỗi các phần mềm phụ trợ khác cho ngành của bộ đều trên Mi_SE. Vì vậy việc lập trình các ứng dụng bổ trợ rất phức tạp và cũng vì không có tài liệu nào hướng dẫn nên cứ mò mẫm tìm lỗi hoài. Viết VBA thì giao diện kém, các hàm cũng hạn chế, dùng VB6 hoặc VB.Net thì hay gặp lỗi khi chạy(có thể do chưa kiểm soát hết được). Vì vậy, bác nào có tài liệu liên quan mong các bác post lên cho anh em cùng tham khảo.
Thanks!

yenphanquochv
Bài viết: 1
Ngày tham gia: T.Năm 09/05/2013 7:04 pm

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi yenphanquochv » T.Hai 20/05/2013 6:00 pm

bác tuan.hoangminh và bác dragon cho em hỏi cái: làm cách nào em dùng cái .net để tạo chèn cái menu vào trong micro sau khi nó khởi động lên giống như IRAC C,B được ạ? và khi chọn vào chương trình của mình viết thì nó ẩn hết các menu và tool của microstation đi? thanh kiu bác nhìu!

tuan.hoangminh
Thành viên chính thức
Thành viên chính thức
Bài viết: 16
Ngày tham gia: T.Bảy 16/05/2009 12:44 am
Has thanked: 2 time
Been thanked: 1 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi tuan.hoangminh » T.Năm 12/09/2013 5:39 pm

Có tài liệu đây nhưng nói thật các bác em còn non quá mò mãi không ra. Đọc chảng hiểu gì cả. Bác nào nghiên cứu được share lên cho cả nhà cùng chung vui nha.
Tập tin đính kèm
Lap Trinh macro tren MicroStation.rar
(5.73 MiB) Đã tải 1118 lần

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » CN 29/06/2014 10:36 pm

Chào các bạn, lâu rồi không vào diễn dàn, nhờ có một bạn hỏi mình bổ sung thêm một vài cách code :
Mình bổ sung thêm các code khác:(Lưu ý lần này mình add thư viện Microstation 8.9 nghĩa là trong máy cài Microstation V8i, cái này khác với Micro V8 vài chỗ ngen => có một ít chỗ phải sửa lại mới chạy được)
Cách tạo một Text node:

  1. Private Sub VE_TEXT_NODE()
  2.         '====
  3.         Dim TOADO As Point3d
  4.         Dim TEXT As TextNodeElement
  5.         ungdung.ActiveSettings.TextStyle.Height = 210
  6.         ungdung.ActiveSettings.TextStyle.Width = 210
  7.         ungdung.ActiveSettings.TextStyle.NodeLineSpacing = 210
  8.         TOADO = ungdung.Point3dFromXY(7678, 6567)
  9.         TEXT = ungdung.CreateTextNodeElement1(Nothing, TOADO, Nothing) 'Tạo đối tượng text
  10.         TEXT.AddTextLine("Thiên Thanh")
  11.         TEXT.AddTextLine("Thôn 1")
  12.         TEXT.AddTextLine("1987")
  13.         TEXT.AddTextLine("123456")
  14.         TEXT.AddTextLine("10/24/2004")
  15.         TEXT.AddTextLine("CA Vĩnh Phúc")
  16.         TEXT.AddTextLine("Pha Lê")
  17.         TEXT.AddTextLine("1991")
  18.         TEXT.AddTextLine("1234578")
  19.         TEXT.AddTextLine("5/24/2009")
  20.         TEXT.AddTextLine("CA Bến Tre")
  21.  
  22.         TEXT.Color = 4
  23.         TEXT.Level = DAT_LOP("63") 'Đặt lớp cho đối tượng text
  24.         ungdung.ActiveSettings.Color = 1
  25.         ungdung.ActiveModelReference.AddElement(TEXT) 'Thêm đối tượng text vừa tạo vào bản vẽ
  26.         TEXT.Redraw() 'Vẽ ra
  27.         'ungdung.CadInputQueue.SendCommand("PLACE DIALOGTEXT ICON")
  28.     End Sub
  29.  


Cách vẽ một text:
  1.     Private Sub VE_TEXT(ByVal ten As String)
  2.         Dim TOADO As Point3d
  3.         Dim TEXT As TextElement
  4.  
  5.         TOADO = ungdung.Point3dFromXY(7678, 6567)
  6.         TEXT = ungdung.CreateTextElement1(Nothing, ten, TOADO, Nothing) 'Tạo đối tượng text
  7.         TEXT.TextStyle.Font = DAT_FONT("Times New Roman")
  8.         TEXT.TextStyle.Height = 1200
  9.         TEXT.TextStyle.Width = 1200
  10.         TEXT.Color = 2
  11.         TEXT.Level = DAT_LOP("63") 'Đặt lớp cho đối tượng text
  12.  
  13.         ungdung.ActiveModelReference.AddElement(TEXT) 'Thêm đối tượng text vừa tạo vào bản vẽ
  14.         TEXT.Redraw() 'Vẽ ra
  15.     End Sub


Tham khảo cách đặt cái gì đó vd: font, kiểu đường... ở hiện hành:
  1. ActiveSettings.TextStyle = ActiveDesignFile.TextStyles('1-Plan Text')
  2. ActiveSettings.Color = 8
  3. ActiveSettings.LineWeight = 2
  4. ActiveSettings.LineStyle = ActiveDesignFile.LineStyles('0')
  5. ActiveSettings.DisplayPriority = 0
  6. ActiveSettings.TextStyle.Font = ActiveDesignFile.Fonts("Working")
  7. ActiveSettings.TextStyle.Height = (0.0888 * SettingMgrScale) 'height
  8. ActiveSettings.TextStyle.Width = (0.0665 * SettingMgrScale) 'width
  9. ActiveSettings.TextStyle.NodeLineSpacing = (ActiveSettings.TextStyle.Height * 0.5)
  10. ActiveSettings.TextStyle.Justification = msdTextJustificationLeftTop
  11. ActiveSettings.TextStyle.NodeJustification = msdTextJustificationLeftTop
  12. ActiveSettings.Angle = 0 'Radians
  13. ActiveSettings.TextStyle.UsesColor = False
  14. ActiveSettings.TextStyle.IsFractions = True
  15. ActiveSettings.TextStyle.Slant = 0
  16. ActiveSettings.TextStyle.NodeLineLength = 255
  17. CadInputQueue.SendCommand "active txcharspace 0" 'intercharacter spacing =0
  18. CadInputQueue.SendCommand "active txvertical off"
  19. CadInputQueue.SendCommand "active txunderline off"
  20. DoEvents
  21. CadInputQueue.SendKeyin "PLACE DIALOGTEXT ICON"

Hàm đặt lớp hiện hành:(tự viết theo cách này để dùng nhiều lần hoặc dùng mấy cái dòng đặt .... hiện hành ở trên)
  1. Private Function DAT_LOP(ByVal ID_LOP As Object) As Level
  2.         'Hàm trả về Level để gán vào đối tượng cần
  3.         'Tên Level có thể là dạng String hoặc số đều được
  4.         'VD: "Times New Roman" hoặc "#10","#25"........(Lưu ý: Nếu gọi Level bằng số thì phải có dấu # đặt trước kèm theo)
  5.         Dim LOP As Level
  6.         LOP = UNGDUNG.ActiveDesignFile.Levels(ID_LOP)
  7.         Return LOP
  8.     End Function

Hàm đặt font hiện hành (tự viết theo cách này để dùng nhiều lần hoặc dùng mấy cái dòng đặt .... hiện hành ở trên)
  1.   Private Function DAT_FONT(ByVal TEN_FONT As Object) As Font
  2.         'Hàm trả về font để gán vào đối tượng cần
  3.         'Tên Font có thể là dạng String hoặc số đều được
  4.         'VD: "Times New Roman" hoặc "#180","#200"........(Lưu ý: Nếu gọi font bằng số thì phải có dấu # đặt trước kèm theo)
  5.         Dim FONT As Font
  6.         FONT = ungdung.ActiveDesignFile.Fonts.Item(TEN_FONT)
  7.         Return FONT
  8.     End Function

Còn tiếp tục: có một Project đơn giản mình làm thử ở bên dưới
Sửa lần cuối bởi Dragons vào ngày T.Ba 01/07/2014 7:14 pm với 2 lần sửa.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » CN 29/06/2014 10:53 pm

dynamicsamcom đã viết:Help???
Các pác cho em hỏi cái. Hiện tại em dùng C#(2008). Cài microstaion V8i.
Ko hiểu tại sao bây giờ sử dụng cái thư viện của nó bị lỗi.
MicroStationDGN.Font oFont = MI.ActiveDesignFile.Fonts.Find(MsdFontType.msdFontTypeMicroStation, "Vnarial", null);
thì thông báo oFont=null; ko lấy được font ra ?
Pác nào cao thủ chỉ cho em với.

Câu hỏi này bạn hỏi lâu rồi, giờ tui mới xem. Theo tui lỗi có khả năng là:
- Trong cái thư viện hiện hành bạn đang sử dụng không có cái tên font bạn đang gọi "Vnarial" => lỗi ( cụ thể là nó bảo lỗi null đấy :D ) => Bản thử mở Micro lên rồi vẽ một cái Text kiểu font đó xem coi được không ?, nếu không được thì vui lòng khai báo bộ font có cái font đó cho Micro ngen)
- Bộ font hiện hành của Micro có cái font theo yêu cầu của bạn nhưng bạn gõ cái tên của nó không đúng => nó tìm không được, bạn có thể xem font đó số mấy => gọi số ra cũng được
Bạn nghiên cứu xem coi có giải quyết được không nhé.
Sửa lần cuối bởi Dragons vào ngày T.Tư 02/07/2014 11:17 pm với 1 lần sửa.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Ba 01/07/2014 7:44 pm

Đây là Project đơn giảm mình làm, do có một người hỏi cách vẽ Text Node kết hợp với lấy dữ liệu từ file Excel......
Mình dùng VB 2010, Microstation V8, Office 2007
Code mình tự nghiên cứu, chỉ có tác dụng chạy được thôi, có thể là dài dòng và không được Logic cho lắm. Các bạn nào có kinh nghiệm code hay hơn thì chỉnh sửa và bổ sung, đóng góp thêm nhiều chút nữa cho nó pro một chút.
Chủ đề này đã Post từ năm 2009 mà đến nay (07/01/2014) vẫn không thấy kết quả nào mới chi sẽ cho phong phú thêm vậy nhỉ :D
Đây là cái clip thể hiện Project đã chạy:
https://www.youtube.com/watch?v=FiJvDGFtjBU
Đây là cái project mình làm thử:
Up lên Server của caulacbovb không được (chắc do nặng quá, hơn 6Mb).
http://www.mediafire.com/download/2n6ec77r7x3csq7/thu.rar

Các bạn nào phân vân giữa MDL, VBA, VB.NET, C#, C++.... có thể tham khảo ý kiến sau:
Nếu bạn muốn học nhiều hơn nữa ví dụ như MDL hoặc VBA hoặc .net cái nào ứng dụng mạnh và tốt khi làm việc với Microstation thì bạn có thể tham khảo ý kiến sau:
"Hi Aldrin,

my personal addition to Jon's answer...

In my opinion the right question is not "MDL or MVBA and how they differ", but as Jon mentioned, "What is your programming horizont?" ... in other words, what do you want to achieve, what type of problems you need to solve, what are your long-term plans and how much time you are wiling to invest into a learning process?

If I extend a bit Jon's summary what MicroStation offers now:

At first, it's important to realize there are two different types of questions: Available APIs and development languages you can use. They are interconnected, but not one-to-one. With a slight simplification, APIs are: MDL, MicroStationAPI, COM/VBA; and languages are MDL, C, C++, NET (e.g. C# or VB.NET) and VBA. How they are inteconnected? From language perspective:

MDL (pseudocode applications): MDL language (don't mix it up with MDL API) is C-based language, which can be compiled into pseudocode. This technology was marked as obsolete when MicroStation 8.0 was released and will be removed completely from MicroStation in a next major update (which is planned to happen next year). This language can be marked as dead and there is no reason to invest any time to learn it. To provide all information, from MDL language you can use MDL API, which are tightly coupled as they were developed together.
What can be confusing for beginners is a fact some tools like bmake and data structures and file types like resource files, which originates from old MDL times, are still used even with new technologies like native C++ code.
Native C/C++ code: It's the preferred way how to develop MicroStation applications. Here you can use MDL API and MicroStationAPI. MicroStationAPI is C++ API and is treated as the primary API for MicroStation. Because MicroStationAPI is not completed yet, it doesn't offer access to all MicroStation features and it's time when MDL API is used. MDL API is C (not C++), pretty old (together with MDL language introduced in MicroStation V4, but very rich and powerfull. With every version, more features are added to MicroStationAPI and from the next major version, the process of MDL API functions removal will begin.
If you aim is to be professional developer for MicroStation, C++ with MicroStationAPI, supplemented with MDL API where necessary, is the best way to go. A disadvantage (but not if the development is your main job) is you need Microsoft Visual Studio (VS2005 now, probably VS2012 for the planned major update next year).
NET languages: It's a kind of mean course in MicroStation application development. You can choose your favourite language (C#, VB.NET or any other NET language), available API is COM/VBA API (so MicroStationVBA help is valuable here) with several extra features (e.g. command table, WinForms integrated into MicroStation GUI are available, whereas in VBA not). It's planned that NET API will be extended substantially in future and will be not the same as VBA API, but it will be still "second level" option comparing to C++ MicroStationAPI and NET will probably never offer offer the same range of functionality.
If you aim is not to develop high-speed applications extremely tightly integrated with MicroStation (e.g. with its display engine) and you can live with existing limitations (limited 3D functionality), NET can be the good option as it's easier to learn C# than C++ ... or VB.NET if you know VBA already (but be careful, VBA and VB.NET are different! ;-)
An advantage is you need "only" a development environment with NET support, even free Visual Studio 2012 Express should be enough.
MicroStationVBA is Microsoft VBA extended by API allowing to interact with MicroStation. It's the poorest technology, not tightly integrated with MicroStation and with a lot of limitations. The main function of VBA (not in MicroStation only, but in all applications) is to be, as Jon wrote, rapid development tool allowing fast and easy creation of simple macros and small applications. It's not the good tool to create anything bigger and more complex, not only because of limited API, but in my opinion mostly because of limited environment without tools helping you to create clean and efficient code and to manage bigger projects.
My summary is you can choose to learn C++, which is seriously demanding process, but you will have access to everything in MicroStation. On the other hand, NET is also a good alternative, but not as powerfull as C++.
With regards,"

Theo mình thì nên theo VB.net cho tiện và dễ, sức mạnh cũng không kém gì C# hoặc ... :) chỉ có điều nguồn tài nguyên hơi ít hơn thôi.

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Tư 02/07/2014 11:21 pm

Mình sưu tầm thêm các hàm, thủ tục sau đây phục vụ đóng vùng từ linestring
  1. Private Function TIM_LOP(ByVal TEN_LOP As String) As Boolean
  2.         Dim msg As String = ""
  3.         Dim nElements As Long
  4.         Const levelName As String = "11"
  5.         nElements = ScanByLevel(levelName)
  6.         MsgBox("Tìm thấy " & CStr(nElements) & " đối tượng ở lớp '" & levelName & "'", vbInformation Or vbOKOnly, "Thông báo tìm thấy")
  7.         'ungdung.ShowMessage(msg, msg, ungdung.MsdMessageCenterPriority)
  8.         If nElements < 0 Then
  9.             Return False
  10.         Else
  11.             Return True
  12.         End If
  13.     End Function
  14.     Function ScanByLevel(ByVal levelName As String) As Long
  15.  
  16.         Dim nElements As Long
  17.         nElements = 0
  18.         '   Find named level
  19.         Dim oLevel As Level
  20.         oLevel = ungdung.ActiveModelReference.Levels(levelName)
  21.         If (oLevel Is Nothing) Then
  22.             MsgBox("Lớp '" & levelName & "' không tồn tại", vbCritical Or vbOKOnly, "Thông báo")
  23.             Return -1
  24.         End If
  25.         '   Set up scan criteria
  26.         Dim oScanCriteria As ElementScanCriteria
  27.         oScanCriteria = New ElementScanCriteria
  28.         oScanCriteria.ExcludeAllLevels()
  29.         oScanCriteria.IncludeLevel(oLevel)
  30.         '   Perform the scan
  31.         Dim oEnumerator As ElementEnumerator
  32.         oEnumerator = ungdung.ActiveModelReference.Scan(oScanCriteria)
  33.         Do While oEnumerator.MoveNext
  34.             oEnumerator.Current.Redraw(MsdDrawingMode.msdDrawingModeHilite)
  35.             nElements = nElements + 1
  36.         Loop
  37.         Return nElements
  38.     End Function
  39.     Private Function TIM_LINE() As Boolean
  40.         Dim msg As String
  41.         Dim nElements As Long
  42.         nElements = SCAN_LINE()
  43.         msg = "Found " & CStr(nElements) & " line-string elements"
  44.  
  45.         ' ungdung.ShowMessage(msg, msg, ungdung.MsdMessageCenterPriority)
  46.         MsgBox(msg)
  47.         If nElements < 0 Then
  48.             Return False
  49.         Else
  50.             Return True
  51.         End If
  52.     End Function
  53.     Private Function SCAN_LINE() As Long
  54.         Dim nElements As Long
  55.         nElements = 0
  56.  
  57.         '   Set up scan criteria
  58.         Dim oScanCriteria As ElementScanCriteria
  59.         oScanCriteria = New ElementScanCriteria
  60.         oScanCriteria.ExcludeAllTypes()
  61.         oScanCriteria.IncludeType(MsdElementType.msdElementTypeLineString)
  62.         '   Perform the scan
  63.         Dim oEnumerator As ElementEnumerator
  64.         oEnumerator = ungdung.ActiveModelReference.Scan(oScanCriteria)
  65.         Do While oEnumerator.MoveNext
  66.             Dim oLine As LineElement
  67.             oLine = oEnumerator.Current.AsLineElement
  68.             ' ... do something with line-string
  69.             nElements = 1 + nElements
  70.         Loop
  71.         Return nElements
  72.     End Function
  73.     Function IsLineStringClosed(ByVal oLineString As LineElement) As Boolean
  74.         IsLineStringClosed = False
  75.         If 0.0 = ungdung.Point3dDistance(oLineString.StartPoint, oLineString.EndPoint) Then
  76.             IsLineStringClosed = True
  77.         End If
  78.     End Function
  79.     Private Function TIM_LINE_DONG_VUNG() As Boolean
  80.         Dim msg As String
  81.         Dim nElements As Long
  82.         nElements = Scan_ClosedLineStrings()
  83.         msg = "Found " & CStr(nElements) & " closed line-string elements"
  84.         ungdung.ShowMessage(msg, msg, ungdung.msdMessageCenterPriorityInfo)
  85.         If nElements < 0 Then
  86.             Return False
  87.         Else
  88.             Return True
  89.         End If
  90.     End Function
  91.  
  92.     Function Scan_ClosedLineStrings() As Long
  93.         Dim nElements As Long
  94.         nElements = 0
  95.  
  96.         '   Set up scan criteria
  97.         Dim oScanCriteria As ElementScanCriteria
  98.         oScanCriteria = New ElementScanCriteria
  99.         oScanCriteria.ExcludeAllTypes()
  100.         oScanCriteria.IncludeType(MsdElementType.msdElementTypeLineString)
  101.         '   Perform the scan
  102.         Dim oEnumerator As ElementEnumerator
  103.         oEnumerator = ungdung.ActiveModelReference.Scan(oScanCriteria)
  104.         Do While oEnumerator.MoveNext
  105.             If IsLineStringClosed(oEnumerator.Current.AsLineElement) Then
  106.                 nElements = 1 + nElements
  107.             End If
  108.         Loop
  109.         Return nElements
  110.     End Function
  111.     Function CreateShapeFromLineString(ByVal oLine As LineElement) As Boolean
  112.         CreateShapeFromLineString = False
  113.         Dim points() As Point3d
  114.         points = oLine.GetVertices()
  115.         Dim oShape As ShapeElement
  116.  
  117.         oShape = ungdung.CreateShapeElement1(Nothing, points, MsdFillMode.msdFillModeFilled)
  118.         ungdung.ActiveModelReference.AddElement(oShape)
  119.         Return True
  120.     End Function

Nguồn: http://www.la-solutions.co.uk/content/mvba/MVBA-ConvertLineStringsToShapes.htm

Các bạn vào đây tham khảo có nhiều vấn đề mới lắm:
http://communities.bentley.com/products/programming/microstation_programming/f/53237.aspx

Hình đại diện của người dùng
Dragons
Thành viên trung thành
Thành viên trung thành
Bài viết: 270
Ngày tham gia: T.Tư 25/06/2008 10:58 am
Đến từ: Bến Tre, HCM
Has thanked: 14 time
Been thanked: 8 time

Re: Cách lập trình VB.NET trong MicroStation !!

Gửi bàigửi bởi Dragons » T.Ba 14/10/2014 4:57 pm

Chia sẻ với các bạn trang web có các tài liệu trắc địa bản đồ và các phần mềm hữu ích hiếm khác. Các bạn có thể vào đây tham khảo:
http://taimienphi.org/


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.5 khách