Example #1
0
        private void AddDanglingEndpoint([NotNull] TableIndexRow tableIndexRow,
                                         [NotNull] IPoint endPoint)
        {
            int tableIndex = tableIndexRow.TableIndex;

            IDictionary <int, FeatureDangleCount> dangleCountPerFeature;

            if (!_dangleCounts.TryGetValue(tableIndex, out dangleCountPerFeature))
            {
                dangleCountPerFeature = new Dictionary <int, FeatureDangleCount>();

                _dangleCounts.Add(tableIndex, dangleCountPerFeature);
            }

            var feature = (IFeature)tableIndexRow.Row;
            int oid     = feature.OID;

            FeatureDangleCount dangleCount;

            if (!dangleCountPerFeature.TryGetValue(oid, out dangleCount))
            {
                feature.Shape.QueryEnvelope(_envelopeTemplate);

                dangleCount = new FeatureDangleCount(feature,
                                                     _envelopeTemplate.XMax,
                                                     _envelopeTemplate.YMax);

                dangleCountPerFeature[oid] = dangleCount;
            }

            dangleCount.AddDanglingPoint(endPoint);
        }
Example #2
0
        private int CheckDangles(int tableIndex,
                                 [NotNull] FeatureDangleCount featureDangleCount)
        {
            string constraintValues;

            return(IsAllowedDangleCount(tableIndex, featureDangleCount,
                                        out constraintValues)
                                       ? 0
                                       : ReportError(featureDangleCount, constraintValues));
        }
Example #3
0
        private int ReportError([NotNull] FeatureDangleCount featureDangleCount,
                                [CanBeNull] string constraintValues)
        {
            string description = string.IsNullOrEmpty(constraintValues)
                                                     ? string.Format("Invalid number of dangles: {0}",
                                                                     featureDangleCount
                                                                     .DanglingPointCount)
                                                     : string.Format(
                "Invalid number of dangles: {0} ({1})",
                featureDangleCount.DanglingPointCount,
                constraintValues);

            return(ReportError(description,
                               GeometryFactory.CreateMultipoint(
                                   featureDangleCount.DanglingPoints),
                               Codes[Code.InvalidNumberOfDangles],
                               TestUtils.GetShapeFieldName(featureDangleCount.Feature),
                               featureDangleCount.Feature));
        }
Example #4
0
        private bool IsAllowedDangleCount(int tableIndex,
                                          [NotNull] FeatureDangleCount featureDangleCount,
                                          out string constraintValues)
        {
            if (_dangleCountExpressions == null)
            {
                _dangleCountExpressions = GetDangleCountExpressions(_polylineClasses,
                                                                    _dangleCountExpressionsSql);
            }

            TableView tableView = _dangleCountExpressions[tableIndex];

            tableView.ClearRows();
            DataRow dataRow = Assert.NotNull(tableView.Add(featureDangleCount.Feature));

            dataRow[_dangleCountPlaceHolder] = featureDangleCount.DanglingPointCount;

            bool       matchesConstraint = tableView.FilteredRowCount == 1;
            const bool constraintOnly    = true;

            if (matchesConstraint)
            {
                constraintValues = string.Empty;
            }
            else
            {
                var addedColumnNames = new SimpleSet <string>(
                    new[] { _dangleCountPlaceHolder },
                    StringComparer.InvariantCultureIgnoreCase);

                constraintValues = tableView.ToString(featureDangleCount.Feature,
                                                      constraintOnly,
                                                      addedColumnNames);
            }

            return(matchesConstraint);
        }
Example #5
0
        protected override int CompleteTileCore(TileInfo args)
        {
            int errorCount = base.CompleteTileCore(args);

            if (ConnectedElementsList == null)
            {
                return(errorCount);
            }

            IEnvelope allBox = args.AllBox;

            if (allBox == null)
            {
                return(errorCount);
            }

            IEnvelope tileEnvelope = args.CurrentEnvelope;

            if (tileEnvelope == null)
            {
                return(errorCount);
            }

            double tileXMax    = tileEnvelope.XMax;
            double tileYMax    = tileEnvelope.YMax;
            double testRunXMax = allBox.XMax;
            double testRunYMax = allBox.YMax;

            foreach (List <NetElement> connectedRows in ConnectedElementsList)
            {
                UpdateDangleCount(connectedRows);
            }

            foreach (
                KeyValuePair <int, IDictionary <int, FeatureDangleCount> > tablePair in
                _dangleCounts)
            {
                int tableIndex = tablePair.Key;

                var oidsToRemove = new List <int>();
                IDictionary <int, FeatureDangleCount> dangleCountPerOid = tablePair.Value;

                foreach (KeyValuePair <int, FeatureDangleCount> featurePair in
                         dangleCountPerOid)
                {
                    int oid = featurePair.Key;
                    FeatureDangleCount dangleCount = featurePair.Value;

                    // TODO revise for tolerance
                    if ((dangleCount.XMax > tileXMax || dangleCount.YMax > tileYMax) &&
                        (dangleCount.XMax <= testRunXMax &&
                         dangleCount.YMax <= testRunYMax))
                    {
                        continue;
                    }

                    errorCount += CheckDangles(tableIndex, dangleCount);

                    oidsToRemove.Add(oid);
                }

                foreach (int oid in oidsToRemove)
                {
                    dangleCountPerOid.Remove(oid);
                }
            }

            return(errorCount);
        }