#
# 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.
#
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
from Microsoft.Win32 import OpenFileDialog



#setting pre-defined properties of tool_propertyContainer
def getUIContent():
	my_toolProperty = apex_sdk.ToolPropertyContainer()
	
	my_toolProperty.TitleText = "Create 1d connectors ** Only for test **"
	
	file_path = os.path.dirname(os.path.realpath(__file__))
	my_toolProperty.TitleImageUriString = file_path + '/res/ConnectorsFromCurves.png'
	
	
	my_toolProperty.WorkFlowInstructions = """<HTML><BODY><P STYLE=\"font-size:10;\"><SPAN>Identifies CAD Bolts and creates 1d connectors.</SPAN></P>
	<P><SPAN> </SPAN></P>
	<P STYLE=\"font-size:10;\"><SPAN>Identify bolts and connect to geoemtry. ** Make sure to validate Huth stiffness before use in production **<br>
	Creates 1D connectotr of selected at location indiated by piercing curves<br>
	</SPAN></P>
	<P><SPAN> </SPAN></P>
	<P STYLE=\"font-size:10;\"><SPAN>Send questions, comments to stefan.tynelius@hexagon.com <br>
	Elvis sightings are as usual reported to larry.pearce@hexagon.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, 8, 2)
	
	iRow = 1
	
	#global nameTextBox
	#nameTextBox = createDataBox(my_Grid, "Name: ", "", iRow, 0)
	#iRow += 1
	
	global fastenerTypeComboBox, fastenerTypeTextBlock
	fastenerTypeTextBlock = createTextBlock(my_Grid, "Fastener Type:", iRow, 0)
	fastenerTypeComboBox  = createComboBox(my_Grid, iRow, 1)
	#updateComboBox(fastenerTypeComboBox, ["Flexible Link","Discrete Tie RBE2-dof 123", "Rigid Link", "Huth-Connector"])
	updateComboBox(fastenerTypeComboBox, ["Flexible Link","Discrete Tie RBE2-dof 123", "Rigid Link", "Huth-Connector","Rutman"])
	fastenerTypeComboBox.SelectedIndex = 0
	iRow += 1
	
	fastenerTypeComboBox.SelectionChanged += fastenerTypeComboBoxCB
	
	global toleranceTextBox, toleranceTextBlock
	toleranceTextBlock = createTextBlock(my_Grid, "Tolerance:", iRow, 0)
	toleranceTextBox   = createTextBox(my_Grid, "0.5", iRow, 1)
	iRow += 1
	
	toleranceTextBlock.Visibility = System.Windows.Visibility.Visible
	toleranceTextBox.Visibility  = System.Windows.Visibility.Visible
	
	
	
	global diaTextBox, diaTextBlock
	diaTextBlock = createTextBlock(my_Grid, "Diameter:", iRow, 0)
	diaTextBox   = createTextBox(my_Grid, "10.0", iRow, 1)
	iRow += 1
	

	
	
	global matlComboBox, matlComboTextBlock
	matlComboTextBlock = createTextBlock(my_Grid, "Material:", iRow, 0)
	matlComboBox       = createComboBox(my_Grid, iRow, 1)
	iRow += 1
	
	matlComboTextBlock.Visibility = System.Windows.Visibility.Visible
	matlComboBox.Visibility       = System.Windows.Visibility.Visible
	
	
	file_path = os.path.dirname(os.path.realpath(__file__))
	script_path= os.path.join(file_path, 'auGetMaterials.py')
	apex_sdk.runScriptFunction(script_path, "main", callback=getMatls)
	
	global stiffnessComboTextBlock, stiffnessComboBox
	stiffnessComboTextBlock = createTextBlock(my_Grid, "Stiffness:", iRow, 0)
	stiffnessComboBox  = createComboBox(my_Grid, iRow, 1)
	updateComboBox(stiffnessComboBox, ["Nastran QRG"])
	iRow += 1
	
	
	stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
	stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
	
	global distributionTypeComboBox, distributionTypeTextBlock
	distributionTypeTextBlock = createTextBlock(my_Grid, "Distribution Type:", iRow, 0)
	distributionTypeComboBox  = createComboBox(my_Grid, iRow, 1)
	updateComboBox(distributionTypeComboBox, ["Compliant - RBE3 ", "Rigid - RBE2"])
	distributionTypeComboBox.SelectedIndex = 1
	iRow += 1
	
	distributionTypeTextBlock.Visibility = System.Windows.Visibility.Visible
	distributionTypeComboBox.Visibility  = System.Windows.Visibility.Visible
	
	# global clearXtraVerts_Toggle
	# clearXtraVerts_Toggle  = createCheckBox2(my_Grid, "Clear Extra Vertices", iRow, 0)
	# clearXtraVerts_Toggle.IsChecked= System.Nullable[System.Boolean](True)
	# iRow += 1
	
	
	global HuthParamComboBox
	global HuthParamTextBlock
	HuthParamTextBlock = createTextBlock(my_Grid, "Huth Connector Type:", iRow, 0)
	HuthParamComboBox  = createComboBox(my_Grid, iRow, 1)
	updateComboBox(HuthParamComboBox, ["Bolted metallic", "Riveted metallic", "Bolted graphite/epoxy"])
	#HuthParamComboBox=createComboBox(my_Grid, "Huth Connector Type:", ["Bolted metallic", "Riveted metallic", "Bolted graphite/epoxy"], 1, 3, 0)
	
	# Set Visibility as per defeault choice
	#diaTextBlock.Visibility       = System.Windows.Visibility.Collapsed
	#diaTextBox.Visibility         = System.Windows.Visibility.Collapsed
	toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
	toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
	HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
	HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed
	

	return my_Grid




def fastenerTypeComboBoxCB(sender, event):
	# I need to learn and understand sender and event
	global fastenerTypeComboBox
	global diaTextBlock, diaTextBox
	global matlComboTextBlock, matlComboBox
	global stiffnessComboTextBlock, stiffnessCombBox
	
	choices = fastenerTypeComboBox.SelectedValue.ToString().split(":")
	choice = choices[len(choices)-1].lstrip().rstrip()
	
	if choice == "Rigid Link":
		diaTextBlock.Visibility       = System.Windows.Visibility.Collapsed
		diaTextBox.Visibility         = System.Windows.Visibility.Collapsed
		matlComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		matlComboBox.Visibility       = System.Windows.Visibility.Collapsed
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Visible
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Visible
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
		HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed
		
		
	elif choice == "Flexible Link":
		diaTextBlock.Visibility       = System.Windows.Visibility.Visible
		diaTextBox.Visibility         = System.Windows.Visibility.Visible
		matlComboTextBlock.Visibility = System.Windows.Visibility.Visible
		matlComboBox.Visibility       = System.Windows.Visibility.Visible
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Visible
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Visible
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
		HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed
		
	elif choice == "Discrete Tie RBE2-dof 123":
		diaTextBlock.Visibility       = System.Windows.Visibility.Collapsed
		diaTextBox.Visibility         = System.Windows.Visibility.Collapsed
		matlComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		matlComboBox.Visibility       = System.Windows.Visibility.Collapsed
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Visible
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Visible
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
		HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed
		
	elif choice == "Huth-Connector":
		diaTextBlock.Visibility       = System.Windows.Visibility.Visible
		diaTextBox.Visibility         = System.Windows.Visibility.Visible
		matlComboTextBlock.Visibility = System.Windows.Visibility.Visible
		matlComboBox.Visibility       = System.Windows.Visibility.Visible
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Collapsed
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Collapsed
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed	
		HuthParamComboBox.Visibility = System.Windows.Visibility.Visible
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Visible
		
	elif choice == "Rutman":
		diaTextBlock.Visibility       = System.Windows.Visibility.Visible
		diaTextBox.Visibility         = System.Windows.Visibility.Visible
		matlComboTextBlock.Visibility = System.Windows.Visibility.Visible
		matlComboBox.Visibility       = System.Windows.Visibility.Visible
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Collapsed
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Collapsed
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
		HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed	
		
		
		
	else:  
		diaTextBlock.Visibility       = System.Windows.Visibility.Collapsed
		diaTextBox.Visibility         = System.Windows.Visibility.Collapsed
		matlComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		matlComboBox.Visibility       = System.Windows.Visibility.Collapsed
		stiffnessComboTextBlock.Visibility = System.Windows.Visibility.Collapsed
		stiffnessComboBox.Visibility       = System.Windows.Visibility.Collapsed
		distributionTypeTextBlock.Visibility = System.Windows.Visibility.Collapsed
		distributionTypeComboBox.Visibility  = System.Windows.Visibility.Collapsed
		toleranceTextBlock.Visibility = System.Windows.Visibility.Collapsed
		toleranceTextBox.Visibility  = System.Windows.Visibility.Collapsed
		HuthParamComboBox.Visibility = System.Windows.Visibility.Collapsed
		HuthParamTextBlock.Visibility = System.Windows.Visibility.Collapsed
		
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, row, col):
	comboBox = WPFControls.ComboBox()
	
	comboBox.Margin = System.Windows.Thickness(5.)
	
	WPFControls.Grid.SetRow(comboBox, row)
	WPFControls.Grid.SetColumn(comboBox, col)
	
	parent.Children.Add(comboBox)
	
	return comboBox



def updateComboBox(comboBox, comboItems):
	
	for comboItem in comboItems:
		item = WPFControls.ComboBoxItem()
		item.Content=comboItem
		comboBox.Items.Add(item)
	
	comboBox.SelectedIndex="0"



def createTextBlock(parent, text, row, col):
	textBlock = WPFControls.TextBlock()
	textBlock.Text = text
	
	textBlock.Margin = System.Windows.Thickness(5.)
	
	WPFControls.Grid.SetRow(textBlock, row)
	WPFControls.Grid.SetColumn(textBlock, col)
	parent.Children.Add(textBlock)
	
	return textBlock



def createTextBox(parent, value, row, col):
	textBox =WPFControls.TextBox()
	
	textBox.Margin = System.Windows.Thickness(5.)
	
	WPFControls.Grid.SetRow(textBox, row)
	WPFControls.Grid.SetColumn(textBox, col)
	textBox.Text=value
	
	parent.Children.Add(textBox)
	
	return textBox



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



def createCheckBox2(parent, label, row, col):

	checkBox = WPFControls.CheckBox()
	checkBox.Content = label
	WPFControls.Grid.SetRow(checkBox, row)
	WPFControls.Grid.SetColumn(checkBox, col)
	
	parent.Children.Add(checkBox)
	
	return checkBox


#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






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

	
	choices = matlComboBox.SelectedValue.ToString().split(":")
	choice = choices[len(choices)-1].lstrip().rstrip()
	dictionary["material"] = choice
	dictionary["distributionType"] = distributionTypeComboBox.Text
	
	choices = fastenerTypeComboBox.SelectedValue.ToString().split(":")
	choice = choices[len(choices)-1].lstrip().rstrip()
	dictionary["fastenerType"] = choice	

	dictionary["SearchTol"] = toleranceTextBox.Text
	
	dictionary["diameter"]  = diaTextBox.Text
	#dictionary["name"]      = nameTextBox.Text
	
	huthParam=HuthParamComboBox.SelectedValue.ToString().split(":")
	huthType = huthParam[len(huthParam)-1].lstrip().rstrip()
	
	#dictionary["fastenerType"]    = choice
	#dictionary["material"] = materialTextBox.Text
	dictionary["diameter"]  = diaTextBox.Text
	dictionary["HuthType"]  = huthType
	
	file_path = os.path.dirname(os.path.realpath(__file__))
	script_path= os.path.join(file_path, 'CreateConnectorsFromCurves_v1.py')
	
	apex_sdk.runScriptFunction(script_path, "main", dictionary)
	
	
	
	
	
	
# exit button (red) from tool header
@apex_sdk.errorhandler
def HandleExitButton():
	return
	# print("HandleExitButton")
	# file_path = os.path.dirname(os.path.realpath(__file__))
	# script_path= os.path.join(file_path, 'IdentifyBoltsCreate1dConnectors_v02e.py')
	# # Create a Dictionary to store the user defined tool data  
	# dictionary = {}
	
	# #choices = frameTypeComboBox.SelectedValue.ToString().split(":")
	# #choice = choices[len(choices)-1].lstrip().rstrip()
	
	# apex_sdk.runScriptFunction(script_path, "exectuteOnExit", dictionary)






#This function receives data from the Script API function and updates the Tool UI 
@apex_sdk.errorhandler
def getMatls():
	global matlComboBox
	
	ret_dict = apex_sdk.getScriptFunctionReturnData()
	
	matls = ret_dict["matlList"]
	
	updateComboBox(matlComboBox, matls)

