<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[PCB 行业]]></title> 
<atom:link href="https://emlog.camw.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[使用emlog搭建的站点]]></description>
<link>https://emlog.camw.cn/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>C# PaddleOCRSharp 详细使用教程</title>
    <link>https://emlog.camw.cn/?post=10</link>
    <description><![CDATA[<p>C# PaddleOCRSharp 详细使用教程<br />
PaddleOCRSharp 是基于百度 PaddleOCR 封装的 .NET 离线 OCR 库，支持 Windows，开箱即用，无需安装 Python，可识别简体 / 繁体、中英文、数字、印章、倾斜文本，本文从环境配置、安装、基础使用、高级用法、常见问题完整讲解。<br />
一、环境要求<br />
系统：Windows 7/10/11（x64）<br />
.NET 框架：.NET Framework 4.6.1+ /.NET Core 3.1 /.NET 5/6/7/8<br />
项目平台：必须设置为 x64（AnyCPU 会报错，因为底层是 C++ 库）<br />
二、NuGet 安装<br />
方式 1：NuGet 包管理器搜索安装<br />
核心包：PaddleOCRSharp<br />
模型包（二选一，内置推理模型）：<br />
轻量版：PaddleOCRSharp.ModelsLite（体积小，速度快）<br />
完整版：PaddleOCRSharp.Models（识别更精准，体积大）<br />
方式 2：NuGet 命令行</p>
<pre><code>powershell
Install-Package PaddleOCRSharp
Install-Package PaddleOCRSharp.ModelsLite</code></pre>
<p>安装后自动复制模型文件到输出目录，无需手动放模型。<br />
三、核心类说明<br />
OCRParameter：OCR 参数配置（是否检测、是否识别、角度、语言等）<br />
PaddleOCRSharp.OCR：OCR 核心实例，用于识别<br />
OCRResult：识别结果，包含文本、置信度、坐标、角度等<br />
四、完整基础示例（控制台）</p>
<ol>
<li>项目配置<br />
右键项目 → 属性 → 生成 → 平台目标：x64</li>
<li>代码<br />
csharp<br />
运行<br />
c```csharp<br />
using System;<br />
using PaddleOCRSharp;</li>
</ol>
<p>namespace PaddleOCRSharpDemo<br />
{<br />
class Program<br />
{<br />
static void Main(string[] args)<br />
{<br />
// 1. 初始化OCR参数<br />
OCRParameter ocrParam = new OCRParameter<br />
{<br />
use_angle_cls = true,      // 开启角度检测，识别倾斜文字<br />
cls = true,                // 开启方向分类<br />
det = true,                // 开启文本检测<br />
rec = true,                // 开启文本识别<br />
lang = &quot;ch&quot;,               // 语言：ch中文，en英文<br />
cpu_threads = 4            // CPU线程数，根据CPU核心调整<br />
};</p>
<pre><code>        // 2. 创建OCR实例
        using (OCR ocr = new OCR(ocrParam))
        {
            // 3. 识别图片
            string imgPath = @"D:\test.png";
            OCRResult result = ocr.DetectText(imgPath);

            // 4. 解析结果
            Console.WriteLine($"识别到 {result.TextBlocks.Count} 个文本块");
            foreach (var block in result.TextBlocks)
            {
                Console.WriteLine($"文本：{block.Text}");
                Console.WriteLine($"置信度：{block.Confidence:F4}");
                Console.WriteLine($"坐标：{string.Join(",", block.BoxPoints)}");
                Console.WriteLine("————————————");
            }
        }

        Console.ReadKey();
    }
}</code></pre>
<p>}</p>
<pre><code>
五、高级用法
1. 识别 Bitmap 图片（内存识别，不保存文件）
```csharp
csharp
运行
using System.Drawing;

// 加载Bitmap
using (Bitmap bmp = new Bitmap(@"D:\test.png"))
{
    OCRResult result = ocr.DetectText(bmp);
}</code></pre>
<ol start="2">
<li>只识别单行文本（不检测，速度极快）<br />
适合身份证号码、验证码、单行文字，关闭 det 检测
<pre><code class="language-csharp">csharp
运行
OCRParameter ocrParam = new OCRParameter
{
det = false,  // 关闭检测
rec = true,
use_angle_cls = false
};
// 单行识别，直接返回文本
string text = ocr.RecognizeTextSingleLine(bmp);</code></pre></li>
<li>识别印章文字
<pre><code class="language-csharp">csharp
运行
OCRParameter ocrParam = new OCRParameter
{
use_stamp = true, // 开启印章识别
use_angle_cls = true
};</code></pre></li>
<li>繁体识别
<pre><code class="language-csharp">csharp
运行
ocrParam.lang = "chinese_cht";</code></pre></li>
<li>批量识别文件夹图片
<pre><code class="language-csharp">csharp
运行
using System.IO;
var files = Directory.GetFiles(@"D:\imgs", "*.png");
foreach (var file in files)
{
var res = ocr.DetectText(file);
Console.WriteLine($"{Path.GetFileName(file)}：{res.Text}");
}</code></pre>
<p>六、OCRParameter 常用参数详解<br />
表格<br />
参数  类型  说明<br />
use_angle_cls   bool    是否开启角度检测，倾斜文字必开<br />
cls bool    文本方向分类<br />
det bool    文本检测，单行识别可关闭<br />
rec bool    文本识别<br />
lang    string  ch = 简体，en = 英文，chinese_cht = 繁体<br />
cpu_threads int CPU 线程，推荐 2-8<br />
use_stamp   bool    是否识别印章<br />
show_log    bool    是否输出日志<br />
七、WinForm/WPF 使用注意<br />
必须 x64 平台，AnyCPU 直接报错<br />
释放资源：using(OCR ocr = new OCR()) 或手动Dispose()，避免内存泄漏<br />
不要频繁 new OCR 实例，全局单例即可，初始化耗时较长<br />
八、常见报错与解决</p></li>
<li>无法加载 DLL&quot;PaddleOCR.dll&quot;<br />
原因：项目平台是 AnyCPU/x86<br />
解决：项目属性 → 生成 → 平台目标改为 x64</li>
<li>模型文件缺失<br />
解决：安装ModelsLite或Models包，复制模型到输出目录<br />
手动部署：把inference文件夹放到 exe 同级目录</li>
<li>识别慢<br />
开启单行模式：det=false<br />
减少线程：cpu_threads=2<br />
使用 Lite 轻量模型</li>
<li>识别乱码 / 空白<br />
图片模糊：提高图片分辨率<br />
角度问题：开启use_angle_cls=true<br />
语言不对：简体用ch<br />
九、自定义模型（进阶）<br />
如果内置模型识别不准，可替换自定义 PaddleOCR 推理模型：
<pre><code class="language-csharp">csharp
运行
OCRParameter param = new OCRParameter();
param.det_model_dir = @"自定义检测模型路径";
param.rec_model_dir = @"自定义识别模型路径";
param.cls_model_dir = @"自定义方向模型路径";</code></pre></li>
</ol>]]></description>
    <pubDate>Fri, 22 May 2026 08:17:47 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=10</guid>
