明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 899|回复: 6

CAD2012插入文件作为块,块中的属性丢失。

[复制链接]
发表于 2014-10-17 09:37:30 | 显示全部楼层 |阅读模式
插入代码如下:
Private Sub InsertBlock(ByVal point As Point3d, ByVal blockFile As String, ByVal blockName As String, ByVal

rotation As Double)
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acDatabase As Database = acDoc.Database

        Dim fileData As FileInfo = My.Computer.FileSystem.GetFileInfo(blockFile)
        Using (acDoc.LockDocument)
            Using trans As Transaction = acDatabase.TransactionManager.StartTransaction
                Dim acBlockTable As BlockTable = trans.GetObject(acDatabase.BlockTableId, OpenMode.ForWrite)
                Dim FilePath As String = blockFile
                Dim FileName As String = fileData.Name

                Dim db As New Database(False, False)
                db.ReadDwgFile(FilePath, IO.FileShare.Read, True, "")
                Dim id As ObjectId = acDatabase.Insert(FileName, db, True)
                If id.IsValid = False Then
                    Exit Sub
                End If

                If (acBlockTable.Has(blockName)) Then
                    Dim Block As BlockReference = New BlockReference(point, acBlockTable(blockName))
                    Block.ScaleFactors = New Scale3d(1, 1, 1)
                    Block.Rotation = rotation
                    Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId,

OpenMode.ForWrite)
                    ModelSpace.AppendEntity(Block)
                    trans.AddNewlyCreatedDBObject(Block, True)
                Else
                    Dim tr As BlockTableRecord = id.GetObject(OpenMode.ForWrite)
                    tr.Name = blockName
                    Dim Block As BlockReference = New BlockReference(point, id)
                    Block.ScaleFactors = New Scale3d(1, 1, 1)
                    Block.Rotation = rotation

                    Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId,

OpenMode.ForWrite)

                    ModelSpace.AppendEntity(Block)
                    trans.AddNewlyCreatedDBObject(Block, True)
                End If

               
                trans.Commit()
            End Using
        End Using
    End Sub

插入效果图,当前图像中没有ATT属性,但是块中有ATT属性。怎样才能在当前图形中也有ATT属性?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-10-17 11:51:35 | 显示全部楼层
    /// <summary>
    /// 对块参考添加块属性
    /// </summary>
    /// <param name="ctrans">当前事务</param>
    /// <param name="bRef">块参考</param>
    /// <param name="btr">块参考所在的块记录</param>
/// <param name="recs"></param>
    public static void SetAttributes(Transaction ctrans, BlockReference bRef, BlockTableRecord btr, sRecords recs)
    {
      try
      {
        //se.WriteMessage("\nsTr.AppendBlockAttibute strart " +bref.Handle);
        if (bRef == null || btr == null) return;
        if (!btr.HasAttributeDefinitions) return;
        if (bRef.AttributeCollection != null && bRef.AttributeCollection.Count > 0)
        {
          if (recs != null)
          {
            foreach (ObjectId idAtt in bRef.AttributeCollection)
            {
              AttributeReference attRef = (AttributeReference)ctrans.GetObject(idAtt, OpenMode.ForWrite);
              if (recs[attRef.Tag] != null)
              {
                attRef.TextString = recs[attRef.Tag].Data.ToString();
              }
              //se.WriteMessage("\ndbObj.GetType = {0}",dbObj.GetType().Name);
            }
          }
        }
        else
        {
          foreach (ObjectId idAtt in btr)
          {
            Entity ent = (Entity)ctrans.GetObject(idAtt, OpenMode.ForRead);
            if (ent is AttributeDefinition)
            {
              AttributeDefinition attDef = (AttributeDefinition)ent;
              AttributeReference attRef = new AttributeReference();
              attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform);
              if (attRef.Normal.Z == -1.0)
              {
                attRef.IsMirroredInX = true;
              }
              if (recs == null)
                attRef.TextString = attRef.TextString;
              else
              {
                if (recs[attRef.Tag] != null)
                {
                  attRef.TextString = recs[attRef.Tag].Data.ToString();
                }
                else
                {
                  attRef.TextString = attRef.TextString;
                }
              }
              bRef.AttributeCollection.AppendAttribute(attRef);
              ctrans.AddNewlyCreatedDBObject(attRef, true);
            }
          }
        }
        //se.WriteMessage("\nsTr.AppendBlockAttibute End");
      }
      catch (System.Exception ex)
      {
        se.WriteMessage(ex);
      }
    }
发表于 2014-10-17 11:52:48 | 显示全部楼层
          using (Transaction ctrans = sc.db.TransactionManager.StartTransaction())
          {
            BlockTable cbt = (BlockTable)ctrans.GetObject(sc.db.BlockTableId, OpenMode.ForRead);
            BlockTableRecord cbtr = (BlockTableRecord)ctrans.GetObject(cbt[blockName], OpenMode.ForRead);
            BlockReference bref = new BlockReference(point, cbt[blockName]);
            if (scale != null)
              bref.ScaleFactors = scale;
            bref.Rotation = rotation;
            bref.XData = cbtr.XData;
            reValue = sTr.AppendEntity(ctrans, bref, nSpace);
            if (cbtr.HasAttributeDefinitions)
              sTr.SetAttributes(ctrans, bref, cbtr, recs);
            ctrans.Commit();
          }
