Skip to main content

Granta MI Scripting Toolkit 4.2

Exporting data

Last update: 16.07.2025

Export the values of Ultimate tensile strength, Modulus, Baseline fiber volume, and Poisson's ratio for a set of records from the MI Training database.

This example demonstrates:

  • Retrieving a list of databases from a Granta MI server
  • Browsing the tables of a Granta MI database
  • Searching a Granta MI database using the CriteriaSearch operation
  • Retrieving values for attributes of a record

Create a Granta MI Session

Import the GRANTA_MIScriptingToolkit package, and create a connection to a Granta MI server.

import GRANTA_MIScriptingToolkit as gdl

session = gdl.GRANTA_MISession("http://my.server.name/mi_servicelayer", autoLogon=True)

Get the Databases

Access the browse service from the session and execute the GetDatabases method.

browseService = session.browseService
databases = browseService.GetDatabases().databases

print(f"Found {len(databases)} databases on the Granta MI Server")
for d in databases:
    print(f"Database key: {d.DBKey}, database name: {d.volumeName}")

Previous cell output:

Found 1 databases on the Granta MI Server
Database key: MI_Training, database name: MI Training

Use pandas to display the available databases.

import pandas as pd

df = pd.DataFrame(
    {
        "DBKey": [db.DBKey for db in databases],
        "DBName": [db.volumeName for db in databases]
    }
)
df
DBKey DBName
0 MI_Training MI Training

Get the tables in a database

Use the GetTables method from the browse service to see what tables are available in the MI Training database.

dbKey = "MI_Training"

tables = browseService.GetTables(gdl.GetTables(DBKey=dbKey)).tableDetails

print(f"Found {len(tables)} tables in database {dbKey}")
print("Printing the first 5")
for t in tables[:5]:
    print(f"Table name: {t.tableReference.name}")

Previous cell output:

Found 20 tables in database MI_Training
Printing the first 5
Table name: MaterialUniverse
Table name: ProcessUniverse
Table name: Restricted Substances
Table name: Legislations and Lists
Table name: Design Data

Searching a database

Search MI Training for all records in the Tensile Test Data table which have a defined Young's modulus (11-axis) normalized)

table = "Tensile Test Data"
attribute = "Young's modulus (11-axis) (normalized)"

tableRef = gdl.PartialTableReference(tableName=table)
attrRef = gdl.AttributeReference(
    name=attribute,
    DBKey=dbKey,
    partialTableReference=tableRef,
)
searchCriterion = gdl.RecordSearchCriterion(
    searchAttribute=attrRef,
    existsSearchValue=gdl.ExistsSearchValue(),
)
request = gdl.CriteriaSearch(
    DBKey=dbKey,
    searchCriteria=[searchCriterion],
)

searchResults = session.searchService.CriteriaSearch(request).searchResults

Print the shortName and longName of the first 5 records returned by the search.

df2 = pd.DataFrame(
    {
        "ShortName": [r.shortName for r in searchResults],
        "LongName": [r.longName  for r in searchResults]
    }
)
df2.head()
ShortName LongName
0 LBJ8312A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec...
1 LBJ5313A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec...
2 LBJ4212A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec...
3 LBJ6212A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec...
4 LBJ6213A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec...

Export data from records

Create attribute references for the attributes you want to export and export data from all records.

attributes = [
    "Young's Modulus (11-axis) (normalized)",
    "Ultimate tensile strength (normalized)",
    "Baseline fiber volume",
    "Elastic Poisson's Ratio (12-plane)",
]

attrRefs = [
    gdl.AttributeReference(
        name=a,
        DBKey=dbKey,
        partialTableReference=tableRef,
    ) for a in attributes
]
recordRefs = [r.recordReference for r in searchResults]
request = gdl.GetRecordAttributesByRefRequest(
    recordReferences=recordRefs,
    attributeReferences=attrRefs,
)
       
recordData = session.dataExportService.GetRecordAttributesByRef(request).recordData

Print the values of the attributes from the first 5 exported records. Note that some records may not have values for all attributes.

s = [None]*len(df2)
for attribute in attributes:
    for idx, record in enumerate(recordData):
        attrValue = next((x for x in record.attributeValues if x.attributeName == attribute), None)
        s[idx] = attrValue.pointDataType.points[0].value if attrValue else None
    df2[attribute] = s
    
df2.head()
ShortName LongName Young's Modulus (11-axis) (normalized) Ultimate tensile strength (normalized) Baseline fiber volume Elastic Poisson's Ratio (12-plane)
0 LBJ8312A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec... 49.276835 1559.477024 53.473 0.258
1 LBJ5313A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec... 47.249776 1490.005443 53.473 0.253
2 LBJ4212A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec... 45.774298 1580.774931 53.473 0.306
3 LBJ6212A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec... 49.076887 1379.806528 53.473 0.270
4 LBJ6213A S-Glass Unitape S2/SP381, 3M, 0° tension, Spec... 47.911673 1392.975515 53.473 0.266

Create a plot of the exported values

import matplotlib

df2.plot.scatter(
    x="Ultimate tensile strength (normalized)",
    y="Young's Modulus (11-axis) (normalized)",
    loglog=False,
    c="Elastic Poisson's Ratio (12-plane)",
    colormap="viridis",
    norm=matplotlib.colors.LogNorm(),
    grid=True,
    figsize=(10, 7),
)

Previous cell output:

<axes: xlabel="Ultimate tensile strength (normalized)" ylabel="Young's Modulus (11-axis) (normalized)">

png

</axes:>

Connect with Ansys