Data Filter Demo#

A simple example for working with filters through the dips scripting API.

Code Snippet: DataFilterDemo.py#
"""
Demonstration of Data Filter services in Dips Python API.

This script demonstrates IDataFilterServices methods including:
- AddDataFilter: Create a new data filter
- GetDataFilterList: List all data filters
- DeleteDataFilter: Remove a data filter

Available Filter Operators in Dips:
- =        Equals
- <>       Does not equal
- >        Is greater than
- >=       Is greater than or equal to
- <        Is less than
- <=       Is less than or equal to
- Between  Is between
- Not Between  Is not between
- In       Is any of
- Not In   Is none of
"""

from dips import DipsApp
from dips import DipsAPI_pb2
import dips.DataFilterVal


# =============================================================================
# DATA FILTER DEMONSTRATIONS
# =============================================================================

def demonstrate_add_data_filter(model):
    """Demonstrate adding a data filter."""
    print("\n" + "=" * 60)
    print("ADD DATA FILTER")
    print("=" * 60)
    
    try:
        # Create a filter that filters by Dip angle > 45
        data_filter = dips.DataFilterVal.DataFilterVal()
        data_filter.name = "High Dip Filter"
        data_filter.filter_string = "[Dip] > 45"
        
        result = model.AddDataFilter(data_filter)
        print(f"  ✓ AddDataFilter: '{data_filter.name}'")
        return result
    except Exception as e:
        print(f"  ✗ AddDataFilter: {e}")
        return None


def demonstrate_get_data_filter_list(model):
    """Demonstrate listing all data filters."""
    print("\n" + "=" * 60)
    print("GET DATA FILTER LIST")
    print("=" * 60)
    
    try:
        filters = model.GetDataFilterList()
        print(f"  ✓ GetDataFilterList: {len(filters)} filter(s) found")
        
        for i, filter_ref in enumerate(filters):
            filter_value = filter_ref.GetValue()
            print(f"    [{i+1}] Name: '{filter_value.name}'")
            print(f"        Filter: '{filter_value.filter_string}'")
        
        return filters
    except Exception as e:
        print(f"  ✗ GetDataFilterList: {e}")
        return []


def demonstrate_delete_data_filter(model, filter_ref):
    """Demonstrate deleting a data filter."""
    print("\n" + "=" * 60)
    print("DELETE DATA FILTER")
    print("=" * 60)
    
    if filter_ref is None:
        print("  - DeleteDataFilter: No filter to delete")
        return
    
    try:
        filter_value = filter_ref.GetValue()
        filter_name = filter_value.name
        model.DeleteDataFilter(filter_ref)
        print(f"  ✓ DeleteDataFilter: '{filter_name}'")
    except Exception as e:
        print(f"  ✗ DeleteDataFilter: {e}")


def demonstrate_comparison_operators(model):
    """Demonstrate filters using comparison operators."""
    print("\n" + "=" * 60)
    print("COMPARISON OPERATORS")
    print("=" * 60)
    
    # Comparison operators: =, <>, >, >=, <, <=
    filter_examples = [
        ("Dip Equals 45", "[Dip] = 45"),
        ("Dip Not Equals 45", "[Dip] <> 45"),
        ("Dip Greater Than 60", "[Dip] > 60"),
        ("Dip Greater Or Equal 30", "[Dip] >= 30"),
        ("Dip Less Than 30", "[Dip] < 30"),
        ("Dip Less Or Equal 45", "[Dip] <= 45"),
    ]
    
    created_filters = []
    for name, filter_string in filter_examples:
        try:
            data_filter = dips.DataFilterVal.DataFilterVal()
            data_filter.name = name
            data_filter.filter_string = filter_string
            result = model.AddDataFilter(data_filter)
            created_filters.append(result)
            print(f"  ✓ '{name}'")
            print(f"      {filter_string}")
        except Exception as e:
            print(f"  ✗ '{name}': {e}")
    
    return created_filters


def demonstrate_range_operators(model):
    """Demonstrate filters using range operators (Between)."""
    print("\n" + "=" * 60)
    print("RANGE OPERATORS (Is between / Is not between)")
    print("=" * 60)
    
    # Between and Not Between operators
    filter_examples = [
        ("Dip Between 30 and 60", "[Dip] Between (30, 60)"),
        ("Dip Not Between 30 and 60", "Not [Dip] Between (30, 60)"),
        ("DipDirection Between 0 and 90", "[DipDirection] Between (0, 90)"),
    ]
    
    created_filters = []
    for name, filter_string in filter_examples:
        try:
            data_filter = dips.DataFilterVal.DataFilterVal()
            data_filter.name = name
            data_filter.filter_string = filter_string
            result = model.AddDataFilter(data_filter)
            created_filters.append(result)
            print(f"  ✓ '{name}'")
            print(f"      {filter_string}")
        except Exception as e:
            print(f"  ✗ '{name}': {e}")
    
    return created_filters


def demonstrate_list_operators(model):
    """Demonstrate filters using list operators (Is any of / Is none of)."""
    print("\n" + "=" * 60)
    print("LIST OPERATORS (Is any of / Is none of)")
    print("=" * 60)
    
    # In (Is any of) and Not In (Is none of) operators
    # Note: String values must be enclosed in single quotes
    filter_examples = [
        ("Is Any Of (strings)", "[Traverse] In ('Traverse1', 'Traverse2', 'Traverse3')"),
        ("Is None Of (strings)", "Not [Traverse] In ('Excluded1', 'Excluded2')"),
        ("Is Any Of (numbers)", "[Dip] In (30, 45, 60, 90)"),
        ("Is None Of (numbers)", "Not [Dip] In (0, 90)"),
    ]
    
    created_filters = []
    for name, filter_string in filter_examples:
        try:
            data_filter = dips.DataFilterVal.DataFilterVal()
            data_filter.name = name
            data_filter.filter_string = filter_string
            result = model.AddDataFilter(data_filter)
            created_filters.append(result)
            print(f"  ✓ '{name}'")
            print(f"      {filter_string}")
        except Exception as e:
            print(f"  ✗ '{name}': {e}")
    
    return created_filters


