Rosette Tools Demo#

Demonstration of Rosette Tool functionality in Dips Python API.

This script demonstrates all Rosette tool services including: - Tool Group Visibility: All tools, Text, Arrow, Line, Polyline, Polygon, Rectangle, Ellipse, TrendLine - Tool CRUD operations: Add, Get, Update, Delete, SetVisibility for 8 tool types

Rosette supports 8 tool types (fewer than Stereonet2D which has 13): - Text, Arrow, Line, Polyline, Polygon, Rectangle, Ellipse, TrendLine

Note: General Rosette functionality is demonstrated in RosetteDemo.py

Code Snippet: RosetteToolsDemo.py#
"""
Demonstration of Rosette Tool functionality in Dips Python API.

This script demonstrates all Rosette tool services including:
- Tool Group Visibility: All tools, Text, Arrow, Line, Polyline, Polygon, Rectangle, Ellipse, TrendLine
- Tool CRUD operations: Add, Get, Update, Delete, SetVisibility for 8 tool types

Rosette supports 8 tool types (fewer than Stereonet2D which has 13):
- Text, Arrow, Line, Polyline, Polygon, Rectangle, Ellipse, TrendLine

Note: General Rosette functionality is demonstrated in RosetteDemo.py
"""

import math
from dips import DipsApp, BuiltInDataFormatters

# Helper value wrappers
from dips.AnchorPointVal import AnchorPointVal
from dips.Vector2DVal import Vector2DVal
from dips.LineFormatVal import LineFormatVal
from dips.TrendPlungeVal import TrendPlungeVal
from dips.ColorSurrogateVal import ColorSurrogateVal


# =============================================================================
# HELPER FUNCTIONS
# =============================================================================

def create_anchor_point(trend_deg: float, plunge_deg: float):
    """Create an AnchorPoint from degrees using spherical coordinates."""
    ap = AnchorPointVal()
    ap.coordinate_option = DipsApp.enums.eAnchorCoordinateOption.Spherical
    ap.spherical_point = TrendPlungeVal.FromTrendPlunge(trend_deg, plunge_deg)
    return ap


def create_vector2d(x: float, y: float):
    """Create a Vector2D."""
    v = Vector2DVal()
    v.x = x
    v.y = y
    return v


def create_line_format(color_rgb: tuple, width: float = 1.0):
    """Create a LineFormat with specified color and width."""
    lf = LineFormatVal()
    lf.color = ColorSurrogateVal.FromRGBA(*color_rgb)
    lf.line_width = width
    return lf


def create_text_tool(model, name: str, text: str, trend: float, plunge: float):
    """Create a configured TextToolEntityInfo."""
    tool = model.GetDefaultTextToolEntityInfo()
    tool.name = name
    tool.text = text
    tool.is_visible = True
    tool.anchor_point = create_anchor_point(trend, plunge)
    return tool


def create_arrow_tool(model, name: str, start_trend: float, start_plunge: float, end_trend: float, end_plunge: float):
    """Create a configured ArrowToolEntityInfo."""
    tool = model.GetDefaultArrowToolEntityInfo()
    tool.name = name
    tool.is_visible = True
    tool.anchor_point = create_anchor_point(start_trend, start_plunge)
    tool.anchor_point_secondary = create_anchor_point(end_trend, end_plunge)
    return tool


def create_line_tool(model, name: str, start_trend: float, start_plunge: float, end_trend: float, end_plunge: float):
    """Create a configured LineToolEntityInfo."""
    tool = model.GetDefaultLineToolEntityInfo()
    tool.name = name
    tool.is_visible = True
    tool.anchor_point = create_anchor_point(start_trend, start_plunge)
    tool.anchor_point_secondary = create_anchor_point(end_trend, end_plunge)
    return tool


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

