Jin Yong 337 Báo cáo bài đăng Đã đăng Tháng 8 13, 2011 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 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