Update plugin UI with new fields, layout fixes, and settings dialog

This commit is contained in:
sladro 2025-12-11 16:23:18 +08:00
parent bf015be21a
commit 7987c4ee43
16 changed files with 980 additions and 13 deletions

30
Cad/CadContext.cs Normal file
View File

@ -0,0 +1,30 @@
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
namespace CadParamPluging.Cad
{
public class CadContext : IDisposable
{
public Document Document { get; }
public Database Database => Document.Database;
public Transaction Transaction { get; private set; }
public CadContext(Document document)
{
Document = document;
Transaction = Database.TransactionManager.StartTransaction();
}
public void Commit()
{
Transaction?.Commit();
}
public void Dispose()
{
Transaction?.Dispose();
Transaction = null;
}
}
}

30
Cad/CadDrawingService.cs Normal file
View File

@ -0,0 +1,30 @@
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
namespace CadParamPluging.Cad
{
public class CadDrawingService
{
private readonly CadContext _context;
public CadDrawingService(CadContext context)
{
_context = context;
}
public ObjectId DrawLine(Point3d start, Point3d end)
{
var db = _context.Database;
var tr = _context.Transaction;
var blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
var blockTableRecord = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
using (var line = new Line(start, end))
{
var id = blockTableRecord.AppendEntity(line);
tr.AddNewlyCreatedDBObject(line, true);
return id;
}
}
}
}

View File

@ -0,0 +1,15 @@
using Autodesk.AutoCAD.ApplicationServices;
using CadParamPluging.Domain.Models;
namespace CadParamPluging.Cad
{
public static class TemplateDrawingService
{
public static Document CreateDocumentFromTemplate(TemplateInfo template)
{
var doc = Application.DocumentManager.Add(template.FilePath);
Application.DocumentManager.MdiActiveDocument = doc;
return doc;
}
}
}

View File

@ -40,10 +40,16 @@
<Reference Include="acmgd">
<HintPath>C:\Program Files\Autodesk\AutoCAD 2014\acmgd.dll</HintPath>
</Reference>
<Reference Include="AdWindows">
<HintPath>C:\Program Files\Autodesk\AutoCAD 2014\AdWindows.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="WindowsBase" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@ -53,6 +59,24 @@
</ItemGroup>
<ItemGroup>
<Compile Include="PluginEntry.cs" />
<Compile Include="Common\BusinessException.cs" />
<Compile Include="Common\Logger.cs" />
<Compile Include="Cad\CadContext.cs" />
<Compile Include="Cad\CadDrawingService.cs" />
<Compile Include="Cad\TemplateDrawingService.cs" />
<Compile Include="Data\DefaultTemplateRepository.cs" />
<Compile Include="Data\ITemplateRepository.cs" />
<Compile Include="Data\TemplateDefinition.cs" />
<Compile Include="Domain\DomainFacade.cs" />
<Compile Include="Domain\Models\DrawingParams.cs" />
<Compile Include="Domain\Models\TemplateInfo.cs" />
<Compile Include="Domain\Models\TemplateParams.cs" />
<Compile Include="UI\ParamDrawingPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\SettingsForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@ -0,0 +1,15 @@
using System;
namespace CadParamPluging.Common
{
public class BusinessException : Exception
{
public BusinessException(string message) : base(message)
{
}
public BusinessException(string message, Exception innerException) : base(message, innerException)
{
}
}
}

22
Common/Logger.cs Normal file
View File

@ -0,0 +1,22 @@
using System.Diagnostics;
namespace CadParamPluging.Common
{
public static class Logger
{
public static void Info(string message)
{
Debug.WriteLine(message);
}
public static void Error(string message)
{
Debug.WriteLine(message);
}
public static void Error(string message, System.Exception ex)
{
Debug.WriteLine($"{message}: {ex}");
}
}
}

View File

