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()