Exemple #1
0
        /// <summary>
        /// Updates the query search filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            // SKip hidden actors
            var actor = Actor;

            if (actor != null && (actor.HideFlags & HideFlags.HideInHierarchy) != 0)
            {
                return;
            }

            bool noFilter = string.IsNullOrWhiteSpace(filterText);

            _hasSearchFilter = !noFilter;

            // Update itself
            bool isThisVisible;

            if (noFilter)
            {
                // Clear filter
                _highlights?.Clear();
                isThisVisible = true;
            }
            else
            {
                var text = Text;
                if (QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var font     = Style.Current.FontSmall;
                    var textRect = TextRect;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(text, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(text, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
                    }
                    isThisVisible = true;
                }
        /// <summary>
        /// Updates the filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            Profiler.BeginEvent("VisjectCMGroup.UpdateFilter");

            // Update items
            bool isAnyVisible = false;

            for (int i = 0; i < _children.Count; i++)
            {
                if (_children[i] is VisjectCMItem item)
                {
                    item.UpdateFilter(filterText);
                    isAnyVisible |= item.Visible;
                }
            }

            // Update header title
            if (QueryFilterHelper.Match(filterText, HeaderText))
            {
                for (int i = 0; i < _children.Count; i++)
                {
                    if (_children[i] is VisjectCMItem item)
                    {
                        item.Visible = true;
                    }
                }
                isAnyVisible = true;
            }

            // Update itself
            if (isAnyVisible)
            {
                if (!string.IsNullOrEmpty(filterText))
                {
                    Open(false);
                }
                Visible = true;
            }
            else
            {
                // Hide group if none of the items matched the filter
                Visible = false;
            }

            Profiler.EndEvent();
        }
Exemple #3
0
        /// <summary>
        /// 执行查询记录
        /// </summary>
        /// <returns></returns>
        public PageResult <T> ToPageList()
        {
            PageResult <T> result = new PageResult <T>();
            QueryFilter    filter = QueryFilterHelper.GetPageFilter(query, select, orderByClauseList, pager, unSelect);

            List <T>  list      = new List <T>();
            DbCommand dbCommand = null;

            try
            {
                if (!filter.IsPage)
                {
                    throw new Exception("分页查询未指定分页信息");
                }
                else
                {
                    dbCommand = dbContext.DbProvider.GetQueryRecordsPageDbCommand <T>(filter, subTableArg);
                }
                dbCommand.Connection = dbContext.GetDbConnection();
                DbDataReader dr = dbCommand.ExecuteReader();
                DataTable    dt = dbContext.ConvertDataReaderToDataTable(dr);

                list = dt.ToList <T>();

                int       totalCount           = 0;
                DbCommand getRecCountDbCommand = dbContext.DbProvider.GetCountDbCommand <T>(filter, subTableArg);
                getRecCountDbCommand.Connection = dbCommand.Connection;
                object valueObj = getRecCountDbCommand.ExecuteScalar();
                if (valueObj != null && valueObj != DBNull.Value)
                {
                    totalCount = Convert.ToInt32(valueObj);
                }
                //分页查询 获取记录总数
                result.Rows       = list;
                result.Total      = totalCount;
                filter.TotalCount = totalCount;
                dbContext.CloseDbConnection(dbCommand);
            }
            catch (Exception ex)
            {
                dbContext.CloseDbConnection(dbCommand);
                throw ex;
            }
            return(result);
        }
Exemple #4
0
        private void BuildLinqFilter(UserEntityPermissionSet permissionSet)
        {
            permissionSet.QueryFilterPredicate = null;
            var readPerms = permissionSet.ConditionalPermissions.Where(
                p => p.RecordPermission.AccessTypes.IsSet(AccessType.Peek | AccessType.Read));

            if (readPerms.Any(p => p.QueryPredicate == null)) // if any permission has no linq filter, it means all allowed through this permission
            {
                return;
            }
            var allFilters = readPerms.Where(p => p.QueryPredicate != null).Select(p => p.QueryPredicate).Distinct().ToList();

            if (allFilters.Count == 0)
            {
                return;
            }
            permissionSet.QueryFilterPredicate = QueryFilterHelper.CombinePredicatesWithOR(allFilters);
        }
        protected override void BeginTileCore(BeginTileParameters parameters)
        {
            base.BeginTileCore(parameters);

            for (var involvedTable = 0; involvedTable < InvolvedTables.Count; involvedTable++)
            {
                QueryFilterHelper filterHelper = GetQueryFilterHelper(involvedTable);
                filterHelper.ForNetwork = true;
            }

            _pointsEnumerator = null;             // points enumerator is valid only within same tile

            _pointSearchEnvelope = null;
            if (parameters.TileEnvelope != null)
            {
                _pointSearchEnvelope = GeometryFactory.Clone(parameters.TileEnvelope);
            }
            _pointSearchEnvelope?.Expand(SearchDistance, SearchDistance, asRatio: false);
        }
Exemple #6
0
        private void UpdateItemsSearchFilter(ContentFolder folder, List <ContentItem> items, bool[] filters, string filterText)
        {
            for (int i = 0; i < folder.Children.Count; i++)
            {
                var child = folder.Children[i];

                if (child is ContentFolder childFolder)
                {
                    UpdateItemsSearchFilter(childFolder, items, filters, filterText);
                }
                else if (filters[(int)child.SearchFilter])
                {
                    if (filters[(int)child.SearchFilter] && QueryFilterHelper.Match(filterText, child.ShortName))
                    {
                        items.Add(child);
                    }
                }
            }
        }
        protected int FindErrors([NotNull] IFeature feature,
                                 [NotNull] IGeometry searchGeometry,
                                 int tableIndex, int relatedTableIndex)
        {
            Assert.ArgumentNotNull(feature, nameof(feature));
            Assert.ArgumentNotNull(searchGeometry, nameof(searchGeometry));

            ITable relatedTable = InvolvedTables[relatedTableIndex];

            // access through properties to allow lazy initialization:
            ISpatialFilter    relatedFilter       = SpatialFilters[relatedTableIndex];
            QueryFilterHelper relatedFilterHelper = FilterHelpers[relatedTableIndex];

            relatedFilter.Geometry = searchGeometry;

            var errorCount = 0;
            var anyFound   = false;

            foreach (IRow relatedRow in Search(relatedTable,
                                               relatedFilter,
                                               relatedFilterHelper,
                                               feature.Shape))
            {
                anyFound = true;

                errorCount += FindErrors(feature, tableIndex,
                                         relatedRow, relatedTableIndex);
            }

            if (!anyFound && _disjointIsError)
            {
                if (IsDisjoint(searchGeometry,
                               relatedTable, relatedTableIndex,
                               relatedFilterHelper,
                               feature.Shape))
                {
                    errorCount += FindErrorsNoRelated(feature);
                }
            }

            return(errorCount);
        }
        private void OnSearchBoxTextChanged()
        {
            // Skip events during setup or init stuff
            if (IsLayoutLocked)
            {
                return;
            }

            var filterText = _searchBox.Text;

            _groupSearch.LockChildrenRecursive();
            _groupSearch.DisposeChildren();

            foreach (var actorType in Editor.CodeEditing.Actors.Get())
            {
                var text = actorType.Name;

                if (!QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
                {
                    continue;
                }

                var item = _groupSearch.AddChild(CreateActorItem(CustomEditors.CustomEditorsUtil.GetPropertyNameUI(text), actorType));
                item.TooltipText = Surface.SurfaceUtils.GetVisualScriptTypeDescription(actorType);

                var highlights = new List <Rectangle>(ranges.Length);
                var style      = Style.Current;
                var font       = style.FontSmall;
                var textRect   = item.TextRect;
                for (int i = 0; i < ranges.Length; i++)
                {
                    var start = font.GetCharPosition(text, ranges[i].StartIndex);
                    var end   = font.GetCharPosition(text, ranges[i].EndIndex);
                    highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
                }
                item.SetHighlights(highlights);
            }

            _groupSearch.UnlockChildrenRecursive();
            PerformLayout();
            PerformLayout();
        }
            /// <summary>
            /// Updates the filter.
            /// </summary>
            /// <param name="filterText">The filter text.</param>
            public void UpdateFilter(string filterText)
            {
                if (string.IsNullOrWhiteSpace(filterText))
                {
                    // Clear filter
                    _highlights?.Clear();
                    Visible = true;
                }
                else
                {
                    QueryFilterHelper.Range[] ranges;
                    if (QueryFilterHelper.Match(filterText, Name, out ranges))
                    {
                        // Update highlights
                        if (_highlights == null)
                        {
                            _highlights = new List <Rectangle>(ranges.Length);
                        }
                        else
                        {
                            _highlights.Clear();
                        }
                        var style = Style.Current;
                        var font  = style.FontSmall;
                        for (int i = 0; i < ranges.Length; i++)
                        {
                            var start = font.GetCharPosition(Name, ranges[i].StartIndex);
                            var end   = font.GetCharPosition(Name, ranges[i].EndIndex);
                            _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                        }

                        Visible = true;
                    }
                    else
                    {
                        // Hide
                        _highlights?.Clear();
                        Visible = false;
                    }
                }
            }
Exemple #10
0
        /// <summary>
        /// create a filter that gets the lines crossing the current row,
        /// with the same attribute constraints as the table
        /// </summary>
        private void InitFilters()
        {
            _filters = new Dictionary <int, ISpatialFilter>();
            _helpers = new Dictionary <int, QueryFilterHelper>();

            bool caseSensitive = GetSqlCaseSensitivity();

            foreach (int tableIndex in NonNetworkClassIndexList)
            {
                ITable         nonNetworkClass = InvolvedTables[tableIndex];
                ISpatialFilter filter          = new SpatialFilterClass();

                var helper = new QueryFilterHelper(nonNetworkClass,
                                                   GetConstraint(tableIndex),
                                                   caseSensitive);

                ConfigureQueryFilter(tableIndex, filter);

                esriGeometryType geometryType =
                    ((IFeatureClass)nonNetworkClass).ShapeType;

                switch (geometryType)
                {
                case esriGeometryType.esriGeometryPolyline:
                    filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    break;

                case esriGeometryType.esriGeometryPolygon:
                    filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
                    break;

                default:
                    throw new NotImplementedException("Unhandled geometry type " +
                                                      geometryType);
                }

                _filters.Add(tableIndex, filter);
                _helpers.Add(tableIndex, helper);
            }
        }
Exemple #11
0
        protected override int ExecuteCore(IRow row, int tableIndex)
        {
            Assert.ArgumentNotNull(row, nameof(row));

            var feature = row as IFeature;

            if (feature == null)
            {
                return(NoError);
            }

            IGeometry searchGeometry = GetSearchGeometry(feature, tableIndex);

            if (searchGeometry == null || searchGeometry.IsEmpty)
            {
                return(NoError);
            }

            var errorCount = 0;

            int startCompare = IgnoreUndirected && UsesSymmetricRelation
                                                   ? tableIndex
                                                   : 0;

            for (int searchTableIndex = startCompare;
                 searchTableIndex < TotalClassCount;
                 searchTableIndex++)
            {
                QueryFilterHelper filter = GetQueryFilterHelper(searchTableIndex);
                filter.MinimumOID = IgnoreUndirected && UsesSymmetricRelation &&
                                    tableIndex == searchTableIndex
                                                            ? row.OID
                                                            : -1;

                errorCount += FindErrors(feature, searchGeometry, tableIndex, searchTableIndex);
            }

            return(errorCount);
        }
Exemple #12
0
        /// <summary>
        /// Updates the query search filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            bool noFilter = string.IsNullOrWhiteSpace(filterText);

            // Update itself
            bool isThisVisible;

            if (noFilter)
            {
                // Clear filter
                _highlights?.Clear();
                isThisVisible = true;
            }
            else
            {
                var text = Text;
                if (QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style    = Style.Current;
                    var font     = style.FontSmall;
                    var textRect = TextRect;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(text, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(text, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
                    }
                    isThisVisible = true;
                }
        /// <summary>
        /// create a filter that gets the lines crossing the current row,
        /// with the same attribute constraints as the table
        /// </summary>
        private void InitFilter()
        {
            IList <ISpatialFilter>    spatialFilters;
            IList <QueryFilterHelper> filterHelpers;

            // there is one table and hence one filter (see constructor)
            // Create copy of this filter and use it for quering crossing lines
            CopyFilters(out spatialFilters, out filterHelpers);

            _spatialFilter = spatialFilters[0];
            _selectHelper  = filterHelpers[0];

            _spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;

            if (_constraint != null)
            {
                _compareHelper = TableViewFactory.Create(
                    new[] { InvolvedTables[0], InvolvedTables[0] },
                    new[] { "L", "R" },
                    _constraint,
                    GetSqlCaseSensitivity());
            }
        }
Exemple #14
0
        private int FindErrors([NotNull] IRow row,
                               [NotNull] IPolyline polyline,
                               int tableIndex,
                               int searchTableIndex)
        {
            Assert.ArgumentNotNull(row, nameof(row));
            Assert.ArgumentNotNull(polyline, nameof(polyline));

            ITable searchTable = InvolvedTables[searchTableIndex];

            ISpatialFilter    searchFilter       = _filter[searchTableIndex];
            QueryFilterHelper searchFilterHelper = _helper[searchTableIndex];

            int errorCount = 0;

            int routeFieldIndex = _routeIdFieldIndexes[tableIndex];

            object routeId = row.get_Value(routeFieldIndex);

            if (routeId == null || routeId == DBNull.Value)
            {
                return(NoError);
            }

            foreach (IPoint endPoint in GetEndpoints(polyline, _fromPoint, _toPoint))
            {
                searchFilter.Geometry = endPoint;

                foreach (IRow searchRow in Search(searchTable, searchFilter, searchFilterHelper))
                {
                    errorCount += FindErrors(endPoint, row, routeId,
                                             tableIndex, searchRow, searchTableIndex);
                }
            }

            return(errorCount);
        }
        private bool IsDisjoint([NotNull] IGeometry shape,
                                [NotNull] ITable relatedTable, int relatedTableIndex,
                                [NotNull] QueryFilterHelper relatedFilterHelper,
                                [NotNull] IGeometry cacheShape)
        {
            ISpatialFilter intersectsFilter = _spatialFiltersIntersects[relatedTableIndex];

            intersectsFilter.Geometry = shape;

            foreach (
                IRow row in
                Search(relatedTable, intersectsFilter, relatedFilterHelper, cacheShape))
            {
                if (_msg.IsVerboseDebugEnabled)
                {
                    _msg.VerboseDebugFormat("not disjoint (row found: {0})",
                                            GdbObjectUtils.ToString(row));
                }

                return(false);
            }

            return(true);
        }
        private void OnSelectStringClicked(Button button)
        {
            var settings = GameSettings.Load <LocalizationSettings>();

            if (settings?.LocalizedStringTables == null || settings.LocalizedStringTables.Length == 0)
            {
                MessageBox.Show("No valid localization settings setup.");
                return;
            }
            Profiler.BeginEvent("LocalizedStringEditor.OnSelectStringClicked");
            var allKeys = new HashSet <string>();

            for (int i = 0; i < settings.LocalizedStringTables.Length; i++)
            {
                var table = settings.LocalizedStringTables[i];
                if (table && !table.WaitForLoaded())
                {
                    var entries = table.Entries;
                    foreach (var e in entries)
                    {
                        allKeys.Add(e.Key);
                    }
                }
            }
            var allKeysSorted = allKeys.ToList();

            allKeysSorted.Sort();
            var value    = _idElement?.TextBox.Text;
            var menu     = Utils.CreateSearchPopup(out var searchBox, out var tree);
            var idToNode = new TreeNode[allKeysSorted.Count];

            for (var i = 0; i < allKeysSorted.Count; i++)
            {
                var key  = allKeysSorted[i];
                var node = new TreeNode
                {
                    Text        = key,
                    TooltipText = Localization.GetString(key),
                    Parent      = tree,
                };
                if (key == value)
                {
                    tree.Select(node);
                }
                idToNode[i] = node;
            }
            tree.SelectedChanged += delegate(List <TreeNode> before, List <TreeNode> after)
            {
                if (after.Count == 1)
                {
                    menu.Hide();
                    _idElement.TextBox.SetTextAsUser(after[0].Text);
                }
            };
            searchBox.TextChanged += delegate
            {
                if (tree.IsLayoutLocked)
                {
                    return;
                }
                tree.LockChildrenRecursive();
                var query = searchBox.Text;
                for (int i = 0; i < idToNode.Length; i++)
                {
                    var node = idToNode[i];
                    node.Visible = string.IsNullOrWhiteSpace(query) || QueryFilterHelper.Match(query, node.Text);
                }
                tree.UnlockChildrenRecursive();
                menu.PerformLayout();
            };
            menu.Show(button, new Vector2(0, button.Height));
            Profiler.EndEvent();
        }
        /// <summary>
        /// Updates the query search filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            bool noFilter = string.IsNullOrWhiteSpace(filterText);

            // Update itself
            bool isThisVisible;

            if (noFilter)
            {
                // Clear filter
                _highlights?.Clear();
                isThisVisible = true;
            }
            else
            {
                QueryFilterHelper.Range[] ranges;
                var text = Text;
                if (QueryFilterHelper.Match(filterText, text, out ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style    = Style.Current;
                    var font     = style.FontSmall;
                    var textRect = TextRect;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(text, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(text, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
                    }
                    isThisVisible = true;
                }
                else
                {
                    // Hide
                    _highlights?.Clear();
                    isThisVisible = false;
                }
            }

            // Update children
            bool isAnyChildVisible = false;

            for (int i = 0; i < _children.Count; i++)
            {
                if (_children[i] is ContentTreeNode child)
                {
                    child.UpdateFilter(filterText);
                    isAnyChildVisible |= child.Visible;
                }
            }

            bool isExpanded = isAnyChildVisible;

            if (isExpanded)
            {
                Expand(true);
            }
            else
            {
                Collapse(true);
            }

            Visible = isThisVisible | isAnyChildVisible;
        }
Exemple #18
0
        private int CheckRows([NotNull] IList <NetElement> connectedRows,
                              bool ignoreLoopEndpoints)
        {
            IRow lineFeature1;
            IRow lineFeature2;

            if (!IsPseudoNode(connectedRows, ignoreLoopEndpoints,
                              out lineFeature1, out lineFeature2))
            {
                return(NoError);
            }

            Assert.NotNull(lineFeature1, "lineFeature1");
            Assert.NotNull(lineFeature2, "lineFeature2");

            //compare fields
            Dictionary <int, esriFieldType> compareFields =
                GetFieldIndexesToCompare(lineFeature1.Table);

            foreach (KeyValuePair <int, esriFieldType> pair in compareFields)
            {
                int fieldIndex = pair.Key;

                if (pair.Value == esriFieldType.esriFieldTypeGeometry)
                {
                    // Do not compare the geometries by default
                    continue;
                }

                if (!Equals(lineFeature1.Value[fieldIndex],
                            lineFeature2.Value[fieldIndex]))
                {
                    // one of the relevant fields has a different value --> pseudo node is allowed
                    return(NoError);
                }
            }

            // Check if point lies on NON network feature
            IPoint netPoint = connectedRows[0].NetPoint;

            foreach (int nonNetworkClassIndex in NonNetworkClassIndexList)
            {
                ISpatialFilter relatedFilter = Filters[nonNetworkClassIndex];
                relatedFilter.Geometry = netPoint;

                QueryFilterHelper relatedFilterHelper = Helpers[nonNetworkClassIndex];

                IEnumerable <IRow> searchResult = Search(InvolvedTables[nonNetworkClassIndex],
                                                         relatedFilter,
                                                         relatedFilterHelper);

                if (searchResult.Any())
                {
                    // Point lies on NON network feature --> the pseudo node is allowed
                    return(NoError);
                }
            }

            return(ReportError("Pseudo Node", netPoint,
                               Codes[Code.PseudoNode],
                               TestUtils.GetShapeFieldName(lineFeature1),
                               lineFeature1, lineFeature2));
        }
Exemple #19
0
        public void TestMatching()
        {
            // Simple matching
            Assert.IsFalse(QueryFilterHelper.Match("text", "txt"));
            Assert.IsFalse(QueryFilterHelper.Match("text", "txt txt"));
            Assert.IsFalse(QueryFilterHelper.Match("text", "txttxt"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "text"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "ss text"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "text1"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "text 1"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "1text1"));
            Assert.IsTrue(QueryFilterHelper.Match("text", "text text"));

            // Exact matching
            QueryFilterHelper.Range[] range;
            Assert.IsTrue(QueryFilterHelper.Match("text", "text", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 4), range[0]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("text", "text text", out range));
            Assert.AreEqual(2, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 4), range[0]);
            Assert.AreEqual(new QueryFilterHelper.Range(5, 4), range[1]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("bool", "is it bool or boolean, boolish bol", out range));
            Assert.AreEqual(3, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(6, 4), range[0]);
            Assert.AreEqual(new QueryFilterHelper.Range(14, 4), range[1]);
            Assert.AreEqual(new QueryFilterHelper.Range(23, 4), range[2]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("boolean", "is it bool or boolean, boolish bol", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(14, 7), range[0]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("boolean (0)", "is it bool or boolean (0)", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(14, 11), range[0]);

            // More for searching in scene graph examples
            Assert.IsFalse(QueryFilterHelper.Match("actor", "acctor", out range));
            //
            Assert.IsTrue(QueryFilterHelper.Match("actor", "actor (0)", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 5), range[0]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("actor ", "actor (0)", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 6), range[0]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("actor (0)", "actor (0) more", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 9), range[0]);
            //
            Assert.IsFalse(QueryFilterHelper.Match("actor (0)", "actor (1) more", out range));

            // Even more
            Assert.IsTrue(QueryFilterHelper.Match("magic", "Are you looking forTheMagic?", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(22, 5), range[0]);
            //
            Assert.IsTrue(QueryFilterHelper.Match("magic", "black Magical stuff", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(6, 5), range[0]);

            // Sth more tricky
            Assert.IsTrue(QueryFilterHelper.Match("magic ma", "magic magic magic", out range));
            Assert.AreEqual(1, range.Length);
            Assert.AreEqual(new QueryFilterHelper.Range(0, 8), range[0]);
        }
Exemple #20
0
        /// <summary>
        /// Updates the query search filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            // SKip hidden actors
            var actor = Actor;

            if (actor != null && (actor.HideFlags & HideFlags.HideInHierarchy) != 0)
            {
                return;
            }

            bool noFilter = string.IsNullOrWhiteSpace(filterText);

            _hasSearchFilter = !noFilter;

            // Update itself
            bool isThisVisible;

            if (noFilter)
            {
                // Clear filter
                _highlights?.Clear();
                isThisVisible = true;
            }
            else
            {
                QueryFilterHelper.Range[] ranges;
                var text = Text;
                if (QueryFilterHelper.Match(filterText, text, out ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var font     = Style.Current.FontSmall;
                    var textRect = TextRect;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(text, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(text, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
                    }
                    isThisVisible = true;
                }
                else
                {
                    // Hide
                    _highlights?.Clear();
                    isThisVisible = false;
                }
            }

            // Update children
            bool isAnyChildVisible = false;

            for (int i = 0; i < _children.Count; i++)
            {
                if (_children[i] is ActorTreeNode child)
                {
                    child.UpdateFilter(filterText);
                    isAnyChildVisible |= child.Visible;
                }
            }

            bool isExpanded = isAnyChildVisible;

            // Restore cached state on query filter clear
            if (noFilter && actor != null)
            {
                var id = actor.ID;
                isExpanded = Editor.Instance.ProjectCache.IsExpandedActor(ref id);
            }

            if (isExpanded)
            {
                Expand(true);
            }
            else
            {
                Collapse(true);
            }

            Visible = isThisVisible | isAnyChildVisible;
        }
Exemple #21
0
        private int CheckTable([NotNull] IFeature feature,
                               [NotNull] IFeatureClass referenceClass,
                               int referenceClassIndex)
        {
            GeometryComponent geometryComponent =
                GetGeometryComponent(referenceClassIndex);

            IValidRelationConstraint validConstraint =
                GetValidRelationConstraint(referenceClassIndex);

            if (_pointTemplate == null)
            {
                _pointTemplate = new PointClass();
            }

            var errorCount = 0;

            foreach (IPoint point in GetNodes(feature.Shape, _pointTemplate))
            {
                ISpatialFilter    filter = PrepareSpatialFilter(point, referenceClassIndex);
                QueryFilterHelper helper = _helper[referenceClassIndex];

                const int pointClassIndex = 0;
                foreach (IRow referenceRow in Search((ITable)referenceClass,
                                                     filter, helper, point))
                {
                    if (TestUtils.IsSameRow(feature, referenceRow))
                    {
                        continue;
                    }

                    var referenceFeature = (IFeature)referenceRow;

                    string conditionMessage;
                    if (validConstraint != null &&
                        validConstraint.HasConstraint &&
                        validConstraint.IsFulfilled(feature, pointClassIndex,
                                                    referenceFeature, referenceClassIndex,
                                                    out conditionMessage))
                    {
                        continue;
                    }

                    double standardDistance;
                    double?rightSideDistance;
                    double maxNeededDistance = GetMaxNeededDistance(
                        feature, referenceFeature, referenceClassIndex,
                        out standardDistance, out rightSideDistance);
                    maxNeededDistance = Math.Max(maxNeededDistance, _pointClassXyTolerance);

                    bool   isWithinPolygon;
                    bool   onRightSide;
                    double distance = GetDistance(point, referenceFeature, _nearPoint,
                                                  geometryComponent, maxNeededDistance,
                                                  out isWithinPolygon, out onRightSide);

                    if (AllowCoincidentPoints &&
                        IsSmallerThanXyTolerance(distance, referenceClassIndex))
                    {
                        continue;
                    }

                    if (distance > maxNeededDistance)
                    {
                        continue;
                    }

                    double minimumDistance = maxNeededDistance;
                    if (rightSideDistance.HasValue)
                    {
                        if (_referenceFlipConditions == null)
                        {
                            _referenceFlipConditions =
                                CreateFlipConditions(_referenceFlipExpressions);
                        }

                        bool flip = _referenceFlipConditions.Count > 0
                                                                    ? _referenceFlipConditions[
                            referenceClassIndex -
                            _firstReferenceClassIndex].IsFulfilled(
                            referenceFeature)
                                                                    : false;

                        double useDistance = (onRightSide == flip)
                                                                             ? standardDistance
                                                                             : rightSideDistance.Value;
                        if (distance > useDistance)
                        {
                            continue;
                        }

                        minimumDistance = useDistance;
                    }

                    errorCount += ReportError(feature, referenceFeature,
                                              point, _nearPoint,
                                              distance, minimumDistance,
                                              isWithinPolygon, geometryComponent,
                                              validConstraint);
                }
            }

            return(errorCount);
        }
Exemple #22
0
        /// <summary>
        /// Updates the filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            if (string.IsNullOrWhiteSpace(filterText))
            {
                // Clear filter
                _highlights?.Clear();
                Visible = true;
            }
            else
            {
                object[] data;

                QueryFilterHelper.Range[] ranges;
                if (QueryFilterHelper.Match(filterText, _archetype.Title, out ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(_archetype.Title, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(_archetype.Title, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                    }
                    Visible = true;
                }
                else if (_archetype.AlternativeTitles?.Any(filterText.Equals) == true)
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(1);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    var start = font.GetCharPosition(_archetype.Title, 0);
                    var end   = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
                    _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                    Visible = true;
                }
                else if (NodeArchetype.TryParseText != null && NodeArchetype.TryParseText(filterText, out data))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(1);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    var start = font.GetCharPosition(_archetype.Title, 0);
                    var end   = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
                    _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                    Visible = true;

                    Data = data;
                }
                else
                {
                    // Hide
                    _highlights?.Clear();
                    Visible = false;
                }
            }
        }
Exemple #23
0
        public IList <IRow> Search([NotNull] ITable table,
                                   int tableIndex,
                                   [NotNull] IQueryFilter queryFilter,
                                   [NotNull] QueryFilterHelper filterHelper,
                                   [CanBeNull] IGeometry cacheGeometry)
        {
            var       spatialFilter  = (ISpatialFilter)queryFilter;
            IGeometry filterGeometry = spatialFilter.Geometry;

            IList <IRow> result = new List <IRow>();

            // TODO explain network queries
            bool repeatCachedRows = filterHelper.ForNetwork;

            // filterHelper.PointSearchOnlyWithinTile
            if (filterHelper.ForNetwork)
            {
                var filterPoint = filterGeometry as IPoint;
                if (filterPoint != null)
                {
                    // search only if the point is within the tile box
                    // (or left/below of test run box)

                    double x;
                    double y;
                    filterPoint.QueryCoords(out x, out y);

                    Pnt  tileMin    = CurrentTileBox.Min;
                    Pnt  tileMax    = CurrentTileBox.Max;
                    IPnt testRunMin = _testRunBox.Min;

                    if ((x <= tileMin.X && x > testRunMin.X) || x > tileMax.X ||
                        (y <= tileMin.Y && y > testRunMin.Y) || y > tileMax.Y)
                    {
                        // outside of tile box, return empty list
                        return(result);
                    }
                }
            }

            List <BoxTree <CachedRow> .TileEntry> searchList = SearchList(filterGeometry,
                                                                          tableIndex);

            if (searchList == null || searchList.Count == 0)
            {
                return(result);
            }

            var cacheGeometryOverlapsLeftTile   = false;
            var cacheGeometryOverlapsBottomTile = false;

            if (!repeatCachedRows)
            {
                if (cacheGeometry != null)
                {
                    cacheGeometry.QueryEnvelope(_envelopeTemplate);
                }
                else
                {
                    filterGeometry.QueryEnvelope(_envelopeTemplate);
                }

                double xmin;
                double ymin;
                double xmax;
                double ymax;
                _envelopeTemplate.QueryCoords(out xmin, out ymin, out xmax, out ymax);

                cacheGeometryOverlapsLeftTile = xmin <CurrentTileBox.Min.X &&
                                                      xmin> _testRunBox.Min.X;

                // https://issuetracker02.eggits.net/browse/COM-85
                // observed (CtLu):
                // - filter geometry ymin = 220532.967
                // - filter geometry ymax = 220557.78500
                // - tile ymin            = 220557.78534
                // --> filter geometry is completely outside of tile boundaries!!!
                // --> causes incorrect error in QaContainsOther
                cacheGeometryOverlapsBottomTile = ymin <CurrentTileBox.Min.Y &&
                                                        ymin> _testRunBox.Min.Y;
            }

            IGeometryEngine engine = _container.GeometryEngine;

            engine.SetSourceGeometry(filterGeometry);

            IList <ContainerTest> tests = _testsPerTable[table];
            int indexTest = tests.IndexOf(filterHelper.ContainerTest);

            IList <BaseRow> ignoredRows = IgnoredRowsByTableAndTest[tableIndex][indexTest];

            foreach (BoxTree <CachedRow> .TileEntry entry in searchList)
            {
                CachedRow cachedRow = Assert.NotNull(entry.Value, "cachedRow");

                // This causes problems for QaIsCoveredByOther. However
                // IsCoveredByOther is not a network test, but still requires cached features
                // to be returned repeatedly
                if (cacheGeometryOverlapsLeftTile && !cachedRow.IsFirstOccurrenceX)
                {
                    // only if *not for network*:
                    // the filter geometry overlaps the left border of the tile, but
                    // not the left border of the test run box AND the cached row
                    // was already returned previously --> skip it
                    continue;
                }

                if (cacheGeometryOverlapsBottomTile && !cachedRow.IsFirstOccurrenceY)
                {
                    // only if *not for network*:
                    // the filter geometry overlaps the bottom border of the tile, but
                    // not the bottom border of the test run box AND the cached row
                    // was already returned previously --> skip it
                    continue;
                }

                if (ignoredRows != null && ignoredRows.Contains(entry.Value))
                {
                    continue;
                }

                IFeature targetFeature = cachedRow.Feature;

                if (targetFeature.OID < filterHelper.MinimumOID)
                {
                    continue;
                }

                engine.SetTargetGeometry(cachedRow.Geometry);

                // Remark: if most of the rows fullfill helper.Check,
                // it is better to check the geometric relation first
                var matchesConstraint = false;
                if (filterHelper.AttributeFirst)
                {
                    if (!filterHelper.MatchesConstraint(targetFeature))
                    {
                        continue;
                    }

                    matchesConstraint = true;
                }

                if (engine.EvaluateRelation(spatialFilter))
                {
                    if (matchesConstraint || filterHelper.MatchesConstraint(targetFeature))
                    {
                        result.Add(targetFeature);
                    }
                }
            }

            return(result);
        }
Exemple #24
0
        /// <summary>
        /// Updates the filter.
        /// </summary>
        /// <param name="filterText">The filter text.</param>
        public void UpdateFilter(string filterText)
        {
            _isStartsWithMatch = _isFullMatch = false;
            if (filterText == null)
            {
                // Clear filter
                _highlights?.Clear();
                Visible = true;
            }
            else
            {
                if (QueryFilterHelper.Match(filterText, _archetype.Title, out var ranges))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(ranges.Length);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    for (int i = 0; i < ranges.Length; i++)
                    {
                        var start = font.GetCharPosition(_archetype.Title, ranges[i].StartIndex);
                        var end   = font.GetCharPosition(_archetype.Title, ranges[i].EndIndex);
                        _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));

                        if (ranges[i].StartIndex <= 0)
                        {
                            _isStartsWithMatch = true;
                            if (ranges[i].Length == _archetype.Title.Length)
                            {
                                _isFullMatch = true;
                            }
                        }
                    }
                    Visible = true;
                }
                else if (_archetype.AlternativeTitles?.Any(altTitle => string.Equals(filterText, altTitle, StringComparison.CurrentCultureIgnoreCase)) == true)
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(1);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    var start = font.GetCharPosition(_archetype.Title, 0);
                    var end   = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
                    _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                    Visible = true;
                }
                else if (NodeArchetype.TryParseText != null && NodeArchetype.TryParseText(filterText, out var data))
                {
                    // Update highlights
                    if (_highlights == null)
                    {
                        _highlights = new List <Rectangle>(1);
                    }
                    else
                    {
                        _highlights.Clear();
                    }
                    var style = Style.Current;
                    var font  = style.FontSmall;
                    var start = font.GetCharPosition(_archetype.Title, 0);
                    var end   = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
                    _highlights.Add(new Rectangle(start.X + 2, 0, end.X - start.X, Height));
                    Visible = true;

                    Data = data;
                }
                else
                {
                    // Hide
                    _highlights?.Clear();
                    Visible = false;
                }
            }
        }
Exemple #25
0
        private void CompleteJunctions()
        {
            foreach (KeyValuePair <RowKey, SegmentNeighbors> pair in ProcessedList)
            {
                RowKey key = pair.Key;
                if (_conflictTables.ContainsKey(key.TableIndex))
                {
                    continue;
                }

                // --> junction was not searched
                var thisFeature           = (IFeature)key.Row;
                var thisCurve             = (IGeometryCollection)thisFeature.Shape;
                IIndexedSegments thisGeom =
                    IndexedSegmentUtils.GetIndexedGeometry(thisFeature, false);
                Dictionary <int, SegmentPart> handledParts = new Dictionary <int, SegmentPart>();

                foreach (KeyValuePair <SegmentPart, SegmentParts> segmentPair in pair.Value)
                {
                    if (segmentPair.Value.Count == 0)
                    {
                        continue;
                    }

                    SegmentPart segment = segmentPair.Key;
                    if (handledParts.ContainsKey(segment.PartIndex))
                    {
                        continue;
                    }

                    int segmentsCount = thisGeom.GetPartSegmentCount(segment.PartIndex);

                    IEnvelope searchBox = thisCurve.Geometry[segment.PartIndex].Envelope;

                    double tolerance = UsedJunctionCoincidenceTolerance;
                    searchBox.Expand(tolerance, tolerance, asRatio: false);

                    Pnt  start    = thisGeom.GetSegment(segment.PartIndex, 0).GetStart(false);
                    IBox startBox = new Box(new Pnt2D(start.X - tolerance, start.Y - tolerance),
                                            new Pnt2D(start.X + tolerance, start.Y + tolerance));

                    Pnt end = thisGeom.GetSegment(segment.PartIndex, segmentsCount - 1)
                              .GetEnd(false);
                    IBox endBox = new Box(new Pnt2D(end.X - tolerance, end.Y - tolerance),
                                          new Pnt2D(end.X + tolerance, end.Y + tolerance));

                    foreach (KeyValuePair <int, IFeatureClass> topoPair in _topoTables)
                    {
                        int            neighborTableIdx = topoPair.Key;
                        ISpatialFilter filter           = _topoFilters[neighborTableIdx];
                        filter.Geometry = searchBox;
                        QueryFilterHelper helper = _topoHelpers[neighborTableIdx];

                        foreach (IRow neighborRow in Search((ITable)topoPair.Value, filter, helper)
                                 )
                        {
                            if (neighborRow.OID == key.Row.OID &&
                                neighborTableIdx == key.TableIndex)
                            {
                                continue;
                            }

                            var neighborFeature           = (IFeature)neighborRow;
                            IIndexedSegments neighborGeom =
                                IndexedSegmentUtils.GetIndexedGeometry(neighborFeature, false);

                            int connectedPart;
                            int connectedFraction;
                            if (IsConnected(neighborGeom, startBox, start,
                                            JunctionCoincidenceToleranceSquare,
                                            out connectedPart, out connectedFraction))
                            {
                                var jct =
                                    new Junction(thisFeature, key.TableIndex, segment.PartIndex, 0,
                                                 neighborFeature, neighborTableIdx, connectedPart,
                                                 connectedFraction);
                                _junctions.Add(jct);
                            }

                            if (IsConnected(neighborGeom, endBox, end,
                                            JunctionCoincidenceToleranceSquare,
                                            out connectedPart, out connectedFraction))
                            {
                                var jct = new Junction(
                                    thisFeature, key.TableIndex, segment.PartIndex, segmentsCount,
                                    neighborFeature, neighborTableIdx, connectedPart,
                                    connectedFraction);
                                _junctions.Add(jct);
                            }

                            if (ConnectionMode == ConnectionMode.VertexOnVertex)
                            {
                                for (int iSegment = 1; iSegment < segmentsCount; iSegment++)
                                {
                                    Pnt vertex = thisGeom
                                                 .GetSegment(segment.PartIndex, iSegment)
                                                 .GetStart(false);
                                    IBox vertexBox =
                                        new Box(
                                            new Pnt2D(vertex.X - tolerance, vertex.Y - tolerance),
                                            new Pnt2D(vertex.X + tolerance, vertex.Y + tolerance));

                                    if (IsConnected(neighborGeom, vertexBox, vertex,
                                                    JunctionCoincidenceToleranceSquare,
                                                    out connectedPart, out connectedFraction))
                                    {
                                        var jct = new Junction(
                                            thisFeature, key.TableIndex, segment.PartIndex,
                                            iSegment,
                                            neighborFeature, neighborTableIdx, connectedPart,
                                            connectedFraction);
                                        _junctions.Add(jct);
                                    }
                                }
                            }
                        }
                    }

                    handledParts.Add(segment.PartIndex, segment);
                }
            }
        }