@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CadParamPluging.Domain.Models;
namespace CadParamPluging.Data
{
public class DefaultTemplateRepository : ITemplateRepository
{
private readonly List<TemplateDefinition> _templates;
public DefaultTemplateRepository()
{
_templates = new List<TemplateDefinition>
{
new TemplateDefinition
{
ProjectType = "结构",
DrawingType = "基础平面",
SheetSize = "A1",
Scale = "1:50",
FilePath = "C\\CadTemplates\\Stru_Base_A1_50.dwt",
Description = "结构基础平面 A1 1:50"
},
new TemplateDefinition
{
ProjectType = "示例",
DrawingType = "示例图",
SheetSize = "A3",
Scale = "1:100",
FilePath = "C\\CadTemplates\\Sample_A3_100.dwt",
Description = "示例模板 A3 1:100"
}
};
}
public TemplateDefinition FindTemplate(TemplateParams templateParams)
{
if (templateParams == null)
{
return null;
}
var matches = _templates.Where(t => Matches(t.ProjectType, templateParams.ProjectType)
&& Matches(t.DrawingType, templateParams.DrawingType)
&& Matches(t.SheetSize, templateParams.SheetSize)
&& Matches(t.Scale, templateParams.Scale))
.ToList();
if (matches.Count == 1)
{
return matches.First();
}
return null;
}
private static bool Matches(string source, string input)
{
if (string.IsNullOrWhiteSpace(input))
{
return true;
}
return source != null && input != null && source.Equals(input, StringComparison.OrdinalIgnoreCase);
}
}
}

View File

@ -0,0 +1,9 @@
using CadParamPluging.Domain.Models;
namespace CadParamPluging.Data
{
public interface ITemplateRepository
{
TemplateDefinition FindTemplate(TemplateParams templateParams);
}
}

View File

@ -0,0 +1,12 @@
namespace CadParamPluging.Data
{
public class TemplateDefinition
{
public string ProjectType { get; set; }
public string DrawingType { get; set; }
public string SheetSize { get; set; }
public string Scale { get; set; }
public string FilePath { get; set; }
public string Description { get; set; }
}
}

82
Domain/DomainFacade.cs Normal file
View File

@ -0,0 +1,82 @@
using System;
using Autodesk.AutoCAD.Geometry;
using CadParamPluging.Cad;
using CadParamPluging.Common;
using CadParamPluging.Data;
using CadParamPluging.Domain.Models;
namespace CadParamPluging.Domain
{
public static class DomainFacade
{
private static readonly ITemplateRepository TemplateRepository = new DefaultTemplateRepository();
public static TemplateInfo SelectTemplate(TemplateParams templateParams)
{
var definition = TemplateRepository.FindTemplate(templateParams);
if (definition == null)
{
throw new BusinessException("未找到匹配的模板,或匹配结果不唯一。");
}
return new TemplateInfo
{
Name = definition.Description ?? definition.FilePath,
FilePath = definition.FilePath,
Description = definition.Description
};
}
public static void ValidateParameters(TemplateParams templateParams, DrawingParams drawingParams)
{
if (templateParams == null)
{
throw new BusinessException("模板参数不能为空。");
}
if (string.IsNullOrWhiteSpace(templateParams.ProjectType) ||
string.IsNullOrWhiteSpace(templateParams.DrawingType))
{
throw new BusinessException("请填写项目类型和图纸类型。");
}
if (drawingParams == null || !drawingParams.HasValidSize())
{
throw new BusinessException("请填写有效的出图尺寸(宽度和高度需大于 0。");
}
}
public static void DrawByParams(TemplateInfo template, DrawingParams drawingParams, CadDrawingService cadService)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
if (cadService == null)
{
throw new ArgumentNullException(nameof(cadService));
}
var width = drawingParams?.Width ?? 0;
var height = drawingParams?.Height ?? 0;
if (width <= 0 || height <= 0)
{
width = width <= 0 ? 5000 : width;
height = height <= 0 ? 3000 : height;
}
var p1 = new Point3d(0, 0, 0);
var p2 = new Point3d(width, 0, 0);
var p3 = new Point3d(width, height, 0);
var p4 = new Point3d(0, height, 0);
cadService.DrawLine(p1, p2);
cadService.DrawLine(p2, p3);
cadService.DrawLine(p3, p4);
cadService.DrawLine(p4, p1);
}
}
}

View File

@ -0,0 +1,13 @@
namespace CadParamPluging.Domain.Models
{
public class DrawingParams
{
public double Width { get; set; }
public double Height { get; set; }
public bool HasValidSize()
{
return Width > 0 && Height > 0;
}
}
}

View File

@ -0,0 +1,9 @@
namespace CadParamPluging.Domain.Models
{
public class TemplateInfo
{
public string Name { get; set; }
public string FilePath { get; set; }
public string Description { get; set; }
}
}

