Files
OpenNest/OpenNest.Core/Converters/ConvertProgram.cs
AJ Isaacs d5b5ab57e3 fix: assign colors to SpecialLayers and ConvertProgram entities
ConvertProgram.ToGeometry() created entities without setting Color,
defaulting to Color.Empty (alpha=0). After ededc7b switched from
Pens.White to per-entity colors, these rendered fully transparent.

- Add explicit colors to all SpecialLayers (Cut=White, Rapid=Gray, etc.)
- Set entity Color from layer in ConvertProgram for lines, arcs, circles
- Add GetEntityPen fallback: treat Empty/alpha-0 as White
- Add bend line rendering and selection in EntityView/CadConverterForm
- Fix SolidWorksBendDetector MText formatting strip for bend notes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 21:57:50 -04:00

141 lines
4.3 KiB
C#

using OpenNest.CNC;
using OpenNest.Geometry;
using OpenNest.Math;
using System.Collections.Generic;
namespace OpenNest.Converters
{
public static class ConvertProgram
{
public static List<Entity> ToGeometry(Program pgm)
{
var geometry = new List<Entity>();
var curpos = new Vector();
var mode = Mode.Absolute;
AddProgram(pgm, ref mode, ref curpos, ref geometry);
return geometry;
}
private static void AddProgram(Program program, ref Mode mode, ref Vector curpos, ref List<Entity> geometry)
{
mode = program.Mode;
for (int i = 0; i < program.Length; ++i)
{
var code = program[i];
switch (code.Type)
{
case CodeType.ArcMove:
AddArcMove((ArcMove)code, ref mode, ref curpos, ref geometry);
break;
case CodeType.LinearMove:
AddLinearMove((LinearMove)code, ref mode, ref curpos, ref geometry);
break;
case CodeType.RapidMove:
AddRapidMove((RapidMove)code, ref mode, ref curpos, ref geometry);
break;
case CodeType.SubProgramCall:
var tmpmode = mode;
var subpgm = (SubProgramCall)code;
var geoProgram = new Shape();
AddProgram(subpgm.Program, ref mode, ref curpos, ref geoProgram.Entities);
geometry.Add(geoProgram);
mode = tmpmode;
break;
}
}
}
private static void AddLinearMove(LinearMove linearMove, ref Mode mode, ref Vector curpos, ref List<Entity> geometry)
{
var pt = linearMove.EndPoint;
if (mode == Mode.Incremental)
pt += curpos;
var layer = ConvertLayer(linearMove.Layer);
var line = new Line(curpos, pt)
{
Layer = layer,
Color = layer.Color
};
geometry.Add(line);
curpos = pt;
}
private static void AddRapidMove(RapidMove rapidMove, ref Mode mode, ref Vector curpos, ref List<Entity> geometry)
{
var pt = rapidMove.EndPoint;
if (mode == Mode.Incremental)
pt += curpos;
var line = new Line(curpos, pt)
{
Layer = SpecialLayers.Rapid,
Color = SpecialLayers.Rapid.Color
};
geometry.Add(line);
curpos = pt;
}
private static void AddArcMove(ArcMove arcMove, ref Mode mode, ref Vector curpos, ref List<Entity> geometry)
{
var center = arcMove.CenterPoint;
var endpt = arcMove.EndPoint;
if (mode == Mode.Incremental)
{
endpt += curpos;
center += curpos;
}
var startAngle = center.AngleTo(curpos);
var endAngle = center.AngleTo(endpt);
var dx = endpt.X - center.X;
var dy = endpt.Y - center.Y;
var radius = System.Math.Sqrt(dx * dx + dy * dy);
var layer = ConvertLayer(arcMove.Layer);
if (startAngle.IsEqualTo(endAngle))
geometry.Add(new Circle(center, radius) { Layer = layer, Color = layer.Color });
else
geometry.Add(new Arc(center, radius, startAngle, endAngle, arcMove.Rotation == RotationType.CW) { Layer = layer, Color = layer.Color });
curpos = endpt;
}
private static Layer ConvertLayer(LayerType layer)
{
switch (layer)
{
case LayerType.Cut:
return SpecialLayers.Cut;
case LayerType.Display:
return SpecialLayers.Display;
case LayerType.Leadin:
return SpecialLayers.Leadin;
case LayerType.Leadout:
return SpecialLayers.Leadout;
case LayerType.Scribe:
return SpecialLayers.Scribe;
default:
return new Layer(layer.ToString());
}
}
}
}