cad.net 宋体问号 删除 KT_ST.ttf

疑问

两台电脑是win10的,这个问题也可能存在xp.win7.win8...

电脑A的cad字体设置为"宋体",电脑B打开之后就变成了问号,这很奇怪.
这个链接说的是对的 https://blog.csdn.net/tisn05/article/details/53063702
但是他只是找到了解决方案,没有找到问题原因.

我用了edata告诉我的方法,
运行cmd检查字体是否相同: dir c:\windows\fonts\*.*

因为win字体文件夹有权限,所以我用pe系统(装机的小系统)来替换字体,
第一次直接替换了没有受影响的电脑的所有字体,
然后发现OK的,虽然这样就可以结束了,
但是我要找出什么字体导致的,免得再次出现同类情况.
然后就是二分法排除,然后如果是错的就再分它.
重复开关电脑十来次,没有虚拟机,懒...
发现字体: KT_ST.ttf 是导致的宋体问号的元凶,手动删除就好了.

代码

接着我们写一个自动替换字体样式的代码吧.
详见字体问题集合

public class ChangeNewSongCommands {
    [IFoxInitialize]
    public void Initialize() {
        DocumentCreated(); // 自执行
        Acap.DocumentManager.DocumentCreated += DocumentCreated;
    }

    private void DocumentCreated(object sender = null, DocumentCollectionEventArgs e = null) {
        try {
            Document doc;
            if (e is not null) {
                doc = e.Document;
            }
            else {
                var dm = Acap.DocumentManager;
                doc = dm.MdiActiveDocument;
            }

            HostApplicationServices.WorkingDatabase = doc.Database;
            using var tr = new DBTrans(doc, docLock: true);

            // 新宋体为宋体,
            // 改的都是字体设置,不是样式名,因为同名存在冲突.
            var tsMap = TextStyleMap();
            // 样式名
            var list = new List<string>() { "新宋体", "SD_新宋体" }
            foreach(var item in list) {
                if (tsMap.ContainsKey(item))
                    AddOrUpdateTextStyle(tsMap, item, "宋体.ttf");
            }
            // 字体名
            list.Clear();
            list.Add("RS_Song".ToUpper());
            list.Add("SimSun".ToUpper());
            // 此处是转大写匹配的,不能map
            tr.TextStyleTable.ForEach(tstr => {
               if (!list.ContainsKey(tstr.Font.TypeFace.ToUpper()))
                   continue;
               AddOrUpdateTextStyle(tsMap, tstr.Name, "宋体.ttf");
            });

            // 如果不存在就创建新的字体样式
            // 防止ctrl+u回滚事务出错,改名字之后再改内容
            AddOrUpdateTextStyle(tsMap, "SD_新宋体", "宋体.ttf");

            // 高版本发送命令刷新不了,只能用Lisp
            SendToCad.SendLisp("(command \"REGENALL\")");
        }
        catch {}
    }

    // 获取文字样式map
    // 因为Acad08索引器有IsErased属性的,所以要自己首次缓存.
    public static Dictionary<string, ObjectId> TextStyleMap(bool getFonstName = false) {
        var tr = DBTrans.Top;
        var map = new Dictionary<string, ObjectId>();
        using var st = (TextStyleTable)tr.GetObject(db.TextStyleTableId) {
            foreach (ObjectId id in st) {
                if (!id.IsOk()) continue;
                using var tstr = (TextStyleTableRecord)tr.GetObject(id) {
                    var key = getFonstName ? tstr.Font.TypeFace : tstr.Name;
                    if (!map.ContainsKey(key))
                        map.Add(tstr.Name, id);
                }
            }
        }
        return map;
    }

    /// <summary>
    /// 新建文字样式
    /// </summary>
    /// <param name="name">样式名</param>
    /// <param name="smallfont">字体名</param>
    /// <param name="bigfont">大字体</param>
    /// <param name="height">高度</param>
    /// <param name="xscale">宽度因子</param>
    /// <returns></returns>
    public static ObjectId AddOrUpdateTextStyle(Dictionary<string, ObjectId> textStyleMap,
        string name, string smallfont, 
        string bigfont = null, double xscale = 1, double height = 0) {
        var tr = DBTrans.Top;
        bigfont = bigfont is null ? "" : bigfont;

        // 含有但不设置,就只返回
        if (textStyleMap.ContainsKey(name) && string.IsNullOrEmpty(smallfont))
            return textStyleMap[name];

        // 含有就改设置
        if (textStyleMap.ContainsKey(name)) {
            using var tstr = (TextStyleTableRecord)tr.GetObject(_tsMap[name]);
            tstr.UpgradeOpen();
            tstr.FileName = smallfont;
            tstr.BigFontFileName = bigfont;
            tstr.TextSize = height;
            tstr.XScale = xscale;
            return textStyleMap[name]; 
        }

        // 不含有,就创建
        var tstr = new TextStyleTableRecord {
            Name = name,
            FileName = smallfont,
            TextSize = height,
            XScale = xscale
        };
        tstr.BigFontFileName = bigfont;

        using var st = (TextStyleTable)tr.GetObject(tr.Database.TextStyleTableId);
        st.UpgradeOpen();
        var resultObjectId = st.Add(tstr);
        tr.AddNewlyCreatedDBObject(tstr, true);
        // 加入缓存
        textStyleMap.Add(tstr.Name, resultObjectId);
        return resultObjectId;
    }
}

(完)

posted @   惊惊  阅读(1806)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示