240 lines
8.5 KiB
C#
240 lines
8.5 KiB
C#
using Hi.Coloring;
|
|
using Hi.MachiningProcs;
|
|
using Hi.Common;
|
|
using Hi.Disp;
|
|
using Hi.Disp.Flag;
|
|
using Hi.Mech.Topo;
|
|
using System.Collections.Generic;
|
|
using System.Collections;
|
|
using Hi.Geom;
|
|
using System.Linq;
|
|
using Hi.Numerical;
|
|
using System;
|
|
|
|
namespace Sample.Disp;
|
|
|
|
/// <summary>
|
|
/// Represents a displayable wrapper for a machining project.
|
|
/// </summary>
|
|
public class MachiningProjectDisplayee : IDisplayee, IGetAnchor
|
|
{
|
|
/// <summary>
|
|
/// Gets the current milling course from the host function.
|
|
/// </summary>
|
|
public MachiningProject MachiningProject => LocalProjectService.MachiningProject;
|
|
/// <summary>
|
|
/// Gets or sets the function that provides the machining project.
|
|
/// </summary>
|
|
public LocalProjectService LocalProjectService { get; set; }
|
|
|
|
///// <summary>
|
|
///// Initializes a new instance of the <see cref="MachiningProjectDisplayee"/> class.
|
|
///// </summary>
|
|
///// <param name="machiningProject">The machining project to display.</param>
|
|
///// <param name="renderingFlagBitArray">The bit array controlling rendering flags.</param>
|
|
//public MachiningProjectDisplayee(MachiningProject machiningProject,
|
|
// BitArray renderingFlagBitArray)
|
|
// {
|
|
// RenderingFlagBitArray = renderingFlagBitArray;
|
|
// }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="MachiningProjectDisplayee"/> class with default rendering flags.
|
|
/// </summary>
|
|
public MachiningProjectDisplayee(LocalProjectService localProjectService)
|
|
{ LocalProjectService = localProjectService; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the bit array that controls which elements are rendered.
|
|
/// </summary>
|
|
public BitArray RenderingFlagBitArray { get; set; } = new BitArray(EnumUtil.GetEnumBitArrayCap<RenderingFlag>())
|
|
{
|
|
[(int)RenderingFlag.DimensionBar] = true,
|
|
[(int)RenderingFlag.WorkpieceGeom] = true,
|
|
[(int)RenderingFlag.Fixture] = true,
|
|
[(int)RenderingFlag.ClStrip] = true,
|
|
//[(int)RenderingFlag.Mech] = true,
|
|
};
|
|
IsoCoordinateEntryDisplayee isoCoordinateEntryDisplayee;
|
|
/// <summary>
|
|
/// Gets the ISO coordinate entry displayee for ISO-based coordinate systems.
|
|
/// </summary>
|
|
public IsoCoordinateEntryDisplayee IsoCoordinateEntryDisplayee =>
|
|
isoCoordinateEntryDisplayee ??= new IsoCoordinateEntryDisplayee(
|
|
() => MachiningProject.NcEnv,
|
|
() => LocalProjectService.MachiningEquipment);
|
|
HeidenhainCoordinateEntryDisplayee heidenhainCoordinateEntryDisplayee;
|
|
/// <summary>
|
|
/// Gets the Heidenhain coordinate entry displayee for Heidenhain-based coordinate systems.
|
|
/// </summary>
|
|
public HeidenhainCoordinateEntryDisplayee HeidenhainCoordinateEntryDisplayee =>
|
|
heidenhainCoordinateEntryDisplayee ??= new HeidenhainCoordinateEntryDisplayee(
|
|
() => MachiningProject.NcEnv,
|
|
() => LocalProjectService.MachiningEquipment);
|
|
|
|
/// <summary>
|
|
/// Gets a list of anchored displayees based on current rendering flags.
|
|
/// </summary>
|
|
/// <returns>A list of anchored displayees for rendering</returns>
|
|
List<IAnchoredDisplayee> GetAnchoredDisplayeeList()
|
|
{
|
|
List<IAnchoredDisplayee> dst = new List<IAnchoredDisplayee>();
|
|
MachiningProject machiningProject = MachiningProject;
|
|
if (machiningProject == null)
|
|
return dst;
|
|
|
|
LocalProjectService localProjectService = LocalProjectService;
|
|
HardNcEnv ncEnv = machiningProject.NcEnv;
|
|
var workpiece = localProjectService.Workpiece;
|
|
var machiningEquipment = localProjectService.MachiningEquipment;
|
|
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.ClStrip])
|
|
{
|
|
localProjectService.ClStrip.IsKeepingDispAlive = true;
|
|
dst.Add(new AnchoredDisplayee(
|
|
localProjectService.MachiningEquipment?.Workpiece?.ProgramZeroAnchor,
|
|
localProjectService.ClStrip));
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.Mech])
|
|
{
|
|
if (localProjectService.MachiningEquipment != null)
|
|
{
|
|
List<IAnchoredDisplayee> machAncDisplayees = localProjectService
|
|
?.MachiningEquipment?.GetAnchoredDisplayeeList() ?? [];
|
|
HashSet<Anchor> exclusiveAnchorSet = new([
|
|
.. localProjectService.Workpiece?.Asmb.GetDescendantAnchors()??[],
|
|
.. localProjectService.MachiningTool?.GetAsmb().GetDescendantAnchors()??[],
|
|
.. localProjectService.Fixture?.Asmb.GetDescendantAnchors()??[],
|
|
]);
|
|
dst.AddRange(machAncDisplayees.Where(ad =>
|
|
!exclusiveAnchorSet.Contains(ad.GetAnchor())));
|
|
}
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.WorkpieceGeom])
|
|
{
|
|
if (workpiece != null)
|
|
dst.AddRange(localProjectService.WorkpieceService
|
|
.GetAnchoredDisplayeeList());
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.Tool])
|
|
{
|
|
if (localProjectService.MachiningEquipment != null
|
|
&& localProjectService.MachiningTool != null)
|
|
dst.Add(new AnchoredDisplayee(
|
|
localProjectService.MachiningTool?.GetAnchor(),
|
|
localProjectService.MachiningTool));
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.Fixture])
|
|
{
|
|
if (localProjectService.MachiningEquipment != null
|
|
&& localProjectService.Fixture != null)
|
|
dst.Add(new AnchoredDisplayee(
|
|
localProjectService.Fixture?.GeomAnchor,
|
|
localProjectService.Fixture));
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.ProgramZero])
|
|
{
|
|
if (workpiece != null)
|
|
dst.Add(workpiece.ProgramZeroAnchor);
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.IsoCoordinate])
|
|
{
|
|
dst.Add(IsoCoordinateEntryDisplayee);
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.HeidenhainCoordinate]
|
|
&& ncEnv.CncBrand == CncBrand.Heidenhain)
|
|
{
|
|
dst.Add(HeidenhainCoordinateEntryDisplayee);
|
|
}
|
|
return dst;
|
|
}
|
|
/// <summary>
|
|
/// Gets the root anchor for the display hierarchy based on current rendering flags.
|
|
/// </summary>
|
|
/// <returns>The root anchor to use for rendering</returns>
|
|
internal static Anchor GetRootAnchor(
|
|
LocalProjectService localProjectService, BitArray renderingFlagBitArray)
|
|
{
|
|
if (renderingFlagBitArray[(int)RenderingFlag.Mech])
|
|
return localProjectService?.MachiningEquipment?.GetAnchor();
|
|
else if (renderingFlagBitArray[(int)RenderingFlag.WorkpieceGeom])
|
|
return localProjectService.Workpiece?.GetAnchor();
|
|
else if (renderingFlagBitArray[(int)RenderingFlag.Fixture])
|
|
return localProjectService.Fixture?.GetAnchor();
|
|
else if (renderingFlagBitArray[(int)RenderingFlag.Tool])
|
|
return localProjectService.MachiningTool?.GetAnchor();
|
|
else
|
|
return null;
|
|
}
|
|
/// <inheritdoc/>
|
|
public Anchor GetAnchor() => GetRootAnchor(LocalProjectService, RenderingFlagBitArray);
|
|
/// <inheritdoc/>
|
|
public void Display(Bind bind)
|
|
{
|
|
//Console.WriteLine($"RB: {string.Join(',', Enumerable.Range(0,
|
|
// RenderingFlagBitArray.Length).Select(RenderingFlagBitArray.Get))}");
|
|
|
|
//ClStrip pos has to be update by ClStrip.
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.WorkpieceGeom]
|
|
&& !RenderingFlagBitArray[(int)RenderingFlag.ClStrip]
|
|
&& LocalProjectService?.ClStrip.CallRefreshDrawing == true)
|
|
LocalProjectService?.ClStrip.RefreshDrawingInRendering(false);
|
|
|
|
bind.PushCoveringPixelMode();
|
|
double offsetHOnCover = 0;
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.DimensionBar])
|
|
{
|
|
bind.ModelMatStack.Push();
|
|
bind.ModelMatStack.Trans(0, offsetHOnCover, 0);
|
|
DimensionBar.Display(bind, "mm");
|
|
bind.ModelMatStack.Pop();
|
|
offsetHOnCover += DimensionBar.OffsetH;
|
|
}
|
|
if (RenderingFlagBitArray[(int)RenderingFlag.ColorScaleBar]
|
|
&& MachiningProject?.MillingGuide?.DictionaryColorGuide?.SelectedColorGuide
|
|
is IGetRangeColorRule getRangeColorRule)
|
|
{
|
|
var rangeColorRule = getRangeColorRule.GetRangeColorRule();
|
|
if (rangeColorRule != null)
|
|
{
|
|
bind.ModelMatStack.Push();
|
|
bind.ModelMatStack.Trans(0, offsetHOnCover, 0);
|
|
|
|
ColorScaleBar.Display(bind,
|
|
rangeColorRule.Floor, rangeColorRule.Ceiling,
|
|
rangeColorRule.GetRgb, "L.", "");
|
|
bind.ModelMatStack.Pop();
|
|
offsetHOnCover += ColorScaleBar.OffsetH;
|
|
}
|
|
}
|
|
if (LocalProjectService?.WorkpieceService?.HasDiff == true)
|
|
{
|
|
bind.ModelMatStack.Push();
|
|
bind.ModelMatStack.Trans(0, offsetHOnCover, 0);
|
|
|
|
var rangeColorRule = LocalProjectService.WorkpieceService.DiffRangeColorRule;
|
|
ColorScaleBar.Display(bind,
|
|
rangeColorRule.Floor, rangeColorRule.Ceiling,
|
|
rangeColorRule.GetRgb, "Df.", "");
|
|
bind.ModelMatStack.Pop();
|
|
offsetHOnCover += ColorScaleBar.OffsetH;
|
|
}
|
|
bind.ModelMatStack.Pop();
|
|
|
|
bind.PushColorByRgb(1, 1, 1);
|
|
LocalProjectService?.MachiningEquipment?.GetAsmb()?.Display(bind,
|
|
GetAnchor(),
|
|
GetAnchoredDisplayeeList().ToArray());
|
|
bind.PopColor();
|
|
}
|
|
/// <inheritdoc/>
|
|
public void ExpandToBox3d(Box3d dst)
|
|
{
|
|
//Console.WriteLine($"dst.A: {dst}");
|
|
LocalProjectService?.MachiningEquipment?.GetAsmb()?.ExpandToBox3d(dst,
|
|
GetAnchor(),
|
|
GetAnchoredDisplayeeList().ToArray());
|
|
//Console.WriteLine($"dst.B: {dst}");
|
|
}
|
|
}
|