De manière générale, le corps d'une de ces méthodes spécifie un ensemble d'entités ... :
- qu'on va sélectionner dans un ensemble préétabli
- qu'on va créer par instantiation (en nombre préétabli ou non)
Lorsqu'il s'agit de sélectionner, l'utilisateur code une fonction comme suit :
bool myEntitySpec_selectorPredicate_Body(EntitySpecMethod* pM) { bool result = false; Entity* pCandidate = pM->GetEntityArgValue(CANDIDATEENTITY_ARGUMENT); Entity* pEref = pM->GetEntityArgValue(REFERENCEENTITY_ARGUMENT); // détermination si pCandidate doit être sélectionnée ou non return result; };Puis, par AssignSelectorPredicate, il l'attache comme corps de la méthode EntitySelector d'une sous-classe d'EntitySpec de son domaine d'application :
MyEntitySpec::MyEntitySpec() : EntitySpec(SOME_ENTITY_CLASS_ID) { ClassName("myEntitySpec"); SetQuantificatorId(NFIRST); SetMode(RETURN_INSTANCES); IntQuantity(1); AssignSelectorPredicate(myEntitySpec_selectorPredicate_Body); };Lorsqu'il s'agit d'instancier des entités que le moteur de simulation va assembler lui-même dans une liste, l'utilisateur code une fonction comme suit :
BasicEntity* myEntitySpec_entityInstantiator_Body(EntitySpecMethod* pM) { Entity* pEref = pM->GetEntityArgValue(REFERENCEENTITY_ARGUMENT); UserClassId classId = pM->GetIntArgValue(CLASSID_ARGUMENT); Entity* result = App_NewEntityFromId(classId); ... // compléments de construction de l'entité qui sera renvoyée return result; };L'attachage comme corps de la méthode EntityInstantiator d'une sous-classe d'EntitySpec du domaine d'application se fait par AssignEntityInstantiator.
Lorsqu'il s'agit d'instancier des entités et de les assembler dans une liste, l'utilisateur code une fonction comme suit :
pEntityTab* myEntitySpec_entityListInstantiator_Body(EntitySpecMethod* pM) { Entity* pEref = pM->GetEntityArgValue(REFERENCEENTITY_ARGUMENT); UserClassId classId = pM->GetIntArgValue(CLASSID_ARGUMENT); int listSise = pM->GetIntArgValue(LISTSIZE_ARGUMENT); pEntityTab* result = new pEntityTab(); for(int k=0;k<listSize;k++) { Entity* pE_k = App_NewEntityFromId(classId); ... // compléments de construction de l'entité qui sera renvoyée result->push_back(pE_k); } return result; };L'attachage comme corps de la méthode EntityListInstantiator d'une sous-classe d'EntitySpec du domaine d'application se fait par AssignEntityListInstantiator.
Pour la spécification du nombre d'entités à sélectionner ou à instancier, l'utilisateur code une fonction comme suit :
int myEntitySpec_quantityEvaluator_Body(EntitySpecMethod* pM) { Entity* pEref = pM->GetEntityArgValue(REFERENCEENTITY_ARGUMENT); int result; ... // détermination du nombre return result; };L'attachage comme corps de la méthode QuantityEvaluator d'une sous-classe d'EntitySpec du domaine d'application se fait par AssignQuantityEvaluator.