edutenorio
Subscriber

My objective was to find a way to transfer Named Selections from a model to another model, never managed to find it. Thanks to Erik code I could finally create something that works, which I share below and hope it's useful for someone.

FILE_NAME = 'named_sel_export.py'

model = ExtAPI.DataModel.Project.Model

object_lists = {
    # 'Ansys.ACT.Automation.Mechanical.AnalysisPly': 'model.???',
    # 'Ansys.ACT.Automation.Mechanical.CrossSection': 'model.???',
    'Ansys.ACT.Automation.Mechanical.Material': 'model.Materials.Children',
    'Ansys.ACT.Automation.Mechanical.NamedSelection': 'model.NamedSelections.Children',
    'Ansys.ACT.Automation.Mechanical.CoordinateSystem': 'model.CoordinateSystems.Children',
}

with open(FILE_NAME, 'w') as f:
    lines = []
    lines.append("def get_entity_by_name(entity_list, name):")
    lines.append("    for x in entity_list:")
    lines.append("        if x.Name == name:")
    lines.append("            return x")
    lines.append("    return None")
    lines.append("")
    lines.append("model = ExtAPI.DataModel.Project.Model")
    lines.append("")
    for ns in model.NamedSelections.Children:
        lines.append("ns = Model.AddNamedSelection()")
        lines.append("ns.Name = '{}'".format(ns.Name))
        lines.append("ns.ScopingMethod = GeometryDefineByType.{}".format(ns.ScopingMethod))
        if ns.ScopingMethod == GeometryDefineByType.Worksheet:
            lines.append("criteria = ns.GenerationCriteria")
            for i, criteria in enumerate(ns.GenerationCriteria):
                lines.append("criteria.Add(None)")
                lines.append("criteria[{}].Active = {}".format(i, criteria.Active))
                lines.append("criteria[{}].Action = SelectionActionType.{}".format(i, criteria.Action))
                lines.append("criteria[{}].EntityType = SelectionType.{}".format(i, criteria.EntityType))
                if criteria.Action in [SelectionActionType.Invert, SelectionActionType.Convert]:
                    # No further parameters necessary for Invert or Convert
                    continue
                lines.append("criteria[{}].Criterion = SelectionCriterionType.{}".format(i, criteria.Criterion))
                lines.append("criteria[{}].Operator = SelectionOperatorType.{}".format(i, criteria.Operator))
                if criteria.Operator in [SelectionOperatorType.RangeExclude, SelectionOperatorType.RangeInclude]:
                    # Define lower and upper bound only, do not define value
                    if criteria.IsUnitless():
                        lines.append("criteria[{}].LowerBound = {}".format(i, criteria.LowerBound))
                        lines.append("criteria[{}].UpperBound = {}".format(i, criteria.UpperBound))
                    else:
                        lines.append("criteria[{}].LowerBound = Quantity('{}')".format(i, criteria.LowerBound))
                        lines.append("criteria[{}].UpperBound = Quantity('{}')".format(i, criteria.UpperBound))
                else:
                    # Define value, do not define lower and upper bound
                    if criteria.IsString():
                        lines.append("criteria[{}].Value = '{}'".format(i, criteria.Value))
                    elif criteria.IsObject():
                        lines.append("criteria[{}].Value = get_entity_by_name({}, '{}')".format(i, object_lists[str(criteria.Value.GetType())], criteria.Value.Name))
                    elif criteria.IsUnitless():
                        lines.append("criteria[{}].Value = {}".format(i, criteria.Value))
                    else:
                        lines.append("criteria[{}].Value = Quantity('{}')".format(i, criteria.Value))
                if criteria.CoordinateSystem.CoordinateSystemID != 0:
                    lines.append("criteria[{}].CoordinateSystem = get_entity_by_name(model.CoordinateSystems.Children, '{}')".format(i, criteria.CoordinateSystem.Name))
                # lines.append("# criteria[{}].IsObject() == {}".format(i, criteria.IsObject()))
                # lines.append("# criteria[{}].IsString() == {}".format(i, criteria.IsString()))
                # lines.append("# criteria[{}].IsUnitless() == {}".format(i, criteria.IsUnitless()))
            lines.append("ns.ToleranceType = ToleranceType.Manual")
            lines.append("ns.ZeroTolerance = 1E-3")
            lines.append("ns.RelativeTolerance = 1E-3")
            lines.append("ns.Generate()")
        lines.append("")
    f.write('\n'.join(lines))
    f.close()