1
shareDialogService.ShowDialogModal(nameof(SettingView), para, r => { });
shareDialogService.ShowDialogModal(
"SettingView", → 打开哪个窗口
para, → 带什么数据过去
r => { } → 窗口关了之后干啥(这里啥也不干)
);
2
csharp
{
//配置参数
shareDialogService.ShowDialogModal(nameof(SettingView), para, async r =>
{
}, "notitle");
}
参数 4:"notitle"弹窗样式标识:隐藏标题栏,无关闭按钮、无标题文字;
常见配套标识:"normal"(正常带标题)、"min"、"fullscreen" 等。
3
没懂 dialogService.ShowDialogModal(nameof(NewView), r => nameof(NewView)
nameof(NewView) 就是字符串 "NewView"。
csharp
nameof(NewView) → 等同于写 "NewView"
框架收到这个字符串,去容器里找到对应的 View 和 ViewModel,创建出来显示。
4
if (NewProduct != null)
{
NewProduct.ScanDirection = value;
OnPropertyChanged();
} value?
value 是 C# 的关键字,就是你赋给它的值:
csharp
ScanDirectionIndex = 0; // value = 0
ScanDirectionIndex = 2; // value = 2
你选 ComboBox "左上"(第0个),SelectedIndex 变成 0,自动调 setter,value 就是 0。
5
fov?
FOV = Field of View(视野/视场)
在 XRay 这个工业 X 射线检测设备中,FOV 指的是 检测视野面板,是导航图上用于标记 X 射线扫描覆盖区域的矩形框。
项目中的 FOV
| 方面 | 说明 |
|---|---|
| 控件 | XRayFovBoardControl.xaml --- 紫色矩形面板 |
| 颜色系 | 紫色 #702caf(边框 #60702caf,填充 #33702caf) |
| View/VM | XRayFovBoardControl.xaml / XRayFovBoardViewModel.cs |
| 配置开关 | PDModeConfig.ShowFov = true --- 生产模式下显示 FOV 边框 |
为什么 FOV 单独特化
FovConverter 是 FOV 专用的背景色转换器,和普通元件用的 MultiConverter 分开。区别在于:
- 普通元件 :扫描/重建时显示橙褐色
#80d87a16 - FOV 面板 :扫描/重建时始终透明 --- 因为它只是一个区域标记框,不需要像元件一样高亮填充
FOV 的核心作用是告诉操作员"当前正在检测哪个区域",而不是表示检测结果,所以它的视觉表现更低调。
6
- PCB 电子制造(机械三点定位)
PCB机械三点定位详细解释(SMT/检测治具通用)
一、作用核心逻辑
一块PCB是平面薄板,机械固定只靠1点会旋转、2点会左右滑动;3个不共线的定位点能唯一锁定一块板子的平面位置,完全限制6个自由度(上下、左右、前后、旋转、倾斜、偏移),设备才能精准贴元件、X光检测、分板、测试。
二、PCB上的定位点两种形式
1. 定位孔(最常用,机械销钉定位)
PCB出厂前蚀刻3个圆孔,分布在板子对角/边缘,三点连线形成三角形,不能排成一条直线。
设备载具上有3根金属定位销,PCB放上去后销钉穿进定位孔,卡死板子:
- 2个孔限制左右、前后平移;
- 第三个孔杜绝板子绕前两孔旋转;
最终板子每次放置坐标完全一致,不会偏位。
2. Mark点(光学三点定位,你做X光检测上位机最常用)
就是电路板上圆形铜基准点,分全局MARK ,一般设计3颗,对应三点定位逻辑:
X光机、SMT贴片机相机拍照抓取3个Mark坐标,设备软件根据三点坐标自动算出PCB当前偏移、旋转角度,补偿运动轴,实现精准对位。
三、为什么必须是3点,不能2点/4点?
- 2点定位缺陷
两点只能固定直线位置,PCB能绕两点连线转圈,轻微旋转就会导致元件贴偏、X光检测图像错位,BGA、IGBT检测直接报废。 - 3点最优
最少数量、最低成本,完全锁死平面位置,治具加工、相机算法计算最简单;工业标准首选。 - 4点多余
四点容易出现加工公差导致板子压变形,增加计算量,只有超大尺寸PCB才会辅助加支撑点,基准定位仍以3个主Mark为准。
四、和你工作相关场景(X光半导体检测设备)
你开发的X光/CT检测设备,DBC基板、BGA、QFN、IGBT检测流程:
- 相机拍摄PCB上3个基准Mark点;
- 上位机软件读取三点像素坐标,通过三点定位算法计算板子实际旋转、XY偏移;
- 自动控制平台轴移动补偿偏差,保证CT断层扫描、焊点尺寸测量坐标统一;
- 如果只用2个Mark,板子轻微旋转后,芯片焊点坐标全部计算错误,良率分析数据失真。
五、工艺硬性要求
- 三点禁止共线,尽量分散在电路板三个角落,三角形面积越大,定位精度越高;
- 三个定位孔/Mark尺寸统一,避免识别、卡料偏差;
- 治具销钉、相机视觉三点定位配套使用:机械粗定位+光学三点精定位。
六、简单总结
PCB机械三点定位,本质用不共线三个基准点消除电路板平移、旋转偏差,是SMT贴片、X光半导体检测、电路板测试的基础对位方案,是上位机视觉坐标换算的核心依据。
7
寸动距离
寸动距离(JOG Step / 步进距离)
一、核心定义
工业数控、运动控制、起重设备术语,英文常称 Jog Step Distance :
单次触发寸动(点动/步进)指令时,轴固定移动的预设位移值 。
分两种寸动模式,对应两种"寸动距离"含义:
- 步进寸动(点一次走固定长度)
按一下方向键/按钮,轴自动走完设定寸动距离后立刻停止;再按再走一段,适合精密微调对位。
例:寸动距离设0.1mm,点一次X+,X轴精确移动0.1mm停下。 - 连续寸动(按住就走)
部分控制器参数里的"寸动距离"为单次最长移动限位,按住按键持续低速运动,松开即停,不会超出该距离,防止撞机。
二、参数换算逻辑
寸动距离由控制器脉冲参数换算得出:
寸动距离=寸动脉冲数÷每毫米脉冲数\text{寸动距离} = \text{寸动脉冲数} \div \text{每毫米脉冲数}寸动距离=寸动脉冲数÷每毫米脉冲数
- 每毫米脉冲:丝杆导程、电机细分决定;
- 修改寸动距离只需修改HMI/参数表里的长度数值,控制器自动换算脉冲输出。
三、常见取值范围
- 精密设备(半导体检测、CNC、视觉对位):0.001mm ~ 1mm
- 普通机床、自动化流水线:0.1mm ~ 10mm
- 行车、起重机重载对位:2mm ~ 100mm(最小可3mm微寸动)
四、作用场景
- 模具、工件、相机Mark点精准对位;
- 换模、调试前低速短距离试运行,避免碰撞;
- 重载起重微调吊具位置,降低操作难度;
- 设备回零、坐标偏移修正。
五、易混区分
- 寸动距离(Step):点一下固定走一段,定量微调;
- 寸动速度(JOG速度):寸动模式下轴运行快慢,和距离无关;
- 连续点动(自由JOG):无固定寸动距离,按住持续移动。
8
背钻主钻孔
背钻主钻孔(PCB背钻工艺:主钻=一次通孔钻)
一、定义区分
1. 主钻孔(一钻/主钻)
背钻流程里第一道钻孔工序 ,行业简称主钻:
- 用小号钻头,一次性钻穿整板,生成完整PTH电镀通孔;
- 孔径为有效导电孔径,孔壁后续沉铜、电镀,实现全层导通;
- 作用:建立层间导电通道,是背钻的基础孔;
- 俗称:一次钻、通孔主钻。
2. 背钻孔(二钻/背钻)
主钻电镀完成后的二次定深钻孔:
- 钻头直径比主钻大0.15~0.3mm;
- 从板子反面(无信号层一侧)精准控深钻削;
- 目标:把通孔多余的铜柱(残桩Stub)钻掉,只保留需要导通的孔段;
- 不能钻穿、不能伤到目标导通层,预留安全残桩(5~10mil)。
二、完整工艺流程(主钻+背钻)
- 主钻孔(核心第一步)
CNC钻机按Gerber钻孔文件钻通整板,形成原始通孔; - 沉铜+全板电镀,通孔内壁镀铜,全层电气连通;
- 背钻孔(二次加工)
大钻头对位原主钻孔,反向定深钻除无用铜壁; - 清洗、蚀刻去除钻屑,保留有效导电段。
三、核心参数对比
| 项目 | 主钻孔(一次钻) | 背钻孔(二次钻) |
|---|---|---|
| 钻孔顺序 | 第一道基础工序 | 电镀后二次加工 |
| 钻头大小 | 基础小孔(成品导电孔径) | 比主钻大0.15~0.3mm |
| 钻孔深度 | 贯穿整板 | 可控深度,不钻到目标导通层 |
| 孔壁铜 | 完整保留,导电 | 多余铜壁被钻除,仅上段有铜 |
| 功能 | 建立层间导电通路 | 消除过孔残桩,优化高速信号完整性 |
四、为什么必须分主钻+背钻,不能直接定深盲孔?
- 成本更低:无需顺序压合盲埋孔,多层背板、高速服务器板首选;
- 布线灵活:通孔布线自由度高,再背钻切除多余残桩;
- 适用场景:10G/25G/56G高速差分、PCIe、光纤信号,残桩过长会引发反射、眼图恶化、EMI干扰。
五、设计与生产关键要求
- 孔径搭配:背钻孔径 ≥ 主钻孔径+0.15mm,保证完全切除铜壁;
- 残桩控制:行业标准剩余Stub<10mil(0.25mm);
- 深度公差:±0.05mm,过深会切断有效层铜箔,造成开路;
- 设计标注:PCB文件需分开输出主钻钻孔层 、背钻钻孔层,标注背钻起止层。
六、通俗总结
主钻孔是打底的完整通孔,背钻是反向扩孔修掉没用的铜柱子;没有主钻,就不存在背钻。
高速PCB里说"背钻孔",整套结构都要先做主钻通孔,再二次背钻。
通俗拆解:残桩Stub、主钻通孔、背钻去除多余铜柱
1. 先搞懂:通孔做完是什么样子(只主钻、不背钻)
一块多层PCB,比如8层板,只做一次主钻通孔 :
钻头直接钻穿所有板材,沉铜电镀后,整个孔内壁全部镀上铜,整根孔从头到尾全导电。
假设需求:信号只需要第1层 ↔ 第4层 导通,5~8层不需要连这条线路。
此时通孔结构:
- 1~4层:有用,需要保留铜壁导电;
- 4~8层:一整段空心铜管子悬空,没有任何线路连接,这一段悬空铜壁就叫残桩Stub。
这段悬空铜柱等于一根无用短截传输线,高速信号走的时候会产生信号反射、干扰、眼图变差,高速板必须删掉。
2. 背钻怎么"只保留需要导通的孔段"
- 主钻先钻通整板,电镀完整铜壁;
- 从板子背面(第8层那一面)用更大钻头对准原孔,精准控制钻孔深度;
- 钻削深度刚好钻到第4层下方一点点,把4~8层那一段多余的铜管壁全部钻碎清除;
- 严格控制不能钻穿到1~4层区域,这一段铜壁完整保留,维持1-4层导通。
3. 一句话直白总结
通孔电镀后整根孔全是铜,不需要导通的下半截铜管子就是残桩;
背钻从反面定深钻掉下半截无用铜柱,只留下上层需要导电的那段铜壁,消除高速信号干扰。
补充示意图文字版
不背钻:
层1\]铜 → \[层4\]铜 → 【残桩铜柱】→ \[层8
背钻后:
层1铜 → 层4铜 (到此截止),下方残桩全部钻空无铜
9
代码逐行解析(C#)
完整代码
csharp
if (values[9] is bool d && d)
{
status |= ShapeStatus.DrillConfigured;
}
}
逐行拆解
-
if (values.Length >= 10)判断数组
values长度是否大于等于10,保证下标9存在 ,防止索引越界报错。数组下标从0开始,第10个元素对应索引
9。 -
values[9] is bool dC# 模式匹配语法:
- 校验
values[9]的数据类型是否为bool; - 如果是,把值取出赋值给局部变量
d; - 类型不匹配时,整个表达式直接返回
false,不会进入内层逻辑。
- 校验
-
&& d类型匹配通过后,再判断布尔值是否为
true。只有
values[9]是布尔true才满足条件。 -
status |= ShapeStatus.DrillConfigured;位运算赋值:等价于
status = status | ShapeStatus.DrillConfiguredShapeStatus是枚举,标记图形状态;|=给status追加「钻孔已配置」状态位,不清除原有其他状态。
逻辑总结
当满足全部3个条件时,给图形状态打上钻孔配置标记:
- values数组至少有10个元素;
- 第10个元素(索引9)是布尔类型;
- 该布尔值为true。
等价老式写法(无模式匹配,兼容低版本C#)
csharp
if (values.Length >= 10)
{
object val = values[9];
if (val is bool)
{
bool d = (bool)val;
if (d)
{
status = status | ShapeStatus.DrillConfigured;
}
}
}
简化优化写法
csharp
if (values.Length >= 10 && values[9] is true)
{
status |= ShapeStatus.DrillConfigured;
}
is true 直接同时完成类型校验+真值判断,省去中间变量。