明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2548|回复: 5

[求助]标注样式复制的问题

[复制链接]
发表于 2010-6-13 11:16:00 | 显示全部楼层 |阅读模式

我想在不打开图纸A的情况下把图纸A中的标注样式“a”复制到图纸B中,请问如何做?

发表于 2010-6-13 15:01:00 | 显示全部楼层
下面的代码以前贴过的,不过感觉太麻烦了,应该有简单的办法的:)
  1.         [CommandMethod("t13")]
  2.         public static void Test13()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database dbDesc = doc.Database;
  6.             Database dbSouce = new Database(false, true);
  7.             dbSouce.ReadDwgFile("e:\\dimstyles.dwg", FileShare.Read, true, null);
  8.             using (Transaction trSouce = dbSouce.TransactionManager.StartTransaction())
  9.             {
  10.                 BlockTable btSouce = trSouce.GetObject(dbSouce.BlockTableId, OpenMode.ForRead) as BlockTable;
  11.                 TextStyleTable tstSouce = trSouce.GetObject(dbSouce.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
  12.                 LinetypeTable ltSouce = trSouce.GetObject(dbSouce.LinetypeTableId, OpenMode.ForRead) as LinetypeTable;
  13.                 DimStyleTable dstSouce = trSouce.GetObject(dbSouce.DimStyleTableId, OpenMode.ForRead) as DimStyleTable;
  14.                 DimStyleTableRecord dstrSouce = trSouce.GetObject(dstSouce["MyDimStyle"], OpenMode.ForRead) as DimStyleTableRecord;
  15.                 using (Transaction trDesc = dbDesc.TransactionManager.StartTransaction())
  16.                 {
  17.                     BlockTable btDesc = trDesc.GetObject(dbDesc.BlockTableId, OpenMode.ForRead) as BlockTable;
  18.                     TextStyleTable tstDesc = trDesc.GetObject(dbDesc.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
  19.                     LinetypeTable ltDesc = trDesc.GetObject(dbDesc.LinetypeTableId, OpenMode.ForWrite) as LinetypeTable;
  20.                     DimStyleTable dstDesc = trDesc.GetObject(dbDesc.DimStyleTableId, OpenMode.ForWrite) as DimStyleTable;
  21.                     DimStyleTableRecord dstrDesc = new DimStyleTableRecord();
  22.                     dstrDesc.CopyFrom(dstrSouce);
  23.                     dstrDesc.Dimblk = GetBtrForm(dstrSouce.Dimblk, btSouce, btDesc);
  24.                     dstrDesc.Dimblk1 = GetBtrForm(dstrSouce.Dimblk1, btSouce, btDesc);
  25.                     dstrDesc.Dimblk2 = GetBtrForm(dstrSouce.Dimblk2, btSouce, btDesc);
  26.                     dstrDesc.Dimldrblk = GetBtrForm(dstrSouce.Dimldrblk, btSouce, btDesc);
  27.                     dstrDesc.Dimtxsty = GetTstrForm(trDesc, dstrSouce.Dimtxsty, tstSouce, tstDesc);
  28.                     dstrDesc.Dimltex1 = GetLtrForm(trDesc, dstrSouce.Dimltex1, ltSouce, ltDesc);
  29.                     dstrDesc.Dimltex2 = GetLtrForm(trDesc, dstrSouce.Dimltex2, ltSouce, ltDesc);
  30.                     dstDesc.Add(dstrDesc);
  31.                     trDesc.AddNewlyCreatedDBObject(dstrDesc, true);
  32.                     trDesc.Commit();
  33.                 }
  34.                 trSouce.Commit();
  35.                
  36.             }
  37.         }
  38.         //在数据库间复制文字样式
  39.         public static ObjectId GetTstrForm(Transaction tr, ObjectId rid, TextStyleTable tstSouce, TextStyleTable tstDesc)
  40.         {
  41.             if (rid != ObjectId.Null)
  42.             {
  43.                 TextStyleTableRecord tstrSouce = (TextStyleTableRecord)rid.GetObject(OpenMode.ForRead);
  44.                 ObjectId idRes = GetRecordId(tstDesc, tstrSouce.Name);
  45.                 if (idRes == ObjectId.Null)
  46.                 {
  47.                     TextStyleTableRecord tstrDesc = new TextStyleTableRecord();
  48.                     tstrDesc.CopyFrom(tstrSouce);
  49.                     idRes = tstDesc.Add(tstrDesc);
  50.                     tr.AddNewlyCreatedDBObject(tstrDesc, true);
  51.                 }
  52.                 return idRes;
  53.             }
  54.             return ObjectId.Null;
  55.         }
  56.         //在数据库间复制线型
  57.         public static ObjectId GetLtrForm(Transaction tr, ObjectId rid, LinetypeTable ltSouce, LinetypeTable ltDesc)
  58.         {
  59.             if (rid != ObjectId.Null)
  60.             {
  61.                 LinetypeTableRecord ltrSouce = (LinetypeTableRecord)rid.GetObject(OpenMode.ForRead);
  62.                 ObjectId idRes = GetRecordId(ltDesc, ltrSouce.Name);
  63.                 if (idRes == ObjectId.Null)
  64.                 {
  65.                     LinetypeTableRecord ltrDesc = new LinetypeTableRecord();
  66.                     ltrDesc.CopyFrom(ltrSouce);
  67.                     idRes = ltDesc.Add(ltrDesc);
  68.                     tr.AddNewlyCreatedDBObject(ltrDesc, true);
  69.                 }
  70.                 return idRes;
  71.             }
  72.             return ObjectId.Null;
  73.         }
  74.         //在数据库间复制块定义
  75.         public static ObjectId GetBtrForm(ObjectId rid, BlockTable btSouce, BlockTable btDesc)
  76.         {
  77.             if (rid != ObjectId.Null)
  78.             {
  79.                 BlockTableRecord btrSouce = (BlockTableRecord)rid.GetObject(OpenMode.ForRead);
  80.                 ObjectId idRes = GetRecordId(btDesc, btrSouce.Name);
  81.                 if (idRes == ObjectId.Null)
  82.                 {
  83.                     ObjectIdCollection ids = new ObjectIdCollection();
  84.                     ids.Add(rid);
  85.                     btSouce.Database.Wblock(
  86.                         btDesc.Database,
  87.                         ids,
  88.                         new Point3d(),
  89.                         DuplicateRecordCloning.Replace
  90.                         );
  91.                     idRes = GetRecordId(btDesc, btrSouce.Name);
  92.                 }
  93.                 return idRes;
  94.             }
  95.             return ObjectId.Null;
  96.         }
  97.         //获取符号表记录名
  98.         public static ObjectId GetRecordId(SymbolTable st, string key)
  99.         {
  100.             if (st.Has(key))
  101.             {
  102.                 ObjectId idres = st[key];
  103.                 if (!idres.IsErased)
  104.                     return idres;
  105.                 foreach (ObjectId id in st)
  106.                 {
  107.                     if (!id.IsErased)
  108.                     {
  109.                         SymbolTableRecord str =
  110.                             (SymbolTableRecord)id.GetObject(OpenMode.ForRead);
  111.                         if (str.Name == key)
  112.                             return id;
  113.                     }
  114.                 }
  115.                     return st[key];
  116.             }
  117.             return ObjectId.Null;
  118.         }
 楼主| 发表于 2010-6-22 21:34:00 | 显示全部楼层

由于我最近一直忙,没有时间来论坛学习,今天进来一看,没有想到版主这么早就回复了,很是感动,只是版主,我用的vb.net,c#不会啊,您有vb.net的代码吗?

 楼主| 发表于 2010-6-24 16:22:00 | 显示全部楼层
我改成了vb.net的,但是还是有问题,请帮忙看看:
  1. 'VB.NET
  2. Imports System.IO
  3. 'CAD
  4. Imports Autodesk.AutoCAD.ApplicationServices
  5. Imports Autodesk.AutoCAD.DatabaseServices
  6. Imports Autodesk.AutoCAD.EditorInput
  7. Imports Autodesk.AutoCAD.Geometry
  8. Imports Autodesk.AutoCAD.Runtime
  9. Public Class CopyCls
  10.     <CommandMethod("netcopy")> Public Shared Sub Test13()
  11.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  12.         Dim dbDesc As Database = doc.Database
  13.         Dim dbSouce As New Database(False, True)
  14.         dbSouce.ReadDwgFile("C:\1.dwg", FileShare.Read, True, Nothing)
  15.         Using trSouce As Transaction = dbSouce.TransactionManager.StartTransaction()
  16.             Dim btSouce As BlockTable = TryCast(trSouce.GetObject(dbSouce.BlockTableId, OpenMode.ForRead), BlockTable)
  17.             Dim tstSouce As TextStyleTable = TryCast(trSouce.GetObject(dbSouce.TextStyleTableId, OpenMode.ForRead), TextStyleTable)
  18.             Dim ltSouce As LinetypeTable = TryCast(trSouce.GetObject(dbSouce.LinetypeTableId, OpenMode.ForRead), LinetypeTable)
  19.             Dim dstSouce As DimStyleTable = TryCast(trSouce.GetObject(dbSouce.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
  20.             Dim dstrSouce As DimStyleTableRecord = TryCast(trSouce.GetObject(dstSouce("1"), OpenMode.ForRead), DimStyleTableRecord)
  21.             Using trDesc As Transaction = dbDesc.TransactionManager.StartTransaction()            '在这里就出错了
  22.                 Dim btDesc As BlockTable = TryCast(trDesc.GetObject(dbDesc.BlockTableId, OpenMode.ForRead), BlockTable)
  23.                 Dim tstDesc As TextStyleTable = TryCast(trDesc.GetObject(dbDesc.TextStyleTableId, OpenMode.ForWrite), TextStyleTable)
  24.                 Dim ltDesc As LinetypeTable = TryCast(trDesc.GetObject(dbDesc.LinetypeTableId, OpenMode.ForWrite), LinetypeTable)
  25.                 Dim dstDesc As DimStyleTable = TryCast(trDesc.GetObject(dbDesc.DimStyleTableId, OpenMode.ForWrite), DimStyleTable)
  26.                 Dim dstrDesc As New DimStyleTableRecord()
  27.                 dstrDesc.CopyFrom(dstrSouce)
  28.                 dstrDesc.Dimblk = GetBtrForm(dstrSouce.Dimblk, btSouce, btDesc)
  29.                 dstrDesc.Dimblk1 = GetBtrForm(dstrSouce.Dimblk1, btSouce, btDesc)
  30.                 dstrDesc.Dimblk2 = GetBtrForm(dstrSouce.Dimblk2, btSouce, btDesc)
  31.                 dstrDesc.Dimldrblk = GetBtrForm(dstrSouce.Dimldrblk, btSouce, btDesc)
  32.                 dstrDesc.Dimtxsty = GetTstrForm(trDesc, dstrSouce.Dimtxsty, tstSouce, tstDesc)
  33.                 dstrDesc.Dimltex1 = GetLtrForm(trDesc, dstrSouce.Dimltex1, ltSouce, ltDesc)
  34.                 dstrDesc.Dimltex2 = GetLtrForm(trDesc, dstrSouce.Dimltex2, ltSouce, ltDesc)
  35.                 dstDesc.Add(dstrDesc)
  36.                 trDesc.AddNewlyCreatedDBObject(dstrDesc, True)
  37.                 trDesc.Commit()
  38.             End Using
  39.             trSouce.Commit()
  40.         End Using
  41.     End Sub
  42.     Public Shared Function GetTstrForm(ByVal tr As Transaction, ByVal rid As ObjectId, ByVal tstSouce As TextStyleTable, ByVal tstDesc As TextStyleTable) As ObjectId
  43.         If rid <> ObjectId.Null Then
  44.             Dim tstrSouce As TextStyleTableRecord = DirectCast(rid.GetObject(OpenMode.ForRead), TextStyleTableRecord)
  45.             Dim idRes As ObjectId = GetRecordId(tstDesc, tstrSouce.Name)
  46.             If idRes = ObjectId.Null Then
  47.                 Dim tstrDesc As New TextStyleTableRecord()
  48.                 tstrDesc.CopyFrom(tstrSouce)
  49.                 idRes = tstDesc.Add(tstrDesc)
  50.                 tr.AddNewlyCreatedDBObject(tstrDesc, True)
  51.             End If
  52.             Return idRes
  53.         End If
  54.         Return ObjectId.Null
  55.     End Function
  56.     Public Shared Function GetLtrForm(ByVal tr As Transaction, ByVal rid As ObjectId, ByVal ltSouce As LinetypeTable, ByVal ltDesc As LinetypeTable) As ObjectId
  57.         If rid <> ObjectId.Null Then
  58.             Dim ltrSouce As LinetypeTableRecord = DirectCast(rid.GetObject(OpenMode.ForRead), LinetypeTableRecord)
  59.             Dim idRes As ObjectId = GetRecordId(ltDesc, ltrSouce.Name)
  60.             If idRes = ObjectId.Null Then
  61.                 Dim ltrDesc As New LinetypeTableRecord()
  62.                 ltrDesc.CopyFrom(ltrSouce)
  63.                 idRes = ltDesc.Add(ltrDesc)
  64.                 tr.AddNewlyCreatedDBObject(ltrDesc, True)
  65.             End If
  66.             Return idRes
  67.         End If
  68.         Return ObjectId.Null
  69.     End Function
  70.     Public Shared Function GetBtrForm(ByVal rid As ObjectId, ByVal btSouce As BlockTable, ByVal btDesc As BlockTable) As ObjectId
  71.         If rid <> ObjectId.Null Then
  72.             Dim btrSouce As BlockTableRecord = DirectCast(rid.GetObject(OpenMode.ForRead), BlockTableRecord)
  73.             Dim idRes As ObjectId = GetRecordId(btDesc, btrSouce.Name)
  74.             If idRes = ObjectId.Null Then
  75.                 Dim ids As New ObjectIdCollection()
  76.                 ids.Add(rid)
  77.                 btSouce.Database.Wblock(btDesc.Database, ids, New Point3d(), DuplicateRecordCloning.Replace)
  78.                 idRes = GetRecordId(btDesc, btrSouce.Name)
  79.             End If
  80.             Return idRes
  81.         End If
  82.         Return ObjectId.Null
  83.     End Function
  84.     Public Shared Function GetRecordId(ByVal st As SymbolTable, ByVal key As String) As ObjectId
  85.         If st.Has(key) Then
  86.             Dim idres As ObjectId = st(key)
  87.             If Not idres.IsErased Then
  88.                 Return idres
  89.             End If
  90.             For Each id As ObjectId In st
  91.                 If Not id.IsErased Then
  92.                     Dim str As SymbolTableRecord = DirectCast(id.GetObject(OpenMode.ForRead), SymbolTableRecord)
  93.                     If str.Name = key Then
  94.                         Return id
  95.                     End If
  96.                 End If
  97.             Next
  98.             Return st(key)
  99.         End If
  100.         Return ObjectId.Null
  101.     End Function
  102. End Class
发表于 2010-6-24 21:55:00 | 显示全部楼层
似乎不要那么复杂,呵呵
看来以前是想多了:)
  1.         [CommandMethod("t13")]
  2.         public static void Test13()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database dbDesc = doc.Database;
  6.             Database dbSouce = new Database(false, true);
  7.             dbSouce.ReadDwgFile("e:\\dimstyles.dwg", FileShare.Read, true, null);
  8.             using (Transaction trSouce = dbSouce.TransactionManager.StartTransaction())
  9.             {
  10.                 DimStyleTable dstSouce = trSouce.GetObject(dbSouce.DimStyleTableId, OpenMode.ForRead) as DimStyleTable;
  11.                 dbSouce.WblockCloneObjects
  12.                 (
  13.                     new ObjectIdCollection { dstSouce["MyDimStyle"] },
  14.                     dbDesc.DimStyleTableId,
  15.                     new IdMapping(),
  16.                     DuplicateRecordCloning.UnmangleName,
  17.                     false
  18.                 );
  19.             }
  20.         }
 楼主| 发表于 2010-6-25 20:22:00 | 显示全部楼层

改成了vb.net的代码(还不完善,请大家自己改改),供需要的人学习,感谢飞狐大哥,感谢Fneix群友:

<CommandMethod("t13")> Public Shared Sub Test13()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim dbDesc As Database = doc.Database
        Dim dbSouce As New Database(False, True)
        dbSouce.ReadDwgFile("C:\1.dwg", FileShare.Read, True, Nothing)
        Using trSouce As Transaction = dbSouce.TransactionManager.StartTransaction()
            Dim dstSouce As DimStyleTable = TryCast(trSouce.GetObject(dbSouce.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            Dim newids As New ObjectIdCollection
            Dim iffind As Boolean = False
            For Each id As ObjectId In dstSouce
                Dim dstSouceRecord As DimStyleTableRecord = trSouce.GetObject(id, OpenMode.ForRead)
                If dstSouceRecord.Name = "100" Then
                    iffind = True
                    newids.Add(id)
                    Exit For
                End If
            Next
            If iffind = True Then
                dbSouce.WblockCloneObjects(newids, dbDesc.DimStyleTableId, New IdMapping(), DuplicateRecordCloning.UnmangleName, False)
            Else
                MsgBox("没有100")
            End If
        End Using
    End Sub

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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