本文章主要是使用C#对CAD进行开发时,需要用到的一些简单的、常规的方法介绍,仅供参考。
1、RealDwg辅助类:
public class HostServices : HostApplicationServices
{
public override string FindFile(string fileName, Database database, FindFileHint hint)
{
throw new NotImplementedException();
}
}
public class RealDwgHelper
{
/// <summary>
/// 创建新的Database
/// </summary>
/// <param name="dwgPath">dwg文件路径</param>
/// <returns></returns>
public static Database CreateNewDatabase(string dwgPath)
{
// 初始化依赖环境
Initialize();
// 创建database实例
Database db = new Database(false, true);
if (dwgPath.ToLower().EndsWith("dwg"))
{
db.ReadDwgFile(dwgPath, FileShare.ReadWrite, true, "");
}
else if (dwgPath.ToLower().EndsWith("dxf"))
{
db.DxfIn(dwgPath, dwgPath + ".log");
}
else
{
Console.WriteLine("不支持的格式");
}
db.CloseInput(true);
return db;
}
public static bool IsInitialized;
public static void Initialize()
{
if (!IsInitialized)
{
IsInitialized = true;
// 初始化依赖环境
InitHashTable();
HostServices dwg = new HostServices();
RuntimeSystem.Initialize(dwg, 1033);
}
}
static public Hashtable mOverrides;
///<summary>
/// This initializes the hashtable with all the functions and properties which are overridden in the class.
/// It is using Reflection to achieve this.
/// </summary>
static public void InitHashTable()
{
mOverrides = new Hashtable();
Type t = typeof(HostServices);
MethodInfo[] methods = t.GetMethods();
foreach (MethodInfo method in methods)
{
if (!mOverrides.Contains(method.Name) && method.DeclaringType == t)
mOverrides.Add(method.Name, true);
}
}
/// <summary>
/// 创建新的Database
/// </summary>
/// <param name="dwgPath">dwg文件地址</param>
/// <param name="needRecovery">是否需要修复文件,true需要修复</param>
/// <returns>返回一个Database</returns>
public static Database CreateNewDatabase(string dwgPath, bool needRecovery)
{
string fileName = dwgPath;
if (needRecovery)
{
var newPath = Path.ChangeExtension(dwgPath, "recover.dwg");
if (TextStyleRecovery(dwgPath, ref newPath))
{
fileName = newPath;
}
}
return CreateNewDatabase(fileName);
}
/// <summary>
/// 修复字体样式
/// </summary>
/// <param name="fileName">dwg文件地址</param>
/// <param name="newFileName">修复后保存的文件地址</param>
[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]
[System.Security.SecurityCritical]
public static bool TextStyleRecovery(string fileName, ref string newFileName)
{
try
{
using (var acDb = CreateNewDatabase(fileName))
{
acDb.TextStyleRecovery();
acDb.SaveAs(newFileName, acDb.OriginalFileVersion);
return true;
}
}
catch (AccessViolationException)
{
newFileName = Path.ChangeExtension(newFileName, "2.dwg");
File.Copy(fileName, newFileName, true);
return UsedRecoveryCommand(newFileName, 120000);
}
catch (System.Exception e)
{
return false;
}
}
/// <summary>
/// 使用修复命令
/// </summary>
/// <param name="fileName">文件地址</param>
/// <param name="milliseconds">等待命令退出的时间(以毫秒为单位)。</param>
/// <returns>如果修复成功,则为true;否则为false;</returns>
public static bool UsedRecoveryCommand(string fileName, int milliseconds)
{
System.Diagnostics.Process accoreconsole = null;
try
{
var scrComment = new StringBuilder();
scrComment.AppendLine("secureload")
.AppendLine("0")
.AppendLine("netload")
.AppendLine(typeof(RealDwgHelper).Assembly.Location)
.AppendLine("CustomRecover");
var scrPath = Path.ChangeExtension(fileName, "recover.scr");
File.WriteAllText(scrPath, scrComment.ToString());
var args = $"/i \"{fileName}\" /s \"{scrPath}\" /l zh-CN";
var appPath = AutoCADHelper.FindConsoleApp(fileName);
accoreconsole = new System.Diagnostics.Process();
//accoreconsole.StartInfo.FileName = Common.GolbalSetter.AccoreConsoleAppPath;
acco