Add a Shape Library dialog (Nest > Shape Library) for creating drawings
from built-in parametric shapes. Supports configuration presets loaded
from JSON files — ships with 136 standard pipe flanges. Parameters use
TextBox inputs with architectural unit parsing (feet/inches, fractions).
- ShapeLibraryForm with split layout: shape list, preview, parameters
- ShapePreviewControl for auto-zoom rendering with info overlay
- ArchUnits utility for parsing architectural measurements
- SetPreviewDefaults() on all ShapeDefinition subclasses
- Convention-based config discovery (Configurations/{ShapeName}.json)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
80 lines
1.9 KiB
C#
80 lines
1.9 KiB
C#
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms;
|
|
|
|
namespace OpenNest.Controls
|
|
{
|
|
public class ShapePreviewControl : PlateView
|
|
{
|
|
private string[] infoLines;
|
|
|
|
public ShapePreviewControl()
|
|
{
|
|
DrawOrigin = false;
|
|
DrawBounds = false;
|
|
AllowPan = false;
|
|
AllowSelect = false;
|
|
AllowZoom = false;
|
|
AllowDrop = false;
|
|
BackColor = Color.White;
|
|
}
|
|
|
|
public void SetInfo(params string[] lines)
|
|
{
|
|
infoLines = lines;
|
|
Invalidate();
|
|
}
|
|
|
|
public void ShowDrawing(Drawing drawing)
|
|
{
|
|
Plate.Parts.Clear();
|
|
Plate.Size = new Geometry.Size(0, 0);
|
|
|
|
if (drawing?.Program != null)
|
|
{
|
|
AddPartFromDrawing(drawing, Geometry.Vector.Zero);
|
|
ZoomToFit();
|
|
}
|
|
else
|
|
{
|
|
Invalidate();
|
|
}
|
|
}
|
|
|
|
protected override void OnResize(System.EventArgs e)
|
|
{
|
|
base.OnResize(e);
|
|
|
|
if (Plate.Parts.Count > 0)
|
|
ZoomToFit(false);
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
|
|
|
|
e.Graphics.TranslateTransform(origin.X, origin.Y);
|
|
Renderer.DrawPlate(e.Graphics);
|
|
Renderer.DrawParts(e.Graphics);
|
|
e.Graphics.ResetTransform();
|
|
|
|
PaintInfo(e.Graphics);
|
|
}
|
|
|
|
private void PaintInfo(Graphics g)
|
|
{
|
|
if (infoLines == null) return;
|
|
|
|
var lineHeight = Font.GetHeight(g) + 1;
|
|
var y = 4f;
|
|
|
|
foreach (var line in infoLines)
|
|
{
|
|
if (string.IsNullOrEmpty(line)) continue;
|
|
g.DrawString(line, Font, Brushes.Black, 4, y);
|
|
y += lineHeight;
|
|
}
|
|
}
|
|
}
|
|
}
|