Rosette Demo#

Comprehensive demonstration of Rosette functionality in Dips Python API.

This script demonstrates Rosette services including: - View Management: Create, Get, Close views - Legend and Settings: Visibility, Weighting, Rosette settings, Projection mode - Group Visibility: User planes - Entity References: Get and set user plane entity visibility - Data Filters: Get and set active filter

Note: Tool demonstrations are in RosetteToolsDemo.py

Code Snippet: RosetteDemo.py#
"""
Comprehensive demonstration of Rosette functionality in Dips Python API.

This script demonstrates Rosette services including:
- View Management: Create, Get, Close views
- Legend and Settings: Visibility, Weighting, Rosette settings, Projection mode
- Group Visibility: User planes
- Entity References: Get and set user plane entity visibility
- Data Filters: Get and set active filter

Note: Tool demonstrations are in RosetteToolsDemo.py
"""

import math
from dips import DipsApp, BuiltInDataFormatters

# Helper value wrappers
from dips.TrendPlungeVal import TrendPlungeVal
from dips.ColorSurrogateVal import ColorSurrogateVal
from dips.StereonetProjectionModeVal import StereonetProjectionModeVal
from dips.RosetteSettingsVal import RosetteSettingsVal

# Data wrappers
from dips.DiscontinuityDataVal import DiscontinuityDataVal
from dips.OrientationDataSetVal import OrientationDataSetVal


# =============================================================================
# SAMPLE DATA CREATION
# =============================================================================

def create_sample_traverse_with_poles(model):
    """Create a sample traverse with discontinuities (poles) for demonstration."""
    ods = model.GetDefaultOrientationDataSet()
    ods.name = "Sample Traverse for Rosette Demo"
    ods.orientation_convention = DipsApp.enums.eOrientationConvention.TrendPlungeOrientation
    ods.orientation_data_type = DipsApp.enums.eOrientationDataType.SpotMapping
    ods.discontinuity_orientation_convention = DipsApp.enums.eOrientationConvention.TrendPlungeOrientation
    
    # Use built-in unit formatters
    ods.traverse_elevation_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.traverse_xyz_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.traverse_depth_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.survey_distance_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.discontinuity_distance_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.discontinuity_xyz_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    ods.discontinuity_persistence_unit = BuiltInDataFormatters.LengthMeterDataFormatter
    
    # Create sample poles with different orientations
    sample_poles = [
        (45, 30), (90, 45), (135, 60), (180, 30),
        (225, 45), (270, 60), (315, 30), (0, 45),
        (60, 75), (120, 25), (240, 50), (300, 40),
    ]
    
    for trend_deg, plunge_deg in sample_poles:
        discontinuity = DiscontinuityDataVal()
        discontinuity.orientation1.angle_radians = math.radians(trend_deg)
        discontinuity.orientation2.angle_radians = math.radians(plunge_deg)
        discontinuity.quantity = 1.0
        ods.discontinuity_list.append(discontinuity)
    
    return ods


# =============================================================================
# VIEW MANAGEMENT DEMONSTRATIONS
# =============================================================================

def demonstrate_view_management(model):
    """Demonstrate view creation and listing."""
    print("\n" + "=" * 60)
    print("VIEW MANAGEMENT")
    print("=" * 60)
    
    # Get existing views
    views = model.GetRosetteViewList()
    print(f"  ✓ GetRosetteViewList: {len(views)} found")
    
    # Create a new view
    print("  Creating new Rosette view...")
    new_view = model.CreateRosetteView()
    view_value = new_view.GetValue()
    print(f"  ✓ CreateRosetteView: '{view_value.view_name}'")
    return new_view


# =============================================================================
# LEGEND AND SETTINGS DEMONSTRATIONS
# =============================================================================

def demonstrate_legend_and_settings(view, model):
    """Demonstrate legend visibility and settings."""
    print("\n" + "=" * 60)
    print("LEGEND AND SETTINGS")
    print("=" * 60)
    
    # Legend visibility
    view.SetLegendVisibility(True)
    print("  ✓ SetLegendVisibility: True")
    
    # IsWeighted
    view.SetIsWeighted(False)
    print("  ✓ SetIsWeighted: False")
    
    # Rosette settings - use GetDefault
    # RosetteSettings properties:
    #   - sight_line_orientation: TrendPlunge
    #   - min_angle: AngleData
    #   - max_angle: AngleData
    #   - start_bin_strike: AngleData
    #   - num_bins: int (number of bins/sectors)
    #   - custom_scaling: bool
    #   - num_planes_per_circle_increment: int
    #   - is_weighted: bool
    rosette_settings = model.GetDefaultRosetteSettings()
    rosette_settings.num_bins = 36
    rosette_settings.is_weighted = False
    view.SetRosetteSettings(rosette_settings)
    print("  ✓ SetRosetteSettings (36 bins)")
    
    # Projection mode - use GetDefault
    projection = model.GetDefaultStereonetProjectionMode()
    projection.hemisphere_draw_option = DipsApp.enums.eHemisphereDrawOption.Lower
    projection.projection_method_draw_option = DipsApp.enums.eProjectionMethodDrawOption.EqualArea
    view.SetProjectionMode(projection)
    print("  ✓ SetProjectionMode: Lower Hemisphere, EqualArea")


# =============================================================================
# GROUP VISIBILITY DEMONSTRATIONS
# =============================================================================

