From 6516de99375616a2bfc011bda07586da9fb98b75 Mon Sep 17 00:00:00 2001 From: sladro Date: Wed, 31 Dec 2025 11:21:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=87=AA=E5=8A=A8=E6=AF=94?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/ParamDrawingPanel.cs | 75 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/UI/ParamDrawingPanel.cs b/UI/ParamDrawingPanel.cs index 63d0391..3d889ba 100644 --- a/UI/ParamDrawingPanel.cs +++ b/UI/ParamDrawingPanel.cs @@ -644,7 +644,80 @@ namespace CadParamPluging.UI { AppendLog($"原图中心点: {removeResult.OriginalCenter}"); } - AppendLog($"绘图参数: Type={tplParams.ProjectType}, Size={tplParams.SheetSize}, Scale={tplParams.Scale}, Method={tplParams.DrawingType}"); + + // --------------------------------------------------------- + // 智能比例建议 (Pre-calculation) + // --------------------------------------------------------- + if (removeResult.WhiteFrameExtents.HasValue) + { + var frame = removeResult.WhiteFrameExtents.Value; + var frameWidth = frame.MaxPoint.X - frame.MinPoint.X; + var frameHeight = frame.MaxPoint.Y - frame.MinPoint.Y; + + // 1. 获取预估图形尺寸 (不含标注的纯几何尺寸 + 预留边距) + var expectedSize = FeatureDrivenDrawer.CalculateExpectedSize(bag, tplParams.SheetSize); + + if (expectedSize.IsValid) + { + var currentDrawW = expectedSize.Width * scaleFactor; + var currentDrawH = expectedSize.Height * scaleFactor; + + bool isOverflow = currentDrawW > frameWidth || currentDrawH > frameHeight; + bool isTooSmall = currentDrawW < frameWidth * 0.3 && currentDrawH < frameHeight * 0.3; + + if (isOverflow || isTooSmall) + { + // 计算建议比例 (目标填充率 65%) + var ratioW = frameWidth / expectedSize.Width; + var ratioH = frameHeight / expectedSize.Height; + var targetScale = Math.Min(ratioW, ratioH) * 0.65; + + // 格式化建议比例 + string suggestedScaleText; + double newOneToN = 1.0 / targetScale; + + // 简单的取整逻辑,优先凑整 1:1, 1:2, 1:5, 1:10 等 + if (targetScale >= 0.95) + { + suggestedScaleText = "1:1"; + targetScale = 1.0; + } + else + { + // 凑整到最近的 0.5 或 整数 + if (newOneToN < 10) + { + newOneToN = Math.Round(newOneToN * 2) / 2.0; // 凑整 0.5 + } + else + { + newOneToN = Math.Round(newOneToN); // 凑整 1 + } + suggestedScaleText = $"1:{newOneToN}"; + targetScale = 1.0 / newOneToN; + } + + var msg = isOverflow + ? $"当前比例 (1:{(1/scaleFactor):F1}) 会导致图形超出图纸边框。\n建议调整为 {suggestedScaleText}。\n\n是否应用建议比例?" + : $"当前比例 (1:{(1/scaleFactor):F1}) 会导致图形过小(占比<30%)。\n建议调整为 {suggestedScaleText}。\n\n是否应用建议比例?"; + + var dialogResult = MessageBox.Show(this, msg, "自动比例建议", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (dialogResult == DialogResult.Yes) + { + scaleFactor = targetScale; + bag.Set("DrawingScale", suggestedScaleText); // 更新参数包中的比例字符串 + AppendLog($"[自动调整] 已应用建议比例: {suggestedScaleText}"); + } + else + { + AppendLog($"[自动调整] 用户忽略了比例建议,保持原比例。"); + } + } + } + } + + AppendLog($"绘图参数: Type={tplParams.ProjectType}, Size={tplParams.SheetSize}, Scale={bag.GetString("DrawingScale")}, Method={tplParams.DrawingType}"); // Dubug: Dump bag keys var bagKeys = bag.GetKeys(); // Assuming GetKeys exists? If not, skip or use reflection?