#
# Copyright © 2020 MSC.Software Corporation
#  
# Permission to use Scripts
#  
# Permission is granted to MSC.Software customers with valid licenses of the MSC Apex™ software 
# to use script files posted on this page (collectively “Scripts”) solely for customers’ own authorized 
# internal use in conjunction with licensed use of the MSC Apex software.  
# No other use is permitted.  No license to MSC Apex or other software is granted under this Permission.
#  
# SCRIPTS ARE PROVIDED ON AN "AS-IS" BASIS, WITH NO WARRANTIES OF ANY KIND.  USE OF THE SCRIPTS IS AT CUSTOMER'S SOLE RISK.
#  
# IN NO EVENT SHALL MSC.SOFTWARE CORPORATION, ITS AFFILIATES, SUBSIDIARIES, SUPPLIERS, AGENTS, REPRESENTATIVES OR EMPLOYEES BE LIABLE FOR ANY 
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, TORT, 
# STRICT LIABILITY, OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION USE OF THE SCRIPTS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
#  
# Customer shall indemnify, defend and hold MSC.Software Corporation, its affiliates, subsidiaries, suppliers, agents, 
# employees or representatives (collectively, “Indemnified Parties”) harmless from and against any third-party claims 
# brought against Indemnified Parties rising out of or in connection with Customer’s use of the Scripts.
#
# Author: Larry Pearce
# Revised by: Larry Pearce
# Revision History
# Date         Change                                 By
# 2020-10-13   Original code                          Larry Pearce

import os
import apex_sdk

# .NET references
import System
import System.Windows.Controls as WPFControls


# setting pre-defined properties of tool_propertyContainer
def getUIContent():
    my_toolProperty = apex_sdk.ToolPropertyContainer()

    my_toolProperty.TitleText = "Reconnect Broken P2P Connectors 1.0"

    file_path = os.path.dirname(os.path.realpath(__file__))
    my_toolProperty.TitleImageUriString = file_path+"../res/auFixBrokenConnectors.png"

    my_toolProperty.WorkFlowInstructions = """<HTML><BODY><P STYLE=\"font-size:10;\"><SPAN>Updates broken point to point connections.</SPAN></P>
    <P><SPAN>Re-connects point-to-point connections that are broken after re-mesh.  This tool uses the attributes from other scripts that were 
    used to create the connections initially to determine the end locations of the connections.  The closest node tolerance is used to screen for 
    the closest node to the connector interface location.</SPAN></P>
    <P><SPAN> </SPAN></P>
    <P STYLE=\"font-size:10;\"><SPAN>Send questions, comments and Elvis sightings to larry.pearce@mscsoftware.com</SPAN></P></BODY></HTML>"""

    # handle apply button (green) click event
    my_toolProperty.AppliedCommand = apex_sdk.ActionCommand(System.Action(HandleApplyButton))
    # handle exit button (red) click event
    my_toolProperty.ExitCommand = apex_sdk.ActionCommand(System.Action(HandleExitButton))

    my_toolProperty.ToolPropertyContent = getCustomToolPropertyContent()

    # define pickFiterTools
    # my_toolProperty.ShowPickChoice = True
    my_toolProperty.IsCustomTool = True
    # setPickFilterTools()
    # my_toolProperty.PickFilterList = setPickFilterTools()

    return my_toolProperty


def getCustomToolPropertyContent():

    my_Grid = WPFControls.Grid()

    createLayout(my_Grid, 4, 2)

    iRow = 1

    global toleranceTextBox
    toleranceTextBox = createDataBox(my_Grid, "Closest Node Tol: ", "0.01", iRow, 0)
    iRow += 1

    return my_Grid


def createLayout(parent, numRows, numCols):
    for k in range(numRows):
        parent.RowDefinitions.Add(WPFControls.RowDefinition())
    for k in range(numCols):
        parent.ColumnDefinitions.Add(WPFControls.ColumnDefinition())


def createComboBox(parent, title, labels, selected, row, col):
    textBlock = WPFControls.TextBlock()
    textBlock.Text = title
    WPFControls.Grid.SetRow(textBlock, row)
    WPFControls.Grid.SetColumn(textBlock, col)

    parent.Children.Add(textBlock)

    comboBox = WPFControls.ComboBox()
    for label in labels:
        item = WPFControls.ComboBoxItem()
        item.Content=label
        comboBox.Items.Add(item)

    WPFControls.Grid.SetRow(comboBox, row)
    WPFControls.Grid.SetColumn(comboBox, col+1)

    if selected > len(labels): selected = 0
    comboBox.SelectedIndex=str(selected)

    parent.Children.Add(comboBox)

    return comboBox


