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;
///
/// Represents a displayable wrapper for a machining project.
///
public class MachiningProjectDisplayee : IDisplayee, IGetAnchor
{
///
/// Gets the current milling course from the host function.
///
public MachiningProject MachiningProject => LocalProjectService.MachiningProject;
///
/// Gets or sets the function that provides the machining project.
///
public LocalProjectService LocalProjectService { get; set; }
/////
///// Initializes a new instance of the class.
/////
///// The machining project to display.
///// The bit array controlling rendering flags.
//public MachiningProjectDisplayee(MachiningProject machiningProject,
// BitArray renderingFlagBitArray)
// {
// RenderingFlagBitArray = renderingFlagBitArray;
// }
///
/// Initializes a new instance of the class with default rendering flags.
///
public MachiningProjectDisplayee(LocalProjectService localProjectService)
{ LocalProjectService = localProjectService; }
///
/// Gets or sets the bit array that controls which elements are rendered.
///
public BitArray RenderingFlagBitArray { get; set; } = new BitArray(EnumUtil.GetEnumBitArrayCap())
{
[(int)RenderingFlag.DimensionBar] = true,
[(int)RenderingFlag.WorkpieceGeom] = true,
[(int)RenderingFlag.Fixture] = true,
[(int)RenderingFlag.ClStrip] = true,
//[(int)RenderingFlag.Mech] = true,
};
IsoCoordinateEntryDisplayee isoCoordinateEntryDisplayee;
///
/// Gets the ISO coordinate entry displayee for ISO-based coordinate systems.
///
public IsoCoordinateEntryDisplayee IsoCoordinateEntryDisplayee =>
isoCoordinateEntryDisplayee ??= new IsoCoordinateEntryDisplayee(
() => MachiningProject.NcEnv,
() => LocalProjectService.MachiningEquipment);
HeidenhainCoordinateEntryDisplayee heidenhainCoordinateEntryDisplayee;
///
/// Gets the Heidenhain coordinate entry displayee for Heidenhain-based coordinate systems.
///
public HeidenhainCoordinateEntryDisplayee HeidenhainCoordinateEntryDisplayee =>
heidenhainCoordinateEntryDisplayee ??= new HeidenhainCoordinateEntryDisplayee(
() => MachiningProject.NcEnv,
() => LocalProjectService.MachiningEquipment);
///
/// Gets a list of anchored displayees based on current rendering flags.
///
/// A list of anchored displayees for rendering
List GetAnchoredDisplayeeList()
{
List dst = new List();
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 machAncDisplayees = localProjectService
?.MachiningEquipment?.GetAnchoredDisplayeeList() ?? [];
HashSet 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;
}
///
/// Gets the root anchor for the display hierarchy based on current rendering flags.
///
/// The root anchor to use for rendering
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;
}
///
public Anchor GetAnchor() => GetRootAnchor(LocalProjectService, RenderingFlagBitArray);
///
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();
}
///
public void ExpandToBox3d(Box3d dst)
{
//Console.WriteLine($"dst.A: {dst}");
LocalProjectService?.MachiningEquipment?.GetAsmb()?.ExpandToBox3d(dst,
GetAnchor(),
GetAnchoredDisplayeeList().ToArray());
//Console.WriteLine($"dst.B: {dst}");
}
}