在使用代码打开图纸时,如果图纸中,存在一些字体的字体文件缺失,会导致我们在读取对应的文字信息时,丢失一些关键信息,在获取文字实体边界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”重新赋值即可。