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;
}
}
(完)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)