Example #1
0
        /// <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;
        }
Example #2
0
        /// <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;
        }