View File

@ -0,0 +1,10 @@
namespace CadParamPluging.Domain.Models
{
public class TemplateParams
{
public string ProjectType { get; set; }
public string DrawingType { get; set; }
public string SheetSize { get; set; }
public string Scale { get; set; }
}
}

View File

@ -1,17 +1,30 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Linq;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using Autodesk.Windows;
using CadParamPluging.UI;
namespace CadParamPluging
{
public class PluginEntry : IExtensionApplication
{
private static PaletteSet _palette;
private static bool _ribbonButtonCreated;
private const string RibbonTabId = "CadParamPlugingTab";
private const string RibbonPanelId = "CadParamPlugingPanel";
private const string RibbonButtonId = "CadParamPlugingPanelButton";
public void Initialize()
{
ShowPalette();
EnsurePaletteCreated();
CreateRibbonButton();
Application.Idle += OnApplicationIdle;
}
public void Terminate()
@ -19,7 +32,7 @@ namespace CadParamPluging
// 可在此释放资源或记录日志
}
private void ShowPalette()
private void EnsurePaletteCreated()
{
if (_palette == null)
{
@ -27,21 +40,169 @@ namespace CadParamPluging
{
Style = PaletteSetStyles.ShowCloseButton |
PaletteSetStyles.ShowAutoHideButton |
PaletteSetStyles.Snappable
PaletteSetStyles.Snappable,
DockEnabled = DockSides.Right,
Dock = DockSides.Right
};
var placeholder = new Label
{
Text = "Param panel placeholder",
Dock = DockStyle.Fill,
TextAlign = ContentAlignment.MiddleCenter
};
_palette.Add("Main", placeholder);
var panel = new ParamDrawingPanel();
_palette.Add("Main", panel);
_palette.MinimumSize = new Size(240, 200);
}
}
private void ShowPalette()
{
EnsurePaletteCreated();
_palette.Dock = DockSides.Right;
_palette.Visible = true;
_palette.Activate(0);
}
private void CreateRibbonButton()
{
var ribbon = ComponentManager.Ribbon;
if (ribbon == null)
{
return;
}
if (_ribbonButtonCreated)
{
return;
}
var tab = ribbon.Tabs.FirstOrDefault(t => t.Id == RibbonTabId);
if (tab == null)
{
tab = ribbon.Tabs.FirstOrDefault(t =>
string.Equals(t.Title, "插件", StringComparison.OrdinalIgnoreCase) ||
string.Equals(t.Title, "Add-Ins", StringComparison.OrdinalIgnoreCase) ||
string.Equals(t.Title, "Add-ins", StringComparison.OrdinalIgnoreCase));
}
if (tab == null)
{
tab = new RibbonTab
{
Title = "参数化出图",
Id = RibbonTabId
};
ribbon.Tabs.Add(tab);
}
var panel = tab.Panels.FirstOrDefault(p => p.Source != null && p.Source.Id == RibbonPanelId);
if (panel == null)
{
var source = new RibbonPanelSource
{
Id = RibbonPanelId,
Title = "插件"
};
panel = new RibbonPanel { Source = source };
tab.Panels.Add(panel);
}
var existingButton = panel.Source.Items
.OfType<RibbonButton>()
.FirstOrDefault(b => b.Id == RibbonButtonId);
if (existingButton == null)
{
panel.Source.Items.Clear();
var button = new RibbonButton
{
Id = RibbonButtonId,
Name = "参数面板",
Text = "参数面板",
ShowText = true,
ShowImage = true,
Size = RibbonItemSize.Large,
Orientation = System.Windows.Controls.Orientation.Vertical,
CommandHandler = new RelayCommand(ShowPalette)
};
var img = LoadImage("param_panel.png");
if (img != null)
{
button.LargeImage = img;
button.Image = img;
}
var row = new RibbonRowPanel();
row.Items.Add(button);
panel.Source.Items.Add(row);
}
tab.IsActive = true;
_ribbonButtonCreated = true;
}
private void OnApplicationIdle(object sender, EventArgs e)
{
if (_ribbonButtonCreated)
{
Application.Idle -= OnApplicationIdle;
return;
}
CreateRibbonButton();
}
private static ImageSource LoadImage(string fileName)
{
try
{
var asmPath = typeof(PluginEntry).Assembly.Location;
var dir = Path.GetDirectoryName(asmPath);
if (string.IsNullOrEmpty(dir))
{
return null;
}
var fullPath = Path.Combine(dir, fileName);
if (!File.Exists(fullPath))
{
return null;
}
var img = new BitmapImage();
img.BeginInit();
img.UriSource = new Uri(fullPath, UriKind.Absolute);
img.CacheOption = BitmapCacheOption.OnLoad;
img.EndInit();
img.Freeze();
return img;
}
catch
{
return null;
}
}
private class RelayCommand : ICommand
{
private readonly System.Action _action;
public RelayCommand(System.Action action)
{
_action = action;
}
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
_action?.Invoke();
}
public event System.EventHandler CanExecuteChanged
{
add { }
remove { }
}
}
[CommandMethod("PARAM_PANEL")]

