LTSCALE

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. 纵断面默认横向比例尺为 1:1000,CAD行业惯例是「全局线型比例 = 出图比例尺分母」,这样打印出来的点划线、虚线长短刚好符合制图规范;
    2. 不同用户的图纸设置差异极大(有人设1,有人设100,有人设500),如果不统一,同一条中心线在不同图纸里可能密得像实线,也可能疏得看不出是点划线,临时固定值能保证纵断面生成效果完全一致。

三、配套的设计:finally 还原机制

这段代码放在 try 块中,在方法末尾的 finally 块里有对应的还原代码:

csharp 复制代码
finally
{
    Application.SetSystemVariable("LTSCALE", ltscale);
}

这是CAD插件开发的标准规范:

  • 无论命令正常执行完成,还是中途报错、用户取消操作,finally 块一定会执行;
  • 保证命令结束后,图纸的 LTSCALE 会恢复成用户原本的值,不会污染用户的绘图环境。

四、补充说明

  1. 适用场景 :这段逻辑只针对模型空间 绘图生效;如果是布局(图纸空间)出图,还需要配合 PSLTSCALE 系统变量使用。
  2. 仅影响非连续线型 :实线(Continuous)不受 LTSCALE 影响,所以井轮廓、管线实线等不会变化。
  3. 和比例尺的联动:代码里所有线宽、文字高度、表格尺寸都和横向比例尺联动缩放,线型比例也同步匹配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 比例下效果最标准。

相关推荐
Behaviour25 分钟前
Unity 手游网络同步技术
网络·unity·c#·游戏引擎
LccKyI1 小时前
# C# 基础编程 面试题汇总(一)
开发语言·c#
祀爱1 小时前
C# MQTT 连接服务
后端·c#·.net
LccKyI2 小时前
C#基础编程 面试题汇总(二)
java·面试·c#
Behaviour14 小时前
Unity UI循环列表UIScrollViewContent实现
ui·unity·c#·游戏引擎
c#上位机14 小时前
C#上位机项目实战——C#的dll项目编译时拷贝到指定目录下
开发语言·c#
曹牧15 小时前
C#:数组与列表的差异
开发语言·c#
何以解忧唯有撸码15 小时前
Winform上位机也能写出媲美Avalonia的界面
c#·源码·自定义控件
格林威18 小时前
C#图像快速剪切:使用OpenCvSharp和Halcon优化图像剪切和CPU占用
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机