Update plugin UI with new fields, layout fixes, and settings dialog
This commit is contained in:
parent
bf015be21a
commit
7987c4ee43
30
Cad/CadContext.cs
Normal file
30
Cad/CadContext.cs
Normal 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
30
Cad/CadDrawingService.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Cad/TemplateDrawingService.cs
Normal file
15
Cad/TemplateDrawingService.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -40,10 +40,16 @@
|
|||||||
<Reference Include="acmgd">
|
<Reference Include="acmgd">
|
||||||
<HintPath>C:\Program Files\Autodesk\AutoCAD 2014\acmgd.dll</HintPath>
|
<HintPath>C:\Program Files\Autodesk\AutoCAD 2014\acmgd.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="AdWindows">
|
||||||
|
<HintPath>C:\Program Files\Autodesk\AutoCAD 2014\AdWindows.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="PresentationCore" />
|
||||||
|
<Reference Include="PresentationFramework" />
|
||||||
|
<Reference Include="WindowsBase" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
@ -53,6 +59,24 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="PluginEntry.cs" />
|
<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" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
|||||||
15
Common/BusinessException.cs
Normal file
15
Common/BusinessException.cs
Normal 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
22
Common/Logger.cs
Normal 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}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
68
Data/DefaultTemplateRepository.cs
Normal file
68
Data/DefaultTemplateRepository.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Data/ITemplateRepository.cs
Normal file
9
Data/ITemplateRepository.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using CadParamPluging.Domain.Models;
|
||||||
|
|
||||||
|
namespace CadParamPluging.Data
|
||||||
|
{
|
||||||
|
public interface ITemplateRepository
|
||||||
|
{
|
||||||
|
TemplateDefinition FindTemplate(TemplateParams templateParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
12
Data/TemplateDefinition.cs
Normal file
12
Data/TemplateDefinition.cs
Normal 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
82
Domain/DomainFacade.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
Domain/Models/DrawingParams.cs
Normal file
13
Domain/Models/DrawingParams.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Domain/Models/TemplateInfo.cs
Normal file
9
Domain/Models/TemplateInfo.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Domain/Models/TemplateParams.cs
Normal file
10
Domain/Models/TemplateParams.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
187
PluginEntry.cs
187
PluginEntry.cs
@ -1,17 +1,30 @@
|
|||||||
|
using System;
|
||||||
using System.Drawing;
|
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.Runtime;
|
||||||
using Autodesk.AutoCAD.Windows;
|
using Autodesk.AutoCAD.Windows;
|
||||||
|
using Autodesk.Windows;
|
||||||
|
using CadParamPluging.UI;
|
||||||
namespace CadParamPluging
|
namespace CadParamPluging
|
||||||
{
|
{
|
||||||
public class PluginEntry : IExtensionApplication
|
public class PluginEntry : IExtensionApplication
|
||||||
{
|
{
|
||||||
private static PaletteSet _palette;
|
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()
|
public void Initialize()
|
||||||
{
|
{
|
||||||
ShowPalette();
|
EnsurePaletteCreated();
|
||||||
|
CreateRibbonButton();
|
||||||
|
Application.Idle += OnApplicationIdle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Terminate()
|
public void Terminate()
|
||||||
@ -19,7 +32,7 @@ namespace CadParamPluging
|
|||||||
// 可在此释放资源或记录日志
|
// 可在此释放资源或记录日志
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowPalette()
|
private void EnsurePaletteCreated()
|
||||||
{
|
{
|
||||||
if (_palette == null)
|
if (_palette == null)
|
||||||
{
|
{
|
||||||
@ -27,21 +40,169 @@ namespace CadParamPluging
|
|||||||
{
|
{
|
||||||
Style = PaletteSetStyles.ShowCloseButton |
|
Style = PaletteSetStyles.ShowCloseButton |
|
||||||
PaletteSetStyles.ShowAutoHideButton |
|
PaletteSetStyles.ShowAutoHideButton |
|
||||||
PaletteSetStyles.Snappable
|
PaletteSetStyles.Snappable,
|
||||||
|
DockEnabled = DockSides.Right,
|
||||||
|
Dock = DockSides.Right
|
||||||
};
|
};
|
||||||
|
|
||||||
var placeholder = new Label
|
var panel = new ParamDrawingPanel();
|
||||||
{
|
_palette.Add("Main", panel);
|
||||||
Text = "Param panel placeholder",
|
|
||||||
Dock = DockStyle.Fill,
|
|
||||||
TextAlign = ContentAlignment.MiddleCenter
|
|
||||||
};
|
|
||||||
|
|
||||||
_palette.Add("Main", placeholder);
|
|
||||||
_palette.MinimumSize = new Size(240, 200);
|
_palette.MinimumSize = new Size(240, 200);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowPalette()
|
||||||
|
{
|
||||||
|
EnsurePaletteCreated();
|
||||||
|
|
||||||
|
_palette.Dock = DockSides.Right;
|
||||||
_palette.Visible = true;
|
_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")]
|
[CommandMethod("PARAM_PANEL")]
|
||||||
|
|||||||
400
UI/ParamDrawingPanel.cs
Normal file
400
UI/ParamDrawingPanel.cs
Normal 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
67
UI/SettingsForm.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user