400
UI/ParamDrawingPanel.cs Normal file
View File

@ -0,0 +1,400 @@
using System;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using CadParamPluging.Cad;
using CadParamPluging.Common;
using CadParamPluging.Domain;
using CadParamPluging.Domain.Models;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace CadParamPluging.UI
{
public class ParamDrawingPanel : UserControl
{
private readonly ComboBox _cbProjectType;
private readonly ComboBox _cbDrawingType;
private readonly ComboBox _cbSheetSize;
private readonly ComboBox _cbScale;
private readonly TextBox _txtWidth;
private readonly TextBox _txtHeight;
private Label _lblTemplateInfo;
private TextBox _txtLog;
private TextBox _txtTemplatePath;
private TemplateInfo _selectedTemplate;
public ParamDrawingPanel()
{
Dock = DockStyle.Fill;
var layout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 1,
RowCount = 4,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink,
Padding = new Padding(8)
};
_cbProjectType = CreateComboBox(new[] { "结构", "示例" });
_cbDrawingType = CreateComboBox(new[] { "基础平面", "示例图" });
_cbSheetSize = CreateComboBox(new[] { "A1", "A3" });
_cbScale = CreateComboBox(new[] { "1:50", "1:100" });
_txtWidth = CreateTextBox("5000");
_txtHeight = CreateTextBox("3000");
var templateGroup = BuildTemplateGroup();
var drawingGroup = BuildDrawingGroup();
var actionPanel = BuildActionPanel();
var logGroup = BuildLogGroup();
layout.Controls.Add(templateGroup, 0, 0);
layout.Controls.Add(drawingGroup, 0, 1);
layout.Controls.Add(actionPanel, 0, 2);
layout.Controls.Add(logGroup, 0, 3);
Controls.Add(layout);
}
private GroupBox BuildTemplateGroup()
{
var group = new GroupBox
{
Text = "模板参数",
Dock = DockStyle.Top,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink
};
var grid = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 6,
AutoSize = true
};
grid.Controls.Add(new Label { Text = "交付状态", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 0);
grid.Controls.Add(_cbProjectType, 1, 0);
grid.Controls.Add(new Label { Text = "工艺方法", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 1);
grid.Controls.Add(_cbDrawingType, 1, 1);
grid.Controls.Add(new Label { Text = "结构特征", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 2);
grid.Controls.Add(_cbSheetSize, 1, 2);
grid.Controls.Add(new Label { Text = "特殊条件", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 3);
grid.Controls.Add(_cbScale, 1, 3);
var btnSelect = new Button { Text = "选择模板", AutoSize = true };
btnSelect.Click += (_, __) => OnSelectTemplate();
_txtTemplatePath = new TextBox { Width = 160, ReadOnly = true };
grid.Controls.Add(btnSelect, 0, 4);
grid.Controls.Add(_txtTemplatePath, 1, 4);
var btnMatch = new Button { Text = "匹配模板", AutoSize = true };
btnMatch.Click += (_, __) => OnMatchTemplate();
_lblTemplateInfo = new Label
{
Text = "未匹配模板",
AutoSize = true,
ForeColor = Color.DarkBlue,
TextAlign = ContentAlignment.MiddleLeft
};
grid.Controls.Add(btnMatch, 0, 5);
grid.Controls.Add(_lblTemplateInfo, 1, 5);
group.Controls.Add(grid);
return group;
}
private GroupBox BuildDrawingGroup()
{
var group = new GroupBox
{
Text = "出图参数",
Dock = DockStyle.Top,
AutoSize = true,
AutoSizeMode = AutoSizeMode.GrowAndShrink
};
var grid = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 3,
AutoSize = true
};
grid.Controls.Add(new Label { Text = "宽度(mm)", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 0);
grid.Controls.Add(_txtWidth, 1, 0);
grid.Controls.Add(new Label { Text = "高度(mm)", AutoSize = true, TextAlign = ContentAlignment.MiddleLeft }, 0, 1);
grid.Controls.Add(_txtHeight, 1, 1);
group.Controls.Add(grid);
return group;
}
private FlowLayoutPanel BuildActionPanel()
{
var panel = new FlowLayoutPanel
{
Dock = DockStyle.Top,
AutoSize = true
};
var btnGenerate = new Button { Text = "生成图纸", AutoSize = true };
btnGenerate.Click += (_, __) => OnGenerateDrawing();
var btnSaveAs = new Button { Text = "保存当前图纸", AutoSize = true };
btnSaveAs.Click += (_, __) => OnSaveDrawing();
var btnSettings = new Button { Text = "设置", AutoSize = true };
btnSettings.Click += (_, __) => OnOpenSettings();
panel.Controls.Add(btnGenerate);
panel.Controls.Add(btnSaveAs);
panel.Controls.Add(btnSettings);
return panel;
}
private GroupBox BuildLogGroup()
{
var group = new GroupBox
{
Text = "日志",
Dock = DockStyle.Fill
};
_txtLog = new TextBox
{
Multiline = true,
ScrollBars = ScrollBars.Vertical,
Dock = DockStyle.Fill,
Height = 140
};
group.Controls.Add(_txtLog);
return group;
}
private void OnMatchTemplate()
{
try
{
var tplParams = CollectTemplateParams();
_selectedTemplate = DomainFacade.SelectTemplate(tplParams);
_lblTemplateInfo.Text = $"已匹配: {_selectedTemplate.Name}";
_txtTemplatePath.Text = _selectedTemplate.FilePath;
AppendLog($"模板: {_selectedTemplate.FilePath}");
}
catch (BusinessException bex)
{
_selectedTemplate = null;
_lblTemplateInfo.Text = "未匹配模板";
_txtTemplatePath.Text = "";
AppendLog($"模板选择错误: {bex.Message}");
}
catch (Exception ex)
{
_selectedTemplate = null;
_lblTemplateInfo.Text = "未匹配模板";
_txtTemplatePath.Text = "";
AppendLog($"异常: {ex.Message}");
Logger.Error("MatchTemplate", ex);
}
}
private void OnSelectTemplate()
{
try
{
using (var dialog = new OpenFileDialog())
{
dialog.Filter = "CAD 模板文件 (*.dwt;*.dwg)|*.dwt;*.dwg|所有文件 (*.*)|*.*";
dialog.Title = "选择模板文件";
if (dialog.ShowDialog() == DialogResult.OK)
{
var filePath = dialog.FileName;
var fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
_selectedTemplate = new TemplateInfo
{
Name = fileName,
FilePath = filePath,
Description = "手动选择"
};
_txtTemplatePath.Text = filePath;
_lblTemplateInfo.Text = $"已选择: {fileName}";
AppendLog($"手动选择模板: {filePath}");
}
}
}
catch (Exception ex)
{
AppendLog($"选择模板失败: {ex.Message}");
Logger.Error("SelectTemplate", ex);
}
}
private void OnGenerateDrawing()
{
try
{
var tplParams = CollectTemplateParams();
var drawingParams = CollectDrawingParams();
if (_selectedTemplate == null)
{
_selectedTemplate = DomainFacade.SelectTemplate(tplParams);
_lblTemplateInfo.Text = $"已匹配: {_selectedTemplate.Name}";
}
DomainFacade.ValidateParameters(tplParams, drawingParams);
var doc = TemplateDrawingService.CreateDocumentFromTemplate(_selectedTemplate);
using (doc.LockDocument())
using (var ctx = new CadContext(doc))
{
var cadService = new CadDrawingService(ctx);
DomainFacade.DrawByParams(_selectedTemplate, drawingParams, cadService);
ctx.Commit();
}
AppendLog("图纸生成完成。");
}
catch (BusinessException bex)
{
AppendLog($"参数错误: {bex.Message}");
}
catch (Exception ex)
{
AppendLog($"生成失败: {ex.Message}");
Logger.Error("GenerateDrawing", ex);
}
}
private void OnSaveDrawing()
{
try
{
var doc = AcadApp.DocumentManager.MdiActiveDocument;
if (doc == null)
{
AppendLog("未找到活动图纸,无法保存。");
return;
}
using (var dialog = new SaveFileDialog
{
Filter = "AutoCAD Drawing (*.dwg)|*.dwg",
FileName = "新图纸.dwg"
})
{
if (dialog.ShowDialog() == DialogResult.OK)
{
doc.Database.SaveAs(dialog.FileName, true, DwgVersion.Current, doc.Database.SecurityParameters);
AppendLog($"图纸已保存到: {dialog.FileName}");
}
}
}
catch (Exception ex)
{
AppendLog($"保存失败: {ex.Message}");
Logger.Error("SaveDrawing", ex);
}
}
private void OnOpenSettings()
{
try
{
using (var form = new SettingsForm())
{
if (form.ShowDialog() == DialogResult.OK)
{
// TODO: Save settings
AppendLog("设置已保存 (暂无实际生效项)");
}
}
}
catch (Exception ex)
{
AppendLog($"打开设置失败: {ex.Message}");
Logger.Error("OpenSettings", ex);
}
}
private TemplateParams CollectTemplateParams()
{
return new TemplateParams
{
ProjectType = _cbProjectType.Text?.Trim(),
DrawingType = _cbDrawingType.Text?.Trim(),
SheetSize = _cbSheetSize.Text?.Trim(),
Scale = _cbScale.Text?.Trim()
};
}
private DrawingParams CollectDrawingParams()
{
return new DrawingParams
{
Width = ParseDouble(_txtWidth.Text),
Height = ParseDouble(_txtHeight.Text)
};
}
private static ComboBox CreateComboBox(string[] items)
{
var cb = new ComboBox
{
DropDownStyle = ComboBoxStyle.DropDownList,
Width = 160
};
cb.Items.AddRange(items);
if (cb.Items.Count > 0)
{
cb.SelectedIndex = 0;
}
return cb;
}
private static TextBox CreateTextBox(string defaultText)
{
return new TextBox { Width = 160, Text = defaultText };
}
private static double ParseDouble(string text)
{
if (double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out var value))
{
return value;
}
if (double.TryParse(text, NumberStyles.Float, CultureInfo.CurrentCulture, out value))
{
return value;
}
return 0;
}
private void AppendLog(string message)
{
var time = DateTime.Now.ToString("HH:mm:ss");
_txtLog.AppendText($"[{time}] {message}{Environment.NewLine}");
}
}
}

67
UI/SettingsForm.cs Normal file
View File

@ -0,0 +1,67 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace CadParamPluging.UI
{
public class SettingsForm : Form
{
public SettingsForm()
{
Text = "设置";
Size = new Size(400, 300);
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
ShowInTaskbar = false;
var layout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
Padding = new Padding(10),
RowCount = 2,
ColumnCount = 1
};
layout.RowStyles.Add(new RowStyle(SizeType.Percent, 100f)); // Content area
layout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // Buttons area
// Placeholder for future settings
var contentPanel = new GroupBox
{
Text = "常规设置",
Dock = DockStyle.Fill
};
var lblPlaceholder = new Label
{
Text = "更多设置项即将推出...",
AutoSize = true,
Location = new Point(20, 30),
ForeColor = Color.Gray
};
contentPanel.Controls.Add(lblPlaceholder);
// Bottom buttons
var flowButtons = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.RightToLeft,
AutoSize = true
};
var btnCancel = new Button { Text = "取消", DialogResult = DialogResult.Cancel };
var btnOk = new Button { Text = "确定", DialogResult = DialogResult.OK };
flowButtons.Controls.Add(btnCancel);
flowButtons.Controls.Add(btnOk);
layout.Controls.Add(contentPanel, 0, 0);
layout.Controls.Add(flowButtons, 0, 1);
Controls.Add(layout);
AcceptButton = btnOk;
CancelButton = btnCancel;
}
}
}