我的两台电脑是win10的,(可能这个问题也存在在xp.win7.win8.......毕竟十年前我就遇到过了.......)

一台电脑的cad字体设置为"宋体",另一台电脑打开之后就变成了问号,这很奇怪....

以至于我很烦恼....

搜了一波之后,这个链接说的是对的 https://blog.csdn.net/tisn05/article/details/53063702

但是他只是找到了解决方案,没有找到问题原因

  • 原因

我用了e大告诉我的方法,在cmd上用  dir c:\windows\fonts\*.*  检查字体是否相同,

因为win字体文件夹有权限,所以我用pe (u盘装机进入的小系统)来替换字体,

第一次直接替换了没有受影响的电脑的所有字体,然后发现OK的.....

虽然这样可以结束了,但是我要具体分析到是什么字体导致的,免得再次出现同类情况,

然后就是排除法,每次把所有字体都分成几份,然后如果是错的...就再分它....重复开关电脑十来次.....

经过一晚上的排查,发现了一个字体:  KT_ST.ttf  导致的宋体问号....请大家删掉它....

(话外题,宋体比新宋体好!!原因是宋体没有字体偏移问题,详见我 的字体问题集合)

  • 代码的解决方案:

我的c#代码写得比链接多了点东西,主要是两台电脑相互保存的话,要能看见才行....

主函数: 部分代码是替换新宋体到宋体...没删,懒.....

AutoGo.ConfigTxtStyle ="宋体"

    public class Command_ChangNewSong : IAutoGo //接口是自动运行的接口,可以看我另一篇做这个接口的文章
{
public void Initialize()
{
ChangNewSong();//自执行一次
Application.DocumentManager.DocumentCreated += new DocumentCollectionEventHandler(ChangNewSong);
} public void Terminate()
{ }
public static void ChangNewSong(object sender = null, DocumentCollectionEventArgs e = null)
{
try
{
using (Application.DocumentManager.MdiActiveDocument.LockDocument())//锁文档
{
Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
ChangNewSongEnt(db);

//直接发送命令到cad命令栏 高版本发送命令刷新不了,只能发送延后的lisp...
                     SendToCad.SendLisp("(command \"REGENALL\")");

                }
}
catch
{ }
}
public static void ChangNewSongEnt(Database db)
{
//更改新宋体为宋体
bool songticunzai = false;//SD_宋体 存在
bool songticunzaiNew = false;//SD_新宋体 存在
string ttc = ".TTF"; using (Transaction tr = db.TransactionManager.StartTransaction())
{
var st = tr.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
foreach (ObjectId id in st)
{
if (id.IsOk())
{
var tstr = tr.GetObject(id, OpenMode.ForRead) as TextStyleTableRecord;
if (tstr.Name == "SD_" + AutoGo.ConfigTxtStyle)
{
songticunzai = true;
}
if (tstr.Name == "SD_新宋体")
{
songticunzaiNew = true;
}
if (tstr.Font.TypeFace != "")//缺失字体
{
string trypFace = tstr.Font.TypeFace.ToUpper();
//if (tstr.Name == "SD_宋体")
//{
// System.Windows.Forms.MessageBox.Show($"SD_宋体用了这个:{trypFace}");
//}
if (trypFace == "RS_Song".ToUpper() || trypFace == "SimSun".ToUpper())
{
tr.AddTextStyle(db, tstr.Name, AutoGo.ConfigTxtStyle + ttc);
}
}
}
}
if (!songticunzai) //没有就是可以改名称
{
foreach (ObjectId id in st)
{
if (id.IsOk())
{
var tstr = tr.GetObject(id, OpenMode.ForRead) as TextStyleTableRecord;
if (tstr.Font.TypeFace == "新宋体" && tstr.Name == "SD_新宋体")
{
tstr.UpgradeOpen();
tstr.Name = "SD_" + AutoGo.ConfigTxtStyle;
tstr.DowngradeOpen();
}
if (tstr.Font.TypeFace == "新宋体")
{
tr.AddTextStyle(db, tstr.Name, AutoGo.ConfigTxtStyle + ttc);
}
}
}
}
tr.Commit();
}
//防止ctrl+u回滚事务出错,改名字之后再改内容
using (Transaction tr = db.TransactionManager.StartTransaction())
{
if (songticunzai)
{
if (songticunzaiNew) //判断有没有 "SD_新宋体"
{
#if !HC2019
//文字样式
var stid = tr.AddTextStyle(db, "SD_新宋体", AutoGo.ConfigTxtStyle + ttc);
#else
//文字样式
var stid = tr.AddTextStyleToDatabase(db,"SD_新宋体", AutoGo.ConfigTxtStyle);
#endif
}
}
else
{
#if !HC2019
//文字样式
var stid = tr.AddTextStyle(db, "SD_" + AutoGo.ConfigTxtStyle, AutoGo.ConfigTxtStyle + ttc);
#else
//文字样式
var stid = tr.AddTextStyleToDatabase(db,"SD_" + AutoGo.ConfigTxtStyle, AutoGo.ConfigTxtStyle);
#endif
}
tr.Commit();
}
}
}

