AutoCAD批量复制图层功能的.net代码

有一大批dwg文件,将里面某个图层的数据全部复制到一个新文件,这是一个很常用的功能。但是lisp是做不到需要跨文件执行命令的,只能使用arx来做。


using System;
using System.Collections.Generic;
using System.Text;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.PlottingServices;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
using System.IO;

namespace CadHelper
{
    public class CopyJZD
    {
        [CommandMethod("CJZD", CommandFlags.Session)]
        public void ComInteropCommand()
        {
            var files = new string[] {
            };

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

            var filepath = @"E:\BaiduNetdiskDownload\555";
            var layername = "JZD";
            var logname = "result.txt";
            string logfile = null;

            PromptResult result = doc.Editor.GetString("\n请输入目录路径: ");
            switch (result.Status)
            {
                case PromptStatus.OK:
                    filepath = result.StringResult;
                    doc.Editor.WriteMessage("\n读取该目录的所有dwg:" + result.StringResult);
                    break;

                case PromptStatus.Cancel:
                    doc.Editor.WriteMessage("\n用户取消了输入");
                    return;
                    break;

                default:
                    break;
            }

            PromptResult resultLyr = doc.Editor.GetString("\n请图层名称: ");
            switch (resultLyr.Status)
            {
                case PromptStatus.OK:
                    layername = resultLyr.StringResult;
                    break;

                case PromptStatus.Cancel:
                    doc.Editor.WriteMessage("\n用户取消了输入");
                    return;
                    break;

                default:
                    break;
            }

            if (!string.IsNullOrEmpty(filepath))
            {
                logfile = Path.Combine(filepath, logname);
                File.Create(logfile).Close();

                List<string> ll = new List<string>();

                DirectoryInfo fdir = new DirectoryInfo(filepath);
                FileInfo[] fs = fdir.GetFiles();

                File.AppendAllText(logfile, "\r\n读取到以下文件:");

                foreach (FileInfo item in fs)
                {
                    var filename = item.FullName;
                    if (filename.ToUpper().EndsWith(".DWG")) {
                        File.AppendAllText(logfile, "\r\n" + filename);
                        ll.Add(filename);
                    }
                }

                files = ll.ToArray();
            } else
            {
                return;
            }

            File.AppendAllText(logfile, "\r\n\r\n");


            DocumentLock m_DocumentLock = doc.LockDocument();

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                foreach (var item in files)
                {
                    var filename = item;
                    try
                    {
                        var srcDoc = Application.DocumentManager.Open(filename, true);
                        Editor ed = srcDoc.Editor;
                        TypedValue[] tvs = new TypedValue[]
                        {
                            new TypedValue((int)DxfCode.LayerName, layername)
                        };

                        SelectionFilter sf = new SelectionFilter(tvs);
                        PromptSelectionResult psr = ed.SelectAll(sf);
                        if (psr.Status == PromptStatus.OK)
                        {
                            SelectionSet SS = psr.Value;
                            var oids = SS.GetObjectIds();

                            if (oids.Length > 0)
                            {
                                ObjectIdCollection oos = new ObjectIdCollection(oids);
                                srcDoc.Database.WblockCloneObjects(oos, db.CurrentSpaceId, DuplicateRecordCloning.Ignore, false);
                            } else
                            {
                                File.AppendAllText(logfile, "\r\nJZD图层没有内容:" + filename + "\n");
                            }
                        } else
                        {
                            File.AppendAllText(logfile, "\r\nJZD图层没有内容:" + filename + "\n");
                        }

                        (srcDoc.AcadDocument as AcadDocument).Close();
                    }
                    catch (System.Exception)
                    {

                        throw;
                    }
                }

                try
                {
                    tr.Commit();
                }
                catch (System.Exception)
                {

                    throw;
                }
            }

            m_DocumentLock.Dispose();
            doc.Editor.WriteMessage("\n复制完毕,请另存本dwg文件");
        }
    }
}

使用说明:

1. 新建一个空的dwg文件,在cad命令行输入netload,读取dll

2. 选择CadHelper.dll加载进cad

3. 在cad输入CJZD命令

4. 根据命令提示,输入路径和复制的图层名称。

5. 复制结束后,命令行提示“复制结束,请另存本文件”

6. 将这个文件保存,关闭后重新打开。

7. 复制的内容都在里面了。


附上编译好的dll,autocad2004测试成功:https://pan.baidu.com/s/1GKFaHIrTT6EdEfA8qk_MPQ

猜你喜欢

转载自blog.csdn.net/kowity/article/details/80855016