有一类问题,只有真正做过企业信息化的人才会反复被折磨到:芯片制造厂里,工艺工程师好不容易从设备监控台把厂务管道布局图、机台脚位图或者封装基板的局部 CAD 图复制到剪贴板,准备贴到网页里的 TinyMCE 富文本编辑器,写一份异常报告或者变更申请单。结果按下 Ctrl+V 之后,编辑器里出现一张模糊到发虚的位图,放大一点字就看不清,标注尺寸的箭头也歪了。打印归档或者转 PDF 的时候,图更没法看,签字人在邮件里反复问“你这图到底画的是什么”。
这个场景不是偶发,而是所有用浏览器富文本承载工程图纸的企业都会碰到的痛点。TinyMCE 作为嵌入到各业务系统里最常见的编辑器之一,默认对 CAD 这种矢量图形并不友好。CAD 图纸本身是矢量数据,由直线、圆弧、标注、填充等数学图元组成,但浏览器和富文本编辑器并不理解 CAD 的原生格式。解决这个问题的关键,是让图纸从 CAD 复制出来之后,在 TinyMCE 里仍然以可缩放、打印清晰的矢量形式输出,而不是退化成基于像素的图片。
我前两年正好在一家半导体制造相关的企业做过类似的知识库与质量文档系统改造,核心就是把 CAD 图纸从粘贴到 TinyMCE 的链路全部摸了一遍,搞懂剪贴板里放了什么、浏览器到底能读什么、哪些环节可以保留矢量,哪些环节必须要做格式中转。本文把我整个思路和踩坑过程写出来,重点讲工程上可以落地的方案。这不是一篇无脑调 API 的教程,更适合已经在业务系统里被这个问题折磨过、想找一套完整解法的人参考。
1. 为什么芯片厂写文档时,总在处理“图纸粘贴”这件事
1.1 业务场景:不只是“贴一张图”这么简单
芯片制造企业的文档系统里,需要嵌入 CAD 场景的频率比很多人想象中高得多。设备异常报告要贴设备布局和管路走向的局部截图,工艺变更单要贴机台部件图纸,厂务动力系统的点检记录要贴楼层管线图,封测厂的 NPI 报告还要贴基板 layout 的局部图。这些图纸原文件通常存在专门的图档管理系统里,但写报告、发起会签、做质量分析的入口往往是一个网页表单,表单正文用的就是 TinyMCE。
业务部门对“粘贴”这件事的期待很简单:我在 CAD 里选中一块图,复制,到网页里粘贴,这张图应该保持原样,能看清楚所有尺寸标注和文字。但他们并不知道,这个简单的操作背后涉及 CAD 软件、操作系统剪贴板、浏览器安全模型、富文本编辑器内部数据表示以及最后文档导出的一条完整链路。只要链路里某一个环节放弃了矢量信息,后面再想挽回就非常麻烦。
更麻烦的是,芯片厂里的图纸往往涉及批量的工艺数据和尺寸标记。一张位图可能压缩后只有几十 KB,但缩小到特定视图里看,字号本身就很小,一旦再被位图化,字体边缘出现锯齿,关键参数字母根本没法辨认。这在流程上会直接造成质量文档“不可读”“无法审计”的争议。所以在项目规划阶段,业务方提出来的已经不是“能不能贴图”,而是“能不能贴出来的图纸放大后还是清晰的”。
1.2 TinyMCE 默认粘贴机制为什么会把矢量丢掉
TinyMCE 本身没有特殊处理 CAD 数据的能力。它依靠浏览器的粘贴事件拿到剪贴板内容,官方 PowerPaste 插件做得比较成熟的是对 Word、Excel 这类 Office 内容的转换,对 CAD 内容基本只能走默认图片通道。
当用户在 AutoCAD、中望CAD 或者 Altium Designer 这类软件里复制图形时,程序会往 Windows 剪贴板里写入多种格式的数据。以 Windows 平台为例,常见的有设备无关位图(DIB/PNG)、增强型图元文件(EMF)、WMF 甚至纯文本。浏览器读取剪贴板内容时,通常会选择它自己能处理的那一种格式。Chromium 系浏览器最方便处理的图形格式是 PNG 位图,于是最后进入 TinyMCE 的往往是一张栅格化之后的图片。
TinyMCE 收到图片后的行为很简单:如果你开启了 paste_data_images,它会把图片作为 base64 数据插入编辑器 DOM,或者按你的配置上传到后端。无论走哪条路,图片都是位图,和图纸原本的矢量坐标没有任何关系。图纸在从 CAD 复制到剪贴板的那一刻,虽然 EMF 格式里仍然保留了矢量路径,但默认粘贴流程根本不会去读它,因为浏览器没有安全接口能直接拿到 EMF 并解析成 SVG 或者 HTML5 画布图形。
1.3 “矢量输出”最终要交付给谁看
在这个项目里,我和业务方花了一些时间对齐“矢量输出”的定义。最终发现它包含两层含义。第一层是在编辑器页面上看,图纸不能模糊,插进去的内容可以随着浏览器缩放保持清晰。这层用 SVG 就能解决。第二层是文档导出环节,当报告从系统导出成 PDF 或者 Word 时,图纸不能掉回位图,尤其是要走打印签字流程的文档,图纸上的尺寸线必须清晰可辨。
这两层如果分开做,会很容易给自己挖坑。很多团队第一版只做了“插入高清 PNG”,在页面上看还行,一到打印环节发现图片精度根本不够,又被迫改成双倍尺寸上传、再压缩显示,绕了一大圈还是没有真正解决问题。所以我们在方案设计时,一开始就把目标定成:内容编辑态以 SVG 形式保存,导出 PDF 时直接渲染 SVG,导出 Word 时至少保证一个可接受的矢量兼容通道。后续所有技术选型都围绕这个目标展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案选型:先看剪贴板,再看浏览器,最后才写代码
2.1 剪贴板上的图纸不是只有一种存在形式
从 Windows 剪贴板的结构看,一个 CAD 图形被复制后,并不是只有一张图片那么简单。AutoCAD 这类软件复制图元时,会在同一个剪贴板上同时写入好几种数据格式。有的格式是 AutoCAD 自己内部使用的,比如 AcDb 数据;有的格式是面向其他 Windows 应用程序的,比如 EMF/WMF;还有一种是给不支持矢量格式的简单程序用的,比如 DIB 位图。
这里面,EMF 是值得重点关注的。EMF 全称 Enhanced Metafile,是 Windows 用来描述矢量图形的一种标准格式,保存了绘图指令和坐标信息。理论上,只要我们能从剪贴板里把 EMF 数据完整取出来,就可以交给后端工具转换成 SVG,再插入 TinyMCE。这比从位图里用自动描摹算法去还原矢量要靠谱得多,CAD 原始线条、标注、填充路径在 EMF 里基本都还保留着。
另一个常见来源是 PDF。有些企业给 CAD 软件配置了“打印到 PDF”的虚拟打印机,用户习惯先在 CAD 里输出 PDF,再粘贴到报告里。PDF 本身也是矢量容器,只要后续处理工具能够解析 PDF 图形,也可以作为一条路径。但是 PDF 文件的剪贴板交互不如 EMF 直接,通常不是通过“复制粘贴”进入系统,而是通过文件上传进入,所以在这个项目里我们把它作为备用通道。
2.2 浏览器到底允许网页读到什么
如果你尝试用纯前端脚本读取用户复制 CAD 图形后的剪贴板,会很快碰到安全边界。浏览器出于隐私考虑,对网页访问剪贴板做了严格限制。
标准 Clipboard API 里的 navigator.clipboard.read() 只有在页面获得焦点、且用户授权之后才能读取。而且浏览器通常只把与文本和常规图片相关的 MIME 类型暴露给网页,比如 text/plain、text/html、image/png。对于 EMF/WMF 这类 Windows 系统级矢量元文件格式,Chromium 和 Firefox 不会把它们暴露在 clipboardData.items 里。也就是说,纯前端方案可以可靠地拿到 CAD 复制后浏览器自带的 PNG 位图,却拿不到那个真正保存了矢量数据的 EMF。
这个限制几乎粉碎了“在 TinyMCE 里加一个脚本就能自动拦截 EMF”的幻想。我们早期也想过直接从 paste 事件里枚举剪贴板项目,看有没有 image/emf 或者 application/x-emf,实测在主流浏览器里都为空。唯一还可能在剪贴板里见到的矢量格式是 image/svg+xml,但那需要源程序主动写入 SVG。Visio 或者 draw.io 这类网页图形工具复制 SVG 数据时有机会出现,CAD 桌面软件目前还没这么友好。
2.3 三条可行的工程路线对比
既然纯前端没法直接拿 EMF,剩下可以落地的路线主要有三条。我先列出它们各自的形态,再讲我们最后怎么选的。
| 路线 | 实现方式 | 矢量保真度 | 用户操作体验 | 维护成本 |
|---|---|---|---|---|
| 路线A:前端截获已有 SVG | TinyMCE paste 事件里监听 image/svg+xml,拿到后消毒并插入 |
高,但依赖复制源是否写 SVG | 很顺滑,自动处理 | 低,只需前端与消毒逻辑 |
| 路线B:CAD 二次开发插件主动上传 | 在 CAD 里通过 LISP/ObjectARX 做一个命令,用户选中图形后直接上传到系统,网页端再插入 SVG | 高,可控性强 | 多一步手动命令,需要在每台 CAD 环境装插件 | 中等,需要兼容各种 CAD 版本 |
| 路线C:本地助手中转剪贴板 | 在用户电脑上装一个小工具,监听系统剪贴板,读取 EMF 转成 SVG,再交给前端插入 TinyMCE | 高,从 EMF 转 SVG 能还原大部分几何 | 用户只需复制后点击或配合自定义粘贴,学习成本低 | 偏高,要维护本地程序与 Web 的通信 |
路线A对源软件比较挑,只能处理本身支持 SVG 写入剪贴板的程序。路线B虽然最受 CAD 管理员喜欢,但要在所有工程师电脑上推插件,适配 AutoCAD、中望CAD、浩辰CAD 等不同内核版本,工作量并不小。路线C则是一种能覆盖大多数桌面 CAD 软件的通用方案,因为它站在操作系统剪贴板这一层,不管用户用的是哪款 CAD,复制动作只要往系统里写了 EMF,本地助手都能读到。
2.4 我们最终采用的混合链路
真实项目里最终跑通的方案,其实是一个混合架构。它不依赖用户在 CAD 里安装任何插件,也不需要改成纯前端幻想。
整个链路是这样:用户从 CAD 里复制图形后,本地助手立即检测到 Windows 剪贴板中出现 EMF 格式,后台将 EMF 数据保存成临时文件,调用 Inkscape 转换服务生成 SVG,并将 SVG 暂存在本机内存中。用户在 TinyMCE 编辑页面里点击一个“CAD 矢量粘贴”插件按钮,页面通过 fetch 请求本地助手的 HTTP 接口 http://127.0.0.1:17890/current,拿到最新转换好的 SVG,用 DOMPurify 消毒后插入编辑器。如果用户没有安装本地助手或者助手没检测到 EMF,则退化成 TinyMCE 默认的位图粘贴流程,用户依然可以手动粘贴一张 PNG 作为兜底。
这套混合方案既解决了矢量来源问题,又没有完全颠覆用户习惯。你仍然可以在 CAD 里复制一块图,切到网页编辑器,只需要比平时多按一个按钮,而不是像路线B那样要专门在 CAD 里输入命令。对芯片制造企业里那些对 CAD 操作本身并不熟练的质量工程师来说,这个操作负担更容易接受。
3. 落地细节:在 TinyMCE 里做矢量粘贴和矢量保存
3.1 第一步:先让 TinyMCE 干净地接收 SVG 内容
TinyMCE 默认是 HTML 富文本编辑器,SVG 本质上是一种 XML 标签,直接插入编辑器并不会被当成普通 HTML 丢弃,但如果你不配置,TinyMCE 可能会在某些操作中剥离未知标签。为了让 SVG 在整个生命周期里稳定存在,第一步要做的是允许 SVG 标签通过 valid_elements 或者 extended_valid_elements 配置。
我在项目里的做法是在 tinymce.init 里增加这样一段:
javascript复制tinymce.init({
selector: '#report-body',
plugins: 'paste code lists table',
toolbar: 'undo redo | blocks | bold italic | bullist numlist | cadvector',
paste_data_images: true,
extended_valid_elements:
'svg[*],defs[*],g[*],path[*],circle[*],rect[*],line[*],polyline[*],polygon[*],text[*],tspan[*],marker[*],use[*]',
content_style:
'svg { max-width: 100%; height: auto; } .cad-vector-container { background: #fafafa; border: 1px solid #ddd; padding: 8px; margin: 12px 0; }',
...
});
注意不要把 *[*] 全开,否则会把 SVG 里的 <script>、<foreignObject> 等危险标签放进编辑器。CAD 图纸转换后的 SVG 一般由基本图形元素组成,白名单只要覆盖这些基本节点就够了。content_style 里给 SVG 设置 max-width: 100% 是很有用的,因为图纸可能很大,不限制的话会把页面撑破。
3.2 第二步:写插件按钮,让页面从本地助手取图
TinyMCE 的自定义插件接口很成熟。我们不需要侵入太多内部 API,只需要注册一个工具栏按钮,点击后请求本地助手接口,把 SVG 插入编辑器。这个比监听 paste 事件更可控,因为用户明确知道自己按了“CAD 矢量粘贴”按钮,异步请求再慢也不会造成粘贴内容错乱。
核心代码大致如下:
javascript复制tinymce.PluginManager.add('cadvector', (editor) => {
const fetchCurrentSvg = async () => {
const response = await fetch('http://127.0.0.1:17890/current');
if (!response.ok) {
throw new Error('本地CAD助手未运行或暂无可用的图纸数据');
}
const data = await response.json();
return data.svg;
};
editor.ui.registry.addButton('cadvector', {
text: 'CAD矢量粘贴',
tooltip: '从CAD剪贴板粘贴矢量SVG',
onAction: async () => {
try {
const rawSvg = await fetchCurrentSvg();
const cleanSvg = DOMPurify.sanitize(rawSvg, {
USE_PROFILES: { svg: true },
});
editor.insertContent(
`<div class="cad-vector-container">${cleanSvg}</div>`
);
} catch (err) {
editor.notificationManager.open({
type: 'error',
text: err.message || '获取CAD矢量数据失败,请先在CAD中复制图形',
});
}
},
});
});
DOMPurify 是必须加的。SVG 使用 XML 语法,和 HTML 的解析方式不太一样,历史上出现过不少通过 SVG 载体做 XSS 的案例。千万不要相信本地工具转出来的内容就绝对安全,要默认“任何进入编辑器的内容都可能是脏的”,统一消毒。
3.3 第三步:本地助手负责从系统剪贴板里提取 EMF 并转 SVG
Web 端好写,难的是本地助手怎么稳定地抓到 EMF。我们最初用 Python 写了一个 Windows 托盘程序,监听系统剪贴板更新消息。核心思路不复杂:当 CAD 复制动作发生后,Windows 会广播 WM_CLIPBOARDUPDATE,助手收到消息后立刻检查剪贴板里是否存在增强图元文件格式。
伪代码思路如下:
python复制import win32clipboard
import win32gui
import os
import subprocess
import json
# 收到剪贴板变化后
def on_clipboard_update():
win32clipboard.OpenClipboard()
try:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_ENHMETAFILE):
emf_data = win32clipboard.GetClipboardData(win32clipboard.CF_ENHMETAFILE)
emf_path = os.path.join(temp_dir, "latest_clip.emf")
with open(emf_path, "wb") as fp:
fp.write(emf_data)
svg_path = convert_emf_to_svg(emf_path)
save_current_svg_for_web(svg_path)
finally:
win32clipboard.CloseClipboard()
这里有一个很重要的细节:在你的程序还没读完剪贴板数据之前,不要把剪贴板关掉。如果剪贴板被其他程序持续占用或者数据量很大,读取可能失败。同时,CAD 复制时常常会在剪贴板里写入不只一种 EMF 格式,我们要优先读取 CF_ENHMETAFILE 而不是老的 CF_WMF,因为 EMF 无论是分辨率还是坐标精度都更高,转换出来的 SVG 尺寸更准确。
3.4 第四步:EMF 到 SVG 的转换工具选择
本地助手里最关键的工具选择是 EMF 转 SVG。这一步直接影响图纸质量。我尝试过几种方案:
第一种是用 Inkscape,这是最稳的。Inkscape 1.x 版本可以直接把 EMF 作为输入文件:
bash复制inkscape latest_clip.emf --export-type=svg --export-filename=latest_clip.svg
实测下来,AutoCAD 复制出来的 EMF 经 Inkscape 转换后,线条、颜色、填充大多能还原。需要注意字体问题:如果图纸里使用的中文字体没有在转换机器上安装,SVG 里的文字会替换成默认字体,造成字形偏移。解决方法是让本地助手所在的电脑安装与企业 CAD 环境一致的基础字体,至少覆盖宋体、黑体、仿宋等常见工程字形。
第二种是用 ImageMagick 加 Unicode 转译,本质还是栅格化,不推荐,因为转出来已经不是矢量。第三种是用 EMF 解析库直接写转换器,比如尝试用 libemf2svg 这类开源库。如果只是做局部图形还好,遇到复杂块引用、线型定义很容易跑偏。我们在项目里没有采用,主要是不想花过多精力维护一套图形解释器。
综合来看,Inkscape 是当前投入产出比最好的选择。它的转换结果不是百分之百完美,但对工程标注类图纸已经有足够好的还原度。如果遇到 Inkscape 无法处理的边角案例,还可以让 CAD 用户先把文件输出成 PDF,再通过 Inkscape 的 PDF 导入能力转 SVG。不过这种方式不能再叫“复制粘贴”,只能作为特殊补充。
3.5 第五步:SVG 进编辑器之后的安全处理和保存策略
SVG 一旦进入 TinyMCE,就会和 HTML 一起保存到数据库。和普通图片不同,SVG 没有独立的二进制文件路径,它是纯文本标签。数据库存储字段需要能容纳比较大的文本,比如 MySQL 的 LONGTEXT,否则一张包含几千个路径的图纸可能让字段溢出。
保存之前,前端已经用 DOMPurify 消过毒,后端保存时还要再做一次检查。最稳妥的做法是后端也接一个 XML 解析器,只保留白名单标签,并且检查 SVG 内不包含脚本事件、外部引用、href 指向非安全地址等风险。因为我们做的是芯片制造企业内部系统,图纸内容高度敏感,任何被注入的脚本都可能造成数据泄露,这个防御一定不能省。
保存后的 HTML 里,CAD 图纸区域就像下面这样:
html复制<div class="cad-vector-container" data-cad-source="AutoCAD" data-cad-time="2025-04-08T10:32:00">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 800">
<g stroke="#1a1a1a" fill="none">
<path d="M120,250 L360,250 L360,480 L120,480 Z" />
...
</g>
</svg>
</div>
加 data-cad-source 和 data-cad-time 这组自定义属性非常有价值。后续做质量审计时,可以直接从 HTML 里提取某张图纸来自哪款 CAD、哪个时刻被粘贴,不用再去翻操作日志。很多芯片厂的内部质量体系对这种可追溯性有刚性要求,与其让系统单独维护一份日志表,不如在 HTML 元数据里先埋下一层。
4. 实操踩坑与排查手记
4.1 同样一张图,转出来的 SVG 要么偏移要么空白
这是我们在联调时遇到最多的问题。一开始以为是 Inkscape 没装好,后来逐个排查发现,CAD 复制到剪贴板的 EMF 坐标体系中,单位是毫米还是英寸取决于 CAD 模板的默认设置。Inkscape 转换时如果不指定单位,可能默认按照 96 DPI 或者 90 DPI 换算,导致图纸插入页面后偏小或者偏大。
更常见的偏移发生在文字和标注上。AutoCAD 的 EMF 里有大量由线型和造型组成的虚线和箭头,Inkscape 在部分场景下把虚线渲染成了实线,把箭头表现为自定义路径,位置和方向大体对,但和原始图形有细微差别。这类误差在低精度屏幕上看不出来,一旦在 PDF 里放大到 400% 就会暴露。
处理经验是,在本地助手转换完后,不要直接把 SVG 堆到编辑器里,先对 SVG 做一次后处理。检查根节点的 width、height 和 viewBox 是否合理。对于空白问题,还要检查 SVG 的坐标系范围。有些 EMF 里图形中心不在原点,导致生成的 SVG 只有一部分落在可视区域内。这种情况可以在 Inkscape 转换后用脚本批量执行 --export-area-drawing 来自动裁剪内容边界,而不是傻傻地把整页空白都带进编辑器。
4.2 大图纸 SVG 没有性能问题,真正要管的是编辑器的 DOM
很多人会担心 SVG 节点太多会不会撑爆浏览器。实测下来,单独渲染一张包含几千个 path 节点的 SVG,现代 Chromium 内核浏览器可以轻松处理。因为 SVG 没有像素填充,不会像超大位图那样消耗 GPU 内存。风险更多出在 TinyMCE 的内容模型上。
TinyMCE 对内容里的 DOM 节点操作比较频繁,尤其是执行撤销、重做、格式刷这类操作时,它可能要遍历整个 DOM。如果一个页面里嵌了二十几张大图纸的 SVG,每张都有几千个节点,页面长时间编辑可能会出现输入卡顿。针对这个问题,我们在设计表单时强制约束了报告类型:要么主要结论用少量图形,要么把多张图纸折叠成附件区,不在编辑器正文里一次性塞几十张原图。
另外还要注意,SVG 中如果包含大量 <text> 节点,TinyMCE 偶尔会误判成普通内联文本,导致按 Backspace 时把整个 SVG 的一部分删除。为了避免误操作,我给插入的容器块增加 contenteditable="false" 属性,这样用户只能把它看作一个整体对象,可以删除、移动,但不能进入内部去破坏 SVG 节点。如果需要批量修改图纸,应该回 CAD 改完之后重新粘贴,而不是在编辑器里直接操作。
4.3 审计与追溯:图纸的版本信息和谁贴的,必须留痕
芯片制造企业对文件追溯的要求比普通行业严格得多。一张图纸贴进报告以后,将来审核人员需要知道这个图来自哪个版本的 CAD 文件、是谁在哪个时间点复制出来的。单纯靠 SVG 本身并没有携带这些信息。因此我们的本地助手在生成临时 EMF 时,会尝试从 CAD 进程的窗口标题里读取当前打开的文件名和路径,然后一并传给 Web 端。
Web 端拿到后并不把完整路径插入到 HTML 里,而是把路径信息提交给后端,由后端生成一个全局唯一的图形标识,比如 CAD_GRAPH_20250408_000123,这个标识返回给前端,作为 SVG 容器块的 data-vector-id。数据库单独存一张图形来源表,把标识与文件名、用户、时间、转换参数关联起来。将来需要审计,直接解析 HTML 拿 data-vector-id 就能查到来源。这种设计比把所有信息都写进 HTML 更干净,也避免把内网路径暴露给终端用户。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查和处理建议 |
|---|---|---|
| 点按钮后提示“本地助手未运行” | 本地助手服务没有启动,或者端口被占用 | 查看托盘进程,访问 http://127.0.0.1:17890/health 验证健康状态 |
| 能获取 SVG,但是图形明显偏小或偏大 | EMF 单位换算出错 | 检查 CAD 模板单位,在 Inkscape 命令中显式指定 DPI |
| 图纸里有中文内容变成方框 | 转换机器缺少对应中文字体 | 安装宋体、黑体等常用字体后重新转换 |
| 图形边界出现大片空白 | EMF 中图形坐标远离原点 | 转换后对 SVG 执行导出区域裁剪,去掉空白边距 |
| 粘贴的图形能看但双击无法编辑 | 容器 contenteditable 已经关闭 |
这是有意设计,防止误删节点。编辑请回 CAD 修改后重新粘贴 |
| 保存后 SVG 内容被数据库截断 | 字段容量不足或特殊字符被转义 | 将字段改为 LONGTEXT,后端按 XML 方式存取 |
最后再分享一个小技巧
如果你在一个已有系统中做改造,不想立刻引入复杂的本地助手,可以先做“半自动”方案:让用户在 TinyMCE 里直接粘贴 CAD 复制的内容,系统检测到剪贴板带过来的是 PNG 位图时,弹出一个提示:“检测到你的剪贴板中有图纸类图形,请选择“从 CAD 重新矢量导入”以获得清晰版本。”同时保留位图插入作为兜底。先让用户尝到“矢量版本更清晰”的甜头,再慢慢引导到本地助手的完整流程,会比一开始就强制要求安装工具顺畅很多。
图纸粘贴这件事,表面上是前端小功能,实际上牵扯剪贴板协议、系统进程、SVG 安全解析、存储模型和审计规则。只有把整条链路都想清楚,才能在芯片制造企业这种对图纸精度和可追溯性要求极高的环境里,真正把问题解决干净。