def demonstrate_logical_operators(model):
    """Demonstrate filters using logical operators (AND, OR)."""
    print("\n" + "=" * 60)
    print("LOGICAL OPERATORS (AND, OR)")
    print("=" * 60)
    
    # Combining conditions with AND, OR
    filter_examples = [
        ("AND Condition", "[Dip] > 30 AND [Dip] < 60"),
        ("OR Condition", "[DipDirection] < 45 OR [DipDirection] > 315"),
        ("Complex Condition", "([Dip] >= 30 AND [Dip] <= 60) AND ([DipDirection] >= 0 AND [DipDirection] <= 90)"),
        ("Mixed AND/OR", "[Dip] > 45 AND ([DipDirection] < 90 OR [DipDirection] > 270)"),
    ]
    
    created_filters = []
    for name, filter_string in filter_examples:
        try:
            data_filter = dips.DataFilterVal.DataFilterVal()
            data_filter.name = name
            data_filter.filter_string = filter_string
            result = model.AddDataFilter(data_filter)
            created_filters.append(result)
            print(f"  ✓ '{name}'")
            print(f"      {filter_string}")
        except Exception as e:
            print(f"  ✗ '{name}': {e}")
    
    return created_filters


def demonstrate_cleanup(model, filters_to_delete):
    """Clean up created filters."""
    print("\n" + "=" * 60)
    print("CLEANUP")
    print("=" * 60)
    
    for filter_ref in filters_to_delete:
        try:
            filter_value = filter_ref.GetValue()
            model.DeleteDataFilter(filter_ref)
            print(f"  ✓ Deleted: '{filter_value.name}'")
        except Exception as e:
            print(f"  ✗ Delete failed: {e}")


# =============================================================================
# MAIN
# =============================================================================

def main():
    """Main demonstration function."""
    print("=" * 60)
    print("Dips API - Data Filter Services Demo")
    print("=" * 60)
    
    # Connect to Dips
    print("\nConnecting to Dips application...")
    try:
        app = DipsApp.LaunchApp(62535)
        print("✓ Connected to Dips")
    except Exception as e:
        print(f"✗ Failed to connect: {e}")
        print("Make sure Dips is running with scripting enabled on port 62535")
        return
    
    model = app.GetModel()
    
    # Show initial state
    print("\n" + "-" * 60)
    print("INITIAL STATE")
    print("-" * 60)
    demonstrate_get_data_filter_list(model)
    
    # Add a single filter
    new_filter = demonstrate_add_data_filter(model)
    
    # Delete the filter
    demonstrate_delete_data_filter(model, new_filter)
    
    # Demonstrate all filter operator types
    all_created_filters = []
    
    comparison_filters = demonstrate_comparison_operators(model)
    all_created_filters.extend(comparison_filters)
    
    range_filters = demonstrate_range_operators(model)
    all_created_filters.extend(range_filters)
    
    list_filters = demonstrate_list_operators(model)
    all_created_filters.extend(list_filters)
    
    logical_filters = demonstrate_logical_operators(model)
    all_created_filters.extend(logical_filters)
    
    # List all filters
    demonstrate_get_data_filter_list(model)
    
    # Cleanup
    demonstrate_cleanup(model, all_created_filters)
    
    # Show final state
    print("\n" + "-" * 60)
    print("FINAL STATE")
    print("-" * 60)
    demonstrate_get_data_filter_list(model)
    
    # Show the application
    app.Show()
    
    # Summary
    print("\n" + "=" * 60)
    print("DEMONSTRATION COMPLETE")
    print("=" * 60)
    print("""
Data Filter services demonstrated (3 methods):

  - AddDataFilter: Create a new data filter with a filter expression
  - GetDataFilterList: List all data filters in the project
  - DeleteDataFilter: Remove a data filter from the project

AVAILABLE FILTER OPERATORS IN DIPS:

COMPARISON OPERATORS:
  [Column] = value          Equals
  [Column] <> value         Does not equal
  [Column] > value          Is greater than
  [Column] >= value         Is greater than or equal to
  [Column] < value          Is less than
  [Column] <= value         Is less than or equal to

RANGE OPERATORS:
  [Column] Between (a, b)       Is between a and b
  Not [Column] Between (a, b)   Is not between a and b

LIST OPERATORS:
  [Column] In (val1, val2, ...)      Is any of (matches any value in list)
  Not [Column] In (val1, val2, ...)  Is none of (matches none in list)

LOGICAL OPERATORS:
  condition1 AND condition2   Both conditions must be true
  condition1 OR condition2    Either condition can be true
  (cond1) AND (cond2 OR cond3)   Use parentheses for grouping

SYNTAX NOTES:
  - Column names must be wrapped in brackets: [ColumnName]
  - String values must be enclosed in single quotes: 'text'
  - Numeric values are used directly: 45, 30.5
  - Use parentheses for list values: (val1, val2, val3)

EXAMPLE FILTERS:
  "[Dip] > 45"                              High dip angles
  "[Dip] >= 30 AND [Dip] <= 60"             Medium dip range
  "[DipDirection] < 45 OR [DipDirection] > 315"   North-facing
  "[Dip] Between (30, 60)"                  Dip between 30 and 60
  "[Traverse] In ('BH1', 'BH2', 'BH3')"     Specific traverses only
""")


if __name__ == "__main__":
    main()