Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Jin Yong

Sử dụng XData để gán dữ liệu cho đối tượng

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

Do có người từng hỏi về việc sử dụng XDATA nên Jin post bài này lên đây

Đoạn code này sử dụng VB.NET

 

Gán dữ liệu:

Sub Add_Line_With_XData(ByVal X1 As Decimal, ByVal Y1 As Decimal, ByVal X2 As Decimal, ByVal Y2 As Decimal, ByVal tLayer As String, ByVal tXData As String)
       If X1 = X2 And Y1 = Y2 Then Exit Sub
       Dim acDoc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
       Dim acCurDb As Database = acDoc.Database
       Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
           Dim acBlkTbl As BlockTable
           acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, DatabaseServices.OpenMode.ForRead)
           Dim acBlkTblRec As BlockTableRecord
           acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite)
           Dim acLine As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X2, Y2, 0))
           acLine.SetDatabaseDefaults()
           acLine.Layer = tLayer

           AddRegAppTableRecord("JINYONG")
           Dim rb As ResultBuffer = New ResultBuffer(New TypedValue(1001, "JINYONG"), New TypedValue(1000, tXData))
           acLine.XData = rb

           acBlkTblRec.AppendEntity(acLine)
           acTrans.AddNewlyCreatedDBObject(acLine, True)
           acTrans.Commit()
       End Using
   End Sub

 

Sub AddRegAppTableRecord(ByVal regAppName As String)
       Dim doc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
       Dim ed As Editor = doc.Editor
       Dim db As Database = doc.Database
       Dim tr As Transaction = doc.TransactionManager.StartTransaction()
       Using tr
           Dim rat As RegAppTable = tr.GetObject(db.RegAppTableId, DatabaseServices.OpenMode.ForRead, False)
           If rat.Has(regAppName) = False Then
               rat.UpgradeOpen()
               Dim ratr As RegAppTableRecord = New RegAppTableRecord
               ratr.Name = regAppName
               rat.Add(ratr)
               tr.AddNewlyCreatedDBObject(ratr, True)
               tr.Commit()
           End If
       End Using
   End Sub

 

Đọc dữ liệu:

Sub BB_Get_XData_Left(ByVal acSSet As ArrayList, ByRef tXData As String)
       Dim acDoc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
       Dim acCurDb As Database = acDoc.Database
       Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
           For i = 0 To acSSet.Count - 1
               Dim acSSObj As Object = acSSet(i)
               If Not IsDBNull(acSSObj) Then
                   Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, DatabaseServices.OpenMode.ForRead)
                   If acEnt.GetType.Name = "Line" Then
                       Dim acLine As Line = acEnt
                       Dim obj As DBObject = acTrans.GetObject(acLine.ObjectId, DatabaseServices.OpenMode.ForRead)
                       Dim rb As ResultBuffer = obj.GetXDataForApplication("JINYONG")
                       For Each tv As TypedValue In rb
                           If tv.TypeCode = 1000 Then tXData = tv.Value
                       Next                
                   End If
               End If
           Next
           acTrans.Commit()
       End Using
   End Sub

 

Tham khảo thêm: http://www.kxcad.net/autodesk/autocad/AutoLISP_Developers_Guide/ws73099cc142f4875516d84be10ebc87a53f-7a08.htm

  • Vote tăng 2

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  

×