</item>
<item>
    <title>nvm管理Node.js版本</title>
    <link>https://emlog.camw.cn/?post=9</link>
    <description><![CDATA[<ol>
<li>Node.js版本切换<br />
安装nvm-setup.exe<br />
注意：切换Node.js版本之后，yarn/nrm等全局安装的npm工具，需要重新安装<br />
1.1. 使用nvm-windows管理Node.js版本（Windows环境）<br />
nvm-windows下载地址（已经安装，若需要更新，可从下面地址中获取最新安装包）</li>
<li>Win + R，输入cmd打开终端</li>
<li>输入nvm list，查看已安装的Node.js版本<br />
控制台：nvm list</li>
</ol>
<ul>
<li>18.11.0 (Currently using 64-bit executable)<br />
14.20.1</li>
</ul>
<ol start="3">
<li>输入nvm list available ,查看可安装的Node.js版本<br />
控制台：nvm list available</li>
</ol>
<table>
<thead>
<tr>
<th>CURRENT</th>
<th>LTS</th>
<th>OLD STABLE</th>
<th>OLD UNSTABLE</th>
</tr>
</thead>
<tbody>
<tr>
<td>19.3.0</td>
<td>18.12.1</td>
<td>0.12.18</td>
<td>0.11.16</td>
</tr>
<tr>
<td>19.2.0</td>
<td>18.12.0</td>
<td>0.12.17</td>
<td>0.11.15</td>
</tr>
<tr>
<td>19.1.0</td>
<td>16.19.0</td>
<td>0.12.16</td>
<td>0.11.14</td>
</tr>
<tr>
<td>19.0.1</td>
<td>16.18.1</td>
<td>0.12.15</td>
<td>0.11.13</td>
</tr>
<tr>
<td>19.0.0</td>
<td>16.18.0</td>
<td>0.12.14</td>
<td>0.11.12</td>
</tr>
<tr>
<td>18.11.0</td>
<td>16.17.1</td>
<td>0.12.13</td>
<td>0.11.11</td>
</tr>
<tr>
<td>18.10.0</td>
<td>16.17.0</td>
<td>0.12.12</td>
<td>0.11.10</td>
</tr>
<tr>
<td>18.9.1</td>
<td>16.16.0</td>
<td>0.12.11</td>
<td>0.11.9</td>
</tr>
<tr>
<td>18.9.0</td>
<td>16.15.1</td>
<td>0.12.10</td>
<td>0.11.8</td>
</tr>
<tr>
<td>18.8.0</td>
<td>16.15.0</td>
<td>0.12.9</td>
<td>0.11.7</td>
</tr>
<tr>
<td>18.7.0</td>
<td>16.14.2</td>
<td>0.12.8</td>
<td>0.11.6</td>
</tr>
<tr>
<td>18.6.0</td>
<td>16.14.1</td>
<td>0.12.7</td>
<td>0.11.5</td>
</tr>
<tr>
<td>18.5.0</td>
<td>16.14.0</td>
<td>0.12.6</td>
<td>0.11.4</td>
</tr>
<tr>
<td>18.4.0</td>
<td>16.13.2</td>
<td>0.12.5</td>
<td>0.11.3</td>
</tr>
<tr>
<td>18.3.0</td>
<td>16.13.1</td>
<td>0.12.4</td>
<td>0.11.2</td>
</tr>
<tr>
<td>18.2.0</td>
<td>16.13.0</td>
<td>0.12.3</td>
<td>0.11.1</td>
</tr>
<tr>
<td>18.1.0</td>
<td>14.21.2</td>
<td>0.12.2</td>
<td>0.11.0</td>
</tr>
<tr>
<td>18.0.0</td>
<td>14.21.1</td>
<td>0.12.1</td>
<td>0.9.12</td>
</tr>
<tr>
<td>17.9.1</td>
<td>14.21.0</td>
<td>0.12.0</td>
<td>0.9.11</td>
</tr>
<tr>
<td>17.9.0</td>
<td>14.20.1</td>
<td>0.10.48</td>
<td>0.9.10</td>
</tr>
<tr>
<td>4. 输入nvm install<version> 安装相应版本的Node.js</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>控制台：nvm install 14.20.1</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>// 以下为安装过程显示</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Downloading node.js version 14.20.1 (64-bit)...</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Complete</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Creating C:\Users\boywe\AppData\Roaming\nvm\temp</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Downloading npm version 6.14.17... Complete<br />
Installing npm v6.14.17...</p>
<p>Installation complete. If you want to use this version, type</p>
<p>nvm use 14.20.1</p>
<ol start="5">
<li>输入nvm use <version>切换指定版本的Node.js，version为指定的版本号<br />
控制台：nvm use 14.20.1<br />
Now using node v14.20.1 (64-bit)</li>
<li>输入nvm current 查看当前使用的Node.js版本<br />
控制台：nvm current<br />
v14.20.1</li>
<li>确认当前Node.js版本及npm版本<br />
控制台：node -v<br />
v14.20.1</li>
</ol>
<p>控制台：npm -v<br />
6.14.17</p>
<ol start="2">
<li>
<p>npm镜像源切换<br />
使用nrm进行镜像源的管理，避免一些国外源无法下载或者下载慢的问题</p>
</li>
<li>
<p>安装 nrm ：npm i -g nrmnrm</p>
</li>
<li>
<p>nrm查看可用的镜像源 ：npm ls</p>
</li>
</ol>
<pre><code class="language-控制台：nrm">
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.cloud.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/</code></pre>
<ol start="3">
<li>切换npm镜像源, 以淘宝镜像源为例：</li>
</ol>
<pre><code>控制台：nrm use taobao

Registry has been set to: https://registry.npmmirror.com/</code></pre>
<pre><code>安装yarn控制台：npm i -g yarn</code></pre>
<pre><code>yarn查询版本：yarn --version</code></pre>
<p>1.22.19</p>]]></description>
    <pubDate>Wed, 20 May 2026 18:16:30 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=9</guid>
