#
# 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-12   Original code (2.0)                    Larry Pearce

import sys
import os
import apex_sdk
import clr

#.NET references
import System
import System.Windows.Controls as WPFControls
from System.Windows.Automation import AutomationProperties

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

    my_toolProperty.TitleText = "Find short/small edges/faces 2.0"

    file_path = os.path.dirname(os.path.realpath(__file__))
    my_toolProperty.TitleImageUriString = os.path.join(os.path.dirname(file_path), r"res\auFindShortandSmall.png")

    my_toolProperty.WorkFlowInstructions = """<HTML><BODY><P STYLE=\"font-size:10;\"><SPAN>Highlights short geometry edges and small face areas</SPAN></P>
    <P><SPAN> </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))

    # set property content
    my_toolProperty.ToolPropertyContent = getCustomToolPropertyContent()

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

    #return my_toolProperty
    return my_toolProperty



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

    #Tool Registration
    #Tool Name has to be the same
    #apex_sdk.PickFilterRegistration.RegisterTool("Auto Tie Nodes", pickChoices)
    return pickChoices



def getCustomToolPropertyContent():
    my_Grid = WPFControls.Grid()
    createLayout(my_Grid, 12, 2)

    row = col = 0

    global shortEdgeTextBox
    shortEdgeTextBox = createDataBox(my_Grid, "Short Edge Target:", "0.1", row, col)
    row += 1

    global smallAreaTextBox
    smallAreaTextBox = createDataBox(my_Grid, "Small Area Target:", "0.1", row, col)
    row += 1

    sep = WPFControls.Separator()
    sep.Margin = System.Windows.Thickness(5.)
    sep.Opacity = (1.0)
    sep.HorizontalAlignment = 3
    WPFControls.Grid.SetColumnSpan(sep, 2)
    WPFControls.Grid.SetRow(sep, row)
    WPFControls.Grid.SetColumn(sep, col)
    my_Grid.Children.Add(sep)
    row += 1

    highlightShortEdgesBtn = WPFControls.Button()
    highlightShortEdgesBtn.Content="Highlight Short Edges"
    highlightShortEdgesBtn.Click+=HandleHighlightShortEdgesBtn
    WPFControls.Grid.SetColumnSpan(highlightShortEdgesBtn, 2)
    WPFControls.Grid.SetRow(highlightShortEdgesBtn, row)
    WPFControls.Grid.SetColumn(highlightShortEdgesBtn, col)
    my_Grid.Children.Add(highlightShortEdgesBtn)
    highlightShortEdgesBtn.Margin = System.Windows.Thickness(5.)
    row += 1

    highlightSmallFacesBtn = WPFControls.Button()
    highlightSmallFacesBtn.Content="Highlight Small Faces"
    highlightSmallFacesBtn.Click+=HandleHighlightSmallFacesBtn
    WPFControls.Grid.SetColumnSpan(highlightSmallFacesBtn, 2)
    WPFControls.Grid.SetRow(highlightSmallFacesBtn, row)
    WPFControls.Grid.SetColumn(highlightSmallFacesBtn, col)
    my_Grid.Children.Add(highlightSmallFacesBtn)
    highlightSmallFacesBtn.Margin = System.Windows.Thickness(5.)
    row += 1

    clearHighlightsBtn = WPFControls.Button()
    clearHighlightsBtn.Content="Clear Highlights"
    clearHighlightsBtn.Click+=HandleClearHighlightsBtn
    WPFControls.Grid.SetColumnSpan(clearHighlightsBtn, 2)
    WPFControls.Grid.SetRow(clearHighlightsBtn, row)
    WPFControls.Grid.SetColumn(clearHighlightsBtn, col)
    my_Grid.Children.Add(clearHighlightsBtn)
    clearHighlightsBtn.Margin = System.Windows.Thickness(5.)
    row += 1

    sep = WPFControls.Separator()
    sep.Margin = System.Windows.Thickness(5.)
    sep.Opacity = (1.0)
    sep.HorizontalAlignment = 3
    WPFControls.Grid.SetColumnSpan(sep, 2)
    WPFControls.Grid.SetRow(sep, row)
    WPFControls.Grid.SetColumn(sep, col)
    my_Grid.Children.Add(sep)
    row += 1

    suppressShortEdgesBtn = WPFControls.Button()
    suppressShortEdgesBtn.Content="Suppress Short Edges"
    suppressShortEdgesBtn.Click+=HandleSuppressShortEdgesBtn
    WPFControls.Grid.SetColumnSpan(suppressShortEdgesBtn, 2)
    WPFControls.Grid.SetRow(suppressShortEdgesBtn, row)
    WPFControls.Grid.SetColumn(suppressShortEdgesBtn, col)
    my_Grid.Children.Add(suppressShortEdgesBtn)
    suppressShortEdgesBtn.Margin = System.Windows.Thickness(5.)
    row += 1

    suppressSmallFacesBtn = WPFControls.Button()
    suppressSmallFacesBtn.Content="Suppress Small Faces"
    suppressSmallFacesBtn.Click+=HandleSuppressSmallFacesBtn
    WPFControls.Grid.SetColumnSpan(suppressSmallFacesBtn, 2)
    WPFControls.Grid.SetRow(suppressSmallFacesBtn, row)
    WPFControls.Grid.SetColumn(suppressSmallFacesBtn, col)
    my_Grid.Children.Add(suppressSmallFacesBtn)
    suppressSmallFacesBtn.Margin = System.Windows.Thickness(5.)
    row += 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 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

    textBlock.Margin = System.Windows.Thickness(5.)
    textBox.Margin = System.Windows.Thickness(5.)

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

    return textBox



# apply button (green) from tool header
@apex_sdk.errorhandler
def HandleApplyButton():
    dictionary = {}
    dictionary["shortEdgeLength"] = shortEdgeTextBox.Text
    dictionary["smallFaceArea"]   = smallAreaTextBox.Text
    dictionary["mode"]            = "Highlight Short Edges"
    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auFindShortandSmall.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)



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



@apex_sdk.errorhandler
def HandleClearHighlightsBtn(sender, args):
    dictionary = {}
    dictionary["entities"] = "both"
    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path = os.path.join(file_path, 'auClearHighlights.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)



@apex_sdk.errorhandler
def HandleHighlightShortEdgesBtn(sender, args):
    dictionary = {}
    dictionary["shortEdgeLength"] = shortEdgeTextBox.Text
    dictionary["smallFaceArea"]   = smallAreaTextBox.Text
    dictionary["mode"]            = "Highlight Short Edges"

    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auFindShortandSmall.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)



@apex_sdk.errorhandler
def HandleHighlightSmallFacesBtn(sender, args):
    dictionary = {}
    dictionary["shortEdgeLength"] = shortEdgeTextBox.Text
    dictionary["smallFaceArea"]   = smallAreaTextBox.Text
    dictionary["mode"]            = "Highlight Small Faces"

    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auFindShortandSmall.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)



@apex_sdk.errorhandler
def HandleSuppressShortEdgesBtn(sender, args):
    dictionary = {}
    dictionary["shortEdgeLength"] = shortEdgeTextBox.Text
    dictionary["smallFaceArea"]   = smallAreaTextBox.Text
    dictionary["mode"]            = "Suppress Short Edges"

    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auFindShortandSmall.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)



@apex_sdk.errorhandler
def HandleSuppressSmallFacesBtn(sender, args):
    dictionary = {}
    dictionary["shortEdgeLength"] = shortEdgeTextBox.Text
    dictionary["smallFaceArea"]   = smallAreaTextBox.Text
    dictionary["mode"]            = "Suppress Small Faces"

    file_path = os.path.dirname(os.path.realpath(__file__))
    script_path= os.path.join(file_path, 'auFindShortandSmall.py')
    apex_sdk.runScriptFunction(script_path, "main", dictionary)
