有一大批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