diff options
| author | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2022-03-01 14:19:50 +0200 |
|---|---|---|
| committer | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2022-03-01 14:19:50 +0200 |
| commit | 38052847502dd46b47269addae91aef0aa8fb747 (patch) | |
| tree | acb339261eb604991b71edfeb21e626e44a01a58 /Software/Visual_Studio | |
| parent | 1f6b9e23c21b2f31781f4372378a965c109657ca (diff) | |
| download | Tango-38052847502dd46b47269addae91aef0aa8fb747.tar.gz Tango-38052847502dd46b47269addae91aef0aa8fb747.zip | |
Group Repeating - add logic in Dyeing.
Related Work Items: #6229
Diffstat (limited to 'Software/Visual_Studio')
33 files changed, 1128 insertions, 324 deletions
diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml new file mode 100644 index 000000000..e7be33574 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml @@ -0,0 +1,119 @@ +<UserControl x:Class="Tango.PPC.Jobs.Controls.JobModelSummaryViewerControl" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI" + xmlns:enumerations="clr-namespace:Tango.BL.Enumerations;assembly=Tango.BL" + xmlns:entities="clr-namespace:Tango.BL.Entities;assembly=Tango.BL" + xmlns:local="clr-namespace:Tango.PPC.Jobs.Controls" + mc:Ignorable="d" + d:DesignHeight="60" d:DesignWidth="500" Height="38" x:Name="control"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="1*"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="Auto" /> + <RowDefinition Height="1*" /> + </Grid.RowDefinitions> + + <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=JobModel.EffectiveSegments}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DisplayMarkers,Converter={StaticResource BooleanToVisibilityConverter}}"> + <ItemsControl.ItemsPanel> + <ItemsPanelTemplate> + <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel> + </ItemsPanelTemplate> + </ItemsControl.ItemsPanel> + <ItemsControl.ItemTemplate> + <DataTemplate> + <Grid x:Name="grid"> + <Grid.Width> + <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}"> + <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="JobModel.Length"></Binding> + <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding> + <Binding Path="LengthWithInterSegment"></Binding> + </MultiBinding> + </Grid.Width> + + <DockPanel HorizontalAlignment="Center" TextElement.FontSize="{StaticResource TangoSmallFontSize}"> + <DockPanel.Style> + <Style TargetType="DockPanel"> + <Setter Property="Visibility" Value="Visible"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding ElementName=grid,Path=ActualWidth,Converter={StaticResource SmallerThanToBooleanConverter},ConverterParameter=20}" Value="True"> + <Setter Property="Visibility" Value="Collapsed"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </DockPanel.Style> + <controls:FastTextBlock Text="{Binding LengthWithInterSegment,Mode=OneWay,StringFormat=N0}" /> + <controls:FastTextBlock Text="m" /> + </DockPanel> + </Grid> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + + <Border Grid.Row="1" x:Name="brush_border" ClipToBounds="False" CornerRadius="10" Margin="0 5 0 0"> + <Border.Clip> + <RectangleGeometry RadiusX="10" RadiusY="10"> + <RectangleGeometry.Rect> + <MultiBinding Converter="{StaticResource WidthHeightToRectConverter}"> + <Binding ElementName="brush_border" Path="ActualWidth" /> + <Binding ElementName="brush_border" Path="ActualHeight" /> + </MultiBinding> + </RectangleGeometry.Rect> + </RectangleGeometry> + </Border.Clip> + <Grid> + <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=JobModel.EffectiveSegments}"> + <ItemsControl.ItemsPanel> + <ItemsPanelTemplate> + <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel> + </ItemsPanelTemplate> + </ItemsControl.ItemsPanel> + <ItemsControl.ItemTemplate> + <DataTemplate> + <Grid> + <Grid.Width> + <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}"> + <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="JobModel.Length"></Binding> + <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding> + <Binding Path="LengthWithInterSegment"></Binding> + </MultiBinding> + </Grid.Width> + <Rectangle Fill="{Binding SegmentBrush}"></Rectangle> + </Grid> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + + <Rectangle Stroke="{StaticResource TangoGrayBrush}" StrokeThickness="1" StrokeDashArray="5 5 5 5" RadiusX="8" RadiusY="8" /> + </Grid> + </Border> + </Grid> + + <Grid Grid.Column="1" VerticalAlignment="Bottom"> + <Grid.Style> + <Style TargetType="Grid"> + <Setter Property="Visibility" Value="Collapsed"></Setter> + <Style.Triggers> + <MultiDataTrigger> + <MultiDataTrigger.Conditions> + <Condition Binding="{Binding ElementName=control,Path=JobModel.JobType}" Value="{x:Static enumerations:JobTypes.Embroidery}" /> + <Condition Binding="{Binding ElementName=control,Path=IsActive}" Value="False" /> + </MultiDataTrigger.Conditions> + <Setter Property="Visibility" Value="Visible"></Setter> + </MultiDataTrigger> + </Style.Triggers> + </Style> + </Grid.Style> + + <TextBlock Margin="10 0 0 -2" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}"> + <Run Text="x"></Run><Run Text="{Binding ElementName=control,Path=JobModel.NumberOfUnits}"></Run> + </TextBlock> + </Grid> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml.cs new file mode 100644 index 000000000..5bc74e046 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobModelSummaryViewerControl.xaml.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Tango.BL.Entities; +using Tango.PPC.Jobs.Models; + +namespace Tango.PPC.Jobs.Controls +{ + /// <summary> + /// Interaction logic for JobModelSummaryViewerControl.xaml + /// </summary> + public partial class JobModelSummaryViewerControl : UserControl + { + /// <summary> + /// Gets or sets the job. + /// </summary> + public JobModel JobModel + { + get { return (JobModel)GetValue(JobProperty); } + set { SetValue(JobProperty, value); } + } + public static readonly DependencyProperty JobProperty = + DependencyProperty.Register("JobModel", typeof(JobModel), typeof(JobModelSummaryViewerControl), new PropertyMetadata(null)); + + /// <summary> + /// Maybe not necessary! + /// </summary> + public bool IsActive + { + get { return (bool)GetValue(IsActiveProperty); } + set { SetValue(IsActiveProperty, value); } + } + public static readonly DependencyProperty IsActiveProperty = + DependencyProperty.Register("IsActive", typeof(bool), typeof(JobModelSummaryViewerControl), new PropertyMetadata(false)); + + /// <summary> + /// Gets or sets a value indicating whether to display summery markers. + /// </summary> + public bool DisplayMarkers + { + get { return (bool)GetValue(DisplayMarkersProperty); } + set { SetValue(DisplayMarkersProperty, value); } + } + public static readonly DependencyProperty DisplayMarkersProperty = + DependencyProperty.Register("DisplayMarkers", typeof(bool), typeof(JobModelSummaryViewerControl), new PropertyMetadata(true)); + + public JobModelSummaryViewerControl() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml index 8c84777a3..bd0bbfd11 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml @@ -21,7 +21,7 @@ <RowDefinition Height="1*" /> </Grid.RowDefinitions> - <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=JobModel.EffectiveSegments}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DisplayMarkers,Converter={StaticResource BooleanToVisibilityConverter}}"> + <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=Job.EffectiveSegments}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DisplayMarkers,Converter={StaticResource BooleanToVisibilityConverter}}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel> @@ -32,9 +32,9 @@ <Grid x:Name="grid"> <Grid.Width> <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}"> - <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="JobModel.Length"></Binding> + <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="Job.Length"></Binding> <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding> - <Binding Path="LengthWithInterSegment"></Binding> + <Binding Path="LengthWithFactor"></Binding> </MultiBinding> </Grid.Width> @@ -49,7 +49,7 @@ </Style.Triggers> </Style> </DockPanel.Style> - <controls:FastTextBlock Text="{Binding LengthWithInterSegment,Mode=OneWay,StringFormat=N0}" /> + <controls:FastTextBlock Text="{Binding LengthWithFactor,Mode=OneWay,StringFormat=N0}" /> <controls:FastTextBlock Text="m" /> </DockPanel> </Grid> @@ -69,7 +69,7 @@ </RectangleGeometry> </Border.Clip> <Grid> - <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=JobModel.EffectiveSegments}"> + <ItemsControl ClipToBounds="False" ItemsSource="{Binding ElementName=control,Path=Job.EffectiveSegments}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel> @@ -80,9 +80,9 @@ <Grid> <Grid.Width> <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}"> - <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="JobModel.Length"></Binding> + <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="Job.Length"></Binding> <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding> - <Binding Path="LengthWithInterSegment"></Binding> + <Binding Path="LengthWithFactor"></Binding> </MultiBinding> </Grid.Width> <Rectangle Fill="{Binding SegmentBrush}"></Rectangle> @@ -103,7 +103,7 @@ <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> - <Condition Binding="{Binding ElementName=control,Path=JobModel.JobType}" Value="{x:Static enumerations:JobTypes.Embroidery}" /> + <Condition Binding="{Binding ElementName=control,Path=Job.JobType}" Value="{x:Static enumerations:JobTypes.Embroidery}" /> <Condition Binding="{Binding ElementName=control,Path=IsActive}" Value="False" /> </MultiDataTrigger.Conditions> <Setter Property="Visibility" Value="Visible"></Setter> @@ -113,7 +113,7 @@ </Grid.Style> <TextBlock Margin="10 0 0 -2" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}"> - <Run Text="x"></Run><Run Text="{Binding ElementName=control,Path=JobModel.NumberOfUnits}"></Run> + <Run Text="x"></Run><Run Text="{Binding ElementName=control,Path=Job.NumberOfUnits}"></Run> </TextBlock> </Grid> </Grid> diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml.cs index 121be0477..c977e71d0 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Controls/JobSummeryViewer.xaml.cs @@ -13,7 +13,6 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Tango.BL.Entities; -using Tango.PPC.Jobs.Models; namespace Tango.PPC.Jobs.Controls { @@ -28,13 +27,13 @@ namespace Tango.PPC.Jobs.Controls /// <summary> /// Gets or sets the job. /// </summary> - public JobModel JobModel + public Job Job { - get { return (JobModel)GetValue(JobProperty); } + get { return (Job)GetValue(JobProperty); } set { SetValue(JobProperty, value); } } public static readonly DependencyProperty JobProperty = - DependencyProperty.Register("JobModel", typeof(JobModel), typeof(JobSummeryViewer), new PropertyMetadata(null)); + DependencyProperty.Register("Job", typeof(Job), typeof(JobSummeryViewer), new PropertyMetadata(null)); /// <summary> /// Maybe not necessary! diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/ISegmentModel.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/ISegmentModel.cs index 85e280c6e..e97d1342c 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/ISegmentModel.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/ISegmentModel.cs @@ -18,5 +18,7 @@ namespace Tango.PPC.Jobs.Models double InterSegmentLength { get; } bool EnableInterSegment { get; set; } bool ShowGap { get; } -} + + ISegmentModel Clone(); + } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/JobModel.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/JobModel.cs index 0d6855c40..fdb06ac3e 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/JobModel.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/JobModel.cs @@ -340,6 +340,29 @@ namespace Tango.PPC.Jobs.Models } } + protected SynchronizedObservableCollection<SegmentsGroupModel> _segmentsGroups; + + /// <summary> + /// Gets or sets the JobModel segments. + /// </summary> + + public SynchronizedObservableCollection<SegmentsGroupModel> SegmentsGroups + { + get + { + return _segmentsGroups; + } + set + { + if (_segmentsGroups != value) + { + _segmentsGroups = value; + RaisePropertyChangedAuto(); + + } + } + } + private bool _enableintersegment; public bool EnableInterSegment { @@ -403,10 +426,10 @@ namespace Tango.PPC.Jobs.Models public bool HasSelectedItems { get { - //bool test = Segments.ToList().Any(x => x.IsSelected); - return Segments.ToList().Any(x => x.IsSelected); } + return GroupingSegments.Any(x => x.IsSelected); + } } - public List<SegmentModel> SegmentsToCopy { get; set; } + public List<ISegmentModel> SegmentsToCopy { get; set; } public TimeSpan GetEstimatedDuration { @@ -439,8 +462,9 @@ namespace Tango.PPC.Jobs.Models { ColorSpacesList = list; _segments = new SynchronizedObservableCollection<SegmentModel>(); + _segmentsGroups = new SynchronizedObservableCollection<SegmentsGroupModel>(); _groupingSegments = new SynchronizedObservableCollection<ISegmentModel>(); - SegmentsToCopy = new List<SegmentModel>(); + SegmentsToCopy = new List<ISegmentModel>(); _effectiveSegments = new ObservableCollection<SegmentModel>(); Segments.CollectionChanged -= Segments_CollectionChanged; @@ -459,43 +483,79 @@ namespace Tango.PPC.Jobs.Models LoadGroupingSegments(); } + /// <summary> + /// Gets the ordered segments with groups. + /// </summary> + /// <value> + /// The ordered segments with groups. + /// </value> + public List<ISegmentModel> OrderedSegmentsWithGroups + { + get + { + if (Segments == null) + return null; + List<ISegmentModel> orderedSegmentsWithGroups = new List<ISegmentModel>(); + + orderedSegmentsWithGroups.AddRange(Segments.Where(x => x.SegmentsGroupModel == null)); + orderedSegmentsWithGroups.AddRange(SegmentsGroups); + return orderedSegmentsWithGroups.OrderBy(x => x.SegmentIndex).ToList(); + } + } + + /// <summary> + /// Loads the grouping segments. + /// </summary> public void LoadGroupingSegments() { _groupingSegments.Clear(); - var groupedList = Segments.Where(x => x.GroupID >0).Select(grp => grp.SegmentsGroupModel).Distinct().ToList();//List<SegmentsGroupModel> - int ID = 1; - groupedList.ForEach(x => x.SegmentIndex = ID++); + //List<ISegmentModel> segmentsWithGroups = new List<ISegmentModel>(); - Dictionary<int, SegmentsGroupModel> groupIDToSegmentsGroup = new Dictionary<int, SegmentsGroupModel>(); - foreach (var group in groupedList) - { - var groupID = group.SegmentIndex; - groupIDToSegmentsGroup[groupID] = group; - }; - int currentIndex = 1; - foreach (var segment in Segments) + //segmentsWithGroups.AddRange(Segments.Where(x => x.SegmentsGroupModel == null)); + //segmentsWithGroups.AddRange(SegmentsGroups); + OrderedSegmentsWithGroups.ForEach(x => _groupingSegments.Add(x)); + + if (_groupingSegments.Count > 0) + _groupingSegments.Last().IsLast = true; + RaisePropertyChanged(nameof(GroupingSegments)); + } + + /// <summary> + /// Arranges the segment indixes in groups. + /// </summary> + public void ArrangeSegmentIndixesInGroups() + { + foreach (var group in SegmentsGroups) { - if (!segment.IsGroupSegment) + int index = 1; + foreach (var segm in Segments) { - segment.SegmentIndex = currentIndex; - _groupingSegments.Add(segment); + segm.SegmentIndex = index; + index++; } - else - { - SegmentsGroupModel segmentsGroup; - if (groupIDToSegmentsGroup.TryGetValue(segment.GroupID, out segmentsGroup)) - { - _groupingSegments.Add(segmentsGroup); - segmentsGroup.SegmentIndex = currentIndex; - groupIDToSegmentsGroup.Remove(segment.GroupID); - } - } - currentIndex++; } - if(_groupingSegments.Count > 0) - _groupingSegments.Last().IsLast = true; - RaisePropertyChanged(nameof(GroupingSegments)); } + + /// <summary> + /// Arranges the segments indixes. + /// </summary> + public void ArrangeSegmentsIndixes() + { + int index = 1; + int count = GroupingSegments.Count(); + ArrangeSegmentIndixesInGroups(); + foreach (var segment in GroupingSegments) + { + segment.IsLast = (index == count) ? true : false; + segment.SegmentIndex = index++; + } + } + + /// <summary> + /// Creates the inter segment. + /// </summary> + /// <param name="length">The length.</param> + /// <returns></returns> public static SegmentModel CreateInterSegment(double length) { SegmentModel segment = new SegmentModel() @@ -512,6 +572,12 @@ namespace Tango.PPC.Jobs.Models return segment; } + /// <summary> + /// Adds the new segment. + /// </summary> + /// <param name="length">The length.</param> + /// <param name="segmentIndex">Index of the segment.</param> + /// <returns></returns> public SegmentModel AddNewSegment( double length, Int32 segmentIndex) { SegmentModel segment = new SegmentModel(); @@ -522,15 +588,15 @@ namespace Tango.PPC.Jobs.Models segment.Job = this; segment.EnableInterSegment = InterSegmentLength > 0; - if(segmentIndex < Segments.Count) + Segments.Add(segment); + if (segmentIndex < GroupingSegments.Count()) { - Segments.Insert(segmentIndex,segment); + GroupingSegments.Insert(segmentIndex , segment); } else - Segments.Add(segment); - - LoadGroupingSegments(); - + GroupingSegments.Add(segment); + ArrangeSegmentsIndixes(); + return segment; } @@ -546,7 +612,7 @@ namespace Tango.PPC.Jobs.Models private void UpdateEffectiveSegments() { - if (IsAllSegmentsPerSpool) + if (EnableInterSegment && IsAllSegmentsPerSpool) { int max = GroupingSegments.Count > 0 ? GroupingSegments.Max(x => x.SegmentIndex) : 0; @@ -577,7 +643,7 @@ namespace Tango.PPC.Jobs.Models //} //else effectiveSegments.Add(segments[i]); - if (EnableInterSegment && i < segments.Count && repeats < segmentsGroup.Repeats) + if (EnableInterSegment && !(repeats == (segmentsGroup.Repeats - 1) && i == (segments.Count - 1))) { effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); } @@ -593,12 +659,13 @@ namespace Tango.PPC.Jobs.Models } else { + ObservableCollection<SegmentModel> effectiveSegments = new ObservableCollection<SegmentModel>(); foreach (var s in GroupingSegments.OrderBy(x => x.SegmentIndex)) { if (s is SegmentModel) { SegmentModel segment = s as SegmentModel; - _effectiveSegments.Add(segment); + effectiveSegments.Add(segment); } else if (s is SegmentsGroupModel) { @@ -608,16 +675,17 @@ namespace Tango.PPC.Jobs.Models { for (int i = 0; i < segments.Count; i++) { - if (repeats > 0) - { - _effectiveSegments.Add(segments[i].Clone()); - } - else - _effectiveSegments.Add(segments[i]); + //if (repeats > 0) + //{ + // effectiveSegments.Add(segments[i].Clone()); + //} + //else + effectiveSegments.Add(segments[i]); } } } } + _effectiveSegments = effectiveSegments; } RaisePropertyChanged(nameof(EffectiveSegments)); } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentModel.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentModel.cs index 2b3bce545..e1a9a95f2 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentModel.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentModel.cs @@ -27,14 +27,7 @@ namespace Tango.PPC.Jobs.Models #region Properties public string GUID { get; set; } - - public int GroupID { - get - { - return SegmentsGroupModel == null ? -1 : SegmentsGroupModel.SegmentIndex; - } - } - + protected String _name; /// <summary> /// Gets or sets the SegmentModel name. @@ -55,11 +48,11 @@ namespace Tango.PPC.Jobs.Models } } } - protected Double _length; + protected double _length; /// <summary> /// Gets or sets the length. /// </summary> - public Double Length + public double Length { get { @@ -460,6 +453,8 @@ namespace Tango.PPC.Jobs.Models public RelayCommand DeleteGapCommand { get; set; } #endregion + #region construction + public SegmentModel(JobModel jobModel, string guid) { InitnewSegment(); @@ -475,6 +470,8 @@ namespace Tango.PPC.Jobs.Models InitnewSegment(); } + #endregion + public void InitnewSegment() { BrushStops = new SynchronizedObservableCollection<BrushStopModel>(); @@ -490,6 +487,7 @@ namespace Tango.PPC.Jobs.Models AddGapCommand = new RelayCommand(x => AddGap()); DeleteGapCommand = new RelayCommand(x => DeleteGap()); } + #region Public Methods /// <summary> @@ -532,6 +530,10 @@ namespace Tango.PPC.Jobs.Models } } + /// <summary> + /// Clones this instance. + /// </summary> + /// <returns></returns> public SegmentModel Clone() { var cloned = new SegmentModel(Job, GUID);//(SegmentModel)Activator.CreateInstance(typeof(SegmentModel), this.Job); @@ -553,6 +555,11 @@ namespace Tango.PPC.Jobs.Models return cloned; } + ISegmentModel ISegmentModel.Clone() + { + return Clone() as ISegmentModel; + } + public static SegmentModel CreateInterSegment(double length) { return new SegmentModel() @@ -674,6 +681,31 @@ namespace Tango.PPC.Jobs.Models else if (BrushStops.Count > 1) BrushStops.ToList().ForEach(x => x.Position = (BrushStopModel.PositionStatus)x.StopIndex); } + + public void SwapBrushStops() + { + if (BrushStops.Count > 1) + { + int index = 0; + int lastIndex = BrushStops.Count - 1; + for (; index < lastIndex; index++, lastIndex--) + { + var left_temp = BrushStops[index]; + var right_stopIndex = BrushStops[lastIndex].StopIndex; + var right_offsetPercent = BrushStops[lastIndex].OffsetPercent; + + BrushStops[index] = BrushStops[lastIndex]; + BrushStops[index].StopIndex = left_temp.StopIndex; + BrushStops[index].OffsetPercent = left_temp.OffsetPercent; + BrushStops[lastIndex] = left_temp; + BrushStops[lastIndex].StopIndex = right_stopIndex; + BrushStops[lastIndex].OffsetPercent = right_offsetPercent; + } + ArrangeBrushStopsIndexes(); + UpdateMiddleColorBrush(); + } + } + #endregion #region Brush Stops Collection Changed @@ -764,7 +796,7 @@ namespace Tango.PPC.Jobs.Models { EnableInterSegment = false; } - + #endregion } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentsGroupModel.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentsGroupModel.cs index 153b93e8f..57f742b67 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentsGroupModel.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Models/SegmentsGroupModel.cs @@ -188,5 +188,29 @@ namespace Tango.PPC.Jobs.Models Repeats = 1; EnableInterSegment = jobModel.EnableInterSegment; } + + /// <summary> + /// Clones this instance. + /// </summary> + /// <returns></returns> + public SegmentsGroupModel Clone() + { + SegmentsGroupModel cloned = new SegmentsGroupModel(this.Job); + cloned.SegmentIndex = this.SegmentIndex; + + cloned.Segments = Segments.Select(x => x.Clone()).ToSynchronizedObservableCollection(); + + foreach (var stop in cloned.Segments) + { + stop.SegmentsGroupModel= cloned; + } + + return cloned; + } + + ISegmentModel ISegmentModel.Clone() + { + return Clone() as ISegmentModel; + } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj index fb15b9182..dc79f92df 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj @@ -76,6 +76,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Controls\JobModelSummaryViewerControl.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> <Page Include="Controls\RunningJobViewer.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -187,6 +191,9 @@ </Compile> <Compile Include="AppButtons\StartPrintingButton.cs" /> <Compile Include="AppButtons\StopPrintingButton.cs" /> + <Compile Include="Controls\JobModelSummaryViewerControl.xaml.cs"> + <DependentUpon>JobModelSummaryViewerControl.xaml</DependentUpon> + </Compile> <Compile Include="Controls\JobOutlineControl.cs" /> <Compile Include="Controls\RunningJobViewer.xaml.cs"> <DependentUpon>RunningJobViewer.xaml</DependentUpon> @@ -655,7 +662,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/AddNewSegmentCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/AddNewSegmentCommand.cs index 60128b7d4..c8dff948c 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/AddNewSegmentCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/AddNewSegmentCommand.cs @@ -14,10 +14,10 @@ namespace Tango.PPC.Jobs.UndoRedoCommands private int _index; private double _defaultLength; - public AddNewSegmentCommand(JobModel job, Int32 segmentIndex, double defaultLength) + public AddNewSegmentCommand(JobModel job, ISegmentModel segment, double defaultLength) { _jobModel = job; - _index = segmentIndex; + _index = segment.SegmentIndex; _defaultLength = defaultLength; } @@ -29,6 +29,9 @@ namespace Tango.PPC.Jobs.UndoRedoCommands public void UnExecute() { _jobModel.Segments.Remove(_newSegment); + _jobModel.GroupingSegments.Remove(_newSegment); + _jobModel.ArrangeSegmentsIndixes(); + } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/CopySegmentCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/CopySegmentCommand.cs index e82e10e49..fbda54cfd 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/CopySegmentCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/CopySegmentCommand.cs @@ -18,30 +18,15 @@ namespace Tango.PPC.Jobs.UndoRedoCommands } public void Execute() { + _jobModel.SegmentsToCopy.Clear(); + if (false == _jobModel.Segments.ToList().Any(x => x.IsSelected)) return; //LogManager.Log("Copy selected segments."); - int additionalGroupIndex = 1; foreach (var segment in _jobModel.GroupingSegments.Where(i => i.IsSelected).ToList()) { - if (segment is SegmentModel) - { - SegmentModel newSegmentModel = ((SegmentModel)segment).Clone(); - _jobModel.SegmentsToCopy.Add(newSegmentModel); - } - else if (segment is SegmentsGroupModel) - { - SegmentsGroupModel group = (SegmentsGroupModel)segment; - List<SegmentModel> copysegments = new List<SegmentModel>(); - foreach (var segm in group.Segments) - { - SegmentModel newSegmentModel = segm.Clone(); - copysegments.Add(newSegmentModel); - } - SegmentsGroupModel newgroup = new SegmentsGroupModel(_jobModel, copysegments) { SegmentIndex = (_jobModel.LastGroupID + additionalGroupIndex++) }; - copysegments.ForEach(x => { x.SegmentsGroupModel = newgroup; x.IsSelected = false; }); - _jobModel.SegmentsToCopy.AddRange(copysegments); - } + segment.IsSelected = false; + _jobModel.SegmentsToCopy.Add(segment.Clone()); } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/DeleteSegmentsGroupCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/DeleteSegmentsGroupCommand.cs index 83536825b..4b95d9bd7 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/DeleteSegmentsGroupCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/DeleteSegmentsGroupCommand.cs @@ -11,38 +11,40 @@ namespace Tango.PPC.Jobs.UndoRedoCommands { private JobModel _jobModel; private SegmentsGroupModel _segmentsGroup; + private int _index; public DeleteSegmentsGroupCommand(JobModel job, SegmentsGroupModel segmentsGroup) { _jobModel = job; _segmentsGroup = segmentsGroup; + _index = _jobModel.GroupingSegments.IndexOf(_segmentsGroup); } public void Execute() { + _jobModel.SegmentsGroups.Remove(_segmentsGroup); foreach (var obj in _segmentsGroup.Segments) { _jobModel.Segments.Remove(obj); } _jobModel.GroupingSegments.Remove(_segmentsGroup); - _jobModel.LoadGroupingSegments(); + _jobModel.ArrangeSegmentsIndixes(); } public void UnExecute() { - int firstIndex = _segmentsGroup.FirstSegmentIndex; + if (_jobModel.GroupingSegments.Count <= _index) + _jobModel.GroupingSegments.Add(_segmentsGroup); + else + { + _jobModel.GroupingSegments.Insert(_index, _segmentsGroup); + } + _jobModel.SegmentsGroups.Add(_segmentsGroup); foreach (var obj in _segmentsGroup.Segments) { - if (_jobModel.Segments.Count < firstIndex) - _jobModel.Segments.Add(obj); - else - { - _jobModel.Segments.Insert((firstIndex-1), obj); - firstIndex++; - } + _jobModel.Segments.Add(obj); } - _jobModel.LoadGroupingSegments(); + _jobModel.ArrangeSegmentsIndixes(); } - } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/PasteSegmentsCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/PasteSegmentsCommand.cs index 73bcf3f22..827d3debd 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/PasteSegmentsCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/PasteSegmentsCommand.cs @@ -10,15 +10,15 @@ namespace Tango.PPC.Jobs.UndoRedoCommands public class PasteSegmentsCommand : IUndoRedoCommand { private JobModel _jobModel; - public List<SegmentModel> SegmentsToCopy { get; set; } + public List<ISegmentModel> SegmentsToCopy { get; set; } public int _selectedIndex; public PasteSegmentsCommand(JobModel jobModel) { _jobModel = jobModel; - SegmentsToCopy = new List<SegmentModel>(_jobModel.SegmentsToCopy); - _selectedIndex = _jobModel.Segments.OrderBy(x => x.SegmentIndex).ToList().FindIndex(x => x.IsSelected); + SegmentsToCopy = new List<ISegmentModel>(_jobModel.SegmentsToCopy); + _selectedIndex = _jobModel.GroupingSegments.OrderBy(x => x.SegmentIndex).ToList().FindIndex(x => x.IsSelected); } public void Execute() @@ -27,13 +27,26 @@ namespace Tango.PPC.Jobs.UndoRedoCommands { return; } - SegmentsToCopy.ForEach(x => x.RaiseSegmentBrushChanged()); + // SegmentsToCopy.ForEach(x => x.RaiseSegmentBrushChanged()); - if (_selectedIndex == -1 || _selectedIndex == (_jobModel.Segments.Count) - 1) + if (_selectedIndex == -1 || _selectedIndex == (_jobModel.GroupingSegments.Count) - 1) { foreach (var newSegmentModel in SegmentsToCopy) { - _jobModel.Segments.Add(newSegmentModel); + if(newSegmentModel is SegmentModel innerSegment) + { + _jobModel.GroupingSegments.Add(innerSegment); + _jobModel.Segments.Add(innerSegment); + } + else if(newSegmentModel is SegmentsGroupModel group) + { + _jobModel.GroupingSegments.Add(group); + _jobModel.SegmentsGroups.Add(group); + foreach (var segment in group.Segments) + { + _jobModel.Segments.Add(segment); + } + } } } else @@ -42,10 +55,25 @@ namespace Tango.PPC.Jobs.UndoRedoCommands foreach (var newSegmentModel in SegmentsToCopy) { selctedIndex++; - _jobModel.Segments.Insert(selctedIndex, newSegmentModel); + if (newSegmentModel is SegmentModel innerSegment) + { + _jobModel.GroupingSegments.Insert(selctedIndex, innerSegment); + _jobModel.Segments.Add(innerSegment); + } + else if (newSegmentModel is SegmentsGroupModel group) + { + _jobModel.GroupingSegments.Insert(selctedIndex, group); + _jobModel.SegmentsGroups.Add(group); + foreach (var segment in group.Segments) + { + _jobModel.Segments.Add(segment); + } + } } } - _jobModel.LoadGroupingSegments(); + _jobModel.GroupingSegments.ToList().ForEach(x => x.IsSelected = false); + + _jobModel.ArrangeSegmentsIndixes(); _jobModel.SegmentsToCopy.Clear(); } @@ -53,9 +81,22 @@ namespace Tango.PPC.Jobs.UndoRedoCommands { foreach (var segment in SegmentsToCopy) { - _jobModel.Segments.Remove(segment); + _jobModel.GroupingSegments.Remove(segment); + if (segment is SegmentModel innerSegment) + { + _jobModel.Segments.Remove(innerSegment); + } + else if (segment is SegmentsGroupModel group) + { + _jobModel.SegmentsGroups.Remove(group); + foreach (var insegment in group.Segments) + { + _jobModel.Segments.Remove(insegment); + } + } } - _jobModel.LoadGroupingSegments(); + _jobModel.ArrangeSegmentsIndixes(); + _jobModel.SegmentsToCopy = new List<ISegmentModel>(SegmentsToCopy); } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RemoveSegmentsCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RemoveSegmentsCommand.cs index 0ac2a9fc6..1b129a86e 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RemoveSegmentsCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RemoveSegmentsCommand.cs @@ -10,36 +10,59 @@ namespace Tango.PPC.Jobs.UndoRedoCommands public class RemoveSegmentsCommand : IUndoRedoCommand { private JobModel _jobModel; - private Dictionary<int,SegmentModel> _removedSegmentsDict; - + private Dictionary<int, ISegmentModel> _removedSegmentsDict; + public RemoveSegmentsCommand(JobModel job ) { _jobModel = job; - _removedSegmentsDict = _jobModel.Segments.Select((segm, ind) => new { Index = ind, Segment = segm }).Where(x => x.Segment.IsSelected).ToDictionary(i => i.Index, i => i.Segment); ; + _removedSegmentsDict = _jobModel.GroupingSegments.Select((segm, ind) => new { Index = ind, Segment = segm }).Where(x => x.Segment.IsSelected).ToDictionary(i => i.Index, i => i.Segment); ; } public void Execute() { foreach (var obj in _removedSegmentsDict) { - _jobModel.Segments.Remove(obj.Value); + if (obj.Value is SegmentModel innerSegment) + { + _jobModel.Segments.Remove(innerSegment); + } + else if (obj.Value is SegmentsGroupModel group) + { + _jobModel.SegmentsGroups.Remove(group); + foreach (var segm in group.Segments) + { + _jobModel.Segments.Remove(segm); + } + } + _jobModel.GroupingSegments.Remove(obj.Value); } - _jobModel.LoadGroupingSegments(); } public void UnExecute() { foreach (var obj in _removedSegmentsDict) { - if (_jobModel.Segments.Count <= obj.Key) - _jobModel.Segments.Add(obj.Value); + if (obj.Value is SegmentModel innerSegment) + { + _jobModel.Segments.Add(innerSegment); + } + else if (obj.Value is SegmentsGroupModel group) + { + _jobModel.SegmentsGroups.Add(group); + foreach (var segm in group.Segments) + { + _jobModel.Segments.Add(segm); + } + } + if (_jobModel.GroupingSegments.Count <= obj.Key) + _jobModel.GroupingSegments.Add(obj.Value); else { - _jobModel.Segments.Insert(obj.Key, obj.Value); + _jobModel.GroupingSegments.Insert(obj.Key, obj.Value); } } - _jobModel.LoadGroupingSegments(); - + _jobModel.ArrangeSegmentsIndixes(); + } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RepeatCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RepeatCommand.cs index cdce7739a..01390ea71 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RepeatCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/RepeatCommand.cs @@ -10,20 +10,21 @@ namespace Tango.PPC.Jobs.UndoRedoCommands public class RepeatCommand : IUndoRedoCommand { private JobModel _jobModel; - private List<ISegmentModel> _selectedSegments; - + private Dictionary<int, ISegmentModel> _indexToSegmentsDict; + private SegmentsGroupModel _group; + public RepeatCommand(JobModel job) { _jobModel = job; - _selectedSegments = new List<ISegmentModel>(); + _indexToSegmentsDict = new Dictionary<int, ISegmentModel>(); for (int index = 0; index < _jobModel.GroupingSegments.Count; index++) { var segment = _jobModel.GroupingSegments[index]; if (segment.IsSelected ) { - _selectedSegments.Add(segment); + _indexToSegmentsDict[index] = segment; } - else if (_selectedSegments.Count > 0)//selected items should be in turn + else if (_indexToSegmentsDict.Count > 0)//selected items should be in turn { break; } @@ -32,43 +33,67 @@ namespace Tango.PPC.Jobs.UndoRedoCommands public void Execute() { - if (_selectedSegments.Count == 0) + if (_indexToSegmentsDict.Count == 0) return; List<SegmentModel> selectedsegments = new List<SegmentModel>(); - foreach (var segm in _selectedSegments) + foreach (var obj in _indexToSegmentsDict) { - if (segm is SegmentModel) - selectedsegments.Add((SegmentModel)segm); - else if (segm is SegmentsGroupModel) + if (obj.Value is SegmentModel simpleSegment) { - selectedsegments.AddRange(((SegmentsGroupModel)segm).Segments); + selectedsegments.Add(simpleSegment); + _jobModel.GroupingSegments.Remove(simpleSegment); + } + else if (obj.Value is SegmentsGroupModel segmentsGroup) + { + selectedsegments.AddRange(segmentsGroup.Segments); + _jobModel.SegmentsGroups.Remove(segmentsGroup); + _jobModel.GroupingSegments.Remove(segmentsGroup); } } - SegmentsGroupModel group = new SegmentsGroupModel(_jobModel, selectedsegments) ; - group.SegmentIndex = group.FirstSegmentIndex; + _group = new SegmentsGroupModel(_jobModel, selectedsegments) ; + _group.SegmentIndex = _group.FirstSegmentIndex; - selectedsegments.ForEach(x => { x.SegmentsGroupModel = group; x.IsSelected = false; }); + _jobModel.SegmentsGroups.Add(_group); - _jobModel.LoadGroupingSegments(); + if((_group.SegmentIndex - 1) < _jobModel.GroupingSegments.Count) + { + _jobModel.GroupingSegments.Insert((_group.SegmentIndex - 1), _group); + } + else + _jobModel.GroupingSegments.Add( _group); + + _jobModel.ArrangeSegmentsIndixes(); } public void UnExecute() { - if (_selectedSegments.Count == 0) + if (_indexToSegmentsDict.Count == 0) return; - foreach (var segm in _selectedSegments) + + _jobModel.SegmentsGroups.Remove(_group); + _jobModel.GroupingSegments.Remove(_group); + foreach (var obj in _indexToSegmentsDict) { - if (segm is SegmentModel) - ((SegmentModel)segm).SegmentsGroupModel = null; - else if (segm is SegmentsGroupModel) + if (obj.Value is SegmentModel innerSegment) { - SegmentsGroupModel group = (SegmentsGroupModel)segm; + innerSegment.SegmentsGroupModel = null; + } + else if (obj.Value is SegmentsGroupModel group) + { + _jobModel.SegmentsGroups.Add(group); group.Segments.ToList().ForEach(x => x.SegmentsGroupModel = group); } + if (_jobModel.GroupingSegments.Count <= obj.Key) + _jobModel.GroupingSegments.Add(obj.Value); + else + { + _jobModel.GroupingSegments.Insert(obj.Key, obj.Value); + } } - _jobModel.LoadGroupingSegments(); + + _jobModel.ArrangeSegmentsIndixes(); } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/ReverseCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/ReverseCommand.cs index f34a3eaf6..719460e71 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/ReverseCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/ReverseCommand.cs @@ -30,6 +30,28 @@ namespace Tango.PPC.Jobs.UndoRedoCommands _jobModel.SwapSegments(firstIndexToSwap, lastIndexToSwap); } + for (int index = 0; index < _indexes.Count && index < _jobModel.GroupingSegments.Count; index++) + { + if(_jobModel.GroupingSegments[_indexes[index]] is SegmentModel segmentModel) + { + if(segmentModel.IsGradient) + { + segmentModel.SwapBrushStops(); + } + } + else if(_jobModel.GroupingSegments[_indexes[index]] is SegmentsGroupModel group) + { + foreach( var segment in group.Segments) + { + if (segment.IsGradient) + { + segment.SwapBrushStops(); + } + } + } + } + _jobModel.GroupingSegments.ToList().ForEach(x => x.IsSelected = false); + _jobModel.ArrangeSegmentsIndixes(); } public void UnExecute() @@ -44,6 +66,27 @@ namespace Tango.PPC.Jobs.UndoRedoCommands _jobModel.SwapSegments(firstIndexToSwap, lastIndexToSwap); } + for (int index = 0; index < _indexes.Count && index < _jobModel.GroupingSegments.Count; index++) + { + if (_jobModel.GroupingSegments[_indexes[index]] is SegmentModel segmentModel) + { + if (segmentModel.IsGradient) + { + segmentModel.SwapBrushStops(); + } + } + else if (_jobModel.GroupingSegments[_indexes[index]] is SegmentsGroupModel group) + { + foreach (var segment in group.Segments) + { + if (segment.IsGradient) + { + segment.SwapBrushStops(); + } + } + } + } + _jobModel.ArrangeSegmentsIndixes(); } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/UnGroupSegmentsCommand.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/UnGroupSegmentsCommand.cs index b42dda221..cbf801266 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/UnGroupSegmentsCommand.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/UndoRedoCommands/UnGroupSegmentsCommand.cs @@ -11,21 +11,44 @@ namespace Tango.PPC.Jobs.UndoRedoCommands { private JobModel _jobModel; private SegmentsGroupModel _segmentsGroupModel; + private int _index; + public UnGroupSegmentsCommand(JobModel jobModel, SegmentsGroupModel segmentsGroup) { _jobModel = jobModel; _segmentsGroupModel = segmentsGroup; + _index = _jobModel.GroupingSegments.IndexOf(_segmentsGroupModel); } public void Execute() { - _segmentsGroupModel.Segments.ToList().ForEach(x => x.SegmentsGroupModel = null); - _jobModel.LoadGroupingSegments(); + int index = _index; + foreach( var segment in _segmentsGroupModel.Segments) + { + segment.SegmentsGroupModel = null; + _jobModel.GroupingSegments.Insert(index++, segment); + } + _jobModel.SegmentsGroups.Remove(_segmentsGroupModel); + _jobModel.GroupingSegments.Remove(_segmentsGroupModel); + _jobModel.ArrangeSegmentsIndixes(); } public void UnExecute() { - _segmentsGroupModel.Segments.ToList().ForEach(x => x.SegmentsGroupModel = _segmentsGroupModel); - _jobModel.LoadGroupingSegments(); + _jobModel.SegmentsGroups.Add(_segmentsGroupModel); + foreach (var segment in _segmentsGroupModel.Segments) + { + segment.SegmentsGroupModel = _segmentsGroupModel; + _jobModel.GroupingSegments.Remove(segment); + } + + if (_jobModel.GroupingSegments.Count <= _index) + _jobModel.GroupingSegments.Add(_segmentsGroupModel); + else + { + _jobModel.GroupingSegments.Insert(_index, _segmentsGroupModel); + } + + _jobModel.ArrangeSegmentsIndixes(); } } } diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobSummeryViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobSummeryViewVM.cs index 10593cc36..299256d80 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobSummeryViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobSummeryViewVM.cs @@ -163,6 +163,7 @@ namespace Tango.PPC.Jobs.ViewModels .WithUser() .WithSegments() .WithBrushStops() + .WithSegmentsGroups() .BuildAsync(); if (Job.Rml != null && _context != null) diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobViewVM.cs index 776b25d35..cadbc6275 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobViewVM.cs @@ -236,7 +236,7 @@ namespace Tango.PPC.Jobs.ViewModels /// <summary> /// Gets or sets the add solid segment command. /// </summary> - public RelayCommand<Int32> AddNewSegmentCommand { get; set; } + public RelayCommand<ISegmentModel> AddNewSegmentCommand { get; set; } /// <summary> /// Gets or sets the remove segment command. @@ -335,7 +335,7 @@ namespace Tango.PPC.Jobs.ViewModels }); //Initialize Commands - AddNewSegmentCommand = new RelayCommand<Int32>(AddNewSegment); + AddNewSegmentCommand = new RelayCommand<ISegmentModel>(AddNewSegment); RemoveSegmentCommand = new RelayCommand<SegmentModel>(RemoveSegment); DuplicateSegmentCommand = new RelayCommand<SegmentModel>(DuplicateSegment); @@ -426,6 +426,7 @@ namespace Tango.PPC.Jobs.ViewModels .WithUser() .WithSegments() .WithBrushStops() + .WithSegmentsGroups() .BuildAsync(); Job.NameChanged -= Job_NameChanged; @@ -513,76 +514,73 @@ namespace Tango.PPC.Jobs.ViewModels EnableInterSegment = Job.EnableInterSegment }; Dictionary<string, SegmentsGroupModel> guidToGroup = new Dictionary<string, SegmentsGroupModel>(); - foreach (var segm in Job.Segments) + if (Job.Version == 1) { - if (Job.Version == 1 && segm.BrushStops.Count > 1) + foreach (var segm in Job.OrderedSegments) { - int segmentindex = 1; - - var brushes = segm.BrushStops; - Segment currentSegment = segm; - double lengthOfOldSegment = segm.Length; - for (int index = 0; index < (brushes.Count - 1); index++) + if(segm.BrushStops.Count > 1) { - SegmentModel csegmentModel = new SegmentModel(jobModel, segm.Guid) + int segmentindex = 1; + + var brushes = segm.BrushStops; + Segment currentSegment = segm; + double lengthOfOldSegment = segm.Length; + for (int index = 0; index < (brushes.Count - 1); index++) { - Name = segm.Name, - Length = segm.Length, - SegmentIndex = segm.SegmentIndex, - IsInterSegment = segm.IsInterSegment, - Job = jobModel - }; + SegmentModel csegmentModel = new SegmentModel(jobModel, segm.Guid) + { + Name = segm.Name, + Length = segm.Length, + SegmentIndex = segm.SegmentIndex, + IsInterSegment = segm.IsInterSegment, + Job = jobModel + }; - csegmentModel.SegmentIndex = segmentindex++; + csegmentModel.SegmentIndex = segmentindex++; - brushes[index].Segment = currentSegment; - brushes[index + 1].Segment = currentSegment; - csegmentModel.Length = (lengthOfOldSegment * (brushes[index + 1].OffsetPercent - brushes[index].OffsetPercent) / 100d); - BrushStopModel brushStopModelFirst = new BrushStopModel(brushes[index], csegmentModel, 1); - BrushStopModel brushStopModelSecond = new BrushStopModel(brushes[index + 1], csegmentModel, 1); - csegmentModel.CreateGradientBrushes(brushStopModelFirst, brushStopModelSecond); + brushes[index].Segment = currentSegment; + brushes[index + 1].Segment = currentSegment; + csegmentModel.Length = (lengthOfOldSegment * (brushes[index + 1].OffsetPercent - brushes[index].OffsetPercent) / 100d); + BrushStopModel brushStopModelFirst = new BrushStopModel(brushes[index], csegmentModel, 1); + BrushStopModel brushStopModelSecond = new BrushStopModel(brushes[index + 1], csegmentModel, 1); + csegmentModel.CreateGradientBrushes(brushStopModelFirst, brushStopModelSecond); - jobModel.Segments.Add(csegmentModel); + jobModel.Segments.Add(csegmentModel); + } + } + else + { + SegmentModel segmentModel = LoadSegmentModel(segm, jobModel); + jobModel.Segments.Add(segmentModel); } } - else + } + else + { + var segments = Job.OrderedSegmentsWithGroups; + foreach( var segment in segments) { - SegmentModel segmentModel = new SegmentModel(jobModel, segm.Guid) + if (segment is Segment simpleSegment) { - Name = segm.Name, - Length = segm.Length, - SegmentIndex = segm.SegmentIndex, - IsInterSegment = segm.IsInterSegment, - Job = jobModel, - }; - if(segm.SegmentsGroupGuid != null) + SegmentModel segmentModel = LoadSegmentModel(simpleSegment, jobModel); + jobModel.Segments.Add(segmentModel); + } + else if (segment is SegmentsGroup group) { - SegmentsGroupModel segmentsGroupModel; - if(guidToGroup.TryGetValue(segm.SegmentsGroupGuid, out segmentsGroupModel)) + SegmentsGroupModel segmentsGroupModel = new SegmentsGroupModel(jobModel) { SegmentIndex = group.SegmentIndex, Repeats = group.Repeats }; + + foreach (var innerSegment in group.OrderedSegments) { + SegmentModel segmentModel = LoadSegmentModel(innerSegment, jobModel); + jobModel.Segments.Add(segmentModel); segmentsGroupModel.Segments.Add(segmentModel); segmentModel.SegmentsGroupModel = segmentsGroupModel; } - else - { - segmentsGroupModel = new SegmentsGroupModel(jobModel) { SegmentIndex = segm.SegmentsGroup.SegmentIndex, Repeats = segm.SegmentsGroup.Repeats }; - guidToGroup[segm.SegmentsGroupGuid] = segmentsGroupModel; - segmentsGroupModel.Segments.Add(segmentModel); - segmentModel.SegmentsGroupModel = segmentsGroupModel; - } - } - foreach (var brushStop in segm.BrushStops) - { - BrushStopModel brushStopModel = new BrushStopModel(brushStop, segmentModel, Job.Version); - segmentModel.BrushStops.Add(brushStopModel); + jobModel.SegmentsGroups.Add(segmentsGroupModel); } - - segmentModel.ArrangeBrushStopsPosition(); - jobModel.Segments.Add(segmentModel); } } - jobModel.InterSegmentLength = Job.EnableInterSegment ? Job.InterSegmentLength : 0; jobModel.LoadGroupingSegments(); JobModel = jobModel; @@ -593,6 +591,32 @@ namespace Tango.PPC.Jobs.ViewModels ArrangeSegmentsIndixes(); } + /// <summary> + /// Loads the segment model. + /// </summary> + /// <param name="segm">The segm.</param> + /// <param name="jobModel">The job model.</param> + /// <returns></returns> + private SegmentModel LoadSegmentModel(Segment segm, JobModel jobModel) + { + SegmentModel segmentModel = new SegmentModel(jobModel, segm.Guid) + { + Name = segm.Name, + Length = segm.Length, + SegmentIndex = segm.SegmentIndex, + IsInterSegment = segm.IsInterSegment, + Job = jobModel, + }; + foreach (var brushStop in segm.BrushStops) + { + BrushStopModel brushStopModel = new BrushStopModel(brushStop, segmentModel, Job.Version); + segmentModel.BrushStops.Add(brushStopModel); + } + + segmentModel.ArrangeBrushStopsPosition(); + return segmentModel; + } + private void Job_NameChanged(object sender, string e) { DyeCommand.RaiseCanExecuteChanged(); @@ -799,13 +823,13 @@ namespace Tango.PPC.Jobs.ViewModels /// <summary> /// Adds a new segment. /// </summary> - private void AddNewSegment(Int32 segmentIndex) + private void AddNewSegment(ISegmentModel segment) { try { LogManager.Log("Adding new segment..."); - UndoRedoManager.Instance.InsertAndExecuteCommand(new AddNewSegmentCommand(JobModel, segmentIndex, Settings.DefaultSegmentLength > 0 ? Settings.DefaultSegmentLength : 10)); + UndoRedoManager.Instance.InsertAndExecuteCommand(new AddNewSegmentCommand(JobModel, segment, Settings.DefaultSegmentLength > 0 ? Settings.DefaultSegmentLength : 10)); ArrangeSegmentsIndixes(); } catch (Exception ex) @@ -898,16 +922,7 @@ namespace Tango.PPC.Jobs.ViewModels private void ArrangeSegmentsIndixes() { - int index = 1; - int count = JobModel.GroupingSegments.Count(); - - // foreach (var segment in JobModel.Segments) - foreach (var segment in JobModel.GroupingSegments) - { - segment.IsLast = ( index == count)? true : false; - segment.SegmentIndex = index++; - } - + JobModel.ArrangeSegmentsIndixes(); SegmentsCollectionView.Refresh(); } @@ -1197,13 +1212,13 @@ namespace Tango.PPC.Jobs.ViewModels { if (!JobModel.HasSelectedItems) return; - if(JobModel.Segments.ToList().Where(x => x.IsSelected).ToList().Count == JobModel.Segments.Count) + if(JobModel.GroupingSegments.ToList().Where(x => x.IsSelected).ToList().Count == JobModel.GroupingSegments.Count) { await NotificationProvider.ShowInfo("A job must contain at least one segment. Please, change selection."); return; } - if (JobModel.Segments.Count > 1) + if (JobModel.GroupingSegments.Count > 1) { try { @@ -1304,68 +1319,106 @@ namespace Tango.PPC.Jobs.ViewModels Dictionary<int, SegmentsGroup> segmentIndexToGroup = new Dictionary<int, SegmentsGroup>(); - foreach (var segment in JobModel.Segments.OrderBy(x => x.SegmentIndex).ToList()) + //foreach (var segment in JobModel.Segments.OrderBy(x => x.SegmentIndex).ToList()) + foreach(var segment in JobModel.OrderedSegmentsWithGroups) { - var dbSegment = new Segment(); - dbSegment.Guid = System.Guid.NewGuid().ToString(); - dbSegment.Name = "Standard Segment"; - - dbSegment.Job = Job; - dbSegment.SegmentIndex = segment.SegmentIndex; - dbSegment.Length = segment.Length; - if(segment.IsGroupSegment) + if(segment is SegmentModel innerSegment) { - SegmentsGroup dbSegmentsGroup; - if (false == segmentIndexToGroup.TryGetValue(segment.SegmentsGroupModel.SegmentIndex, out dbSegmentsGroup)) - { - dbSegmentsGroup = new SegmentsGroup(); - dbSegmentsGroup.Guid = System.Guid.NewGuid().ToString(); - dbSegmentsGroup.Repeats = segment.SegmentsGroupModel.Repeats; - dbSegmentsGroup.SegmentIndex = segment.SegmentsGroupModel.SegmentIndex; - dbSegmentsGroup.Job = Job; - _db.SegmentsGroups.Add(dbSegmentsGroup); - dbSegment.SegmentsGroup = dbSegmentsGroup; - segmentIndexToGroup[segment.SegmentsGroupModel.SegmentIndex] = dbSegmentsGroup; - } - else + var dbSegment = new Segment(); + dbSegment.Guid = System.Guid.NewGuid().ToString(); + dbSegment.Name = "Standard Segment"; + + dbSegment.Job = Job; + dbSegment.SegmentIndex = segment.SegmentIndex; + dbSegment.Length = segment.Length; + _db.Segments.Add(dbSegment); + foreach (var stop in innerSegment.BrushStops.OrderBy(x => x.StopIndex).ToList()) { - dbSegment.SegmentsGroup = dbSegmentsGroup; + var dbStop = new BrushStop(); + dbStop.Segment = dbSegment; + _db.BrushStops.Add(dbStop); + + dbStop.ColorSpace = colorSpaces.FirstOrDefault(x => x.Code == (int)stop.ColorSpace); + dbStop.Red = stop.Red; + dbStop.Green = stop.Green; + dbStop.Blue = stop.Blue; + dbStop.L = stop.L; + dbStop.A = stop.A; + dbStop.B = stop.B; + dbStop.Cyan = stop.Cyan; + dbStop.Magenta = stop.Magenta; + dbStop.Yellow = stop.Yellow; + dbStop.Black = stop.Black; + dbStop.BestMatchR = stop.BestMatchColor.R; + dbStop.BestMatchG = stop.BestMatchColor.G; + dbStop.BestMatchB = stop.BestMatchColor.B; + + dbStop.OffsetPercent = stop.OffsetPercent; + dbStop.StopIndex = stop.StopIndex; + dbStop.IsOutOfGamut = stop.IsOutOfGamut; + + dbStop.SetVolume(LiquidTypes.Cyan, stop.Cyan); + dbStop.SetVolume(LiquidTypes.Magenta, stop.Magenta); + dbStop.SetVolume(LiquidTypes.Yellow, stop.Yellow); + dbStop.SetVolume(LiquidTypes.Black, stop.Black); + + dbStop.ColorCatalog = stop.ColorCatalog; + dbStop.ColorCatalogsItem = stop.ColorCatalogsItem; } } - _db.Segments.Add(dbSegment); - - foreach (var stop in segment.BrushStops.OrderBy(x => x.StopIndex).ToList()) + else if( segment is SegmentsGroupModel group) { - var dbStop = new BrushStop(); - dbStop.Segment = dbSegment; - _db.BrushStops.Add(dbStop); + SegmentsGroup dbSegmentsGroup = new SegmentsGroup(); + dbSegmentsGroup.Guid = System.Guid.NewGuid().ToString(); + dbSegmentsGroup.Repeats = group.Repeats; + dbSegmentsGroup.SegmentIndex = group.SegmentIndex; + dbSegmentsGroup.Job = Job; + _db.SegmentsGroups.Add(dbSegmentsGroup); + foreach(var segm_group in group.Segments.OrderBy(x=>x.SegmentIndex)) + { + var dbSegment = new Segment(); + dbSegment.Guid = System.Guid.NewGuid().ToString(); + dbSegment.Name = "Standard Segment"; - dbStop.ColorSpace = colorSpaces.FirstOrDefault(x => x.Code == (int)stop.ColorSpace); - dbStop.Red = stop.Red; - dbStop.Green = stop.Green; - dbStop.Blue = stop.Blue; - dbStop.L = stop.L; - dbStop.A = stop.A; - dbStop.B = stop.B; - dbStop.Cyan = stop.Cyan; - dbStop.Magenta = stop.Magenta; - dbStop.Yellow = stop.Yellow; - dbStop.Black = stop.Black; - dbStop.BestMatchR = stop.BestMatchColor.R; - dbStop.BestMatchG = stop.BestMatchColor.G; - dbStop.BestMatchB = stop.BestMatchColor.B; + dbSegment.Job = Job; + dbSegment.SegmentIndex = segm_group.SegmentIndex; + dbSegment.Length = segm_group.Length; + dbSegment.SegmentsGroupGuid = dbSegmentsGroup.Guid; + _db.Segments.Add(dbSegment); + foreach (var stop in segm_group.BrushStops.OrderBy(x => x.StopIndex).ToList()) + { + var dbStop = new BrushStop(); + dbStop.Segment = dbSegment; + _db.BrushStops.Add(dbStop); - dbStop.OffsetPercent = stop.OffsetPercent; - dbStop.StopIndex = stop.StopIndex; - dbStop.IsOutOfGamut = stop.IsOutOfGamut; - - dbStop.SetVolume(LiquidTypes.Cyan, stop.Cyan); - dbStop.SetVolume(LiquidTypes.Magenta, stop.Magenta); - dbStop.SetVolume(LiquidTypes.Yellow, stop.Yellow); - dbStop.SetVolume(LiquidTypes.Black, stop.Black); + dbStop.ColorSpace = colorSpaces.FirstOrDefault(x => x.Code == (int)stop.ColorSpace); + dbStop.Red = stop.Red; + dbStop.Green = stop.Green; + dbStop.Blue = stop.Blue; + dbStop.L = stop.L; + dbStop.A = stop.A; + dbStop.B = stop.B; + dbStop.Cyan = stop.Cyan; + dbStop.Magenta = stop.Magenta; + dbStop.Yellow = stop.Yellow; + dbStop.Black = stop.Black; + dbStop.BestMatchR = stop.BestMatchColor.R; + dbStop.BestMatchG = stop.BestMatchColor.G; + dbStop.BestMatchB = stop.BestMatchColor.B; + + dbStop.OffsetPercent = stop.OffsetPercent; + dbStop.StopIndex = stop.StopIndex; + dbStop.IsOutOfGamut = stop.IsOutOfGamut; - dbStop.ColorCatalog = stop.ColorCatalog; - dbStop.ColorCatalogsItem = stop.ColorCatalogsItem; + dbStop.SetVolume(LiquidTypes.Cyan, stop.Cyan); + dbStop.SetVolume(LiquidTypes.Magenta, stop.Magenta); + dbStop.SetVolume(LiquidTypes.Yellow, stop.Yellow); + dbStop.SetVolume(LiquidTypes.Black, stop.Black); + + dbStop.ColorCatalog = stop.ColorCatalog; + dbStop.ColorCatalogsItem = stop.ColorCatalogsItem; + } + } } } Job.LastUpdated = DateTime.UtcNow; diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs index 85d469ac1..b7380cc4d 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs @@ -361,7 +361,7 @@ namespace Tango.PPC.Jobs.ViewModels _colorSpaces = _db.ColorSpaces.ToList(); - var jobs = new JobsCollectionBuilder(_db).Set(x => x.MachineGuid == MachineProvider.Machine.Guid).WithSegments().WithBrushStops().WithCustomer().WithColorSpace().Build(); + var jobs = new JobsCollectionBuilder(_db).Set(x => x.MachineGuid == MachineProvider.Machine.Guid).WithSegments().WithBrushStops().WithCustomer().WithColorSpace().WithSegmentsGroups().Build(); InvokeUI(() => { diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobSummeryView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobSummeryView.xaml index dd17e4668..34ddeca8a 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobSummeryView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobSummeryView.xaml @@ -102,7 +102,7 @@ </DockPanel> </StackPanel> - <!--<controls:JobSummeryViewer Height="40" JobModel="{Binding Job}" VerticalAlignment="Center" Margin="20 0" Grid.Row="2" />--> + <controls:JobSummeryViewer Height="40" Job="{Binding Job}" VerticalAlignment="Center" Margin="20 0" Grid.Row="2" /> </Grid> </DockPanel> </Border> diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobView.xaml index 70531394f..f650b61a2 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobView.xaml @@ -206,7 +206,7 @@ </DataTemplate> <DataTemplate x:Key="Segment_Template" DataType="{x:Type model:SegmentModel}"> - <Grid Height="380" Margin="57 15 57 0"> + <Grid Height="390" Margin="57 15 57 0"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> @@ -380,7 +380,7 @@ </Grid> </Border> - <DockPanel Margin="0 20 0 0" Grid.Row="1"> + <DockPanel Margin="0 10 0 0" Grid.Row="1"> <!--<Grid DockPanel.Dock="Right" Visibility="{Binding IsLast, Converter={StaticResource BooleanToVisibilityInverseConverter}}">--> <Grid DockPanel.Dock="Right" Visibility="Collapsed"> <touch:TouchButton x:Name="deletegap" DockPanel.Dock="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Command="{Binding DeleteGapCommand}" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0" Visibility="{Binding EnableInterSegment, Converter={StaticResource BooleanToVisibilityConverter}}"> @@ -395,7 +395,7 @@ </StackPanel> </touch:TouchButton> </Grid> - <touch:TouchButton DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" Command="{Binding DataContext.AddNewSegmentCommand, ElementName=listSegments}" CommandParameter="{Binding SegmentIndex}" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0"> + <touch:TouchButton DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" Command="{Binding DataContext.AddNewSegmentCommand, ElementName=listSegments}" CommandParameter="{Binding }" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0"> <StackPanel Orientation="Horizontal"> <Border Height="35" Width="35" BorderThickness="0" Background="Transparent" HorizontalAlignment="Left"> <Image Stretch="Fill" RenderOptions.BitmapScalingMode="Fant" Source="../Images/JobView/AddNewSegment.png"/> @@ -411,7 +411,7 @@ </DataTemplate> <DataTemplate x:Key="GroupSegment_Template" DataType="{x:Type model:SegmentsGroupModel}"> - <Grid Height="380" Margin="57 15 57 0"> + <Grid Height="390" Margin="57 15 57 0"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> @@ -522,7 +522,7 @@ </Grid> </Border> - <DockPanel Margin="0 20 0 0" Grid.Row="1"> + <DockPanel Margin="0 10 0 0" Grid.Row="1"> <!--<Grid DockPanel.Dock="Right" Visibility="{Binding IsLast, Converter={StaticResource BooleanToVisibilityInverseConverter}}">--> <!--<Grid DockPanel.Dock="Right" Visibility="Collapsed">--> <!--<touch:TouchButton x:Name="deletegap" DockPanel.Dock="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Command="{Binding DeleteGapCommand}" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0" Visibility="{Binding EnableInterSegment, Converter={StaticResource BooleanToVisibilityConverter}}"> @@ -537,7 +537,7 @@ </StackPanel> </touch:TouchButton>--> <!--</Grid>--> - <touch:TouchButton DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" Command="{Binding DataContext.AddNewSegmentCommand, ElementName=listSegments}" CommandParameter="{Binding SegmentIndex}" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0"> + <touch:TouchButton DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" Command="{Binding DataContext.AddNewSegmentCommand, ElementName=listSegments}" CommandParameter="{Binding }" EnableDropShadow="False" Foreground="{StaticResource TangoKeyboardKeyDarkTextBrush}" Background="Transparent" BorderThickness="0"> <StackPanel Orientation="Horizontal"> <Border Height="35" Width="35" BorderThickness="0" Background="Transparent" HorizontalAlignment="Left"> <Image Stretch="Fill" RenderOptions.BitmapScalingMode="Fant" Source="../Images/JobView/AddNewSegment.png"/> @@ -953,7 +953,7 @@ <Grid Margin=" 0 10 0 0"> <!--<touch:TouchVirtualizedContentReplaceControl MinHeight="40"> <DataTemplate>--> - <localControls:JobSummeryViewer JobModel="{Binding JobModel}" Height="20" DisplayMarkers="False" /> + <localControls:JobModelSummaryViewerControl JobModel="{Binding JobModel}" Height="20" DisplayMarkers="False" /> <!--</DataTemplate> </touch:TouchVirtualizedContentReplaceControl>--> </Grid> diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobsView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobsView.xaml index e7823d33d..770711f5d 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobsView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Views/JobsView.xaml @@ -176,7 +176,7 @@ <touch:TouchLoadingPanel IsLoading="{Binding IsLoadingJobs}" Visibility="{Binding SelectedCategory,Converter={StaticResource JobsCategoryToVisibilityConverter},ConverterParameter='Draft'}"> <touch:LightTouchDataGrid CollectionFilter="{Binding CollectionFilter}" AnimateSorting="False" RenderOptions.EdgeMode="Unspecified" Style="{StaticResource TangoJobsGrid}" x:Name="dataGridJobs" SelectedItems="{Binding SelectedJobs}" IsMultiSelecting="{Binding IsMultiSelecting,Mode=TwoWay}" OnDragAndDropCommand="{Binding JobDragedDroppedCommand}" ItemsSource="{Binding DraftJobsCollectionView}" ItemSelectedCommand="{Binding JobSelectedCommand}" Margin="10"> <touch:LightTouchDataGrid.Columns> - <touch:LightTouchDataGridColumn Width="90"> + <!--<touch:LightTouchDataGridColumn Width="90"> <touch:LightTouchDataGridColumn.Header> <Image Source="../Images/warning.png" Width="24" /> </touch:LightTouchDataGridColumn.Header> @@ -210,11 +210,14 @@ </Grid> </DataTemplate> </touch:LightTouchDataGridColumn.CellTemplate> - </touch:LightTouchDataGridColumn> - <touch:LightTouchDataGridColumn Width="1*" Header="Name" SortMember="Name" HorizontalContentAlignment="Left"> + </touch:LightTouchDataGridColumn>--> + <touch:LightTouchDataGridColumn Width="1*" SortMember="Name" HorizontalContentAlignment="Left"> + <touch:LightTouchDataGridColumn.Header> + <TextBlock Margin="20 0 0 0" Text="Name" /> + </touch:LightTouchDataGridColumn.Header> <touch:LightTouchDataGridColumn.CellTemplate> <DataTemplate> - <TextBlock IsHitTestVisible="False" Text="{Binding Name,Converter={StaticResource StringEllipsisConverter},ConverterParameter='40'}"></TextBlock> + <TextBlock Margin="20 0 0 0" IsHitTestVisible="False" Text="{Binding Name,Converter={StaticResource StringEllipsisConverter},ConverterParameter='40'}"></TextBlock> </DataTemplate> </touch:LightTouchDataGridColumn.CellTemplate> </touch:LightTouchDataGridColumn> @@ -321,7 +324,7 @@ <touch:LightTouchDataGridColumn Width="1*" Header="Name" SortMember="Name" HorizontalContentAlignment="Left"> <touch:LightTouchDataGridColumn.CellTemplate> <DataTemplate> - <TextBlock IsHitTestVisible="False" Text="{Binding Name,Converter={StaticResource StringEllipsisConverter},ConverterParameter='40'}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock> + <TextBlock IsHitTestVisible="False" Text="{Binding Name,Converter={StaticResource StringEllipsisConverter},ConverterParameter='40'}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock> </DataTemplate> </touch:LightTouchDataGridColumn.CellTemplate> </touch:LightTouchDataGridColumn> diff --git a/Software/Visual_Studio/Tango.BL/Builders/JobBuilder.cs b/Software/Visual_Studio/Tango.BL/Builders/JobBuilder.cs index 0f1a868a4..970309a96 100644 --- a/Software/Visual_Studio/Tango.BL/Builders/JobBuilder.cs +++ b/Software/Visual_Studio/Tango.BL/Builders/JobBuilder.cs @@ -85,5 +85,13 @@ namespace Tango.BL.Builders Context.JobRuns.Where(x => x.JobGuid == Entity.Guid).OrderBy(x => x.StartDate).ToList(); }); } + + public virtual JobBuilder WithSegmentsGroups() + { + return AddStep(7, () => + { + Context.SegmentsGroups.Where(x => x.JobGuid == Entity.Guid).OrderBy(x => x.SegmentIndex).ToList(); + }); + } } } diff --git a/Software/Visual_Studio/Tango.BL/Builders/JobsCollectionBuilder.cs b/Software/Visual_Studio/Tango.BL/Builders/JobsCollectionBuilder.cs index e5db5d7e1..c155e7020 100644 --- a/Software/Visual_Studio/Tango.BL/Builders/JobsCollectionBuilder.cs +++ b/Software/Visual_Studio/Tango.BL/Builders/JobsCollectionBuilder.cs @@ -52,5 +52,16 @@ namespace Tango.BL.Builders } }); } + + public virtual JobsCollectionBuilder WithSegmentsGroups() + { + return AddStep(3, () => + { + foreach (var job in Entities.ToList()) + { + Context.SegmentsGroups.Where(x => x.JobGuid == job.Guid).OrderBy(x => x.SegmentIndex).ToList(); + } + }); + } } } diff --git a/Software/Visual_Studio/Tango.BL/Builders/MachineBuilder.cs b/Software/Visual_Studio/Tango.BL/Builders/MachineBuilder.cs index fd9d14baa..c9c13c389 100644 --- a/Software/Visual_Studio/Tango.BL/Builders/MachineBuilder.cs +++ b/Software/Visual_Studio/Tango.BL/Builders/MachineBuilder.cs @@ -49,7 +49,7 @@ namespace Tango.BL.Builders { return AddStep(3, () => { - new JobsCollectionBuilder(Context).Set(x => x.MachineGuid == Entity.Guid).WithSegments().Build(); + new JobsCollectionBuilder(Context).Set(x => x.MachineGuid == Entity.Guid).WithSegments().WithSegmentsGroups().Build(); }); } diff --git a/Software/Visual_Studio/Tango.BL/Entities/Job.cs b/Software/Visual_Studio/Tango.BL/Entities/Job.cs index 5cd756f27..dbe1c5bf0 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/Job.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/Job.cs @@ -13,6 +13,7 @@ using System.Windows.Media.Imaging; using Tango.BL.ActionLogs; using Tango.BL.Builders; using Tango.BL.Enumerations; +using Tango.BL.Interfaces; using Tango.BL.ValueObjects; using Tango.Core; using Tango.Core.ExtensionMethods; @@ -148,27 +149,92 @@ namespace Tango.BL.Entities { get { + var segments = OrderedSegmentsWithGroups; if (EnableInterSegment && IsAllSegmentsPerSpool) { - int max = Segments.Max(x => x.SegmentIndex); + //int max = Segments.Max(x => x.SegmentIndex); + int max = segments.Max(x => x.SegmentIndex); ObservableCollection<Segment> effectiveSegments = new ObservableCollection<Segment>(); - foreach (var s in Segments.ToList().OrderBy(x => x.SegmentIndex)) + foreach( var s in segments) { - effectiveSegments.Add(s); - - if (s.SegmentIndex != max) + if (s is Segment) { - effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); + Segment segment = s as Segment; + effectiveSegments.Add(segment); + if (s.SegmentIndex != max) + { + effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); + } + } + else if (s is SegmentsGroup) + { + SegmentsGroup segmentsGroup = s as SegmentsGroup; + List<Segment> groupSegments = segmentsGroup.Segments.ToList(); + for (int repeats = 0; repeats < segmentsGroup.Repeats; repeats++) + { + for (int i = 0; i < groupSegments.Count; i++) + { + if (repeats > 0) + { + effectiveSegments.Add(groupSegments[i].Clone()); + } + else + effectiveSegments.Add(groupSegments[i]); + if (EnableInterSegment && !(repeats == (segmentsGroup.Repeats - 1) && i == (groupSegments.Count - 1))) + { + effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); + } + } + } + if (EnableInterSegment && segmentsGroup.SegmentIndex != max) + { + effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); + } } } + //foreach (var s in Segments.ToList().OrderBy(x => x.SegmentIndex)) + //{ + // effectiveSegments.Add(s); + + // if (s.SegmentIndex != max) + // { + // effectiveSegments.Add(CreateInterSegment(InterSegmentLength)); + // } + //} return effectiveSegments; } else { - return Segments.OrderBy(x => x.SegmentIndex).ToObservableCollection(); + ObservableCollection<Segment> effectiveSegments = new ObservableCollection<Segment>(); + foreach (var s in segments) + { + if (s is Segment) + { + effectiveSegments.Add(s as Segment); + } + else if (s is SegmentsGroup) + { + SegmentsGroup segmentsGroup = s as SegmentsGroup; + List<Segment> groupSegments = segmentsGroup.Segments.ToList(); + for (int repeats = 0; repeats < segmentsGroup.Repeats; repeats++) + { + for (int i = 0; i < groupSegments.Count; i++) + { + if (repeats > 0) + { + effectiveSegments.Add(groupSegments[i].Clone()); + } + else + effectiveSegments.Add(groupSegments[i]); + } + } + } + } + return effectiveSegments; + //return Segments.OrderBy(x => x.SegmentIndex).ToObservableCollection(); } } } @@ -185,6 +251,26 @@ namespace Tango.BL.Entities return Segments.OrderBy(x => x.SegmentIndex).ToObservableCollection(); } } + + /// <summary> + /// Gets the ordered segments and groups + /// </summary> + [NotMapped] + [JsonIgnore] + public ObservableCollection<ISegment> OrderedSegmentsWithGroups + { + get + { + if (Segments == null) + return null; + List<ISegment> orderedSegmentsWithGroups = new List<ISegment>(); + + orderedSegmentsWithGroups.AddRange(Segments.Where(x => x.SegmentsGroupGuid == null)); + orderedSegmentsWithGroups.AddRange(SegmentsGroups); + return orderedSegmentsWithGroups.OrderBy(x => x.SegmentIndex).ToObservableCollection(); + // return Segments.OrderBy(x => x.SegmentIndex).ToObservableCollection(); + } + } /// <summary> /// Gets or sets the job fine tuning status. @@ -357,6 +443,7 @@ namespace Tango.BL.Entities cloned.WindingMethod = WindingMethod; cloned.JobStatus = JobStatuses.Draft; cloned.Segments = Segments.Select(x => x.Clone(cloned)).ToSynchronizedObservableCollection(); + cloned.SegmentsGroups = SegmentsGroups.Select(x => x.Clone(cloned)).ToSynchronizedObservableCollection(); foreach (var segment in cloned.Segments) { @@ -373,14 +460,56 @@ namespace Tango.BL.Entities private double GetLength() { - if (Segments != null) - { - return Segments.Sum(x => x.LengthWithFactor) + ((EnableInterSegment && IsAllSegmentsPerSpool) ? (InterSegmentLength * (Segments.Count > 0 ? Segments.Count - 1 : Segments.Count)) : 0); - } - else - { + var segments = OrderedSegmentsWithGroups; + if (segments == null || segments.Count == 0) return 0; + double length = 0; + int max = segments.Max(x => x.SegmentIndex); + foreach (var s in segments) + { + if (s is Segment) + { + length += (s as Segment).LengthWithFactor + ((EnableInterSegment && IsAllSegmentsPerSpool) ? (InterSegmentLength * (segments.Count > 0 ? segments.Count - 1 : segments.Count)) : 0); + } + else if (s is SegmentsGroup) + { + SegmentsGroup segmentsGroup = s as SegmentsGroup; + List<Segment> groupSegments = segmentsGroup.Segments.ToList(); + if(EnableInterSegment && IsAllSegmentsPerSpool) + { + for (int repeats = 0; repeats < segmentsGroup.Repeats; repeats++) + { + for (int i = 0; i < groupSegments.Count; i++) + { + length += groupSegments[i].LengthWithFactor; + + if (EnableInterSegment && !(repeats == (segmentsGroup.Repeats - 1) && i == (groupSegments.Count - 1))) + { + length += InterSegmentLength; + } + } + } + if (EnableInterSegment && segmentsGroup.SegmentIndex != max) + { + length += InterSegmentLength; + } + } + else + { + length += (segmentsGroup.Segments.Sum(x => x.LengthWithFactor) * segmentsGroup.Repeats); + } + } } + + return length; + //if (Segments != null) + //{ + // return Segments.Sum(x => x.LengthWithFactor) + ((EnableInterSegment && IsAllSegmentsPerSpool) ? (InterSegmentLength * (Segments.Count > 0 ? Segments.Count - 1 : Segments.Count)) : 0); + //} + //else + //{ + // return 0; + //} } #endregion @@ -598,7 +727,7 @@ namespace Tango.BL.Entities { using (ObservablesContext db = ObservablesContext.CreateDefault()) { - var job = new JobBuilder(db).Set(Guid).WithUser().WithRML().WithSegments().WithBrushStops().Build(); + var job = new JobBuilder(db).Set(Guid).WithUser().WithRML().WithSegments().WithBrushStops().WithSegmentsGroups().Build(); var machine = new MachineBuilder(db).Set(job.MachineGuid).WithConfiguration().Build(); return CreateJobFile(job, machine); diff --git a/Software/Visual_Studio/Tango.BL/Entities/Segment.cs b/Software/Visual_Studio/Tango.BL/Entities/Segment.cs index d6ff44428..c097bbc0e 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/Segment.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/Segment.cs @@ -457,6 +457,25 @@ namespace Tango.BL.Entities return cloned; } + /// <summary> + /// Clones this segment with its brush stops. + /// </summary> + /// <returns></returns> + ISegment ISegment.Clone() + { + return Clone() as ISegment; + } + + /// <summary> + /// Clones this segment and assigns it to the specified job. + /// </summary> + /// <param name="job">The job.</param> + /// <returns></returns> + ISegment ISegment.Clone(Job job) + { + return Clone(job) as ISegment; + } + #endregion #region Delete diff --git a/Software/Visual_Studio/Tango.BL/Entities/SegmentsGroup.cs b/Software/Visual_Studio/Tango.BL/Entities/SegmentsGroup.cs index 3115c2eeb..b4940792d 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/SegmentsGroup.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/SegmentsGroup.cs @@ -1,18 +1,84 @@ -//------------------------------------------------------------------------------ -// <auto-generated> -// This code was generated by a tool. -// Tango Observables Generator -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. Do not modify! -// </auto-generated> -//------------------------------------------------------------------------------ - + using Tango.BL.Interfaces; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media; +using Tango.Core; +using Tango.Core.Threading; +using Newtonsoft.Json; +using System.Collections.ObjectModel; namespace Tango.BL.Entities { public class SegmentsGroup: SegmentsGroupBase, ISegment { + [NotMapped] + [JsonIgnore] + public ObservableCollection<Segment> OrderedSegments + { + get + { + return Segments.OrderBy(x => x.SegmentIndex).ToObservableCollection(); + } + } + + [NotMapped] + [JsonIgnore] + public virtual SynchronizedObservableCollection<BrushStop> BrushStops + { + get + { + return OrderedSegments.SelectMany(x => x.BrushStops).OrderBy(x => x.StopIndex).ToSynchronizedObservableCollection(); + } + } + + public override SegmentsGroup Clone() + { + SegmentsGroup cloned = base.Clone(); + + cloned.Segments = Segments.Select(x => x.Clone()).ToSynchronizedObservableCollection(); + + foreach (var stop in cloned.Segments) + { + stop.SegmentsGroupGuid = cloned.Guid; + stop.SegmentsGroup = cloned; + } + + return cloned; + } + + /// <summary> + /// Clones this segment and assigns it to the specified job. + /// </summary> + /// <param name="job">The job.</param> + /// <returns></returns> + public SegmentsGroup Clone(Job job) + { + SegmentsGroup cloned = base.Clone(); + + cloned.Segments = Segments.Select(x => x.Clone()).ToSynchronizedObservableCollection(); + + cloned.Job = job; + cloned.JobGuid = job.Guid; + + return cloned; + } + + ISegment ISegment.Clone() + { + return Clone() as ISegment; + } + + ISegment ISegment.Clone(Job job) + { + return Clone(job) as ISegment; + } } }
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.BL/Interfaces/ISegment.cs b/Software/Visual_Studio/Tango.BL/Interfaces/ISegment.cs index db291c832..53cc92d64 100644 --- a/Software/Visual_Studio/Tango.BL/Interfaces/ISegment.cs +++ b/Software/Visual_Studio/Tango.BL/Interfaces/ISegment.cs @@ -1,13 +1,25 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.Core; namespace Tango.BL.Interfaces { - interface ISegment + public interface ISegment { Int32 SegmentIndex { get; set; } + + [NotMapped] + [JsonIgnore] + SynchronizedObservableCollection<BrushStop> BrushStops { get; } + + ISegment Clone(); + + ISegment Clone(Job job); } } diff --git a/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs b/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs index 510befef4..e3239e607 100644 --- a/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs +++ b/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs @@ -431,7 +431,7 @@ namespace Tango.ColorConversion public ProcessParametersTable GetRecommendedProcessParameters(Job job, ProcessParametersTablesGroup group, bool useLightInks = false) { - var stops = job.Segments.SelectMany(x => x.BrushStops).ToList(); + var stops = job.OrderedSegmentsWithGroups.SelectMany(x => x.BrushStops).ToList(); if (stops.Count == 0) { @@ -567,7 +567,7 @@ namespace Tango.ColorConversion throw new InvalidOperationException("The specified RML process group does not contain any tables."); } - List<BrushStop> stops = job.Segments.Select(x => x.Clone()).SelectMany(x => x.BrushStops).ToList(); + List<BrushStop> stops = job.OrderedSegmentsWithGroups.Select(x => x.Clone()).SelectMany(x => x.BrushStops).ToList(); if (stops.Count == 0) { @@ -601,7 +601,7 @@ namespace Tango.ColorConversion private ProcessParametersTable GetRecommendedProcessParametersByGamutRegion(Job job, ProcessParametersTablesGroup group) { - var stops = job.Segments.SelectMany(x => x.BrushStops).ToList(); + var stops = job.OrderedSegmentsWithGroups.SelectMany(x => x.BrushStops).ToList(); var standard_stops = stops.Where(x => x.BrushColorSpace != ColorSpaces.Catalog); var color_catalog_stops = stops.Where(x => x.BrushColorSpace == ColorSpaces.Catalog); diff --git a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs index 957c53a89..03d21c980 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs +++ b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs @@ -2532,7 +2532,7 @@ namespace Tango.Integration.Operation try { bool useLightInks = config.UseLightInks; - if (job.Segments.Count > 1 && !job.EnableInterSegment) useLightInks = false; + if (job.OrderedSegmentsWithGroups.Count > 1 && !job.EnableInterSegment) useLightInks = false; processParameters = converter.GetRecommendedProcessParameters(job, useLightInks); } @@ -2548,7 +2548,7 @@ namespace Tango.Integration.Operation try { - foreach (var stop in job.Segments.SelectMany(x => x.BrushStops).ToList()) + foreach (var stop in job.OrderedSegmentsWithGroups.SelectMany(x => x.BrushStops).ToList()) { stop.SetLiquidVolumes(job.Machine.Configuration, job.Rml, processParameters); } @@ -2611,7 +2611,7 @@ namespace Tango.Integration.Operation job.Guid = originalJob.Guid; job.Name = originalJob.Name; - var jobSegments = job.OrderedSegments; + var jobSegments = job.OrderedSegmentsWithGroups; //Color Conversion if (config.UseColorConversion) @@ -2621,7 +2621,7 @@ namespace Tango.Integration.Operation bool useLightInks = config.UseLightInks; //Use light inks only if one segment or inter segment is enabled. - if (job.Segments.Count > 1 && !job.EnableInterSegment) useLightInks = false; + if (job.OrderedSegmentsWithGroups.Count > 1 && !job.EnableInterSegment) useLightInks = false; foreach (var segment in jobSegments) { @@ -2679,7 +2679,7 @@ namespace Tango.Integration.Operation //Modify transparent/white brush stops. (Transparent/white stops should be all zeros and 100% TI) LogManager.Log("Modifying all 'white' brush stops..."); - foreach (var stop in job.Segments.SelectMany(x => x.BrushStops).Where(x => x.IsTransparent || x.IsWhite).ToList()) + foreach (var stop in job.OrderedSegmentsWithGroups.SelectMany(x => x.BrushStops).Where(x => x.IsTransparent || x.IsWhite).ToList()) { foreach (var liquidVolume in stop.LiquidVolumes.Where(x => x.LiquidType != LiquidTypes.TransparentInk && x.LiquidType != LiquidTypes.Lubricant).ToList()) { @@ -2694,7 +2694,7 @@ namespace Tango.Integration.Operation } } - var segments = job.OrderedSegments.ToList(); + var segments = job.OrderedSegmentsWithGroups.ToList(); List<RequiredLiquid> requiredLiquids = null; @@ -2712,7 +2712,24 @@ namespace Tango.Integration.Operation foreach (var segment in segments) { - t.Segments.Add(CreatePMRJobSegment(segment, originalJob, processParameters)); + if (segment is Segment simpleSegment) + { + t.Segments.Add(CreatePMRJobSegment(simpleSegment, originalJob, processParameters)); + } + else if (segment is SegmentsGroup group) + { + List<JobSegment> groupSegments = new List<JobSegment>(); + + foreach (var innerSegment in group.OrderedSegments) + { + groupSegments.Add(CreatePMRJobSegment(innerSegment, originalJob, processParameters)); + } + + for (int i = 0; i < group.Repeats; i++) + { + t.Segments.AddRange(groupSegments.ToList()); + } + } } requiredLiquids = ValidateJobLiquidQuantity(t, processParameters, job.Machine.Configuration); @@ -2727,7 +2744,7 @@ namespace Tango.Integration.Operation JobRequest request = new JobRequest(); - int max = job.OrderedSegments.Last().SegmentIndex + 1; + int max = job.OrderedSegmentsWithGroups.Last().SegmentIndex + 1; for (int i = 0; i < job.NumberOfUnits - 1; i++) { @@ -2735,7 +2752,15 @@ namespace Tango.Integration.Operation { var cloned = s.Clone(job); cloned.SegmentIndex = max++; - job.Segments.Add(cloned); + + if (cloned is Segment simpleSegment) + { + job.Segments.Add(simpleSegment); + } + else if (cloned is SegmentsGroup g) + { + job.SegmentsGroups.Add(g); + } } } @@ -2885,7 +2910,24 @@ namespace Tango.Integration.Operation { try { - ticket.Segments.Add(CreatePMRJobSegment(segment, originalJob, processParameters)); + if (segment is Segment simpleSegment) + { + ticket.Segments.Add(CreatePMRJobSegment(simpleSegment, originalJob, processParameters)); + } + else if (segment is SegmentsGroup group) + { + List<JobSegment> groupSegments = new List<JobSegment>(); + + foreach (var innerSegment in group.OrderedSegments) + { + groupSegments.Add(CreatePMRJobSegment(innerSegment, originalJob, processParameters)); + } + + for (int i = 0; i < group.Repeats; i++) + { + ticket.Segments.AddRange(groupSegments.ToList()); + } + } } catch (Exception ex) { diff --git a/Software/Visual_Studio/Utilities/Tango.JobProgressTester.UI/MainWindowVM.cs b/Software/Visual_Studio/Utilities/Tango.JobProgressTester.UI/MainWindowVM.cs index d21500685..9dbcb6288 100644 --- a/Software/Visual_Studio/Utilities/Tango.JobProgressTester.UI/MainWindowVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.JobProgressTester.UI/MainWindowVM.cs @@ -116,6 +116,7 @@ namespace Tango.JobProgressTester.UI .WithRML() .WithSegments() .WithUser() + .WithSegmentsGroups() .BuildAsync(); JobHandler = new JobHandler2(() => { }, ActiveJob, null, ActiveJob.Rml.GetActiveProcessGroup().ProcessParametersTables.First(), JobHandlerModes.SettingUp); |
