Fonctionnalités supplémentaires de Windchill > Gestion des processus de fabrication > Personnalisation de l'Explorateur de gammes > Création de formules personnalisées
  
Création de formules personnalisées
Un jeu de formules permet d'associer un ensemble d'attributs aux formules ou équations correspondantes qui doivent être utilisées pour calculer leur valeur. Un jeu de formules comporte les éléments suivants :
FormulaSet identifie le jeu ;
FormulaMetaData définit le nom et la description d'une formule Java ;
FormulaValuatedLink associe un nom d'attribut à une définition de formule.
Le graphique ci-après présente un exemple des données à créer pour ajouter des formules personnalisées :
L'onglet Jeux de formules permet de sélectionner des jeux de formules prédéfinis pouvant servir à calculer le temps et le coût associés à une opération. Il peut s'agir, par exemple, d'un jeu de formules de temps et coût standard et d'un jeu de formules de temps et coût périodiques, par exemple. Ces jeux de formules tiennent compte du nombre d'articles à produire dans le cadre de l'opération et se basent sur les spécifications définies pour le poste de charge (par exemple, temps de préparation, temps d'attente). Les formules et les jeux de formules s'appliquent dès l'instant où vous sélectionnez l'action Calculer le temps et le coût et lorsque vous chargez des gammes et des opérations dans l'Explorateur Gantt de fabrication.
Si plusieurs jeux de formules peuvent être associés à un poste de charge, un seul jeu peut être désigné comme jeu de formules par défaut pour le poste de charge. C'est ce jeu de formules qui est affecté à une opération lorsque le poste de charge est alloué à cette dernière.
* 
Les formules doivent être affectées à un jeu de formules. Si vous ne disposez pas d'un jeu de formules existant, vous devez en définir un avant de définir une formule personnalisée. L'Explorateur de structures produit peut être personnalisé pour vous permettre d'ajouter des valeurs supplémentaires à vos jeux de formules personnalisés. Pour plus d'informations, consultez la documentation de l'Explorateur de structures produit.
Pour créer une formule personnalisée, procédez comme suit :
1. A l'aide de l'utilitaire LoadFromFile, chargez un fichier de chargement XML où <csvname> est propre au système. Ce fichier de chargement doit contenir tous les éléments suivants :
csvFormulaSet : cet élément crée un objet FormulaSet.
csvFormulaMetaData : cet élément crée un objet FormulaMetaData.
csvAddFormulaMetaData : cet élément associe l'objet FormulaMetaData à l'objet FormulaSet.
<csvFormulaSet handler="com.ptc.windchill.mpml.formula.LoadFormula.
createFormulaSet">
<csvuser></csvuser>
<csvname>Standard Time and Cost</csvname>
<csvdescription>This formula Set is used to calculate the time and
cost of an Operation</csvdescription>
<csvfolder>/Default/Design</csvfolder>
<csvparentcontextPath></csvparentcontextPath>
<csvorganizationName></csvorganizationName>
</csvFormulaSet>
2. Créez des métadonnées de formule en créant un lien vers un nom de classe Java implémentant l'interface de formule et renvoyant une valeur calculée. Par exemple, FloatingPointWithUnits.
A l'aide de l'utilitaire LoadFromFile, chargez un fichier de chargement XML où <csvname> est propre au système et où <csvformulaClassName> est la classe Java implémentant l'interface de formule.
<csvFormulaMetaData handler="com.ptc.windchill.mpml.formula.
LoadFormula.createFormulaMetaData">
<csvuser></csvuser>
<csvname>StandardAttributeValueFormulaTime</csvname>
<csvdescription>Standard Attribute Value Formula</csvdescription>
<csvtype>time</csvtype>
<csvformulaClassName>com.ptc.windchill.mpml.formula.Standard AttributeValueFormula</csvformulaClassName>
<csvfolder>/Default/Design</csvfolder>
<csvparentcontextPath></csvparentcontextPath>
<csvorganizationName></csvorganizationName>
<csvorganizationID></csvorganizationID>
</csvFormulaMetaData>
3. Associez les métadonnées de formule au jeu de formules au moyen d'un nom d'attribut.
Par exemple, lors de l'appel du service permettant de calculer la formule, toutes les métadonnées de formule associées au jeu de formules seront exécutées et le système renverra un plan de toutes les valeurs calculées en utilisant le nom d'attribut en tant que clé.
A l'aide de l'utilitaire LoadFromFile, chargez un fichier de chargement XML où <csvattributeName> est l'attribut réutilisable de temps et de coût sur l'objet MPMOperation.
<csvAddFormulaMetaData handler="com.ptc.windchill.mpml.formula.
LoadFormula.addFormulaMetaDataToFormulaSet" >
<csvformulaSetName>Standard Time and Cost</csvformulaSetName>
<csvformulaMetaDataName>StandardAttributeValueFormula Time</csvformulaMetaDataName>
<csvattributeName>IBA|MPM_Attr_MPMOperationSetupTime </csvattributeName>
</csvAddFormulaMetaData>
Lors de la création d'une classe Java qui implémente l'interface de formule, les entrées ci-après sont accessibles par défaut dans le plan d'entrées.
FormulaHelper.FORMULAVALUATED : objet sur lequel le jeu de formules est lié et pointant vers FormulaValuated.
FormulatHelper.FORMULAVALUATED_TI : instance de type d'objet sur laquelle le jeu de formules est lié et pointant vers TypeInstance. Cet élément peut présenter la valeur "null".
FormulaHelper.FORMULAVALUATED_ATTRIBUTE_NAME : nom d'attribut utilisé pour associer les métadonnées de formule au jeu de formules et pointant vers String. Cette valeur sera utilisée en tant que clé dans le plan de résultats.
FormulaHelper.LOT : valeur de lot spécifiée par l'utilisateur dans le contexte de l'action Calculer le temps et le coût. Cette valeur pointe vers Double.
Voici un exemple de classe Java de formule :
import com.ptc.core.meta.common.AttributeIdentifier;
import com.ptc.core.meta.common.AttributeTypeIdentifier;
import com.ptc.core.meta.common.TypeinstanceIdentifier;
import com.ptc.core.meta.context.common.AttributecontextSpec
import com.ptc.core.meta.server.TypeIdentifierUtility;
import com.ptc.core.meta.type.common.TypeInstance;
import com.ptc.core.meta.type.common.TypeInstanceFactory;
import com.ptc.windchill.mpml.MPMLinkHelper;
import java.text.NumberFormat;
import java.util.HashMap;
import wt.units.FloatingPointWithUnits;
import wt.util.WTContext;
import util.WTException;
public class StandardAttributeValueFormula implements Formula{
private static final String RESOURCE = "com.ptc.windchill.mpml.formula.formulaResource";
private static NumberFormat numberFormat =
NumberFormat.getInstance(WTContext.getContext().getLocale());
/** Creates a new instance of StandardAttributeValueFormula */
* This Formula simply return the value of the attribute.
public StandardAttributeValueFormula() {
}
public FloatingPointWithUnits calculate(HashMap inputs)throws
InvalidFormulaInputException, WTException{
//Get the object on which the formula is call
Object object = inputs.get(FormulaHelper.FORMULAVALUATED);
//Get the TI on which the formula is call
TypeInstance ti =(TypeInstance)inputs.get(FormulaHelper.FORMULAVALUATED_TI);
//Get the attribute that is calculated by the formula
String attribute_name = (String)inputs.get(FormulaHelper.FORMULAVALUATED_ATTRIBUTE_NAME);
if(object == null)
throw new InvalidFormulaInputException( RESOURCE, formulaResource.REQUIRED_FORMULA_INPUT_MISSING, new Object[]{FormulaHelper.FORMULAVALUATED} );;
TypeInstanceIdentifier tii = null;

//Get the TI of the object if null
if(ti==null){
tii = TypeIdentifierUtility.getTypeInstanceIdentifier(object);
ti = TypeInstanceFactory.newTypeInstance(tii);
}else
tii = (TypeInstanceIdentifier)ti.getIdentifier();
//Get ATI for the attribute to calculate
AttributeTypeIdentifier ati = (AttributeTypeIdentifier)MPMLinkHelper.getIdentifierFactory().get(attribute_name,tii.getDefinitionIdentifier());
AttributeIdentifier[] ais = ti.getAttributeIdentifiers(ati);
//If the attribute value is not in the TI, update it to get the value
if(ais.length<1){
AttributecontextSpec fl = new AttributecontextSpec();
fl.putEntry(ati);
ti = MPMLinkHelper.updateTypeInstance(new TypeInstance[] {ti}, fl, null)[0];
ais = ti.getAttributeIdentifiers(ati);
}
//Get the attribute value
Object value = null;
if(ais.length>0)
value = ti.get(ais[0]);
//Return the value of the attribute if it’s a FloatingPointWithUnits
if(value instanceof FloatingPointWithUnits)
return (FloatingPointWithUnits)value;
// value is null
return FloatingPointWithUnits.valueOf(numberFormat.format(0));
}
}
* 
Il est également possible d'ajouter d'autres entrées à la formule en créant une action, puis en utilisant les services de formule pour appeler l'exécution du jeu de formules. Pour plus d'informations sur la création d'actions, consultez la documentation de l'Explorateur de structures produit.