def createDataBox(parent, title, value, row, col):
    textBlock = WPFControls.TextBlock()
    textBlock.Text = title
    WPFControls.Grid.SetRow(textBlock, row)
    WPFControls.Grid.SetColumn(textBlock, col)

    textBox =WPFControls.TextBox()
    WPFControls.Grid.SetRow(textBox, row)
    WPFControls.Grid.SetColumn(textBox, col+1)
    textBox.Text=value

    parent.Children.Add(textBlock)
    parent.Children.Add(textBox)

    return textBox


# set pickFilers
# some pick choices are commented out
def setPickFilterTools():
    pickChoices = System.Collections.Generic.List[System.String]()

    #exclusive picking and visibility picking
    pickChoices.Add(apex_sdk.PickFilterTypes.ExclusivePicking)
    pickChoices.Add(apex_sdk.PickFilterTypes.VisibilityPicking)

    #Assembly and part
    #pickChoices.Add(apex_sdk.PickFilterTypes.Assembly)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Part)

    #Bodies
    #pickChoices.Add(apex_sdk.PickFilterTypes.SolidMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Solid)
    #pickChoices.Add(apex_sdk.PickFilterTypes.SurfaceMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Surface)
    #pickChoices.Add(apex_sdk.PickFilterTypes.CurveMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Curve)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Point)

    #features
    #pickChoices.Add(apex_sdk.PickFilterTypes.CellMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.FaceMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.EdgeMesh)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Cell)
    #pickChoices.Add(apex_sdk.PickFilterTypes.VertexMesh)

    #Lower Dimensional Entities
    #pickChoices.Add(apex_sdk.PickFilterTypes.Element3D)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Element2D)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Face)
    #pickChoices.Add(apex_sdk.PickFilterTypes.MeshSeed)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Element1D)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Edge)
    #pickChoices.Add(apex_sdk.PickFilterTypes.SeedPoint)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Node)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Vertex)

    #Sub Lower Dimensional Entities
    #pickChoices.Add(apex_sdk.PickFilterTypes.ElementEdge)
    #pickChoices.Add(apex_sdk.PickFilterTypes.ElementFace)

    #Interactions and connections
    #pickChoices.Add(apex_sdk.PickFilterTypes.DiscreteTie)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Connector)
    #pickChoices.Add(apex_sdk.PickFilterTypes.EdgeTie)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Joint)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Glue)

    #LBCs
    #pickChoices.Add(apex_sdk.PickFilterTypes.Pressure)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Gravity)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Constraint)
    #pickChoices.Add(apex_sdk.PickFilterTypes.ForceMoment)
    #pickChoices.Add(apex_sdk.PickFilterTypes.EnforcedMotion)

    #Attributes and other objects
    #pickChoices.Add(apex_sdk.PickFilterTypes.CompositeZone)
    #pickChoices.Add(apex_sdk.PickFilterTypes.LayeredPanel)
    #pickChoices.Add(apex_sdk.PickFilterTypes.InterfacePoint)
    #pickChoices.Add(apex_sdk.PickFilterTypes.PointMass)
    #pickChoices.Add(apex_sdk.PickFilterTypes.BeamSpan)
    #pickChoices.Add(apex_sdk.PickFilterTypes.Offset)

    #Sensors
    #pickChoices.Add(apex_sdk.PickFilterTypes.MotionEnvelopeSensor)
    #pickChoices.Add(apex_sdk.PickFilterTypes.ClearanceSensor)
    #pickChoices.Add(apex_sdk.PickFilterTypes.CrossSectionSensor)
    #pickChoices.Add(apex_sdk.PickFilterTypes.PointSensor)

    #Coordinate system
    #pickChoices.Add(apex_sdk.PickFilterTypes.CoordinateSystem)

    return pickChoices


@apex_sdk.errorhandler
def HandleApplyButton():
    # Create a Dictionary to store the user defined tool data
    dictionary = {}

    dictionary["tolerance"] = toleranceTextBox.Text

    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auUpdateConnectors.py')

    apex_sdk.runScriptFunction(script_path, "main", dictionary)


# exit button (red) from tool header
@apex_sdk.errorhandler
def HandleExitButton():
    print("HandleExitButton")