新建字体函数

        /// <summary>
/// 新建文字样式
/// </summary>
/// <param name="db"></param>
/// <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 AddTextStyle(this Transaction tr, Database db, string name, string smallfont, string bigfont = null, double xscale = , double height = )
{
ObjectId ida = ObjectId.Null; //获取已有这个名字的文字样式表记录
var st = tr.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
foreach (ObjectId id in st)
{
if (id.IsOk())
{
var tstr = tr.GetObject(id, OpenMode.ForRead) as TextStyleTableRecord;
if (tstr.Name == name)//有就打开,并修改内容
{
if (!string.IsNullOrEmpty(smallfont))//如果字体不设置,就只返回
{
tstr.UpgradeOpen(); tstr.FileName = smallfont;
if (bigfont == null)
{
tstr.BigFontFileName = "";
}
else
{
tstr.BigFontFileName = bigfont;
}
tstr.TextSize = height;
tstr.XScale = xscale; tstr.DowngradeOpen();
}
ida = id;
break;
}
}
}
//没有就新建一个
if (ida == ObjectId.Null)
{
TextStyleTableRecord tstr = new TextStyleTableRecord
{
Name = name,
FileName = smallfont, TextSize = height,
XScale = xscale
}; if (bigfont == null)
{
tstr.BigFontFileName = "";
}
else
{
tstr.BigFontFileName = bigfont;
}
st.UpgradeOpen();
ida = st.Add(tstr);
tr.AddNewlyCreatedDBObject(tstr, true);
st.DowngradeOpen();
}
return ida;
}

