C#-CAD二开相关

本文章主要是使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值