/// <summary>
 /// sends a scan result to all connected clients
 /// </summary>
 /// <param name="userName">the name of the broadcaster</param>
 /// <param name="pResult">the scan results</param>
 public void SendScanResult(string userName, ScanResultPackage pResult)
 {
     //broadcast message
     CurrentScanresults.Add(pResult);
     Clients.All.scanresultRecieved(userName, pResult);
     OnMessageEvent("[SignalR] " + userName + " broadcasted a result.");
 }
Exemple #2
0
 /// <summary>
 /// sends a scan result to all connected clients
 /// </summary>
 /// <param name="pResult">the result package</param>
 public void sendScanResults(ScanResultPackage pResult)
 {
     if (_SignalRHandler != null)
     {
         _SignalRHandler.SendScanResultToClients(pResult);
     }
 }
 /// <summary>
 /// sends a scan result package to the signalr server which then broadcasts it to all clients
 /// </summary>
 /// <param name="pResult"></param>
 public void SendScanResultToClients(ScanResultPackage pResult)
 {
     try
     {
         HubProxy.Invoke("SendScanResult", _name, pResult);
     }
     catch (Exception) { }
 }
Exemple #4
0
        public ScanResultWindow(ScanResultPackage pResultPackage)
        {
            InitializeComponent();

            this._Textblock_Date.Text                         = pResultPackage.timestamp.ToString();
            this._Textblock_AlgorithmUsed.Text                = pResultPackage.algorithmUsed.ToString();
            this._Textblock_NumberOfClouds.Text               = pResultPackage.numberOfClouds.ToString();
            this._Textblock_NumberOfPoints.Text               = pResultPackage.numberOfPoints.ToString();
            this._Textblock_ScannedDelaunayVolume.Text        = Math.Round(pResultPackage.scannedDelaunayVolume, 3).ToString() + " m³";
            this._Textblock_ConvexScannedAlgorithmVolume.Text = Math.Round(pResultPackage.convexScannedAlgorithmVolume, 3).ToString() + " m³";
            this._Textblock_ConcavScannedAlgorithmVolume.Text = Math.Round(pResultPackage.concavScannedAlgorithmVolume, 3).ToString() + " m³";
            this._Textblock_NumberOfContainers.Text           = pResultPackage.containerResults.Sum(t => t.amount).ToString();
            this._Textblock_ContainerAccuracy.Text            = Math.Round(pResultPackage.containerAccuracy, 3).ToString() + "%";
            this._Textblock_PayloadVolume.Text                = Math.Round(pResultPackage.estimatedPayloadVolume, 3) + " m³";

            foreach (Post_KNV_MessageClasses.ScanResultPackage.ContainerResult res in pResultPackage.containerResults)
            {
                ContainerResultsListViewItem temp = new ContainerResultsListViewItem();
                temp.name   = res.containerType.containerName;
                temp.amount = res.amount;
                _ContainerResultListView.Items.Add(temp);
            }
        }
        /// <summary>
        /// ASYNC: calculates the results of the point cloud and returns a result package; throws OnResultPackageEvent when done, OnErrorEvent when an error occured
        /// </summary>
        /// <param name="pInputCloud">the input cloud</param>
        /// <param name="pAlgorithm">the algorithm to chose</param>
        /// <param name="pSettings">the configuration object</param>
        public void calculateResults(PointCloud pInputCloud, ServerConfigObject pConfig)
        {
            _CancelTokenSource = new CancellationTokenSource();
            Log.LogManager.updateAlgorithmStatus("Start Calculation Service");
            Task <ScanResultPackage> t = new Task <ScanResultPackage>(() =>
            {
                //remove calibrated planes
                pInputCloud.removePlaneFromPointcloud(pConfig.serverAlgorithmConfig.calibratedPlanes, pConfig.serverAlgorithmConfig.planar_ThresholdDistance);
                this.OnNewPointPicturesEvent(pInputCloud.pictures);

                //remove calibrated objects
                pInputCloud.removePointcloudsFromPointCloud(pConfig.serverAlgorithmConfig.calibratedObjects, pConfig.serverAlgorithmConfig.euclidean_ExtractionRadius);
                this.OnNewPointPicturesEvent(pInputCloud.pictures);

                //remove noise via euclidean cluster extraction, discard too small ones
                List <PointCloud> pointCloudList = EuclideanClusterExtraction.calculateEuclideanClusterExtraction(pInputCloud, pConfig.serverAlgorithmConfig.euclidean_ExtractionRadius, _CancelTokenSource.Token);
                pointCloudList.RemoveAll(pcl => pcl.delaunayVolume < pConfig.serverAlgorithmConfig.euclidean_MinimumVolume);
                if (pointCloudList.Count == 0)
                {
                    throw new Exception("No valid point clouds found!");
                }

                //calculate items in result package
                _CancelTokenSource.Token.ThrowIfCancellationRequested();
                ScanResultPackage resultPack = new ScanResultPackage();
                PlaneModel floorPlane        = pConfig.serverAlgorithmConfig.calibratedPlanes.Find(pl => pl.isFloor);

                //create concav and convex areas
                List <IntermediateScanResultPackage> intermediateResultList = Algorithm.PlanarVolumeCalculation.CalculateIntermediateScanresults(pointCloudList,
                                                                                                                                                 floorPlane,
                                                                                                                                                 pConfig.serverAlgorithmConfig.downsamplingFactor,
                                                                                                                                                 pConfig.serverAlgorithmConfig.concav_angleThreshold);

                //sum up convex and concav volume
                resultPack.convexScannedAlgorithmVolume = 0d; resultPack.concavScannedAlgorithmVolume = 0d;
                foreach (IntermediateScanResultPackage p in intermediateResultList)
                {
                    resultPack.convexScannedAlgorithmVolume += p.convexPlaneArea * p.averageHeight;
                    resultPack.concavScannedAlgorithmVolume += p.concavPlaneArea * p.averageHeight;
                }

                //calculate best fit for container matching, check first if container calibration exist, aggregate result
                resultPack.containerResults = null; resultPack.estimatedPayloadVolume = 0;
                if (pConfig.calibratedContainers.Count > 0)
                {
                    List <ContainerCalculation.tModel> bestFitSolutions = ContainerCalculation.CalculateBestFitSolutions(intermediateResultList, pConfig.calibratedContainers);
                    resultPack.containerResults = new List <ScanResultPackage.ContainerResult>();

                    //go through the best fit solution for every point cloud
                    foreach (ContainerCalculation.tModel p in bestFitSolutions)
                    {
                        foreach (Post_knv_Server.CalculationService.ContainerCalculation.tContainerModel m in p.containerResults)
                        {
                            //check if container exists in containerResults, if not add, if yes, just add
                            if (resultPack.containerResults.Exists(q => q.containerType == m.containerType))
                            {
                                resultPack.containerResults.Find(q => q.containerType == m.containerType).amount += m.amountOfContainers;
                            }
                            else
                            {
                                ScanResultPackage.ContainerResult res = new ScanResultPackage.ContainerResult();
                                res.containerType = m.containerType; res.amount = m.amountOfContainers;
                                resultPack.containerResults.Add(res);
                            }

                            //add container volume
                            resultPack.estimatedPayloadVolume += m.containerType.containerVolume * m.amountOfContainers;
                        }
                    }

                    //accumulate rating
                    resultPack.containerAccuracy = bestFitSolutions.Average(i => i.pRating);

                    //estimate payload
                    resultPack.estimatedPayloadVolume = resultPack.concavScannedAlgorithmVolume - resultPack.estimatedPayloadVolume;
                }

                //create results
                resultPack.timestamp                    = DateTime.Now;
                resultPack.algorithmUsed                = pConfig.serverAlgorithmConfig.useAlgorithm;
                resultPack.numberOfClouds               = pointCloudList.Count;
                resultPack.numberOfPoints               = pointCloudList.Sum(p => p.count);
                resultPack.scannedDelaunayVolume        = pointCloudList.Sum(p => p.delaunayVolume);
                resultPack.amountOfKinectsDataRequested = pInputCloud.ConfigObject.clientRequestObject.amountOfKinectsInRequest;

                return(resultPack);
            }, _CancelTokenSource.Token);

            //task finishing
            t.ContinueWith(calculationFinishedSuccessfully, TaskContinuationOptions.OnlyOnRanToCompletion);
            t.ContinueWith(exceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
            t.Start();
        }
Exemple #6
0
 /// <summary>
 /// gets thrown when a new scan result is reported, ready from the calculation service
 /// </summary>
 /// <param name="pResult">the result package</param>
 void _CalculationManager_OnResultPackageEvent(ScanResultPackage pResult)
 {
     _Webservice.sendScanResults(pResult);
     OnNewScanResultEvent(pResult);
 }