// ============================================================
// 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;
/// PDF 查看器是否已挂载且打开了文档。
public static bool IsViewerReady
{
get { return _viewer != null && _viewer.IsDocumentOpen; }
}
/// 当前打开的图纸名(去扩展名;查看器未打开文档为空)。扒图写入箱号「图纸」列用。
public static string CurrentDrawingName
{
get { return _viewer != null ? _viewer.CurrentDrawingName : ""; }
}
/// 扒图连续模式当前是否激活(供 ESC 全局过滤判断)。
public static bool PickModeActive
{
get { return _viewer != null && _viewer.PickModeActive; }
}
/// 兼容 CadBridge:查看器中蒙版被外部删除(当前无触发源,保留事件形状)。
public static event Action EntityErased;
/// 框选识别完成一批(图号/箱号/元件)。
public static event Action> PaPicked;
/// 用户按 ESC 退出连续扒图模式。
public static event Action PaExited;
/// 用户按 F1 —— 元件两两合并。
public static event Action F1Requested;
/// 用户按 F2 —— 元件三个一组合并。
public static event Action F2Requested;
/// 用户按 F3 —— 元件四个一组合并。
public static event Action F3Requested;
/// 把 PDF 查看器挂到桥上(查看器构造时调用一次)。
public static void Attach(PdfViewerWindow viewer)
{
_viewer = viewer;
}
// ------------------------------------------------------------
// 查看器 → 主窗口的上行事件触发(仅查看器调用)
// ------------------------------------------------------------
public static void RaisePaPicked(MyApp.PaMode mode, List 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(); }
// ------------------------------------------------------------
// 主窗口 → 查看器的下行命令
// ------------------------------------------------------------
///
/// 发送扒图命令。接受原 CAD 命令名(CADPATU/CADPAXH/CADPAYJ/CADPACL)
/// 或网页命令名(patu/paxh/payj/pacl)。
///
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);
}
/// 定位到指定 Handle 的蒙版框(点击表格行定位)。
public static void ZoomToFrameHandle(string handle)
{
if (string.IsNullOrWhiteSpace(handle) || _viewer == null) return;
_viewer.ZoomToFrame(handle);
}
/// 批量删除指定 Handle 的蒙版(删表格行联动删框)。
public static void DeleteFramesByHandles(IEnumerable handles)
{
if (handles == null || _viewer == null) return;
var list = new List();
foreach (string h in handles)
if (!string.IsNullOrWhiteSpace(h)) list.Add(h);
if (list.Count == 0) return;
_viewer.DeleteFrames(list);
}
///
/// 合并蒙版:保留 keep 的蒙版并扩大到所有 removes 蒙版的并集,
/// 被合并行的蒙版移除(元件合并时蒙版同步合并)。
///
public static void MergeMasks(string keep, IEnumerable removes)
{
if (string.IsNullOrWhiteSpace(keep) || _viewer == null) return;
var list = new List();
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);
}
/// 清除所有高亮。
public static void ClearHighlight()
{
if (_viewer == null) return;
_viewer.ClearHighlight();
}
/// 显示箱号组虚线框:把该箱号的箱号图框+全部元件图框按页求并集,
/// 每页画一个橙色虚线矩形(点元件表/箱号表行时调用)。
/// focusHandle=点中的框:翻到它所在页并缩放到装下整个组框(跳转适配)。
public static void SetGroupFrames(IEnumerable handles, string focusHandle = null)
{
if (_viewer == null) return;
_viewer.SetGroupFrames(handles, focusHandle);
}
/// 清除箱号组虚线框(点图号表行/新开 PDF 时)。
public static void ClearGroupFrames()
{
if (_viewer == null) return;
_viewer.ClearGroupFrames();
}
}
}