Exemplo n.º 1
0
 /// <summary>
 /// Constructor for the renderer
 /// </summary>
 public RenderOverlayTile(Guid dataModelId,
                          //AExternalDescriptor :TASNodeRequestDescriptor;
                          DisplayMode mode,
                          XYZ blPoint,
                          XYZ trPoint,
                          bool coordsAreGrid,
                          ushort nPixelsX,
                          ushort nPixelsY,
                          IFilterSet filters,
                          DesignOffset cutFillDesign,
                          IPlanViewPalette aColorPalettes,
                          Color representColor,
                          Guid requestingTRexNodeId,
                          ILiftParameters liftParams,
                          VolumeComputationType volumeType
                          )
 {
     DataModelID = dataModelId;
     // ExternalDescriptor = AExternalDescriptor
     Mode                 = mode;
     BLPoint              = blPoint;
     TRPoint              = trPoint;
     CoordsAreGrid        = coordsAreGrid;
     NPixelsX             = nPixelsX;
     NPixelsY             = nPixelsY;
     Filters              = filters;
     CutFillDesign        = cutFillDesign;
     ColorPalettes        = aColorPalettes;
     RepresentColor       = representColor;
     RequestingTRexNodeID = requestingTRexNodeId;
     LiftParams           = liftParams;
     VolumeType           = volumeType;
 }
Exemplo n.º 2
0
 public TileRenderRequestArgument(Guid siteModelId,
                                  DisplayMode mode,
                                  IPlanViewPalette palette,
                                  BoundingWorldExtent3D extents,
                                  bool coordsAreGrid,
                                  ushort pixelsX,
                                  ushort pixelsY,
                                  IFilterSet filters,
                                  DesignOffset referenceDesign,
                                  VolumeComputationType volumeType)
 {
     ProjectID       = siteModelId;
     Mode            = mode;
     Palette         = palette;
     Extents         = extents;
     CoordsAreGrid   = coordsAreGrid;
     PixelsX         = pixelsX;
     PixelsY         = pixelsY;
     Filters         = filters;
     ReferenceDesign = referenceDesign;
     VolumeType      = volumeType;
 }
Exemplo n.º 3
0
 public abstract void SetPalette(IPlanViewPalette palette);
Exemplo n.º 4
0
        protected TileRenderRequestArgument SimpleTileRequestArgument(ISiteModel siteModel, DisplayMode displayMode, IPlanViewPalette palette = null, CellPassAttributeFilter attributeFilter = null, VolumeComputationType volumeType = VolumeComputationType.None)
        {
            var filter = displayMode == DisplayMode.CutFill ? new FilterSet(new CombinedFilter(), new CombinedFilter()) : new FilterSet(new CombinedFilter());

            if (attributeFilter != null)
            {
                filter.Filters[0].AttributeFilter = attributeFilter;
            }

            return(new TileRenderRequestArgument(siteModel.ID, displayMode, palette, siteModel.SiteModelExtent, true, 256, 256, filter, new DesignOffset(), volumeType));
        }
Exemplo n.º 5
0
 /// <summary>
 /// A palette set accessor for use when a palette is only known by its IPlanViewPalette interface
 /// </summary>
 public override void SetPalette(IPlanViewPalette palette)
 {
     Palette = palette as TP;
 }
