The Mechanical application enables you to import supported finite element data types from External Model and represents them natively through various imported objects in the tree. In addition, imported databases almost always contain additional commands that are not natively supported by the application. Mechanical exposes these commands (along with the commands natively processed in Mechanical) through the ACT extensions and console window. The following APIs enable you to access the underlying commands repository for a file specified in External Model.
When you open Mechanical independently:
commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("External Model", "File1");
When you open Mechanical from Workbench:
commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("Setup", "File1");
Users familiar with ACT APIs for Ansys Mechanical
will notice that the command GetFECommandsRepository
on the
Model object provides access to the commands repository. The two
arguments ("Setup" and "File1") specify the source External
Model Component Id and "File Identifier" in
the External Model Component.
The return object commands is an instance of the interface ICommandRepository
.
Once user has access to the commands database, you can access:
Processed Commands: Commands processed and natively represented in Mechanical.
Unprocessed Commands: Everything other than Processed Commands.
User can access the unprocessed commands names using the combination of following commands:
unprocessedCmdNamesCount = commands.GetCommandNamesCount(Ansys.ACT.Automation.Mechanical.FE.CommandsType.UnProcessed);
And...
unprocessedCmdName = commands.GetCommandName(Ansys.ACT.Automation.Mechanical.FE.CommandsType.UnProcessed, index);
As you might notice, the command GetCommandNamesCount
on ICommandRepository
provides the count of the command names
of type specified as first argument:
Ansys.ACT.Automation.Mechanical.FE.CommandsType.UnProcessed
Or...
Ansys.ACT.Automation.Mechanical.FE.CommandsType.Processed
And the command GetCommandName
provides the command name given
the type and index (index is 1 based, therefore, if the
unprocessedCmdNamesCount = n
, the valid index value are
(1,n)
).
Given a command name, user can access all instances of a command with a given name as:
namedCommands = commands.GetCommandsByName(commandName);
The return value namedCommands
is an instance of the interface
ICommandColl
. A command can be accessed from the
namedCommands
as:
namedCommand = namedCommands.Item(index);
The index argument is 1
based, therefore valid index value are
(1,namedCommands.Count())
)
The return value namedCommand
is a derived instance of the
interface ICommand
, i.e. the namedCommand
instance exposes the methods available on the ICommand
interface:
Name(): Command name
Index(): 1 based global index of the command in command repository
And any additional methods exposed the specific instance of the command. For example,
if the namedCommand
is an instance of
ICECommand
(a type of processed command from CDB file), then the
following additional methods are available:
Nce(): Constraint Equation ID
Constant(): Constant Term
TermCount(): Number of Terms
GetTerm(int index): Term at Index
Similarly, if the namedCommand
is an instance of
IGenericCommand
(unprocessed command from CDB file), then the
following additional methods are available:
ArgumentCount(): Number of arguments
GetArgument(int index): Argument at index
If LS-DYNA models are being imported, the contents of the
namedCommand
can be found using
FieldValueMap()
. For more details, see the example below:
from System.Collections.Generic import Dictionary commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("Setup", "File1"); namedCommands = commands.GetCommandsByName("*EXAMPLE_CARD") list = [] for command in namedCommands : map = command.FieldValueMap() begin = map.Begin() clrdict = Dictionary[str,object]() for i in range(0,10): clrdict.Add(begin.Name(),begin.Value()) begin.Increment() list.Add(clrdict) print list[0]
Refer to the External Model CDB Commands, External Model NASTRAN Commands, and the External Model ABAQUS Commands sections for all the available processed and unprocessed commands from CDB, NASTRAN, and ABAQUS databases.
In addition, you can traverse the command repository by going to the next and previous commands in the database using the following APIs:
prevCommand = commands.GetCommandByIndex(currentCommand.Index()-1);
nextCommand = commands.GetCommandByIndex(currentCommand.Index()+1);
Given the information provided in the above section, let's take a look at some examples.
CBD File Examples
The following examples describe how to query the command repository.
commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("Setup", "File1")
Example: List All Command Names
This example enables you to generate a listing all command names in the command repository.
commandType = Ansys.ACT.Automation.Mechanical.FE.CommandsType.All commandCount = commands.GetCommandNamesCount(commandType) commandsNames = [] for iCommand in range(0, commandCount): commandsNames.append(commands.GetCommandName(commandType, iCommand+1)) commandsNames
Example: List All Nodes
This example enables you to generate a listing all nodes in the command repository.
NBLOCK,6,SOLID, 430, 10 (3i9,6e21.13e3) 421 0 0 6.3203350000000E+004-4.2985880000000E+004 6.3500000000000E+004 422 0 0 6.1696900000000E+004-4.5619000000000E+004 6.3500000000000E+004 423 0 0 5.9365700000000E+004-4.7562160000000E+004 6.3500000000000E+004 424 0 0 5.6517810000000E+004-4.8605830000000E+004 6.3500000000000E+004 425 0 0 5.3482670000000E+004-4.8603130000000E+004 6.3500000000000E+004 426 0 0 5.0634300000000E+004-4.7562160000000E+004 6.3500000000000E+004 427 0 0 4.8295410000000E+004-4.5625390000000E+004 6.3500000000000E+004 428 0 0 4.6795660000000E+004-4.2986070000000E+004 6.3500000000000E+004 429 0 0 4.6250000000000E+004-4.0000000000000E+004 6.3500000000000E+004 430 0 0 4.6795660000000E+004-3.7013930000000E+004 6.3500000000000E+004 N,R5.3,LOC, -1, /*Commands*/ nodeIds = [] nblockCommands = commands.GetCommandsByName("NBLOCK") nblockCount = nblockCommands.Count for iNBlock in range(0, nblockCount): nblock = nblockCommands[iNBlock+1] nodeCount = nblock.NodeCount() for iNode in range(0, nodeCount): node = nblock.GetNode(iNode+1) nodeIds.append(node.Id()) nodeIds /*Output*/ [421, 422, 423, 424, 425, 426, 427, 428, 429, 430]
Example: Extract Analysis Settings
This example enables you to extract all Analysis Setting in the command repository.
ANTYPE, 2 MODOPT,LANB, 6, 0.00000000 , 0.00000000 , 0, 0, 0.00000000 , 0 /*Commands*/ antypeCommands = commands.GetCommandsByName("ANTYPE") if(antypeCommands.Count > 0): antypeCommand = antypeCommands[1] if(antypeCommand.ArgumentCount() > 0): antype = antypeCommand.GetArgument(1) print antype if(antype == "2"): modoptCommands = commands.GetCommandsByName("MODOPT") if(modoptCommands.Count > 0): modoptCommand = modoptCommands[1] for iArg in range(0, modoptCommand.ArgumentCount()): print modoptCommand.GetArgument(iArg+1) /*Output*/ 2 LANB 6 0.00000000 0.00000000 0 0 0.00000000 0
ABAQUS File Example
This example enables you to generate a listing all nodes in the command repository.
/*Input*/ *NODE, NSET=nset_csys2 421, 6.320335E+01,-4.298588E+01, 6.350000E+01 422, 6.169690E+01,-4.561900E+01, 6.350000E+01 423, 5.936570E+01,-4.756216E+01, 6.350000E+01 424, 5.651781E+01,-4.860583E+01, 6.350000E+01 425, 5.348267E+01,-4.860313E+01, 6.350000E+01 426, 5.063430E+01,-4.756216E+01, 6.350000E+01 427, 4.829541E+01,-4.562539E+01, 6.350000E+01 428, 4.679566E+01,-4.298607E+01, 6.350000E+01 429, 4.625000E+01,-4.000000E+01, 6.350000E+01 430, 4.679566E+01,-3.701393E+01, 6.350000E+01 /*Commands*/ nodeIds = [] nodeKeywords = commands.GetCommandsByName("NODE") nodeKeywordCount = nodeKeywords.Count for iNodeKeyword in range(0, nodeKeywordCount): nodeKeyword = nodeKeywords[iNodeKeyword+1] arguments = nodeKeyword.Arguments() for iArg in range(0, arguments.Count()): arg = arguments.Item(iArg+1) print arg.Key()+"="+arg.Value() datalines = nodeKeyword.DataLines() for iLine in range(0, datalines.Count()): dataline = datalines.Item(iLine+1) nodeIds.append(dataline.Item(1)) nodeIds /*Output*/ NSET=nset_csys2 [421, 422, 423, 424, 425, 426, 427, 428, 429, 430]
NASTRAN File Examples
Example: Print Case Control Section
This example enables you to print the case control section in the command repository.
/*Input*/ CEND TITLE = MSC.Nastran job created on 01-May-09 at 15:46:33 ECHO = NONE MPC = 101107 SUBCASE 1 TITLE=REDESIGNED EAI PAN WITH PRODUCTION LOADS SUBTITLE=VIBE_FX SPC = 2 LOAD = 101108 DISPLACEMENT(PLOT,SORT1,REAL)=ALL SPCFORCES(SORT1,REAL)=ALL MPCFORCES(SORT1,REAL)=ALL STRESS(PLOT,SORT1,REAL,VONMISES,BILIN)=ALL FORCE(PLOT,SORT1,REAL,BILIN)=ALL SUBCOM 2 TITLE=REDESIGNED EAI PAN WITH PRODUCTION LOADS SUBTITLE=COMBINED VIBE LOADS (PRODUCTION) LABEL=COMBINE VIBE PRODUCTION WITH AXIAL LINK SUBSEQ = 1., 1., 1., 1., 1., 1. DISPLACEMENT(PLOT,SORT1,REAL)=ALL SPCFORCES(SORT1,REAL)=ALL MPCFORCES(SORT1,REAL)=ALL STRESS(PLOT,SORT1,REAL,VONMISES,BILIN)=ALL FORCE(PLOT,SORT1,REAL,BILIN)=ALL BEGIN BULK /*Commands*/ commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("Setup", "File1") caseControlCommands = commands.GetCommandsByName("CASE") caseCount = caseControlCommands.Count offset = "" for iCaseCmd in range(0, caseCount): caseCmd = caseControlCommands[iCaseCmd+1] text = caseCmd.Text() if (text.startswith("SUBCASE") or text.startswith("SUBCOM")): print text offset = "\t" else: print offset + text /*Output*/ TITLE = MSC.Nastran job created on 01-May-09 at 15:46:33 ECHO = NONE MPC = 101107 SUBCASE 1 TITLE = REDESIGNED EAI PAN WITH PRODUCTION LOADS SUBTITLE = VIBE_FX SPC = 2 LOAD = 101108 DISPLACEMENT(PLOT ,SORT1,REAL)=ALL SPCFORCES(SORT1 ,REAL)=ALL MPCFORCES(SORT1 ,REAL)=ALL STRESS(PLOT ,SORT1,REAL,VONMISES,BILIN)=ALL FORCE(PLOT ,SORT1,REAL,BILIN)=ALL SUBCOM 2 TITLE = REDESIGNED EAI PAN WITH PRODUCTION LOADS SUBTITLE = COMBINED VIBE LOADS (PRODUCTION) LABEL = COMBINE VIBE PRODUCTION WITH AXIAL LINK SUBSEQ = 1.,1.,1.,1.,1.,1. DISPLACEMENT(PLOT ,SORT1,REAL)=ALL SPCFORCES(SORT1 ,REAL)=ALL MPCFORCES(SORT1 ,REAL)=ALL STRESS(PLOT ,SORT1,REAL,VONMISES,BILIN)=ALL FORCE(PLOT ,SORT1,REAL,BILIN)=ALL
Example: List All Bushings
This example enables you to generate a listing all CBUSH elements in the command repository.
/*Input*/ BEGIN BULK CBUSH 5344 1 15301 15307 3 .5 CBUSH 5345 1 15302 15312 3 .5 CBUSH 5346 1 15303 15311 3 .5 CBUSH 5347 1 15304 15310 3 .5 CBUSH 5348 1 15305 15309 3 .5 CBUSH 5349 1 15306 15308 3 .5 /*Commands*/ commands = ExtAPI.DataModel.Project.Model.GetFECommandsRepository("Setup", "File1") cbushCommands = commands.GetCommandsByName("CBUSH") cbushCount = cbushCommands.Count for iCBushCmd in range(0, cbushCount): cbushCmd = cbushCommands[iCBushCmd+1] args = [] args.append(cbushCmd.Name()) argCount = cbushCmd.ArgumentCount() for iArg in range(0, argCount): args.append(cbushCmd.GetArgument(iArg+1)) print args /*Output*/ ['CBUSH', 5344, 1, 15301, 15307, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0] ['CBUSH', 5345, 1, 15302, 15312, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0] ['CBUSH', 5346, 1, 15303, 15311, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0] ['CBUSH', 5347, 1, 15304, 15310, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0] ['CBUSH', 5348, 1, 15305, 15309, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0] ['CBUSH', 5349, 1, 15306, 15308, 0.0, 0.0, 0.0, 3, 0.5, 0, 0.0, 0.0, 0.0]