cpp
string sltscale = Application.GetSystemVariable("LTSCALE").ToString();
ltscale = double.Parse(sltscale);
Application.SetSystemVariable("LTSCALE", 1000);
这段代码是CAD二次开发中非常典型的「系统变量备份-临时修改-执行逻辑-还原」范式,核心作用是统一纵断面图中点划线、虚线等非连续线型的显示效果,同时不破坏用户原图纸的设置。
一、先明确核心概念:LTSCALE
LTSCALE 是 AutoCAD/中望CAD 的全局线型比例因子系统变量,控制图纸中所有非连续线型(中心线、虚线、点划线等)的疏密程度:
- 数值越大,线型中的线段和间隔越长,图案越稀疏;
- 数值越小,线段和间隔越短,图案越密集;
- 它是全局生效的,修改后图纸里所有使用非连续线型的对象都会同步变化。
在管线纵断面图中,井中心线、交叉管线引出线等都使用了 CENTER(中心线)点划线线型,线型比例是否合适直接决定出图是否规范美观。
二、逐行代码解释
1. 读取并备份原始线型比例
csharp
string sltscale = Application.GetSystemVariable("LTSCALE").ToString();
Application.GetSystemVariable("LTSCALE"):调用CAD .NET API,读取当前图纸的LTSCALE系统变量值,返回类型为object。.ToString():将读取到的数值转为字符串,暂存到sltscale变量中。- 作用:先把用户图纸原本的线型比例存下来,命令结束后要原样还原,不能因为运行插件就永久修改用户的绘图环境。
2. 转换为数值类型
csharp
ltscale = double.Parse(sltscale);
- 将字符串格式的比例值解析为
double数值类型,存入字段ltscale。 - 作用:后续还原系统变量时需要传入数值类型,同时数值类型才能参与计算(这段代码没做计算,主要用于还原)。
3. 临时修改全局线型比例为1000
csharp
Application.SetSystemVariable("LTSCALE", 1000);
SetSystemVariable是写入系统变量的API,直接把全局线型比例强制设为1000。- 为什么设为1000 :
- 纵断面默认横向比例尺为 1:1000,CAD行业惯例是「全局线型比例 = 出图比例尺分母」,这样打印出来的点划线、虚线长短刚好符合制图规范;
- 不同用户的图纸设置差异极大(有人设1,有人设100,有人设500),如果不统一,同一条中心线在不同图纸里可能密得像实线,也可能疏得看不出是点划线,临时固定值能保证纵断面生成效果完全一致。
三、配套的设计:finally 还原机制
这段代码放在 try 块中,在方法末尾的 finally 块里有对应的还原代码:
csharp
finally
{
Application.SetSystemVariable("LTSCALE", ltscale);
}
这是CAD插件开发的标准规范:
- 无论命令正常执行完成,还是中途报错、用户取消操作,
finally块一定会执行; - 保证命令结束后,图纸的
LTSCALE会恢复成用户原本的值,不会污染用户的绘图环境。
四、补充说明
- 适用场景 :这段逻辑只针对模型空间 绘图生效;如果是布局(图纸空间)出图,还需要配合
PSLTSCALE系统变量使用。 - 仅影响非连续线型 :实线(Continuous)不受
LTSCALE影响,所以井轮廓、管线实线等不会变化。 - 和比例尺的联动:代码里所有线宽、文字高度、表格尺寸都和横向比例尺联动缩放,线型比例也同步匹配1000的默认比例,保证整体出图效果协调。
对,你的理解是正确的。`LTSCALE 完全不控制图面缩放比例尺,它只负责控制线型的显示与打印效果,和图形整体的放大缩小、出图比例是两个完全不同的概念。
下面把几个容易混淆的概念彻底区分开:
一、LTSCALE 的本质:线型图案的缩放系数
CAD 里的非连续线型(中心线、虚线、点划线等),本质上是一个「重复的图案单元」:比如 CENTER 线型,定义的是「长线段 + 短间隔 + 点 + 短间隔」这样一个基础单元。
LTSCALE 就是这个基础单元的全局放大倍数:
LTSCALE = 1:图案按原始定义大小显示,线段和间隔都很短;LTSCALE = 1000:整个图案单元放大 1000 倍,线段和间隔都变长 1000 倍。
它只改变「线型图案的疏密」,不会改变图形的实际坐标尺寸,也不会让整张图变大变小。
举个例子:
一条 1000 米长的中心线,LTSCALE=1 时,里面可能有上百个点划重复;LTSCALE=1000 时,可能只有一两个点划。但这条线的长度永远是 1000 米,不会变。
二、和「图面缩放」的本质区别
你说的「图面缩放比例尺」,通常对应 CAD 里两种概念,都和 LTSCALE 无关:
| 概念 | 作用 | 是否改变图形真实属性 | 和 LTSCALE 的关系 |
|---|---|---|---|
| 视图缩放(ZOOM) | 只是拉近/拉远你的观察视角,相当于放大镜 | 完全不改变 | 毫无关系,缩放视图不会影响线型比例 |
| 出图比例尺(1:1000、1:100) | 打印图纸时的比例,决定图纸上 1mm 对应实地多少米 | 不改变图形坐标,只控制打印输出 | 需要匹配:LTSCALE 通常设为出图比例分母,保证打印出来的线型大小符合规范 |
三、结合这段代码的场景:为什么设成 1000
这段代码里把 LTSCALE 临时改成 1000,正是为了匹配纵断面默认的 1:1000 横向出图比例。
行业制图有个通用惯例:
模型空间 1:1 绘图,全局线型比例 LTSCALE = 出图比例尺分母
这样最终按 1:1000 打印时,中心线、虚线的线段长度和间隔大小,刚好符合市政管线制图标准的要求(比如打印出来的点划线线段长 3~5mm)。
如果不统一设置:
- 用户图纸 LTSCALE 设成 1,画出来的中心线会密得像实线;
- 用户图纸 LTSCALE 设成 10000,中心线可能整条线就一个点,根本看不出是点划线。
所以这段代码的目的就是:在生成纵断面的过程中,强制统一线型比例,保证无论用户原图怎么设置,生成的纵断面图线型效果都是标准的,命令结束后再还原回去,不影响用户原有设置。
四、补充:一个容易踩的坑
这段代码里 LTSCALE 是写死的 1000,但纵断面的横向比例尺 hScale 是用户可以输入的(比如可以输 500、2000)。
严格来说,更合理的写法应该是和横向比例尺联动:
csharp
Application.SetSystemVariable("LTSCALE", hScale);
这样无论用户选 1:500 还是 1:2000 的比例,打印出来的线型疏密都是一致的。当前写死 1000 属于简化实现,只在默认 1:1000 比例下效果最标准。