</item>
<item>
    <title>win10安装 OpenSSH 服务</title>
    <link>https://emlog.camw.cn/?post=3</link>
    <description><![CDATA[<ol>
<li>
<p>安装 OpenSSH 服务</p>
<pre><code>Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0</code></pre>
</li>
<li>
<p>启动 SSH + 设置开机自启</p>
<pre><code>Start-Service sshd
Set-Service sshd -StartupType Automatic</code></pre>
</li>
<li>
<p>放行防火墙 22 端口</p>
<pre><code>New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName OpenSSH-Server -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Enabled True</code></pre>
</li>
<li>
<p>创建用户 bq 密码 admin@bq</p>
<pre><code>$pwd = ConvertTo-SecureString "admin@bq" -AsPlainText -Force
New-LocalUser bq -Password $pwd -FullName SSH用户</code></pre>
</li>
<li>
<p>把 bq 加入管理员组</p>
<pre><code>Add-LocalGroupMember Administrators bq</code></pre>
</li>
</ol>]]></description>
    <pubDate>Tue, 05 May 2026 18:56:18 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=3</guid>
</item>
<item>
    <title>C++ 工程开发笔记</title>
    <link>https://emlog.camw.cn/?post=2</link>
    <description><![CDATA[<p>一、容器（数组 / 集合）</p>
<pre><code class="language-cpp">std::vector&lt;action_t*&gt; delAct;// 动态数组，允许重复，连续存储，按插入顺序
std::set&lt;action_t*&gt; delAct;// 自动去重，元素唯一，默认按指针地址升序排序
std::unordered_set&lt;action_t*&gt; delAct;// 无序去重，查询更快，不需要有序时优先使用
std::map&lt;double, double, std::less&lt;double&gt;&gt; mapUp; // 正序
std::map&lt;double, double, std::greater&lt;double&gt;&gt; mapDown; // 倒序</code></pre>
<p>二、内存安全删除宏</p>
<pre><code class="language-cpp">SAFE_DELETE (ptr); // 删除单个对象
SAFE_DELETE_ARR (ptr); // 删除数组
SAFE_DELETE_EX (ptr); // 扩展删除
SAFE_DELETE_LIST_ACTION; // 删除 action 链表</code></pre>
<p>三、类型转换与判断</p>
<pre><code class="language-cpp">// 强转子类型
子类型 * psur = (子类型 *) entry;子类型 * psur = static_cast &lt; 子类型 *&gt;(entry);
// 动态转换（安全）
CFileAperture* pap = dynamic_cast&lt;CFileAperture*&gt;(ap);
// 判断是否为文件光圈
if (typeid (*pac-&gt;get_aperture ()) == typeid (CFileAperture))if (pac-&gt;get_aperture ()-&gt;Type () == EAperture::eFile_Aper)</code></pre>
<p>四、STEP 操作</p>
<pre><code class="language-cpp">// 获取当前 STEPCFileTrans* pTrans = CCAMUI::GetCAMUI ()-&gt;GetFileTran ();
// 根据名称获取 STEPCFileTrans* pDestStep = CScenceManager::GetManager ()-&gt;GetStep (name);
// 新建 STEPCScenceManager::GetManager ()-&gt;CreateStep (m_StepImp);
// 删除 STEPCScenceManager::GetManager ()-&gt;RemoveStep (pNetStep);
// 切换 STEPCCAMUI::GetCAMUI ()-&gt;SwitchStep (m_StepImp);
// 同步到列表CScenceManager::GetManager ()-&gt;GetMatrixHelper ()-&gt;AppendStep (m_StepImp);</code></pre>
<p>五、层（Layer）操作</p>
<pre><code class="language-cpp">// 创建或清空层
CFileCell* pLayer = nullptr;CScenceManager::GetManager ()-&gt;CreateOrClearLayer (m_pTrans, pLayer, "层名");
// 添加元素、刷新
pLayer-&gt;add_tail_1 (action);pLayer-&gt;Segmentation ();pLayer-&gt;SetChanged (true);
// 根据层名查找
CFileCell* pCell = m_pTrans-&gt;GetFileCellByLayerName ("层名");
// 获取当前激活层
CFileCell* pCell = CCAMUI::GetCAMUI ()-&gt;GetActiveFile ();
// 删除空线路层
for (auto layer : pTrans-&gt;get_layers ()){
if (IsSignalLayer (layer) &amp;&amp; list_count (&amp;layer-&gt;actionsHead)==0)｛
pTrans-&gt;remove_layer (layer);
}
// 遍历层内元素
for (list_head* pos = pLayer-&gt;actionsHead.next; pos != &amp;pLayer-&gt;actionsHead; pos=pos-&gt;next){action_t* pAct = list_entry (pos, action_t, node);}
// 安全遍历list_head *pos,n;
list_for_each_safe(pos,n,&amp;pLayer-&gt;actionsHead){
action_t pEle = list_entry(pos,action_t,node)-&gt;clone();}</code></pre>
<p>六、光圈与 Action 操作</p>
<pre><code class="language-cpp">// 创建光圈
aperture_t* pNewApe = DefineAperturecEx (str);
// 获取光圈
aperture_t* pApe = pCell-&gt;GetAperture ("r10",true,MM_TO_COORD);
// 光圈缩放
IAperture* newApe = resize_aperture (pap,0.1*MIL_TO_COORD,pCell);
// 打散文件光圈（SYB）
(new CFileODB ())-&gt;BreakPad (pflash,eleNewArr,true,pCell);
// 读取文件光圈
vector&lt;action_t*&gt; eleNewArr;CFileAperture* pap = (CFileAperture*) pac-&gt;get_aperture ();pap-&gt;GetApertureDetailAper (eleNewArr,0);
// Action 距离与交点
double action_distance (a0,a1,out0,out1);
double action_distance_noWidth (a0,a1);
void action_intersect (a0,a1,inters);
void seg_action_intersect_sur (a0,a1,inters);
// 包含 / 包围 / 连接判断bool action_isInclude (a0,a1);bool action_iscovered (a0,a1);bool is_action_connection (a0,a1);
// 范围搜索RectCell rt;vector&lt;action_t*&gt; actionSet;pCell-&gt;cross_range_searchv (rt,actionSet,action_t_filter ());</code></pre>
<p>七、铜皮（Surface）操作</p>
<pre><code class="language-cpp">// 优化轮廓action_surface* sur = (action_surface*) ac;sur-&gt;OptimizeOutcounter ();sur-&gt;OptimizeIncounter ();
// 铜皮合并
UnionHelperPtr pUionnp = GetUnionHelper ();
pUionnp-&gt;AddItems (pSetSurf.begin (),pSetSurf.end ());
pUionnp-&gt;UnionOper ();
// 铜皮掏除（差集）
pUionnp-&gt;AddItem (pOutSurf);
pUionnp-&gt;AddItems2 (pPcsSurf.begin (),pPcsSurf.end ());
pUionnp-&gt;DiffSectOper ();
// 铜皮偏移（放大 / 缩小）
COffesetSurface os;vector&lt;action_surface*&gt; outSurfaces;
os.offeset_surface (psur,10MIL_TO_COORD,outSurfaces); // 放大
os.offeset_surface (psur,-10MIL_TO_COORD,outSurfaces); // 缩小
// 去尖角
os.remove_sharp_corners (psur,size,outSurfaces);
// 铜皮转轮廓线
for (auto pos=psurface-&gt;get_out_action_head ()-&gt;next;
    pos!=psurface-&gt;get_out_action_head ();
    pos=pos-&gt;next){action_t* ac = list_entry (pos,action_t,node)-&gt;clone ();
    ac-&gt;set_aperture (ap);pLayer-&gt;add_tail_1 (ac);
}</code></pre>
<p>八、几何计算</p>
<pre><code class="language-cpp">// 两点距离hypot (dx,dy);vertex2d (e-s).length ();
// 质心Point computeCentroid (const vector&lt;Point&gt;&amp; points);
// 斜率double calculateSlope1 (p1,p2);
// 判断平行bool areLineSegmentsParallel1 (p1,p2,p3,p4,tolerance);
// 点在线段上bool onSegment (p,q,r,epsilon);
// 坐标相等is_point_equal (p1,p2);
// 凸包vector&lt;vertex2d&gt; GetConvexHull(const vector&lt;vertex2d&gt;&amp; polygon);
// 叉积double crossProduct (a,b,c);</code></pre>
<p>九、单位转换</p>
<pre><code class="language-cpp">MM_TO_COORD // 毫米→内部坐标COORD_TO_MIL // 内部坐标→密耳MIL_TO_COORD // 密耳→内部坐标</code></pre>
<p>十、字符串操作</p>
<pre><code class="language-cpp">str.MakeUpper (); // 转大写str.MakeLower (); // 转小写
// CString 格式化CString lyName;lyName.Format (_T ("r% s"),CStringA (size.c_str ()));
// 不区分大小写比较if (pCell-&gt;GetLayerName ().CompareNoCase (name)==0)</code></pre>
<p>十一、调试与日志</p>
<pre><code class="language-cpp">OutputDebugString ("信息"); // 调试输出kcout &lt;&lt; "内容"; // 日志打印AfxMessageBox ("提示"); // 弹窗</code></pre>
<p>十二、Lambda 函数</p>
<pre><code class="language-cpp">auto concat = 
{return a+b;};auto add = 
{return x+y;};auto func = {/代码/};</code></pre>
<p>十三、JSON 解析</p>
<pre><code class="language-cpp">Json::Reader reader;Json::Value root;reader.parse(arg,root);Json::Value dicts = root["data"]["dicts"];</code></pre>
<p>十四、网络抽取</p>
<pre><code class="language-cpp">gkolinesCell-&gt;extract_net ();for (auto&amp; net : gkolinesCell-&gt;GetShapeBlocks ()){// 按网络创建层}</code></pre>
<p>十五、其他常用</p>
<pre><code class="language-cpp">// 智能指针
unique_ptr&lt;IpcbCommandExecution&gt; m_ipcbcom1;
// 保存工程
CSaveMgr::GetInstance ()-&gt;Save ();
// 获取线路层 / 钻孔层
vector&lt;CFileCell*&gt; sigArr = ACTIVESTEP-&gt;GetAllSignalLayers ();
GetThroughFileCellDrill (pCell,vecDrills);
// 层类型枚举转换
const char* KjGetLayerTypeText (PcbLayerType lyType);
PcbLayerType KjGetLayerTypeEnum (CString const&amp; str)</code></pre>]]></description>
    <pubDate>Thu, 16 Apr 2026 10:01:57 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=2</guid>
</item>
<item>
    <title>InCAM Pro6.1 CLI快捷键</title>
    <link>https://emlog.camw.cn/?post=5</link>
    <description><![CDATA[<h1>InCAM Pro CLI 快捷键列表</h1>
<h2>坐标</h2>
<table>
<thead>
<tr>
<th>快捷键</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>rel</td>
<td>相对坐标(Relative)</td>
</tr>
<tr>
<td>abs</td>
<td>绝对坐标(Absolute)</td>
</tr>
<tr>
<td>wc</td>
<td>工作层中心(Work layer Center)</td>
</tr>
<tr>
<td>sbl</td>
<td>Selection-左下角(Selection Bottom Left)</td>
</tr>
<tr>
<td>sbr</td>
<td>Selection-右下角(Selection Bottom Right)</td>
</tr>
<tr>
<td>ce</td>
<td>Selection中心(Center of Selection)</td>
</tr>
<tr>
<td>sd</td>
<td>Step参考点(Step Datum)</td>
</tr>
<tr>
<td>sul</td>
<td>Selection左上角(Selection Upper Left)</td>
</tr>
<tr>
<td>pc</td>
<td>Profile中心(Profile Center)</td>
</tr>
<tr>
<td>sur</td>
<td>Selection右上角(Selection Upper Right)</td>
</tr>
</tbody>
</table>
<h2>捕捉</h2>
<table>
<thead>
<tr>
<th>快捷键</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>us</td>
<td>单层智能捕捉(Use Single Snap Layer)</td>
</tr>
<tr>
<td>um</td>
<td>多层智能捕捉(Use Multiple Snap Layers)</td>
</tr>
<tr>
<td>so</td>
<td>开关捕捉模式(Snap On/Off)</td>
</tr>
<tr>
<td>sb</td>
<td>捕捉弧端点(Snap Arc Points)</td>
</tr>
<tr>
<td>si</td>
<td>捕捉相交点(Snap Intersection)</td>
</tr>
<tr>
<td>sr</td>
<td>捕捉弧中心(Snap Arc Center)</td>
</tr>
<tr>
<td>sp</td>
<td>捕捉profile(Snap Profile)</td>
</tr>
<tr>
<td>sc</td>
<td>捕捉中心(Snap Center)</td>
</tr>
<tr>
<td>sm</td>
<td>捕捉中点(Snap Midpoint)</td>
</tr>
<tr>
<td>se</td>
<td>捕捉边(Snap Edge)</td>
</tr>
<tr>
<td>sn</td>
<td>什么都不捕捉(Snap None)</td>
</tr>
<tr>
<td>st</td>
<td>捕捉相切点(Snap Tangent)</td>
</tr>
<tr>
<td>sx</td>
<td>智能捕捉(Smart (Xjnap))</td>
</tr>
<tr>
<td>sl</td>
<td>捕捉layer profile(Snap Layer Profile)</td>
</tr>
<tr>
<td>sg</td>
<td>捕捉格点(Snap Grid)</td>
</tr>
<tr>
<td>sa</td>
<td>切换捕捉层(Advance Snap Layer)</td>
</tr>
<tr>
<td>ss</td>
<td>捕捉骨架(Snap Skeleton)</td>
</tr>
<tr>
<td>sh</td>
<td>捕捉正交交点(Snap Orthogonal)</td>
</tr>
</tbody>
</table>
<h2>添加</h2>
<table>
<thead>
<tr>
<th>快捷键</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>a</td>
<td>添加Pad(Add Pad)</td>
</tr>
<tr>
<td>at</td>
<td>添加线(Add Trace)</td>
</tr>
<tr>
<td>ac</td>
<td>添加圆弧(Add Arc)</td>
</tr>
<tr>
<td>af</td>
<td>添加多段线(Add Polyline (feature))</td>
</tr>
<tr>
<td>al</td>
<td>增加层次(Add Layer)</td>
</tr>
<tr>
<td>atd</td>
<td>增加泪焊(Add Teardrop)</td>
</tr>
<tr>
<td>atp</td>
<td>增加斜线(Add Tapering on selected)</td>
</tr>
</tbody>
</table>
<h2>编辑</h2>
<table>
<thead>
<tr>
<th>快捷键</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>m</td>
<td>移动到其他层(Move Other Layer)</td>
</tr>
<tr>
<td>c</td>
<td>复制到其他层(Copy Other Layer)</td>
</tr>
<tr>
<td>p</td>
<td>定义profile(Create profile popup)</td>
</tr>
<tr>
<td>t</td>
<td>变形(Transform)</td>
</tr>
<tr>
<td>ct</td>
<td>Contouriz表面化(Contouriz)</td>
</tr>
<tr>
<td>cl</td>
<td>线路倒角(Connect Lines)</td>
</tr>
<tr>
<td>cs</td>
<td>更改符号(Change Symbol)</td>
</tr>
<tr>
<td>aa</td>
<td>修改属性(Add Attributes)</td>
</tr>
<tr>
<td>of</td>
<td>偏移多段线(Offset polyline popup)</td>
</tr>
<tr>
<td>cd</td>
<td>外形到表面(Contour to surface)</td>
</tr>
<tr>
<td>rc</td>
<td>改角度(Round Corners)</td>
</tr>
<tr>
<td>re</td>
<td>整体缩放(Resize global)</td>
</tr>
<tr>
<td>fb</td>
<td>打散物件(Features Break)</td>
</tr>
<tr>
<td>cfx</td>
<td>修改文字(Change Text)</td>
</tr>
<tr>
<td>ft</td>
<td>物件到外形(Feature To Outline)</td>
</tr>
<tr>
<td>fp</td>
<td>填充profile(Fill Profile)</td>
</tr>
<tr>
<td>sub</td>
<td>替换(Substitute)</td>
</tr>
<tr>
<td>lb</td>
<td>打断线路(Line Break)</td>
</tr>
<tr>
<td>mp</td>
<td>拉开平行线(Stretch Parallel lines)</td>
</tr>
<tr>
<td>op</td>
<td>Pad边缘(Offset Pads Edges)</td>
</tr>
<tr>
<td>lc</td>
<td>层对比(Layer Compare)</td>
</tr>
<tr>
<td>pi</td>
<td>反转极性(Polarity Invert)</td>
</tr>
<tr>
<td>pn</td>
<td>反转极性(Polarity Negative)</td>
</tr>
<tr>
<td>pp</td>
<td>反转极性(Polarity Positive)</td>
</tr>
<tr>
<td>ps</td>
<td>平行拉开线路(Stretch Parallel Lines selected)</td>
</tr>
<tr>
<td>ls</td>
<td>拉开线路(Line Stretch)</td>
</tr>
<tr>
<td>mo</td>
<td>直角移动(Move Orth Selected)</td>
</tr>
<tr>
<td>mf</td>
<td>移动Triplet线路(Move Triplet feature)</td>
</tr>
<tr>
<td>ml</td>
<td>移动Triplet线路(Move Triplet lines)</td>
</tr>
<tr>
<td>mt</td>
<td>移动并拉开(Move Stretch)</td>
</tr>
<tr>
<td>di</td>
<td>鼠标删除到焦点(Delete to intersection)</td>
</tr>
<tr>
<td>df</td>
<td>鼠标删除物体(Delete feature)</td>
</tr>
<tr>
<td>ca</td>
<td>更改角度(Change Angle for line)</td>
</tr>
<tr>
<td>cas</td>
<td>更改圆弧(Change Arc)</td>
</tr>
<tr>
<td>isf</td>
<td>物体切割(Intersect Split Feature)</td>
</tr>
<tr>
<td>tl</td>
<td>线割到线(Line to Dash)</td>
</tr>
<tr>
<td>ext</td>
<td>拉开Extend Slot(Extend Slot)</td>
</tr>
<tr>
<td>crs</td>
<td>复制并重复(Copy and repeat)</td>
</tr>
<tr>
<td>isr</td>
<td>交互式间距修复(Interactive Spacing Repair)</td>
</tr>
<tr>
<td>isp</td>
<td>多段线分割(Intersect Split Polyline)</td>
</tr>
<tr>
<td>fd</td>
<td>物体到钻孔(Feature to Drill pattern)</td>
</tr>
<tr>
<td>issr</td>
<td>交互式文字修复(Interactive SS Repair)</td>
</tr>
<tr>
<td>chr</td>
<td>网格间距修复(Cross Hatch Repair)</td>
</tr>
<tr>
<td>fs</td>
<td>填充表面(Fill Surface)</td>
</tr>
</tbody>
</table>
<h2>显示</h2>
<table>
<thead>
<tr>
<th>快捷键</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>mta</td>
<td>打开矩阵(Matrix)</td>
</tr>
<tr>
<td>chk</td>
<td>打开chklist界面(Checklist page)</td>
</tr>
<tr>
<td>tg</td>
<td>打开CAM视图(Open CAM Guide)</td>
</tr>
<tr>
<td>stp</td>
<td>step对比(Step Compare)</td>
</tr>
<tr>
<td>zoa</td>
<td>切换到zoomarea(Zoom area)</td>
</tr>
<tr>
<td>sq</td>
<td>激活筛选(Select (Single))</td>
</tr>
<tr>
<td>rs</td>
<td>反选(Reverse selection)</td>
</tr>
<tr>
<td>hs</td>
<td>物件列表(Features Histogram)</td>
</tr>
<tr>
<td>hsc</td>
<td>选择的物件列表(Selected Histogram)</td>
</tr>
<tr>
<td>zom</td>
<td>打开物件过滤(Features Filter)</td>
</tr>
<tr>
<td>clr</td>
<td>清除高亮选择(Clear Highlight)</td>
</tr>
<tr>
<td>qn</td>
<td>查询网络(Query Net)</td>
</tr>
<tr>
<td>mm</td>
<td>测量点与点(Measure Contours)</td>
</tr>
<tr>
<td>mc</td>
<td>测量面到面(Measure Contours)</td>
</tr>
<tr>
<td>mr</td>
<td>测量角度线(Measure Angular Line)</td>
</tr>
<tr>
<td>ds</td>
<td>显示所有阶层(Display All Layers)</td>
</tr>
<tr>
<td>db</td>
<td>显示board层(Display Board layers)</td>
</tr>
<tr>
<td>ha</td>
<td>取消所有层显示(Hide All Display layers)</td>
</tr>
<tr>
<td>nt</td>
<td>打开Notes(Notes)</td>
</tr>
<tr>
<td>cu</td>
<td>更改单位(Change Unit)</td>
</tr>
</tbody>
</table>]]></description>
    <pubDate>Thu, 08 Jan 2026 22:20:20 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=5</guid>
</item>
<item>
    <title>C# 可实现的 EDA2D/PCB 几何 &amp; 版图全套算法</title>
    <link>https://emlog.camw.cn/?post=4</link>
    <description><![CDATA[<h1>EDA2D 几何引擎全套算法清单（C# 工业实现版）</h1>
<h2>一、2D 基础几何算法（底层必备）</h2>
<ul>
<li>点、线段、圆弧、多边形、多轮廓带孔洞数据结构</li>
<li>点在线上、点在多边形内、线段相交检测</li>
<li>线段 / 圆弧求交、最近距离、投影点计算</li>
<li>轮廓顶点去重、冗余点精简、轮廓闭合修复</li>
<li>折线拟合圆弧、圆弧离散折线、精度归一化</li>
<li>高精度浮点容错、容差阈值几何判定</li>
</ul>
<h2>二、核心几何运算算法</h2>
<h3>多边形布尔运算</h3>
<ul>
<li>并集、交集、差集、异或</li>
<li>多轮廓批量布尔、带孔洞布尔运算</li>
</ul>
<h3>轮廓偏移（等距扩缩）</h3>
<ul>
<li>向内偏移、向外偏移、全局偏移</li>
<li>局部倒角 / 圆角偏移、自相交修复</li>
</ul>
<h3>裁剪 / 分割 / 掩膜</h3>
<ul>
<li>矩形裁剪、多边形互裁</li>
<li>按禁布区裁剪、轮廓分割成子区域</li>
</ul>
<h3>轮廓合并与拆分</h3>
<ul>
<li>相邻轮廓融合、孤岛分离</li>
<li>内外环区分、孔洞提取</li>
</ul>
<h2>三、PCB 铺铜 专用算法（C# 常用）</h2>
<ul>
<li>多边形灌铜、网格铺铜、实心铺铜</li>
<li>铺铜孤岛剔除、死铜移除、回流路径优化</li>
<li>铺铜自动避让焊盘 / 走线 / 过孔</li>
<li>铺铜边界平滑、尖角优化、自动补洞</li>
</ul>
<h2>四、DRC 设计规则检查算法</h2>
<ul>
<li>线宽检查、线距安全间距检查</li>
<li>焊盘与走线、过孔与铜皮间距校验</li>
<li>禁入区检测、短路 / 开路检测</li>
<li>违规区域坐标定位、高亮轮廓生成</li>
</ul>
<h2>五、Gerber / GDSII 解析与可视化算法</h2>
<ul>
<li>Gerber RS274X 文件解析、图层分离、光圈解析</li>
<li>轨迹转多边形、Flash 焊盘生成、图层合并</li>
<li>Gerber 矢量渲染、缩放平移、分层可视化</li>
<li>GDSII 二进制解析、层级展开、版图平铺、多边形提取</li>
</ul>
<h2>六、自动布线 &amp; 路径算法</h2>
<ul>
<li>曼哈顿自动布线、绕障寻路</li>
<li>A* 寻路、多障碍避障路径规划</li>
<li>走线最短路径、角度约束（45°/90°）布线</li>
<li>路径平滑、拐角优化、走线推挤</li>
</ul>
<h2>七、工业激光 / 数控 图形算法</h2>
<ul>
<li>激光切割轮廓预处理、去重去小碎片</li>
<li>切割路径排序、空行程优化、套料排版</li>
<li>图形偏移补偿、刀口补偿、尖角圆角过渡</li>
<li>数控图形分层、轮廓拆分导出 NC 路径</li>
</ul>
<h2>八、辅助实用算法</h2>
<ul>
<li>包围盒 AABB/OBB 碰撞检测、空间索引</li>
<li>多边形面积、周长、重心计算</li>
<li>轮廓旋转、平移、镜像、缩放变换</li>
<li>批量拓扑规整、几何容差统一</li>
</ul>]]></description>
    <pubDate>Thu, 08 Jan 2026 21:27:57 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=4</guid>
</item>
<item>
    <title>IncamPro6.1 免密码自动登录</title>
    <link>https://emlog.camw.cn/?post=8</link>
    <description><![CDATA[<h2>一、添加系统环境变量</h2>
<p>打开电脑系统环境变量（此电脑→右键属性→高级系统设置→环境变量）<br />
新建用户变量 / 系统变量，变量名：FRONTLINE_NO_LOGIN_SCREEN，变量值：1<br />
保存环境变量配置</p>
<pre><code>FRONTLINE_NO_LOGIN_SCREEN = 1</code></pre>
<h2>二、创建软件目录文件夹</h2>
<p>打开 InCAM Pro 6.1 安装目录，进入路径：..\InCAMPro\6.1\bin\<br />
在 bin 文件夹内新建文件夹，命名为：1</p>
<pre><code>创建一个目录..\InCAMPro\6.1\bin\1</code></pre>
<h2>三、首次登录配置免密</h2>
<p>双击启动 InCAM Pro_6.1 软件<br />
首次正常输入用户名、密码完成登录<br />
后续再次启动软件，无需重复输入账号密码，直接免登录进入</p>]]></description>
    <pubDate>Thu, 08 Jan 2026 20:01:41 +0800</pubDate>
    <dc:creator>向田欢</dc:creator>
    <guid>https://emlog.camw.cn/?post=8</guid>
</item>
</channel>
</rss>