def demonstrate_group_visibility(view):
    """Demonstrate group visibility settings."""
    print("\n" + "=" * 60)
    print("GROUP VISIBILITY")
    print("=" * 60)
    
    view.SetUserPlaneEntityGroupVisibility(True)
    print("  ✓ SetUserPlaneEntityGroupVisibility: True")


# =============================================================================
# ENTITY REFERENCE DEMONSTRATIONS
# =============================================================================

def demonstrate_entity_references(view):
    """Demonstrate getting entity references."""
    print("\n" + "=" * 60)
    print("ENTITY REFERENCES")
    print("=" * 60)
    
    entities = view.GetUserPlaneEntityVisibilityList()
    print(f"  ✓ GetUserPlaneEntityVisibilityList: {len(entities)} found")


def demonstrate_individual_entity_visibility(view):
    """Demonstrate setting visibility for individual user planes."""
    print("\n" + "=" * 60)
    print("INDIVIDUAL ENTITY VISIBILITY")
    print("=" * 60)
    
    entities = view.GetUserPlaneEntityVisibilityList()
    if entities:
        entities[0].SetRosetteUserPlaneEntityVisibility(True)
        print("  ✓ SetRosetteUserPlaneEntityVisibility: True")
    else:
        print("  - SetRosetteUserPlaneEntityVisibility: No user planes available")


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

def demonstrate_active_data_filter(view, model):
    """Demonstrate active data filter management."""
    print("\n" + "=" * 60)
    print("ACTIVE DATA FILTER")
    print("=" * 60)
    
    # Get current active filter
    active_filter = view.GetActiveDataFilter()
    if active_filter:
        filter_value = active_filter.GetValue()
        print(f"  ✓ GetActiveDataFilter: '{filter_value.name}'")
    else:
        print("  ✓ GetActiveDataFilter: None (no active filter)")
    
    # Set active filter (if filters exist)
    filters = model.GetDataFilterList()
    if filters:
        view.SetActiveDataFilter(filters[0])
        filter_value = filters[0].GetValue()
        print(f"  ✓ SetActiveDataFilter: '{filter_value.name}'")
    else:
        print("  - SetActiveDataFilter: No filters available")


# =============================================================================
# VIEW CLOSE DEMONSTRATION
# =============================================================================

def demonstrate_close_view(view):
    """Demonstrate closing a view."""
    print("\n" + "=" * 60)
    print("CLOSE VIEW")
    print("=" * 60)
    
    view_value = view.GetValue()
    view_name = view_value.view_name
    view.CloseRosetteView()
    print(f"  ✓ CloseRosetteView: '{view_name}'")


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

def main():
    """Main demonstration function."""
    print("=" * 60)
    print("Dips API - Rosette Comprehensive Demo")
    print("=" * 60)
    
    # Connect to Dips
    print("\nConnecting to Dips application...")
    app = DipsApp.LaunchApp(62535)
    print("✓ Connected to Dips")
    model = app.GetModel()
    
    # Create sample data if needed
    print("\n" + "-" * 60)
    print("SAMPLE DATA SETUP")
    print("-" * 60)
    traverses = model.GetTraverseList()
    if len(traverses) == 0:
        print("Creating sample traverse with poles...")
        ods = create_sample_traverse_with_poles(model)
        model.AddTraverse(ods)
        print(f"  ✓ Created traverse with {len(ods.discontinuity_list)} poles")
    else:
        print(f"  ✓ Found {len(traverses)} existing traverse(s)")
    
    # Get or create a view
    views = model.GetRosetteViewList()
    if views:
        view = views[0]
        print(f"  Using existing view: '{view.GetValue().view_name}'")
    else:
        view = demonstrate_view_management(model)
    
    if view is None:
        print("  ✗ Could not create or find a Rosette view")
        return
    
    # Run all demonstrations
    demonstrate_legend_and_settings(view, model)
    demonstrate_group_visibility(view)
    demonstrate_entity_references(view)
    demonstrate_individual_entity_visibility(view)
    demonstrate_active_data_filter(view, model)
    
    # Create and close a new view to demonstrate view lifecycle
    print("\n" + "-" * 60)
    print("VIEW LIFECYCLE DEMO")
    print("-" * 60)
    new_view = model.CreateRosetteView()
    print(f"  ✓ Created new view: '{new_view.GetValue().view_name}'")
    demonstrate_close_view(new_view)
    
    # Show the application
    print("\n" + "-" * 60)
    app.Show()
    
    # Summary
    print("\n" + "=" * 60)
    print("DEMONSTRATION COMPLETE")
    print("=" * 60)
    print("""
Rosette services demonstrated (12 methods):

VIEW MANAGEMENT (3 methods):
  - GetRosetteViewList
  - CreateRosetteView
  - CloseRosetteView

LEGEND AND SETTINGS (4 methods):
  - SetLegendVisibility
  - SetIsWeighted
  - SetRosetteSettings
  - SetProjectionMode

GROUP VISIBILITY (1 method):
  - SetUserPlaneEntityGroupVisibility

ENTITY REFERENCE LISTS (1 method):
  - GetUserPlaneEntityVisibilityList

INDIVIDUAL ENTITY VISIBILITY (1 method):
  - SetRosetteUserPlaneEntityVisibility

DATA FILTER (2 methods):
  - GetActiveDataFilter
  - SetActiveDataFilter
""")


if __name__ == "__main__":
    main()