明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1571|回复: 8

C#批量替换指定缺失字体求大神帮忙

[复制链接]
发表于 2020-4-25 10:53:16 | 显示全部楼层 |阅读模式
本帖最后由 默写容颜 于 2020-10-30 09:06 编辑

以下代码来自雪山飞狐提供
只能找到CAD缺失自带的字体库,无法找到Windows底下的fons字体,全部提示miss缺失,哪个大神能帮忙改进下



[CommandMethod("t11", CommandFlags.Session)]
        public static void Test11()
        {
            var doc = Application.DocumentManager.Open(@"D:\Downloads\fm.dwg");
            var db = doc.Database;
            var ed = doc.Editor;
            var hostapp = HostApplicationServices.Current;
            using (doc.LockDocument())
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    var tstable = db.TextStyleTableId.GetObject(OpenMode.ForRead) as TextStyleTable;
                    foreach (ObjectId id in tstable)
                    {
                        var tstr = id.GetObject(OpenMode.ForRead) as TextStyleTableRecord;
                        ed.WriteMessage
                        (
                            "\n{0}:{1},{2}",
                            tstr.Name,
                            FindFontFile(db, tstr.FileName),
                            FindFontFile(db, tstr.BigFontFileName)
                        );
                    }
                }
            }
            ed.WriteMessage("\n");
        }

        public static string FindFontFile(Database db, string name)
        {
            var hostapp = HostApplicationServices.Current;
            if (name == "")
                return null;
            string fullname = "";
            try
            {
                fullname =
                    hostapp.FindFile
                    (
                        name,
                        db,
                        FindFileHint.FontFile
                    );
            }
            catch
            {
                fullname = name + " Missing";
            }
            return fullname;
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2020-10-24 22:54:08 | 显示全部楼层
本帖最后由 mkhsj928 于 2020-10-24 23:06 编辑
  1. <div class="blockcode"><blockquote>/// <summary>
  2.         /// 文字样式校正
  3.         /// </summary>
  4.         [CommandMethod("TSTVF")]
  5.         public static void MTextStyleVerify()
  6.         {
  7.             string sysFontsPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);//windows系统字体目录
  8.             DirectoryInfo sysDirInfo = new DirectoryInfo(sysFontsPath);//Windows系统字体文件夹

  9.             Document CurrentDoc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
  10.             Database CurrentDB = CurrentDoc.Database;
  11.             Editor CurrentEd = CurrentDoc.Editor;

  12.             using (Transaction tr = CurrentDoc.TransactionManager.StartTransaction())
  13.             {
  14.                 TextStyleTable tst = (TextStyleTable)tr.GetObject(CurrentDB.TextStyleTableId, OpenMode.ForRead, false);
  15.                 int n = 1;
  16.                 foreach (ObjectId tstid in tst)
  17.                 {
  18.                     using (TextStyleTableRecord tstr = (TextStyleTableRecord)tr.GetObject(tstid, OpenMode.ForWrite, false))
  19.                     {
  20.                         #region 校正windows系统字体
  21.                         if (tstr.Font.TypeFace != string.Empty)
  22.                         {
  23.                             string FontFileFullName = string.Empty;

  24.                             FileInfo[] fis = sysDirInfo.GetFiles(tstr.FileName);
  25.                             if (fis.Length > 0)
  26.                             {
  27.                                 FontFileFullName = fis[0].FullName;
  28.                             }
  29.                             else
  30.                             {
  31.                                 FontFileFullName = FindFontFile(CurrentDB, tstr.FileName);
  32.                             }

  33.                             if (FontFileFullName != string.Empty)
  34.                             {
  35.                                 using (PrivateFontCollection fc = new PrivateFontCollection())
  36.                                 {
  37.                                     try
  38.                                     {
  39.                                         fc.AddFontFile(FontFileFullName);

  40.                                         //更正文字样式的字体名
  41.                                         if (fc.Families[0].Name != tstr.Font.TypeFace)
  42.                                         {
  43.                                             tstr.Font = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor(
  44.                                                 fc.Families[0].Name, tstr.Font.Bold, tstr.Font.Italic,
  45.                                                 tstr.Font.CharacterSet, tstr.Font.PitchAndFamily
  46.                                                 );
  47.                                         }
  48.                                     }
  49.                                     catch (System.Exception e)
  50.                                     {
  51.                                         CurrentEd.WriteMessage($"\n***错误***:{FontFileFullName}-{e.Message}");
  52.                                     }
  53.                                 }
  54.                             }
  55.                             else
  56.                             {
  57.                                 //字体缺失,则用宋体代替
  58.                                 tstr.FileName = "SimSun.ttf";
  59.                                 tstr.Font = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("宋体", false, false, 134, 2);
  60.                             }
  61.                         }
  62.                         #endregion
  63.                         #region 校正shx字体
  64.                         else
  65.                         {
  66.                             if (!tstr.IsShapeFile &&
  67.                                 FindFontFile(CurrentDB, tstr.FileName) == string.Empty)
  68.                             {
  69.                                 tstr.FileName = "romans.shx";//用romans.shx代替
  70.                             }

  71.                             if (tstr.BigFontFileName != string.Empty &&
  72.                                 FindFontFile(CurrentDB, tstr.BigFontFileName) == string.Empty)
  73.                             {
  74.                                 tstr.BigFontFileName = "gbcbig.shx";//用gbcbig.shx代替
  75.                             }
  76.                         }
  77.                         #endregion
  78.                     }
  79.                 }

  80.                 tr.Commit();
  81.             }

  82.             CurrentEd.Regen();
  83.             CurrentEd.UpdateScreen();
  84.         }

  85.         private static string FindFontFile(Database db, string name)
  86.         {
  87.             var hostapp = HostApplicationServices.Current;

  88.             if (name == "") return string.Empty;

  89.             string fullname = string.Empty;
  90.             try
  91.             {
  92.                 fullname = hostapp.FindFile(name, db, FindFileHint.FontFile);
  93.             }
  94.             catch { }

  95.             return fullname;
  96.         }

回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-25 13:09:22 | 显示全部楼层
同求大神给予解决,谢谢
 楼主| 发表于 2020-10-27 08:27:21 | 显示全部楼层

非常感谢,非常感谢,非常感谢
发表于 2020-11-3 16:35:42 | 显示全部楼层
学习了,谢谢!
发表于 2020-11-30 13:36:34 | 显示全部楼层

刚好这个方法帮我解决了问题,非常感谢
发表于 2020-12-10 17:10:21 | 显示全部楼层
用teigha写了一个批量替换指定文件夹下面的字体的程序 不过针对的是我需要的三种字体
 楼主| 发表于 2021-1-24 15:10:46 | 显示全部楼层
本帖最后由 默写容颜 于 2021-1-24 15:14 编辑

1、CAD目录下有ltypeshp.shx形文件,但它不是字体文件,有可能是作图的人将其他字体改为这名字,无法替换

2、系统明明有新宋体和已经安装的字体如微软雅黑,它也是给你替换宋体


3、就是有些图纸它就是明明要繁体字体,这个字体我系统也是有的,它也是按你的指定宋体强制替换了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:17 , Processed in 0.154547 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表