Exemplo n.º 6
0
        /// <summary>
        /// Perform rendering activities to produce a bitmap tile
        /// </summary>
        public RequestErrorStatus PerformRender(DisplayMode mode, IPipelineProcessor processor, IPlanViewPalette colourPalette, IFilterSet filters, ILiftParameters liftParams)
        {
            // Obtain the display responsible for rendering the thematic information for this mode
            Displayer = PVMDisplayerFactory.GetDisplayer(mode /*, FICOptions*/);

            if (Displayer == null)
            {
                processor.Response.ResultStatus = RequestErrorStatus.UnsupportedDisplayType;
                return(processor.Response.ResultStatus);
            }

            // Create and assign the colour palette logic for this mode to the displayer
            if (colourPalette == null)
            {
                if (mode == DisplayMode.CCA || mode == DisplayMode.CCASummary)
                {
                    Displayer.SetPalette(Utilities.ComputeCCAPalette(processor.SiteModel, filters.Filters[0].AttributeFilter, mode));

                    if (Displayer.GetPalette() == null)
                    {
                        processor.Response.ResultStatus = RequestErrorStatus.FailedToGetCCAMinimumPassesValue;
                        return(processor.Response.ResultStatus);
                    }
                }
                else
                {
                    Displayer.SetPalette(PVMPaletteFactory.GetPalette(processor.SiteModel, mode, processor.SpatialExtents));
                }
            }
            else
            {
                Displayer.SetPalette(colourPalette);
            }

            // Create the world coordinate display surface the displayer will render onto
            Displayer.MapView = new MapSurface
            {
                SquareAspect = IsWhollyInTermsOfGridProjection
            };

            var view = Displayer.MapView;

            // Set the world coordinate bounds of the display surface to be rendered on
            view.SetBounds(NPixelsX, NPixelsY);

            if (IsWhollyInTermsOfGridProjection)
            {
                view.FitAndSetWorldBounds(OriginX, OriginY, OriginX + Width, OriginY + Height, 0);
            }
            else
            {
                view.SetWorldBounds(OriginX, OriginY, OriginX + Width, OriginY + Height, 0);
            }

            // Provide data smoothing support to the displayer for the rendering operation being performed
            ((IProductionPVMConsistentDisplayer)Displayer).DataSmoother = DIContext.Obtain <Func <DisplayMode, IDataSmoother> >()(mode);

            // Set the rotation of the displayer rendering surface to match the tile rotation due to the project calibration rotation
            view.SetRotation(TileRotation);

            ConstructPVMTaskAccumulator(processor);

            // Displayer.ICOptions  = ICOptions;

            // Set the skip-step area control cell selection parameters for this tile render. Note that the floating point
            // skip step algorithm is requested, and a user origin is configured that offsets the sampling grid by half a pixel
            // size to matching the skip-stepping the PVM accumulator will use when transcribing cell data from sub grids into
            // the accumulator. Note that the area control set is not configured with a rotation - this is taken into account
            // through the mapview rotation configured above
            processor.Pipeline.AreaControlSet = new AreaControlSet(false,
                                                                   view.XPixelSize, view.YPixelSize,
                                                                   view.XPixelSize / 2.0, view.YPixelSize / 2.0,
                                                                   0.0);

            processor.Pipeline.LiftParams = liftParams;
            // todo PipeLine.NoChangeVolumeTolerance  = FICOptions.NoChangeVolumeTolerance;

            // Perform the sub grid query and processing to render the tile
            var pipelineProcessorStopWatch = Stopwatch.StartNew();

            processor.Process();
            _log.LogInformation($"Pipeline processor completed in {pipelineProcessorStopWatch.Elapsed}");

            if (processor.Response.ResultStatus == RequestErrorStatus.OK)
            {
                // Render the collection of data in the aggregator
                var consistentRenderStopWatch = Stopwatch.StartNew();
                (Displayer as IProductionPVMConsistentDisplayer)?.PerformConsistentRender();
                _log.LogInformation($"Consistent render complated in {consistentRenderStopWatch.Elapsed}");

                PerformAnyRequiredDebugLevelDisplay();

                if (DebugDrawDiagonalCrossOnRenderedTilesDefault)
                {
                    // Draw diagonal cross and top left corner indicators
                    view.DrawLine(view.OriginX, view.OriginY, view.LimitX, view.LimitY, Color.Red);
                    view.DrawLine(view.OriginX, view.LimitY, view.LimitX, view.OriginY, Color.Red);

                    // Draw the horizontal line a little below the world coordinate 'top' of the tile to encourage the line
                    // drawing algorithm not to clip it
                    view.DrawLine(view.OriginX, view.LimitY, view.OriginX, view.CenterY, Color.Red);
                    view.DrawLine(view.OriginX, view.LimitY - 0.01, view.CenterX, view.LimitY - 0.01, Color.Red);
                }
            }

            return(processor.Response.ResultStatus);
        }