Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 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;
        }