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); }
private int CheckDangles(int tableIndex, [NotNull] FeatureDangleCount featureDangleCount) { string constraintValues; return(IsAllowedDangleCount(tableIndex, featureDangleCount, out constraintValues) ? 0 : ReportError(featureDangleCount, constraintValues)); }
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)); }
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); }
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); }