def demonstrate_tool_group_visibility(view):
    """Demonstrate all tool group visibility settings."""
    print("\n" + "=" * 60)
    print("TOOL GROUP VISIBILITY")
    print("=" * 60)
    
    view.SetToolsEntityGroupVisibility(True)
    print("  ✓ SetToolsEntityGroupVisibility: True")
    
    view.SetTextToolEntityGroupVisibility(True)
    print("  ✓ SetTextToolEntityGroupVisibility: True")
    
    view.SetArrowToolEntityGroupVisibility(True)
    print("  ✓ SetArrowToolEntityGroupVisibility: True")
    
    view.SetLineToolEntityGroupVisibility(True)
    print("  ✓ SetLineToolEntityGroupVisibility: True")
    
    view.SetPolylineToolEntityGroupVisibility(True)
    print("  ✓ SetPolylineToolEntityGroupVisibility: True")
    
    view.SetPolygonToolEntityGroupVisibility(True)
    print("  ✓ SetPolygonToolEntityGroupVisibility: True")
    
    view.SetRectangleToolEntityGroupVisibility(True)
    print("  ✓ SetRectangleToolEntityGroupVisibility: True")
    
    view.SetEllipseToolEntityGroupVisibility(True)
    print("  ✓ SetEllipseToolEntityGroupVisibility: True")
    
    view.SetTrendLineToolEntityGroupVisibility(True)
    print("  ✓ SetTrendLineToolEntityGroupVisibility: True")


# =============================================================================
# TOOL MANAGEMENT - ALL 8 TOOL TYPES
# =============================================================================

