Дополнительные возможности Windchill > Управление производственным процессом > Настройка навигатора технологических процессов > Создание пользовательских формул
  
Создание пользовательских формул
Набор формул используется для связывания набора атрибутов с соответствующими формулами или уравнениями, которые будут использоваться для расчета их значений. Набор формул составляют следующие компоненты:
FormulaSet определяет набор
FormulaMetaData определяет наименование и описание для формулы Java
FormulaValuatedLink связывает наименование атрибута с определением формулы
Следующий рисунок - это пример данных, которые нужно создать, чтобы добавить пользовательские формулы:
Вкладка "Наборы формул" используется для выбора ранее определенных наборов формул, которые можно применить для расчета времени и стоимости, связанных с операцией. Например, наборы стандартных и периодических формул времени и стоимости. Эти наборы формул учитывают количество деталей, которые будут произведены в операции, и используют спецификации, определенные для рабочего центра (например, время подготовки или время ожидания в очереди). Формулы и наборы формул используются при выборе действия "Вычислить время и затраты" и при загрузке технологических процессов и операций в навигатор производственных диаграмм Ганта.
С рабочим центром можно связать несколько наборов формул и один из них обозначить как используемый по умолчанию. Именно этот набор формул назначается операции, когда ей назначается рабочий центр.
* 
Формулы должны быть назначены набору формул. Если существующего набора формул нет, его необходимо определить прежде, чем можно будет определить пользовательскую формулу. PSE можно настроить так, чтобы разрешить использование PSE для добавления дополнительных значений в специализированные наборы формул. Дополнительные сведения см. в документации PSE.
Чтобы создать новую пользовательскую формулу, используйте следующую процедуру:
1. С помощью утилиты LoadFromFile загрузите XML-файл загрузки, где значение <csvname> уникально для системы. Этот файл загрузки должен содержать все следующие элементы:
csvFormulaSet - создает объект FormulaSet.
csvFormulaMetaData - создает объект FormulaMetaData.
csvAddFormulaMetaData - связывает FormulaMetaData с 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. Создайте метаданные формулы с использованием ссылки на имя Java-класса, реализующего интерфейс Formula и возвращающего вычисленное значение. Например, FloatingPointWithUnits.
Используя утилиту LoadFromFile, загрузите XML-файл загрузки, где значение <csvname> уникально для системы, а <csvformulaClassName> - это Java-класс, реализующий интерфейс формулы.
<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. Свяжите метаданные формулы с набором формул, использовав наименование атрибута.
Например, при вызове службы для расчета формулы будут выполнены все метаданные формулы, связанные с набором формул, и возвращена карта всех вычисленных значений, использующая наименование атрибута в качестве ключа.
Используя утилиту LoadFromFile, загрузите XML-файл загрузки, где <csvattributeName> - это повторно используемый атрибут времени и стоимости в объекте 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>
При создании Java-класса, реализующего интерфейс Formula, эти входные данные доступны по умолчанию в карте входных данных.
FormulaHelper.FORMULAVALUATED: объект, на который ссылается набор формул, приводится к типу ForumlaValuated.
FormulatHelper.FORMULAVALUATED_TI: экземпляр типа объекта, на который ссылается набор формул, приводится к типу TypeInstance. Его значение может быть равно null.
FormulaHelper.FORMULAVALUATED_ATTRIBUTE_NAME: наименование атрибута, используемое для связывания метаданных формулы с набором формул, приводится к типу String. Используется как ключ в карте результатов.
FormulaHelper.LOT: значение партии, указанное пользователем в контексте действия "Вычислить время и затраты". Приводится к типу Double.
Ниже показан пример Java-класса для формулы:
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));
}
}
* 
В формулу также можно добавить больше входных данных, создав новое действие, а затем использовать службы формулы, чтобы вызвать выполнение набора формул. Дополнительные сведения о создании новых действий см. в документации PSE.