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 比例下效果最标准。

相关推荐
开开心心就好19 分钟前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
波力海苔夹心脆67529 分钟前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
何以解忧唯有撸码7 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
阿松爱学习17 小时前
【Unity开发】局部区域截图功能实现
unity·c#
zhanghaha131418 小时前
C# 系列教程_1 基础语法篇(面向新手系统教程)
开发语言·c#
昂好的day19 小时前
固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
开发语言·c#
淡海水1 天前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章114-视觉与http通讯
图像处理·人工智能·opencv·计算机视觉·c#
波力海苔夹心脆6751 天前
C# 委托与事件详解:委托声明、Action/Func、多播、event 与 EventHandler 入门教程
开发语言·c#·.net·上位机·委托·事件
He BianGu2 天前
【笔记】C# 中BindingFlags的详细作用
笔记·c#