属性定義を作成するには、まず、AppendEntity メソッドを使用して AttributeDefinition オブジェクトを作成し、BlockTableRecord オブジェクトに属性定義を作成する必要があります。属性定義を定義する場合は、属性テキストの高さ、属性モード、プロンプト、タグ文字列、挿入点、既定の属性値を指定する必要があります。
属性定義のモードは、以下のプロパティを使ってコントロールします。
プロンプト文字列は、属性を含むブロックが挿入され、Prompt プロパティを使用して設定されている場合に表示されます。属性のデフォルト値は、TextString プロパティで設定します。Constant プロパティが True に設定されている場合、属性定義を含むブロックが挿入されると、新しい値の入力を求めるプロンプトは無効になります。
タグ文字列は属性の各対象を識別し、Tag プロパティを使って割り当てられます。スペースと感嘆符以外の任意の文字を使用することができます。小文字は自動的に大文字に変更されます。
ブロック内の属性定義の作成後は、INSERT コマンドを使ってブロックを挿入するたびに、定数として定義されていない属性参照ごとに異なる値を指定できます。BlockReference オブジェクトを作成すると、BlockTableRecord オブジェクトで定義する属性は、AppendAttribute メソッドを使用して BlockReference オブジェクトに追加するまで、オブジェクトには含まれません。
属性を BlockReference オブジェクトに追加する前に、SetAttributeFromBlock メソッドを使って AttributeDefinition オブジェクトのプロパティを AttributeReference オブジェクトにコピーします。HasAttributeDefinitions プロパティをブロック テーブル レコードに使用し、そのレコードに属性定義が含まれているかを確認できます。
モデル空間またはペーパー空間に関して作成された属性定義は、ブロックには関連付けられません。
次の例では、ブロックを作成し、そのブロックに属性を追加します。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry <CommandMethod("AddingAttributeToABlock")> _ Public Sub AddingAttributeToABlock() ' Get the current database and start a transaction Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() ' Open the Block table for read Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) If Not acBlkTbl.Has("CircleBlockWithAttributes") Then Using acBlkTblRec As New BlockTableRecord acBlkTblRec.Name = "CircleBlockWithAttributes" ' Set the insertion point for the block acBlkTblRec.Origin = New Point3d(0, 0, 0) ' Add a circle to the block Using acCirc As New Circle acCirc.Center = New Point3d(0, 0, 0) acCirc.Radius = 2 acBlkTblRec.AppendEntity(acCirc) ' Add an attribute definition to the block Using acAttDef As New AttributeDefinition acAttDef.Position = New Point3d(0, 0, 0) acAttDef.Verifiable = True acAttDef.Prompt = "Door #: " acAttDef.Tag = "Door#" acAttDef.TextString = "DXX" acAttDef.Height = 1 acAttDef.Justify = AttachmentPoint.MiddleCenter acBlkTblRec.AppendEntity(acAttDef) acBlkTbl.UpgradeOpen() acBlkTbl.Add(acBlkTblRec) acTrans.AddNewlyCreatedDBObject(acBlkTblRec, True) End Using End Using End Using End If ' Save the new object to the database acTrans.Commit() ' Dispose of the transaction End Using End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; [CommandMethod("AddingAttributeToABlock")] public void AddingAttributeToABlock() { // Get the current database and start a transaction Database acCurDb; acCurDb = Application.DocumentManager.MdiActiveDocument.Database; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; if (!acBlkTbl.Has("CircleBlockWithAttributes")) { using (BlockTableRecord acBlkTblRec = new BlockTableRecord()) { acBlkTblRec.Name = "CircleBlockWithAttributes"; // Set the insertion point for the block acBlkTblRec.Origin = new Point3d(0, 0, 0); // Add a circle to the block using (Circle acCirc = new Circle()) { acCirc.Center = new Point3d(0, 0, 0); acCirc.Radius = 2; acBlkTblRec.AppendEntity(acCirc); // Add an attribute definition to the block using (AttributeDefinition acAttDef = new AttributeDefinition()) { acAttDef.Position = new Point3d(0, 0, 0); acAttDef.Verifiable = true; acAttDef.Prompt = "Door #: "; acAttDef.Tag = "Door#"; acAttDef.TextString = "DXX"; acAttDef.Height = 1; acAttDef.Justify = AttachmentPoint.MiddleCenter; acBlkTblRec.AppendEntity(acAttDef); acBlkTbl.UpgradeOpen(); acBlkTbl.Add(acBlkTblRec); acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true); } } } } // Save the new object to the database acTrans.Commit(); // Dispose of the transaction } }
Sub AddingAttributeToABlock () ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add(insertionPnt, "CircleBlockWithAttributes") ' Add a circle to the block Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 radius = 2 Set circleObj = blockObj.AddCircle(center, radius) ' Add an attribute to the block Dim attributeObj As AcadAttribute Dim height As Double Dim mode As Long Dim prompt As String Dim insertionPoint(0 To 2) As Double Dim tag As String Dim value As String insertionPoint(0) = 0 insertionPoint(1) = 0 insertionPoint(2) = 0 height = 1 prompt = "Door #: " tag = "Door#" value = "DXX" Set attributeObj = blockObj.AddAttribute(height, mode, prompt, insertionPoint, tag, value) attributeObj.Alignment = acAlignmentMiddleCenter End Sub
この例では、属性を持つブロックを作成し、現在のスペースにそのブロックを挿入します。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry <CommandMethod("InsertingBlockWithAnAttribute")> _ Public Sub InsertingBlockWithAnAttribute() ' Get the current database and start a transaction Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() ' Open the Block table for read Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim blkRecId As ObjectId = ObjectId.Null If Not acBlkTbl.Has("CircleBlockWithAttributes") Then Using acBlkTblRec As New BlockTableRecord acBlkTblRec.Name = "CircleBlockWithAttributes" ' Set the insertion point for the block acBlkTblRec.Origin = New Point3d(0, 0, 0) ' Add a circle to the block Using acCirc As New Circle acCirc.Center = New Point3d(0, 0, 0) acCirc.Radius = 2 acBlkTblRec.AppendEntity(acCirc) ' Add an attribute definition to the block Using acAttDef As New AttributeDefinition acAttDef.Position = New Point3d(0, 0, 0) acAttDef.Prompt = "Door #: " acAttDef.Tag = "Door#" acAttDef.TextString = "DXX" acAttDef.Height = 1 acAttDef.Justify = AttachmentPoint.MiddleCenter acBlkTblRec.AppendEntity(acAttDef) acBlkTbl.UpgradeOpen() acBlkTbl.Add(acBlkTblRec) acTrans.AddNewlyCreatedDBObject(acBlkTblRec, True) End Using blkRecId = acBlkTblRec.Id End Using End Using Else blkRecId = acBlkTbl("CircleBlockWithAttributes") End If ' Create and insert the new block reference If blkRecId <> ObjectId.Null Then Dim acBlkTblRec As BlockTableRecord acBlkTblRec = acTrans.GetObject(blkRecId, OpenMode.ForRead) Using acBlkRef As New BlockReference(New Point3d(2, 2, 0), acBlkTblRec.Id) Dim acCurSpaceBlkTblRec As BlockTableRecord acCurSpaceBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) acCurSpaceBlkTblRec.AppendEntity(acBlkRef) acTrans.AddNewlyCreatedDBObject(acBlkRef, True) ' Verify block table record has attribute definitions associated with it If acBlkTblRec.HasAttributeDefinitions Then ' Add attributes from the block table record For Each objID As ObjectId In acBlkTblRec Dim dbObj As DBObject = acTrans.GetObject(objID, OpenMode.ForRead) If TypeOf dbObj Is AttributeDefinition Then Dim acAtt As AttributeDefinition = dbObj If Not acAtt.Constant Then Using acAttRef As New AttributeReference acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform) acAttRef.Position = acAtt.Position.TransformBy(acBlkRef.BlockTransform) acAttRef.TextString = acAtt.TextString acBlkRef.AttributeCollection.AppendAttribute(acAttRef) acTrans.AddNewlyCreatedDBObject(acAttRef, True) End Using End If End If Next End If End Using End If ' Save the new object to the database acTrans.Commit() ' Dispose of the transaction End Using End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; [CommandMethod("InsertingBlockWithAnAttribute")] public void InsertingBlockWithAnAttribute() { // Get the current database and start a transaction Database acCurDb; acCurDb = Application.DocumentManager.MdiActiveDocument.Database; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; ObjectId blkRecId = ObjectId.Null; if (!acBlkTbl.Has("CircleBlockWithAttributes")) { using (BlockTableRecord acBlkTblRec = new BlockTableRecord()) { acBlkTblRec.Name = "CircleBlockWithAttributes"; // Set the insertion point for the block acBlkTblRec.Origin = new Point3d(0, 0, 0); // Add a circle to the block using (Circle acCirc = new Circle()) { acCirc.Center = new Point3d(0, 0, 0); acCirc.Radius = 2; acBlkTblRec.AppendEntity(acCirc); // Add an attribute definition to the block using (AttributeDefinition acAttDef = new AttributeDefinition()) { acAttDef.Position = new Point3d(0, 0, 0); acAttDef.Prompt = "Door #: "; acAttDef.Tag = "Door#"; acAttDef.TextString = "DXX"; acAttDef.Height = 1; acAttDef.Justify = AttachmentPoint.MiddleCenter; acBlkTblRec.AppendEntity(acAttDef); acBlkTbl.UpgradeOpen(); acBlkTbl.Add(acBlkTblRec); acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true); } } blkRecId = acBlkTblRec.Id; } } else { blkRecId = acBlkTbl["CircleBlockWithAttributes"]; } // Insert the block into the current space if (blkRecId != ObjectId.Null) { BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(blkRecId, OpenMode.ForRead) as BlockTableRecord; // Create and insert the new block reference using (BlockReference acBlkRef = new BlockReference(new Point3d(2, 2, 0), blkRecId)) { BlockTableRecord acCurSpaceBlkTblRec; acCurSpaceBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; acCurSpaceBlkTblRec.AppendEntity(acBlkRef); acTrans.AddNewlyCreatedDBObject(acBlkRef, true); // Verify block table record has attribute definitions associated with it if (acBlkTblRec.HasAttributeDefinitions) { // Add attributes from the block table record foreach (ObjectId objID in acBlkTblRec) { DBObject dbObj = acTrans.GetObject(objID, OpenMode.ForRead) as DBObject; if (dbObj is AttributeDefinition) { AttributeDefinition acAtt = dbObj as AttributeDefinition; if (!acAtt.Constant) { using (AttributeReference acAttRef = new AttributeReference()) { acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform); acAttRef.Position = acAtt.Position.TransformBy(acBlkRef.BlockTransform); acAttRef.TextString = acAtt.TextString; acBlkRef.AttributeCollection.AppendAttribute(acAttRef); acTrans.AddNewlyCreatedDBObject(acAttRef, true); } } } } } } } // Save the new object to the database acTrans.Commit(); // Dispose of the transaction } }
Sub InsertingBlockWithAnAttribute () ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add(insertionPnt, "CircleBlockWithAttributes") ' Add a circle to the block Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 radius = 2 Set circleObj = blockObj.AddCircle(center, radius) ' Add an attribute to the block Dim attributeObj As AcadAttribute Dim height As Double Dim mode As Long Dim prompt As String Dim insertionPoint(0 To 2) As Double Dim tag As String Dim value As String insertionPoint(0) = 0 insertionPoint(1) = 0 insertionPoint(2) = 0 height = 1 prompt = "Door #: " tag = "Door#" value = "DXX" Set attributeObj = blockObj.AddAttribute(height, mode, prompt, insertionPoint, tag, value) attributeObj.Alignment = acAlignmentMiddleCenter ' Insert the block, creating a block reference ' and an attribute reference Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ActiveLayout.Block.InsertBlock(insertionPnt, "CircleBlockWithAttributes", 1, 1, 1, 0) End Sub