/// <summary> /// Positions elements of a set of beds /// </summary> /// <param name="filter">Filter</param> /// <param name="forms">A ser of beds(castUnits)</param> /// <param name="elements">A list of elements to be positioned</param> /// <returns></returns> public BedResult AutoBedManage( BedFilter filter, List<RecProductionFormStd> forms, List<RecTMElement> elements ) { if( null == filter || null == forms || forms.Count == 0 || null == elements || elements.Count == 0 ) { throw new ArgumentNullException( "AutoBedManage, Missing input!" ); } var castResult = new BedResult(); if( null == castResult.PositionedElements ) { castResult.PositionedElements = new List<RecTMElement>(); } // Let's work on a copy of the given curFilter var curFilter = new BedFilter( filter ); //DateTime curDate = curfilter.StartDateFrom; var maxShift = forms.OrderBy(p => p.NbrOfShift).Last().NbrOfShift; var firstLoop = true; var unpositioned = elements; var totPositionedElements = new List<RecTMElement>(); do { var firstShift = firstLoop? filter.Shift : 1; castResult.FirstShift = Math.Min( castResult.FirstShift, firstShift); castResult.LastShift = Math.Max( castResult.LastShift, maxShift); castResult.CastDays.Add( curFilter.StartDateFrom ); var hasDayExistingElements = false; var numberOfPositionedElements = 0; for( var shift = firstShift; shift <= maxShift; shift++ ) { curFilter.Shift = shift; var curForms = ( from o in forms where o.NbrOfShift >= curFilter.Shift select o ).ToList(); if( curForms.Count <= 0 ) { continue; } var tempPositioned = new List<RecTMElement>(); bool hasShiftExistingElements; var tempResult = this.ProcessElement( curFilter, curForms, unpositioned, tempPositioned, out hasShiftExistingElements ); castResult.PositionedElements.AddRange( tempPositioned ); if( hasShiftExistingElements ) { hasDayExistingElements = true; } if( tempResult.NumberOfElements > 0 ) { castResult.NumberOfCasts += tempResult.NumberOfCasts; } totPositionedElements.AddRange( tempPositioned ); unpositioned = this.GetUnpositionedElements( elements, totPositionedElements ); castResult.NumberOfElements = totPositionedElements.Count; castResult.Element = tempResult.Element; // For single cast interrupt here, please var done = !curFilter.MultiCast || totPositionedElements.Count == elements.Count; if( done ) { return castResult; } numberOfPositionedElements += tempPositioned.Count; } // If none of the shifts could position then interrupt and return if( 0 == numberOfPositionedElements && !hasDayExistingElements ) { break; } curFilter.StartDateFrom = curFilter.StartDateFrom.AddDays( 1 ); firstLoop = false; } while( true ); return castResult; }
/// <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; }