/// <summary> /// Sorts element on bed /// </summary> /// <param name="filter"></param> /// <param name="form"></param> /// <param name="sortType"></param> /// <returns></returns> public bool SortBedElements( BedFilter filter, RecProductionFormStd form, SortType sortType ) { // Let's work on a copy of the given curFilter // Make sure that SingleElementCastUnit is set to false var curFilter = new BedFilter( filter ) { SingleElementCastUnit = false }; var castData = LoadBedPlanning( curFilter, form ); var forms = castData.CastList; if( forms != null ) { foreach( var bed in forms ) { if( bed.ProductionCast == null ) { continue; } if( bed.ProductionCast.Elements == null || bed.ProductionCast.Elements.Count <= 0 ) { continue; } List<RecTMElement> sortedElements; if( sortType == SortType.DimensionAscending ) { sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ElementWidth ).ThenBy( x => x.ElementLengthOnBed ).ToList(); } else if( sortType == SortType.DimensionDescending ) { sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ElementWidth ).ThenByDescending( x => x.ElementLengthOnBed ).ToList(); } else if( sortType == SortType.ErectionSequenceAscending ) { sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ErectionSequenceNo ).ToList(); } else //( sortType == SortType.ErectionSequenceDescending ) { sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ErectionSequenceNo ).ToList(); } var bpc = new ProductionBedContainer(); bpc.Sort( sortedElements, bed, curFilter ); } } return true; }
/// <summary> /// /// </summary> /// <param name="filter"></param> /// <param name="castUnits"></param> /// <param name="elements"></param> /// <param name="positionedElements"> </param> /// <param name="hasShiftExistingElements"> </param> /// <param name="isUserPositionedElement"> </param> /// <returns></returns> private BedResult ProcessElement( BedFilter filter, List<RecProductionFormStd> castUnits, IList<RecTMElement> elements, List<RecTMElement> positionedElements, out bool hasShiftExistingElements, bool isUserPositionedElement = false ) { if( positionedElements == null ) { throw new ArgumentNullException( "positionedElements" ); } var bedResult = new BedResult(); if( null == filter || null == castUnits || castUnits.Count == 0 || null == elements || elements.Count == 0 ) { throw new ArgumentNullException( "Missing curFilter, castUnits or positionedElements!" ); } // var bpc = new ProductionBedContainer(); bpc.LoadPositionedElementData( castUnits, filter, isUserPositionedElement ); hasShiftExistingElements = false; foreach( var castUnit in castUnits ) { //var controlfilter = new BedFilter( filter ); var hasElements = bpc.HasExistingElements( castUnit ); // If there are no elements on the current cast unit of type bed // then adjust the cast unit data (element type, style,strands) to the first element var recProductionCast = bpc.GetProductionCast( castUnit ); if( castUnit.FormType == FormType.Bed && !hasElements ) { //controlfilter.ForceStrandControl = false; //controlfilter.ForceStyleControl = false; recProductionCast = bpc.AdjustProductionCastToElement( castUnit, elements[0] ); } // Register element existing flag if( hasElements ) { hasShiftExistingElements = true; } // interrupt for single element cast unit if there are existing elements if( filter.SingleElementCastUnit && hasElements ) { continue; } var unpositioned = GetUnpositionedElements( elements, positionedElements ); var allowedElements = LoadAllowedElements( filter, castUnit, recProductionCast, unpositioned, true ); allowedElements = ( from o in allowedElements where o.ElementWidthOnBed < castUnit.MaxWidth || DoubleHelper.IsEqual( o.ElementWidthOnBed, castUnit.MaxWidth ) select o ).ToList(); if( allowedElements.Count > 0 ) { List<RecTMElement> elementsToSave; if( isUserPositionedElement ) { elementsToSave = new List<RecTMElement>(); foreach( var element in elements ) { var found = (from o in allowedElements where o.ElementId == element.ElementId && o.Project.Equals( element.Project ) select o).Any(); if( found ) { elementsToSave.Add( element ); } } } else { // Sort elements by dim var sortedElements = allowedElements.OrderBy( x => x.ElementWidthOnBed ).ThenBy( x => x.ElementLengthOnBed ). ToList(); //Debug( sortedElements ); elementsToSave = bpc.PositionElementsOnBed( castUnit, sortedElements ); } bpc.Save( castUnit, elementsToSave ); if( null != elementsToSave ) { bedResult.NumberOfCasts++; positionedElements.AddRange( elementsToSave ); } } if( positionedElements.Count == elements.Count ) { //Then we are done break; } } bedResult.NumberOfElements = positionedElements.Count; if( positionedElements.Count == 0 ) { // Let's prepare some hint for the user var tempList = new List<RecTMElement> { elements[0] }; var elemInfo = LoadAllowedElements( filter, castUnits[0], null, tempList, false ); if( null != elemInfo && elemInfo.Count > 0 ) { bedResult.Element = elemInfo[0]; } } return bedResult; }