def demonstrate_text_tool(view, model):
    """Demonstrate Text Tool CRUD operations."""
    print("\n  TEXT TOOL:")
    ref = None
    
    tool = create_text_tool(model, "Demo Text", "Hello Rosette!", 90, 45)
    ref = view.AddRosetteTextTool(tool)
    print("    ✓ AddRosetteTextTool")
    
    tool_list = view.GetRosetteTextToolList()
    print(f"    ✓ GetRosetteTextToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteTextToolVisibility(True)
        print("    ✓ SetRosetteTextToolVisibility")
        
        value = ref.GetValue()
        value.text = "Updated Text!"
        ref.UpdateRosetteTextTool(value)
        print("    ✓ UpdateRosetteTextTool")
        
        ref.DeleteRosetteTextTool()
        print("    ✓ DeleteRosetteTextTool")


def demonstrate_arrow_tool(view, model):
    """Demonstrate Arrow Tool CRUD operations."""
    print("\n  ARROW TOOL:")
    ref = None
    
    tool = create_arrow_tool(model, "Demo Arrow", 0, 0, 90, 45)
    ref = view.AddRosetteArrowTool(tool)
    print("    ✓ AddRosetteArrowTool")
    
    tool_list = view.GetRosetteArrowToolList()
    print(f"    ✓ GetRosetteArrowToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteArrowToolVisibility(True)
        print("    ✓ SetRosetteArrowToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Arrow"
        ref.UpdateRosetteArrowTool(value)
        print("    ✓ UpdateRosetteArrowTool")
        
        ref.DeleteRosetteArrowTool()
        print("    ✓ DeleteRosetteArrowTool")


def demonstrate_line_tool(view, model):
    """Demonstrate Line Tool CRUD operations."""
    print("\n  LINE TOOL:")
    ref = None
    
    tool = create_line_tool(model, "Demo Line", 45, 30, 135, 60)
    ref = view.AddRosetteLineTool(tool)
    print("    ✓ AddRosetteLineTool")
    
    tool_list = view.GetRosetteLineToolList()
    print(f"    ✓ GetRosetteLineToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteLineToolVisibility(True)
        print("    ✓ SetRosetteLineToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Line"
        ref.UpdateRosetteLineTool(value)
        print("    ✓ UpdateRosetteLineTool")
        
        ref.DeleteRosetteLineTool()
        print("    ✓ DeleteRosetteLineTool")


def demonstrate_polyline_tool(view, model):
    """Demonstrate Polyline Tool CRUD operations."""
    print("\n  POLYLINE TOOL:")
    ref = None
    
    tool = model.GetDefaultPolylineToolEntityInfo()
    tool.name = "Demo Polyline"
    tool.is_visible = True
    tool.line_format = create_line_format((0, 128, 0), 2)
    tool.points.append(create_vector2d(0.0, 0.0))
    tool.points.append(create_vector2d(0.5, 0.3))
    tool.points.append(create_vector2d(1.0, 0.0))
    ref = view.AddRosettePolylineTool(tool)
    print("    ✓ AddRosettePolylineTool")
    
    tool_list = view.GetRosettePolylineToolList()
    print(f"    ✓ GetRosettePolylineToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosettePolylineToolVisibility(True)
        print("    ✓ SetRosettePolylineToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Polyline"
        ref.UpdateRosettePolylineTool(value)
        print("    ✓ UpdateRosettePolylineTool")
        
        ref.DeleteRosettePolylineTool()
        print("    ✓ DeleteRosettePolylineTool")


def demonstrate_polygon_tool(view, model):
    """Demonstrate Polygon Tool CRUD operations."""
    print("\n  POLYGON TOOL:")
    ref = None
    
    tool = model.GetDefaultPolygonToolEntityInfo()
    tool.name = "Demo Polygon"
    tool.is_visible = True
    tool.line_format = create_line_format((128, 0, 128), 2)
    tool.points.append(create_vector2d(0.0, 0.0))
    tool.points.append(create_vector2d(0.5, 0.5))
    tool.points.append(create_vector2d(1.0, 0.0))
    ref = view.AddRosettePolygonTool(tool)
    print("    ✓ AddRosettePolygonTool")
    
    tool_list = view.GetRosettePolygonToolList()
    print(f"    ✓ GetRosettePolygonToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosettePolygonToolVisibility(True)
        print("    ✓ SetRosettePolygonToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Polygon"
        ref.UpdateRosettePolygonTool(value)
        print("    ✓ UpdateRosettePolygonTool")
        
        ref.DeleteRosettePolygonTool()
        print("    ✓ DeleteRosettePolygonTool")


def demonstrate_rectangle_tool(view, model):
    """Demonstrate Rectangle Tool CRUD operations."""
    print("\n  RECTANGLE TOOL:")
    ref = None
    
    tool = model.GetDefaultRectangleToolEntityInfo()
    tool.name = "Demo Rectangle"
    tool.is_visible = True
    tool.line_format = create_line_format((255, 128, 0), 2)
    tool.first_corner = create_vector2d(-0.5, -0.5)
    tool.second_corner = create_vector2d(0.5, 0.5)
    ref = view.AddRosetteRectangleTool(tool)
    print("    ✓ AddRosetteRectangleTool")
    
    tool_list = view.GetRosetteRectangleToolList()
    print(f"    ✓ GetRosetteRectangleToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteRectangleToolVisibility(True)
        print("    ✓ SetRosetteRectangleToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Rectangle"
        ref.UpdateRosetteRectangleTool(value)
        print("    ✓ UpdateRosetteRectangleTool")
        
        ref.DeleteRosetteRectangleTool()
        print("    ✓ DeleteRosetteRectangleTool")


def demonstrate_ellipse_tool(view, model):
    """Demonstrate Ellipse Tool CRUD operations."""
    print("\n  ELLIPSE TOOL:")
    ref = None
    
    tool = model.GetDefaultEllipseToolEntityInfo()
    tool.name = "Demo Ellipse"
    tool.is_visible = True
    tool.line_format = create_line_format((0, 128, 128), 2)
    tool.first_corner = create_vector2d(-0.3, -0.3)
    tool.second_corner = create_vector2d(0.3, 0.3)
    ref = view.AddRosetteEllipseTool(tool)
    print("    ✓ AddRosetteEllipseTool")
    
    tool_list = view.GetRosetteEllipseToolList()
    print(f"    ✓ GetRosetteEllipseToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteEllipseToolVisibility(True)
        print("    ✓ SetRosetteEllipseToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated Ellipse"
        ref.UpdateRosetteEllipseTool(value)
        print("    ✓ UpdateRosetteEllipseTool")
        
        ref.DeleteRosetteEllipseTool()
        print("    ✓ DeleteRosetteEllipseTool")


def demonstrate_trendline_tool(view, model):
    """Demonstrate TrendLine Tool CRUD operations."""
    print("\n  TREND LINE TOOL:")
    ref = None
    
    tool = model.GetDefaultTrendLineToolEntityInfo()
    tool.name = "Demo TrendLine"
    tool.is_visible = True
    tool.trend.angle_radians = math.radians(45)
    ref = view.AddRosetteTrendLineTool(tool)
    print("    ✓ AddRosetteTrendLineTool")
    
    tool_list = view.GetRosetteTrendLineToolList()
    print(f"    ✓ GetRosetteTrendLineToolList: {len(tool_list)} found")
    
    if ref:
        ref.SetRosetteTrendLineToolVisibility(True)
        print("    ✓ SetRosetteTrendLineToolVisibility")
        
        value = ref.GetValue()
        value.name = "Updated TrendLine"
        ref.UpdateRosetteTrendLineTool(value)
        print("    ✓ UpdateRosetteTrendLineTool")
        
        ref.DeleteRosetteTrendLineTool()
        print("    ✓ DeleteRosetteTrendLineTool")


def demonstrate_all_tools(view, model):
    """Demonstrate all 8 tool types."""
    print("\n" + "=" * 60)
    print("TOOL MANAGEMENT (All 8 Tool Types)")
    print("=" * 60)
    
    demonstrate_text_tool(view, model)
    demonstrate_arrow_tool(view, model)
    demonstrate_line_tool(view, model)
    demonstrate_polyline_tool(view, model)
    demonstrate_polygon_tool(view, model)
    demonstrate_rectangle_tool(view, model)
    demonstrate_ellipse_tool(view, model)
    demonstrate_trendline_tool(view, model)


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

def main():
    """Main demonstration function."""
    print("=" * 60)
    print("Dips API - Rosette Tools Demo")
    print("=" * 60)
    
    # Connect to Dips
    print("\nConnecting to Dips application...")
    app = DipsApp.LaunchApp(62535)
    print("✓ Connected to Dips")
    
    model = app.GetModel()
    
    # Get or create a Rosette view
    print("\n" + "-" * 60)
    print("VIEW SETUP")
    print("-" * 60)
    views = model.GetRosetteViewList()
    if views:
        view = views[0]
        print(f"  Using existing view: '{view.GetValue().view_name}'")
    else:
        view = model.CreateRosetteView()
        print(f"  Created new view: '{view.GetValue().view_name}'")
    
    # Run demonstrations
    demonstrate_tool_group_visibility(view)
    demonstrate_all_tools(view, model)
    
    # Show the application
    app.Show()
    
    # Summary
    print("\n" + "=" * 60)
    print("DEMONSTRATION COMPLETE")
    print("=" * 60)
    print("""
All Rosette Tool services demonstrated (49 methods):

TOOL GROUP VISIBILITY (9 methods):
  - SetToolsEntityGroupVisibility
  - SetTextToolEntityGroupVisibility
  - SetArrowToolEntityGroupVisibility
  - SetLineToolEntityGroupVisibility
  - SetPolylineToolEntityGroupVisibility
  - SetPolygonToolEntityGroupVisibility
  - SetRectangleToolEntityGroupVisibility
  - SetEllipseToolEntityGroupVisibility
  - SetTrendLineToolEntityGroupVisibility

TOOLS - 8 tool types, 5 methods each (40 methods):
  Tool types: Text, Arrow, Line, Polyline, Polygon, Rectangle,
              Ellipse, TrendLine
  Methods per type:
    - AddRosette[ToolType]Tool
    - GetRosette[ToolType]ToolList
    - UpdateRosette[ToolType]Tool
    - DeleteRosette[ToolType]Tool
    - SetRosette[ToolType]ToolVisibility
""")


if __name__ == "__main__":
    main()