cad.net cad宋体问号 删除 KT_ST.ttf的更多相关文章

  1. CAD制图初学入门如何学好CAD?CAD大神总结5点诀窍,必须收藏

    现在有很多的小伙伴们都加入到了CAD这个大家庭中,一开始都是都是一脸懵的状态,更不知要从何入手! 小编才开始也是,但是只要掌握好CAD的技巧和脊髓,一切都不是事.CAD大神总结5点诀窍,悄悄告诉你,必 ...

  2. cad.net cad启动慢? cad2008启动慢? cad启动延迟? cad卡住? cad98%卡? 默认打印机!!

    默认打印机是不是联网打印机,如果cad找不到这个打印机将会很慢才打开cad的界面(它真的不是卡死了,而是找不到...) 奇妙的是桌子至今都没有利用新建线程的方式来控制这个打印机等待,而是直接在主程序上 ...

  3. cad问题小百科 持续更新

    一些浩辰的问题移步去: 浩辰问题        (浩辰可能和桌子具有相同的问题,所以这篇你可能还是要看 cad2007遇到了这种情况 安装问题安装CAD出现C++2005问题的解决方法,出现此问题,原 ...

  4. win10安装CAD失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装CAD失败或提示已安装,也有时候想重新安装CAD的时候会出现本电脑windows系统已安装CAD,你要是不留意直接安装CAD,只会安装CAD的附件或者直接提示失败 ...

  5. CAD安装未完成,某些产品无法安装的解决方法

    CAD提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装CAD失败提示CAD安装未完成,某些产品无法安装,也有时候想重新安装CAD的时候会出现本电脑window ...

  6. CAD卸载/完美解决安装失败/如何彻底卸载清除干净cad各种残留注册表和文件的方法

    在卸载cad重装CAD时发现安装失败,提示是已安装或安装失败.这是因为上一次卸载后没有清理干净,系统会误认为已经安装过了.有的同学是新装的系统也会出现安装失败的情况,这是因为C++ 或者.NET的原因 ...

  7. CAD 卸载工具,完美彻底卸载清除干净cad各种残留注册表和文件

    CAD提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装CAD失败提示CAD安装未完成,某些产品无法安装,也有时候想重新安装CAD的时候会出现本电脑windows ...

  8. 如何在前端通过JavaScript创建修改CAD图形

    背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结.CAD_DWG图Web可视化一站式解决方案-唯杰地图-vjmap中讲解了如何把CAD的DWG格式的图纸Web可视化的方案,那在Web ...

  9. CAD教程/视频教程/软件类专题资料免费下载整理合集

    CAD教程&视频教程类专题资料免费下载 资源列表:http://www.xiaodianlv.com/group/cad/ [1] <AUTOCAD2012中文版全套视频教程大合集> ...

随机推荐

  1. elementui 自定义表头 renderHeader的写法 给增加el-tooltip的提示

    1.html <el-table-column prop="taxes" :render-header="renderHeader" width=&quo ...

  2. Spring常用注解之一

    Spring中的常用注解 @Component 把普通 pojo 实例化到 Spring 容器中,相当于配置文件中的 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller. ...

  3. android studio学习----创建模拟器

    建议在创建模拟器前把 SDK Manager 中的 Tools.Extras 都更新到最新. 如何弹出下面的各个图,首先直接点击  运行  然后会选择  launcher ,点击那个 ...就出来了 ...

  4. 【spring data jpa】带有条件的查询后分页和不带条件查询后分页实现

    一.不带有动态条件的查询 分页的实现 实例代码: controller:返回的是Page<>对象 @Controller @RequestMapping(value = "/eg ...

  5. The field file exceeds its maximum permitted size of 1048576 bytes.

    问题原因:Spring Boot内置tomcat限制了请求文件的大小 下面是修改方法:根据自己的Spring Boot版本 2.0之后版本的修改方式 在主配置文件 application.proper ...

  6. Bean的一生(Bean的生命周期)

    1. 什么是Bean? Bean是spring中组成应用程序的主体及由spring IoC容器所管理的对象(IoC容器初始化.装配及管理的对象).如果把spring比作一座大型工厂,那么bean就是该 ...

  7. Maven编译过程中出现的问题

    在用Jenkins编译Gitlab上代码过程中,实际使用的是Maven服务器上的打包命令,以下为打包过程中出现的问题及解决方案 问题一:Maven无法编译Snapshot版本代码 答:登录至maven ...

  8. C++负数类型转换,-1对256取模

    最近在读C++ primer的时候,发现p32上写道:当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数.因此,把-1赋值给8比特大小的unsigned c ...

  9. Manacher算法(马拉车)求最长回文子串

    Manacher算法求最长回文字串 算法思路 按照惯例((・◇・)?),这里只是对算法的一些大体思路做一个描述,因为找到了相当好理解的博客可以参考(算法细节见参考文章). 一般而言,我们的判断回文算法 ...

  10. vue中axios的简单使用

    我们一般在用jq的时候会使用到ajax来进行与服务器之间的交流,vue中也提供了相应的类似于ajax的方法-axios来进行与服务器之间的数据传递 现在的这篇是最简单的使用,后续会添加上来复杂的使用 ...