Mechanical Python Code example - write nodal information to .csv file

I have a model where several nodal named selections are defined:
etc. These named selection are named with the format "nodalns_fvf_XX".
I also have a .csv file, saved in the user_files directory of the project. This .csv file will be used to define a 3D look-up table in ACP. The "XX" value in the named selection's name will define the fiber volume fraction to be used on that node ("XX" in the NS name defines a FVF of 0.XX, ie "nodalns_fvf_50" should define a fiber volume fraction of 0.50 for all nodes in this named selection).
I want a script that will:
- loop through all named selections
- identify the named selections with the specific names (in this case, that their name contains "nodalns_fvf"
- for each node in these named selection, write to the csv file the (X,Y,Z) position of the node, and the fiber volume fraction to be used on that node.
Answers
-
Below is an example script that will do exactly that:
- # Import necessary modules
- import os
- from os.path import exists
- import wbjn
- import clr
- clr.AddReference("Microsoft.Office.Interop.Excel")
- import Microsoft.Office.Interop.Excel as Excel
- from System import Array
- # Open Excel instance
- excel = Excel.ApplicationClass()
- excel.Visible = True
- # Open pre-existing Excel file
- user_files = wbjn.ExecuteCommand(ExtAPI, "returnValue(GetUserFilesDirectory())")
- filename = os.path.join(user_files,'LookUpTable3D.csv')
- workbook = excel.Workbooks.Open(filename)
- worksheet = workbook.Worksheets("LookUpTable3D")
- # Clear existing data
- worksheet.Range("A14:D10000").ClearContents()
- # Get list of named selection which name contains "nodalns_fvf"
- ns_fiberVolumeFraction = [ns for ns in ExtAPI.DataModel.GetObjectsByType(DataModelObjectCategory.NamedSelection) if 'nodalns_fvf' in ns.Name]
- # Extract data (from ns name and nodes in ns)
- mesh_data = ExtAPI.DataModel.MeshDataByName('Global')
- X_pos = []
- Y_pos = []
- Z_pos = []
- fiber_vf = []
- for ns in ns_fiberVolumeFraction:
- for node in ns.Location:
- X_pos.append(mesh_data.NodeById(node).X)
- Y_pos.append(mesh_data.NodeById(node).Y)
- Z_pos.append(mesh_data.NodeById(node).Z)
- fiber_vf.append("0."+ ns.Name.Split('_')[-1])
- # Write data to Excel file
- len_data = len(X_pos)
- range_data = "A14:D"+str(len_data)
- xlrange = worksheet.Range[range_data]
- data = Array.CreateInstance(object,len_data, 4)
- for row in range(len_data):
- for column in range(4):
- data[row, 0] = X_pos[row]
- data[row, 1] = Y_pos[row]
- data[row, 2] = Z_pos[row]
- data[row, 3] = fiber_vf[row]
- xlrange.Value2 = data
- # Save file and exit
- workbook.Save()
- workbook.Close(True)
- excel.Quit()
For the script to be executed each time the mesh is generated, simply place it in a Python Code object and use the "After Mesh Generated" callback:
The returned .csv file is as follows:
1 -
See also this post for a way to do this in ACP: https://discuss.ansys.com/discussion/1999/acp-script-example-create-3d-lookuptable#latest
0