171 lines
6.9 KiB
C#
171 lines
6.9 KiB
C#
// ============================================================
|
|
// PdfBridge:主窗口与 PDF 查看器之间的桥
|
|
// 与 CadBridge 保持相同的 API 形状:
|
|
// · 下行(主窗口→查看器):SendPaCommand / ZoomToFrameHandle /
|
|
// DeleteFramesByHandles / MergeMasks / ClearHighlight
|
|
// · 上行(查看器→主窗口):PaPicked / EntityErased / PaExited /
|
|
// F1/F2/F3Requested
|
|
// 扒图逻辑:用户在 PDF 上框选 → 裁剪 → OCR 工作进程识别 →
|
|
// 按 CAD 版语义组装 results(正向逐条/反向合并) → PaPicked
|
|
// → 主窗口入表格;查看器在框选位置画彩色蒙版框。
|
|
// ============================================================
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace 成套报价软件
|
|
{
|
|
public static class PdfBridge
|
|
{
|
|
private static PdfViewerWindow _viewer;
|
|
|
|
/// <summary>PDF 查看器是否已挂载且打开了文档。</summary>
|
|
public static bool IsViewerReady
|
|
{
|
|
get { return _viewer != null && _viewer.IsDocumentOpen; }
|
|
}
|
|
|
|
/// <summary>当前打开的图纸名(去扩展名;查看器未打开文档为空)。扒图写入箱号「图纸」列用。</summary>
|
|
public static string CurrentDrawingName
|
|
{
|
|
get { return _viewer != null ? _viewer.CurrentDrawingName : ""; }
|
|
}
|
|
|
|
/// <summary>扒图连续模式当前是否激活(供 ESC 全局过滤判断)。</summary>
|
|
public static bool PickModeActive
|
|
{
|
|
get { return _viewer != null && _viewer.PickModeActive; }
|
|
}
|
|
|
|
/// <summary>兼容 CadBridge:查看器中蒙版被外部删除(当前无触发源,保留事件形状)。</summary>
|
|
public static event Action<string> EntityErased;
|
|
|
|
/// <summary>框选识别完成一批(图号/箱号/元件)。</summary>
|
|
public static event Action<MyApp.PaMode, List<MyApp.PaTextResult>> PaPicked;
|
|
|
|
/// <summary>用户按 ESC 退出连续扒图模式。</summary>
|
|
public static event Action PaExited;
|
|
|
|
/// <summary>用户按 F1 —— 元件两两合并。</summary>
|
|
public static event Action F1Requested;
|
|
|
|
/// <summary>用户按 F2 —— 元件三个一组合并。</summary>
|
|
public static event Action F2Requested;
|
|
|
|
/// <summary>用户按 F3 —— 元件四个一组合并。</summary>
|
|
public static event Action F3Requested;
|
|
|
|
/// <summary>把 PDF 查看器挂到桥上(查看器构造时调用一次)。</summary>
|
|
public static void Attach(PdfViewerWindow viewer)
|
|
{
|
|
_viewer = viewer;
|
|
}
|
|
|
|
// ------------------------------------------------------------
|
|
// 查看器 → 主窗口的上行事件触发(仅查看器调用)
|
|
// ------------------------------------------------------------
|
|
|
|
public static void RaisePaPicked(MyApp.PaMode mode, List<MyApp.PaTextResult> results)
|
|
{
|
|
if (PaPicked != null) PaPicked(mode, results);
|
|
}
|
|
|
|
public static void RaisePaExited()
|
|
{
|
|
if (PaExited != null) PaExited();
|
|
}
|
|
|
|
public static void RaiseEntityErased(string handle)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(handle) && EntityErased != null)
|
|
EntityErased(handle);
|
|
}
|
|
|
|
public static void RaiseF1() { if (F1Requested != null) F1Requested(); }
|
|
public static void RaiseF2() { if (F2Requested != null) F2Requested(); }
|
|
public static void RaiseF3() { if (F3Requested != null) F3Requested(); }
|
|
|
|
// ------------------------------------------------------------
|
|
// 主窗口 → 查看器的下行命令
|
|
// ------------------------------------------------------------
|
|
|
|
/// <summary>
|
|
/// 发送扒图命令。接受原 CAD 命令名(CADPATU/CADPAXH/CADPAYJ/CADPACL)
|
|
/// 或网页命令名(patu/paxh/payj/pacl)。
|
|
/// </summary>
|
|
public static void SendPaCommand(string cmd)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(cmd)) return;
|
|
string c = cmd.Trim().ToUpperInvariant();
|
|
int mode = 0;
|
|
if (c == "CADPATU" || c == "PATU") mode = 0;
|
|
else if (c == "CADPAXH" || c == "PAXH") mode = 1;
|
|
else if (c == "CADPAYJ" || c == "PAYJ") mode = 2;
|
|
else if (c == "CADPACL" || c == "PACL")
|
|
{
|
|
ClearHighlight();
|
|
return;
|
|
}
|
|
else return;
|
|
|
|
if (_viewer == null) return;
|
|
_viewer.StartPick(mode);
|
|
}
|
|
|
|
/// <summary>定位到指定 Handle 的蒙版框(点击表格行定位)。</summary>
|
|
public static void ZoomToFrameHandle(string handle)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(handle) || _viewer == null) return;
|
|
_viewer.ZoomToFrame(handle);
|
|
}
|
|
|
|
/// <summary>批量删除指定 Handle 的蒙版(删表格行联动删框)。</summary>
|
|
public static void DeleteFramesByHandles(IEnumerable<string> handles)
|
|
{
|
|
if (handles == null || _viewer == null) return;
|
|
var list = new List<string>();
|
|
foreach (string h in handles)
|
|
if (!string.IsNullOrWhiteSpace(h)) list.Add(h);
|
|
if (list.Count == 0) return;
|
|
_viewer.DeleteFrames(list);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 合并蒙版:保留 keep 的蒙版并扩大到所有 removes 蒙版的并集,
|
|
/// 被合并行的蒙版移除(元件合并时蒙版同步合并)。
|
|
/// </summary>
|
|
public static void MergeMasks(string keep, IEnumerable<string> removes)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(keep) || _viewer == null) return;
|
|
var list = new List<string>();
|
|
if (removes != null)
|
|
foreach (string h in removes)
|
|
if (!string.IsNullOrWhiteSpace(h) && h != keep) list.Add(h);
|
|
if (list.Count == 0) return;
|
|
_viewer.MergeMasks(keep, list);
|
|
}
|
|
|
|
/// <summary>清除所有高亮。</summary>
|
|
public static void ClearHighlight()
|
|
{
|
|
if (_viewer == null) return;
|
|
_viewer.ClearHighlight();
|
|
}
|
|
|
|
/// <summary>显示箱号组虚线框:把该箱号的箱号图框+全部元件图框按页求并集,
|
|
/// 每页画一个橙色虚线矩形(点元件表/箱号表行时调用)。
|
|
/// focusHandle=点中的框:翻到它所在页并缩放到装下整个组框(跳转适配)。</summary>
|
|
public static void SetGroupFrames(IEnumerable<string> handles, string focusHandle = null)
|
|
{
|
|
if (_viewer == null) return;
|
|
_viewer.SetGroupFrames(handles, focusHandle);
|
|
}
|
|
|
|
/// <summary>清除箱号组虚线框(点图号表行/新开 PDF 时)。</summary>
|
|
public static void ClearGroupFrames()
|
|
{
|
|
if (_viewer == null) return;
|
|
_viewer.ClearGroupFrames();
|
|
}
|
|
}
|
|
}
|