发表于 2014-10-17 11:53:18 | 显示全部楼层
/// <param name="recs">块参考的属性值集合</param>
 楼主| 发表于 2014-10-20 15:58:51 | 显示全部楼层
但是在  SetAttributes 函数的  bRef.AttributeCollection.AppendAttribute(attRef);方法出错了,错误消息是eNoDatabase,不知道怎么回事。
发表于 2014-10-20 16:08:06 | 显示全部楼层
   你的代码?
 楼主| 发表于 2014-10-20 16:13:30 | 显示全部楼层
插入的文件里有个属性是ATT_ABC。我初学CAD开发,很多东西模模糊糊的,请大侠帮忙看看。谢谢!!

Private Sub InsertBlock(ByVal point As Point3d, ByVal blockFile As String, ByVal blockName As String, ByVal rotation As Double)
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acDatabase As Database = acDoc.Database
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor()
        Dim fileData As FileInfo = My.Computer.FileSystem.GetFileInfo(blockFile)
        Using (acDoc.LockDocument)
            Using trans As Transaction = acDatabase.TransactionManager.StartTransaction
                Dim acBlockTable As BlockTable = trans.GetObject(acDatabase.BlockTableId, OpenMode.ForWrite)
                Dim FilePath As String = blockFile
                Dim FileName As String = fileData.Name

                Dim db As New Database(False, False)
                db.ReadDwgFile(FilePath, IO.FileShare.Read, True, "")
                Dim id As ObjectId = acDatabase.Insert(FileName, db, True)
                If id.IsValid = False Then
                    Exit Sub
                End If

                If (acBlockTable.Has(blockName)) Then
                    Dim Block As BlockReference = New BlockReference(point, acBlockTable(blockName))
                    Block.ScaleFactors = New Scale3d(1, 1, 1)
                    Block.Rotation = rotation
                    Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId, OpenMode.ForWrite)
                    ModelSpace.AppendEntity(Block)
                    trans.AddNewlyCreatedDBObject(Block, True)
                Else
                    Dim tr As BlockTableRecord = id.GetObject(OpenMode.ForWrite)
                    tr.Name = blockName
                    Dim Block As BlockReference = New BlockReference(point, id)
                    Block.ScaleFactors = New Scale3d(1, 1, 1)
                    Block.Rotation = rotation

                    If tr.HasAttributeDefinitions Then
                        Dim srlt As New SortedList()
                        srlt.Add("ATT_ABC", "sss")
                        SetAttributes(trans, Block, tr, srlt)
                    End If

                    Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId, OpenMode.ForWrite)

                    ModelSpace.AppendEntity(Block)
                    trans.AddNewlyCreatedDBObject(Block, True)
                End If

Public Shared Sub SetAttributes(ByVal ctrans As Transaction, ByVal bRef As BlockReference, ByVal btr As BlockTableRecord, ByVal recs As SortedList)
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor()
        Try
            'se.WriteMessage("\nsTr.AppendBlockAttibute strart " +bref.Handle);
            If bRef Is Nothing OrElse btr Is Nothing Then
                Return
            End If
            If Not btr.HasAttributeDefinitions Then
                Return
            End If
            If bRef.AttributeCollection IsNot Nothing AndAlso bRef.AttributeCollection.Count > 0 Then
                If recs IsNot Nothing Then
                    For Each idAtt As ObjectId In bRef.AttributeCollection
                        Dim attRef As AttributeReference = DirectCast(ctrans.GetObject(idAtt, OpenMode.ForWrite), AttributeReference)
                        If recs(attRef.Tag) IsNot Nothing Then
                            attRef.TextString = recs(attRef.Tag).Data.ToString()
                            'se.WriteMessage("\ndbObj.GetType = {0}",dbObj.GetType().Name);
                        End If
                    Next
                End If
            Else
                For Each idAtt As ObjectId In btr
                    Dim ent As Entity = DirectCast(ctrans.GetObject(idAtt, OpenMode.ForRead), Entity)
                    If TypeOf ent Is AttributeDefinition Then
                        Dim attDef As AttributeDefinition = DirectCast(ent, AttributeDefinition)
                        Dim attRef As New AttributeReference()
                        attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform)
                        If attRef.Normal.Z = -1.0 Then
                            attRef.IsMirroredInX = True
                        End If

                        If recs Is Nothing Then
                            attRef.TextString = attRef.TextString
                        Else
                            If recs(attRef.Tag) IsNot Nothing Then
                                attRef.TextString = recs(attRef.Tag).ToString()
                            Else
                                attRef.TextString = attRef.TextString
                            End If
                            ed.WriteMessage(vbCrLf & " ==> ATT  =>" & attRef.Tag & " = " & attRef.TextString)
                        End If
                        bRef.AttributeCollection.AppendAttribute(attRef)
                        ctrans.AddNewlyCreatedDBObject(attRef, True)
                    End If
                Next
                'se.WriteMessage("\nsTr.AppendBlockAttibute End");
            End If
        Catch ex As System.Exception
            ed.WriteMessage(vbCrLf & "ERR ==> " & ex.Message)
        End Try
    End Sub



               
                trans.Commit()
            End Using
        End Using
    End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:51 , Processed in 0.176491 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表