diff --git a/Cad/Drawers/BlockRawFreeForgeRoundHeadGenerator.cs b/Cad/Drawers/BlockRawFreeForgeRoundHeadGenerator.cs new file mode 100644 index 0000000..71044f6 --- /dev/null +++ b/Cad/Drawers/BlockRawFreeForgeRoundHeadGenerator.cs @@ -0,0 +1,11 @@ +using CadParamPluging.Common; + +namespace CadParamPluging.Cad +{ + public sealed class BlockRawFreeForgeRoundHeadGenerator : TemplateDrawingGeneratorBase + { + public static readonly string Key = TemplateKeyBuilder.Build("毛料态", "自由锻", "方体", "有圆头"); + + public override string TemplateKey => Key; + } +} diff --git a/Cad/Drawers/ITemplateDrawingGenerator.cs b/Cad/Drawers/ITemplateDrawingGenerator.cs new file mode 100644 index 0000000..6046519 --- /dev/null +++ b/Cad/Drawers/ITemplateDrawingGenerator.cs @@ -0,0 +1,15 @@ +using Autodesk.AutoCAD.Geometry; +using CadParamPluging.Common; +using CadParamPluging.Domain.Models; + +namespace CadParamPluging.Cad +{ + public interface ITemplateDrawingGenerator + { + string TemplateKey { get; } + + FeatureDrivenDrawer.ExpectedDrawingSize CalculateExpectedSize(ParamBag bag, TemplateParams templateParams); + + void Draw(CadContext ctx, ParamBag bag, TemplateParams templateParams, Point3d center, double scaleFactor); + } +} diff --git a/Cad/Drawers/RingMachinedRollingGenerator.cs b/Cad/Drawers/RingMachinedRollingGenerator.cs new file mode 100644 index 0000000..d756b5e --- /dev/null +++ b/Cad/Drawers/RingMachinedRollingGenerator.cs @@ -0,0 +1,11 @@ +using CadParamPluging.Common; + +namespace CadParamPluging.Cad +{ + public sealed class RingMachinedRollingGenerator : TemplateDrawingGeneratorBase + { + public static readonly string Key = TemplateKeyBuilder.Build("车加工", "轧制", "环形", "无"); + + public override string TemplateKey => Key; + } +} diff --git a/Cad/Drawers/RingRawRollingGenerator.cs b/Cad/Drawers/RingRawRollingGenerator.cs new file mode 100644 index 0000000..a4d785d --- /dev/null +++ b/Cad/Drawers/RingRawRollingGenerator.cs @@ -0,0 +1,11 @@ +using CadParamPluging.Common; + +namespace CadParamPluging.Cad +{ + public sealed class RingRawRollingGenerator : TemplateDrawingGeneratorBase + { + public static readonly string Key = TemplateKeyBuilder.Build("毛料态", "轧制", "环形", "无"); + + public override string TemplateKey => Key; + } +} diff --git a/Cad/Drawers/TemplateDrawingGeneratorBase.cs b/Cad/Drawers/TemplateDrawingGeneratorBase.cs new file mode 100644 index 0000000..26064be --- /dev/null +++ b/Cad/Drawers/TemplateDrawingGeneratorBase.cs @@ -0,0 +1,40 @@ +using System; +using Autodesk.AutoCAD.Geometry; +using CadParamPluging.Common; +using CadParamPluging.Domain.Models; + +namespace CadParamPluging.Cad +{ + public abstract class TemplateDrawingGeneratorBase : ITemplateDrawingGenerator + { + public abstract string TemplateKey { get; } + + public virtual FeatureDrivenDrawer.ExpectedDrawingSize CalculateExpectedSize(ParamBag bag, TemplateParams templateParams) + { + return FeatureDrivenDrawer.CalculateExpectedSize(bag, templateParams?.SheetSize); + } + + public virtual void Draw(CadContext ctx, ParamBag bag, TemplateParams templateParams, Point3d center, double scaleFactor) + { + if (ctx == null) + { + throw new ArgumentNullException(nameof(ctx)); + } + + if (templateParams == null) + { + throw new ArgumentNullException(nameof(templateParams)); + } + + HalfSectionDrawer.Draw( + ctx, + bag, + templateParams.ProjectType, + templateParams.SheetSize, + templateParams.Scale, + templateParams.DrawingType, + center, + scaleFactor); + } + } +} diff --git a/Cad/Drawers/TemplateDrawingRegistry.cs b/Cad/Drawers/TemplateDrawingRegistry.cs new file mode 100644 index 0000000..da44b72 --- /dev/null +++ b/Cad/Drawers/TemplateDrawingRegistry.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace CadParamPluging.Cad +{ + public static class TemplateDrawingRegistry + { + private static readonly Dictionary Generators = + new Dictionary(StringComparer.OrdinalIgnoreCase); + + static TemplateDrawingRegistry() + { + Register(new RingMachinedRollingGenerator()); + Register(new RingRawRollingGenerator()); + Register(new BlockRawFreeForgeRoundHeadGenerator()); + } + + public static bool TryResolve(string templateKey, out ITemplateDrawingGenerator generator) + { + generator = null; + if (string.IsNullOrWhiteSpace(templateKey)) + { + return false; + } + + return Generators.TryGetValue(templateKey, out generator); + } + + private static void Register(ITemplateDrawingGenerator generator) + { + if (generator == null || string.IsNullOrWhiteSpace(generator.TemplateKey)) + { + return; + } + + Generators[generator.TemplateKey] = generator; + } + } +} diff --git a/CadParamPluging.csproj b/CadParamPluging.csproj index b70ec37..1414ef7 100644 --- a/CadParamPluging.csproj +++ b/CadParamPluging.csproj @@ -81,6 +81,12 @@ + + + + + + diff --git a/Readme.md b/Readme.md index 3db8b95..a47a368 100644 --- a/Readme.md +++ b/Readme.md @@ -547,6 +547,64 @@ public partial class ParamDrawingPanel : UserControl } ``` +### 4.5 新模板出图逻辑隔离(新增模板开发流程) + +为保证每个模板的**生成图纸逻辑隔离**,出图逻辑按模板拆分为独立生成器: + +**核心机制** + +- 每个模板由 `TemplateKey` 唯一标识(由 `TemplateKeyBuilder.Build(ProjectType, DrawingType, SheetSize, Scale)` 生成)。 +- 出图时根据 `TemplateKey` 从 `TemplateDrawingRegistry` 解析到对应生成器; +- 公共流程(清理模板、附注/表格替换、标题栏更新、参数保存)仍在 `ParamDrawingPanel` 中执行, + **只有“图形绘制 + 预期尺寸计算”由各生成器负责**。 + +**新增模板流程(开发者指引)** + +1. **新增生成器类** + - 目录:`Cad/Drawers/` + - 实现 `ITemplateDrawingGenerator` 或继承 `TemplateDrawingGeneratorBase`。 + - 指定 `TemplateKey`,与模板参数绑定配置完全一致。 + + ```csharp + public sealed class NewTemplateGenerator : TemplateDrawingGeneratorBase + { + public static readonly string Key = TemplateKeyBuilder.Build("交付状态", "工艺方法", "结构特征", "特殊条件"); + public override string TemplateKey => Key; + + // 如需特殊尺寸预估,重写此方法 + public override FeatureDrivenDrawer.ExpectedDrawingSize CalculateExpectedSize(ParamBag bag, TemplateParams templateParams) + { + return base.CalculateExpectedSize(bag, templateParams); + } + + // 如需自定义出图逻辑,重写此方法 + public override void Draw(CadContext ctx, ParamBag bag, TemplateParams templateParams, Point3d center, double scaleFactor) + { + // 自定义绘图逻辑 + } + } + ``` + +2. **注册生成器** + - 在 `TemplateDrawingRegistry` 的静态构造函数中注册: + + ```csharp + Register(new NewTemplateGenerator()); + ``` + +3. **配置模板参数绑定** + - 在 `模板参数绑定` 界面新增模板定义(或在 `TemplateSchemaDefaults` 中加入默认项)。 + - 确保 `ProjectType / DrawingType / SheetSize / Scale` 与生成器 `TemplateKey` 完全一致。 + +4. **参数与附注** + - 在模板绑定里选择该模板需要的参数; + - 配置附注模板文本与占位符绑定(若需要)。 + +**说明** + +- 现有模板生成器示例位于 `Cad/Drawers/`,可直接参考扩展; +- 若某模板需要完全不同的绘图算法,可在生成器中自行实现,不影响其他模板。 + > 具体 UI 控件命名、字段等开发时根据实际参数调整。 --- diff --git a/UI/ParamDrawingPanel.cs b/UI/ParamDrawingPanel.cs index c701c17..dcac0b2 100644 --- a/UI/ParamDrawingPanel.cs +++ b/UI/ParamDrawingPanel.cs @@ -231,6 +231,12 @@ namespace CadParamPluging.UI return; } + if (!TemplateDrawingRegistry.TryResolve(templateKey, out var generator)) + { + AppendLog($"未找到该模板的图纸生成逻辑(TemplateKey={templateKey})。请先实现对应模板生成器。"); + return; + } + var catalog = ParamCatalogStore.Load(); CadParamPluging.Common.ParamBag bag; // 若用户点击了【读取参数】,则将读取到的参数作为本次弹窗的默认值回填 @@ -352,7 +358,7 @@ namespace CadParamPluging.UI } // 1. 获取预估图形尺寸 (不含标注的纯几何尺寸 + 预留边距) - var expectedSize = FeatureDrivenDrawer.CalculateExpectedSize(bag, tplParams.SheetSize); + var expectedSize = generator.CalculateExpectedSize(bag, tplParams); // 调试:输出关键参数以排查比例建议错误 var debugDelivery = bag.GetString("DeliveryStatus"); @@ -438,16 +444,12 @@ namespace CadParamPluging.UI // 根据模板参数绘制半剖视图,居中放置于原图纸位置 // 使用特征驱动模式:根据参数存在性动态绘制对应特征 - HalfSectionDrawer.Draw( + generator.Draw( ctx, bag, - tplParams.ProjectType, // 交付状态 - tplParams.SheetSize, // 结构特征 - tplParams.Scale, // 特殊条件(中心冲孔/有圆头等) - tplParams.DrawingType, // 工艺方法(轧制/自由锻) - removeResult.OriginalCenter, // 原图纸中心点 - scaleFactor // 缩放比例 - ); + tplParams, + removeResult.OriginalCenter, + scaleFactor); // Force Zoom Extents to ensure visibility try { doc.SendStringToExecute("._ZOOM _E ", true, false, false); } catch { }