设计架构,隔离图纸生成逻辑

This commit is contained in:
sladro 2026-01-20 11:19:19 +08:00
parent 3bd6d7cd11
commit b03b72654e
9 changed files with 202 additions and 9 deletions

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
namespace CadParamPluging.Cad
{
public static class TemplateDrawingRegistry
{
private static readonly Dictionary<string, ITemplateDrawingGenerator> Generators =
new Dictionary<string, ITemplateDrawingGenerator>(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;
}
}
}

View File

@ -81,6 +81,12 @@
<Compile Include="Cad\DictionaryHelper.cs" /> <Compile Include="Cad\DictionaryHelper.cs" />
<Compile Include="Cad\FeatureDrivenDrawer.cs" /> <Compile Include="Cad\FeatureDrivenDrawer.cs" />
<Compile Include="Cad\HalfSectionDrawer.cs" /> <Compile Include="Cad\HalfSectionDrawer.cs" />
<Compile Include="Cad\Drawers\ITemplateDrawingGenerator.cs" />
<Compile Include="Cad\Drawers\TemplateDrawingGeneratorBase.cs" />
<Compile Include="Cad\Drawers\RingMachinedRollingGenerator.cs" />
<Compile Include="Cad\Drawers\RingRawRollingGenerator.cs" />
<Compile Include="Cad\Drawers\BlockRawFreeForgeRoundHeadGenerator.cs" />
<Compile Include="Cad\Drawers\TemplateDrawingRegistry.cs" />
<Compile Include="Cad\TemplateAnnotationOptionsExtractor.cs" /> <Compile Include="Cad\TemplateAnnotationOptionsExtractor.cs" />
<Compile Include="Cad\TemplateLayoutAnnotationExtractor.cs" /> <Compile Include="Cad\TemplateLayoutAnnotationExtractor.cs" />
<Compile Include="Cad\TemplateModelSheetExtractor.cs" /> <Compile Include="Cad\TemplateModelSheetExtractor.cs" />

View File

@ -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 控件命名、字段等开发时根据实际参数调整。 > 具体 UI 控件命名、字段等开发时根据实际参数调整。
--- ---

View File

@ -231,6 +231,12 @@ namespace CadParamPluging.UI
return; return;
} }
if (!TemplateDrawingRegistry.TryResolve(templateKey, out var generator))
{
AppendLog($"未找到该模板的图纸生成逻辑TemplateKey={templateKey})。请先实现对应模板生成器。");
return;
}
var catalog = ParamCatalogStore.Load(); var catalog = ParamCatalogStore.Load();
CadParamPluging.Common.ParamBag bag; CadParamPluging.Common.ParamBag bag;
// 若用户点击了【读取参数】,则将读取到的参数作为本次弹窗的默认值回填 // 若用户点击了【读取参数】,则将读取到的参数作为本次弹窗的默认值回填
@ -352,7 +358,7 @@ namespace CadParamPluging.UI
} }
// 1. 获取预估图形尺寸 (不含标注的纯几何尺寸 + 预留边距) // 1. 获取预估图形尺寸 (不含标注的纯几何尺寸 + 预留边距)
var expectedSize = FeatureDrivenDrawer.CalculateExpectedSize(bag, tplParams.SheetSize); var expectedSize = generator.CalculateExpectedSize(bag, tplParams);
// 调试:输出关键参数以排查比例建议错误 // 调试:输出关键参数以排查比例建议错误
var debugDelivery = bag.GetString("DeliveryStatus"); var debugDelivery = bag.GetString("DeliveryStatus");
@ -438,16 +444,12 @@ namespace CadParamPluging.UI
// 根据模板参数绘制半剖视图,居中放置于原图纸位置 // 根据模板参数绘制半剖视图,居中放置于原图纸位置
// 使用特征驱动模式:根据参数存在性动态绘制对应特征 // 使用特征驱动模式:根据参数存在性动态绘制对应特征
HalfSectionDrawer.Draw( generator.Draw(
ctx, ctx,
bag, bag,
tplParams.ProjectType, // 交付状态 tplParams,
tplParams.SheetSize, // 结构特征 removeResult.OriginalCenter,
tplParams.Scale, // 特殊条件(中心冲孔/有圆头等) scaleFactor);
tplParams.DrawingType, // 工艺方法(轧制/自由锻)
removeResult.OriginalCenter, // 原图纸中心点
scaleFactor // 缩放比例
);
// Force Zoom Extents to ensure visibility // Force Zoom Extents to ensure visibility
try { doc.SendStringToExecute("._ZOOM _E ", true, false, false); } catch { } try { doc.SendStringToExecute("._ZOOM _E ", true, false, false); } catch { }