CAD二次开发:检查图纸内文字font字体.shx文件是否缺失

在使用代码打开图纸时,如果图纸中,存在一些字体的字体文件缺失,会导致我们在读取对应的文字信息时,丢失一些关键信息,在获取文字实体边界GeometricExtents时甚至会报错。
这时,我为了能正常的提取到图纸上面的正确信息,选择在打开图纸后,替换那些缺失的字体文件为标准字体库中的字体,判断字体文件是否缺失的方法如下:

bool checkIsFontFileMissing(TextStyleTableRecord textStyle)
{
    bool checkFontFileExist(string file)
    {
        bool findSystemFontFolder()
        {
            string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
            string filePath = System.IO.Path.Combine(folderPath, file);
            return System.IO.File.Exists(filePath);
        }

        bool findAcadFolder()
        {
            string acadPath = Environment.GetCommandLineArgs()[0];
            string acadFolder = System.IO.Path.GetDirectoryName(acadPath);
            string filePath = System.IO.Path.Combine(acadPath, file);

            return System.IO.File.Exists(filePath);
        }

        bool findSearchPath()
        {
            object acadObject = AcadApplication.AcadApplication;
            object preferences = acadObject.GetType().InvokeMember("Preferences", System.Reflection.BindingFlags.GetProperty, null, acadObject, null);
            object files = preferences.GetType().InvokeMember("Files", System.Reflection.BindingFlags.GetProperty, null, preferences, null);
            string searchPathStr = (string)files.GetType().InvokeMember("SupportPath", System.Reflection.BindingFlags.GetProperty, null, files, null);
            string[] searchPaths = searchPathStr.Split(';');

            foreach (string folderPath in searchPaths)
            {
                string filePath = System.IO.Path.Combine(folderPath, file);
                if (System.IO.File.Exists(filePath)) return true;
            }

            return false;
        }

        bool findByHostApplicationApi()
        {
            bool tryFindFile(FindFileHint hint)
            {
                try
                {
                    HostApplicationServices.Current.FindFile(file, Active.Database, hint);
                    return true;
                }
                catch
                {
                    return false;
                }
            }

            return tryFindFile(FindFileHint.FontFile) ||
                tryFindFile(FindFileHint.TrueTypeFontFile) ||
                tryFindFile(FindFileHint.FontMapFile) ||
                tryFindFile(FindFileHint.Default);
        }

        string extension = System.IO.Path.GetExtension(file);
        if (extension == ".ttf")
        {
            return findSystemFontFolder() || findByHostApplicationApi();
        }
        else if (extension == ".dbx")
        {
            return findAcadFolder() || findSearchPath() || findByHostApplicationApi();
        }
        else
        {
            return findSystemFontFolder() || findAcadFolder() || findSearchPath() || findByHostApplicationApi();
        }
    }

    bool isFontMissing = true;
    bool isBigFontMissing = true;

    string fileName = textStyle.FileName;
    string bigFontFileName = textStyle.BigFontFileName;
    if (fileName == "") isFontMissing = false;
    if (bigFontFileName == "") isBigFontMissing = false;

    isFontMissing = !checkFontFileExist(fileName);
    isBigFontMissing = !checkFontFileExist(bigFontFileName);

    return isFontMissing || isBigFontMissing;
}

以上代码来自CAD官方论坛,亲测好用!如果需要替换字体文件,只需要写打开TextStyleTableRecord对象,给"FileName"和“BigFontFileName”重新赋值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值