brainstorm 发表于 2020-11-1 22:37:45

拷贝外部文件 图层、图块、标注样式...



using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using LayerAndTextTools;
using System.Text;
using acDbSvs = Autodesk.AutoCAD.DatabaseServices;
using System.IO;
using System.Text.RegularExpressions;
using Autodesk.AutoCAD.Internal;
using static ZgxCommomLib.StaticGeoMatrix;
using static LayerAndTextTools.layermanager;





namespace ZgxCommomLib
{

    /// <summary>
    /// 从外部文件拷贝块定义、字型、标注样式等
    /// </summary>
    ///
    public static class CopyStyleFromDwg
    {

      public static bool CopyStyleOrBlockFromDwg<T>(string path, DuplicateRecordCloning duplicateRecordCloning)
    where T : SymbolTable //where T1:SymbolTableRecord
      {

            if (!File.Exists(path))
                return false;

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

            ObjectId sourceTableId = new ObjectId();
            ObjectId destTableId = new ObjectId();

            string tName = typeof(T).Name;//类型名称      

            using (Database sourceDb = new Database(false, true))
            {
                sourceDb.ReadDwgFile(path,
                  FileOpenMode.OpenForReadAndAllShare, true, "");

                //此处只能强制转换,用(ObjectId),不能用 as ObjectId
                destTableId = (ObjectId)typeof(Database)
                  .GetProperty(tName + "Id").GetValue(db, null);


                sourceTableId = (ObjectId)typeof(Database)
                   .GetProperty(tName + "Id").GetValue(sourceDb, null);

                ObjectIdCollection ids = new ObjectIdCollection();

                using (Transaction tr = sourceDb.TransactionManager.StartTransaction())
                {
                  T styleTable = (T)tr.GetObject(sourceTableId, OpenMode.ForRead);
                  BlockTableRecord btr;
                  foreach (ObjectId style in styleTable)
                  {
                        btr = tr.GetObject(style, OpenMode.ForRead) as BlockTableRecord;
                        if (btr != null)
                        {
                            if (!btr.IsAnonymous && !btr.IsLayout)//不复制匿名块和布局
                              ids.Add(style);
                        }
                        else
                            ids.Add(style);
                  }
                  tr.Commit();
                }

                //if found, add the style
                if (ids.Count != 0)
                {
                  //get the current drawing database
                  using (doc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true))
                  {
                        IdMapping iMap = new IdMapping();
                        db.WblockCloneObjects(ids, destTableId
                            , iMap, duplicateRecordCloning, false);
                        return true;
                  }
                }
                else
                  return false;
            }//sourceDb.Dispose();
      }

      public static bool CopyStyleOrBlockFromDwg<T>(string path, DuplicateRecordCloning duplicateRecordCloning,
            params string[] styleNames)
            where T : SymbolTable //where T1:SymbolTableRecord

      {

            if (!File.Exists(path))
                return false;

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

            ObjectId sourceTableId = new ObjectId();
            ObjectId destTableId = new ObjectId();

            string tName = typeof(T).Name;//类型名称,如 "BlockTable"
            using (Database sourceDb = new Database(false, true))
            {
                sourceDb.ReadDwgFile(path,
                  FileOpenMode.OpenForReadAndAllShare, true, "");

                //此处只能强制转换,用(ObjectId),不能用 as ObjectId
                //此处利用反射获得块表属性,如BlockTableId
                destTableId = (ObjectId)typeof(Database)
                  .GetProperty(tName + "Id").GetValue(db,
                  System.Reflection.BindingFlags.Default, null, null,
                  System.Globalization.CultureInfo.CurrentCulture);//得到块表属性,如BlockTableId

                sourceTableId = (ObjectId)typeof(Database)
                  .GetProperty(tName + "Id").GetValue(sourceDb,
                  System.Reflection.BindingFlags.Default, null, null,
                  System.Globalization.CultureInfo.CurrentCulture);//得到块表属性,如BlockTableId

                ObjectIdCollection ids = new ObjectIdCollection();
                using (Transaction tr = sourceDb.TransactionManager.StartTransaction())
                {
                  T styleTable = (T)tr.GetObject(sourceTableId, OpenMode.ForRead);
                  BlockTableRecord btr;

                  foreach (string styleName in styleNames)
                  {
                        if (styleTable.Has(styleName))
                        {
                            btr = tr.GetObject(styleTable, OpenMode.ForRead) as BlockTableRecord;
                            if (btr != null)
                            {
                              if (!btr.IsAnonymous && !btr.IsLayout)//不复制匿名块和布局
                                    ids.Add(styleTable);
                            }
                            else
                              ids.Add(styleTable);
                        }
                        else
                        {
                            tr.Commit();
                            return false;
                        }
                  }
                  tr.Commit();
                }

                //if found, add the style
                if (ids.Count != 0)
                {
                  using (doc.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true))
                  {
                        IdMapping iMap = new IdMapping();
                        db.WblockCloneObjects(ids, destTableId
                            , iMap, duplicateRecordCloning, false);
                        return true;
                  }
                }
                else
                  return false;
            }
      }


    }

}


satan421 发表于 2020-11-2 09:04:17

不错,赞一个

f4800 发表于 2020-11-2 13:02:07

不错,赞一个
页: [1]
查看完整版本: 拷贝外部文件 图层、图块、标注样式...