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}"); } }