===== Teamcenter. Настройка форм с помощью FORMJAVARENDERING ===== статья в работе, не описан loadrendering Как известно из Rich Client Customization Programmer's Guide возможно создание собственных форм путем расширения класса AbsractRendering. При этом необходимо реализовать сохранения данных получаемых из экранной формы непосредственно в свойства класса хранения мастер-формы, т.е. в соответствующий объект класса TCComponentForm. Именно с получением нужного объекта TCComponentForm и могут быть проблемы, так как в зависимости от контекста вызова формы, источник TCComponentForm будет различен. ==== Пример ==== Рассмотрим эти варианты на примере объекта MyItem (Изделие) и MyItemRevision (Модификация изделия). Создание новых форм происходит путем создание классов MyItemForm и MyItemRevisionForm в пакете com.my.forms. Соответственно в пакете com.teamcenter.rac.stylesheet в файле stylesheet_user.properties необходимо связать классы хранения форм и классы отображения. MyItem\ Master.FORMJAVARENDERING=com.my.forms.MyItemForm MyItemRevision\ Master.FORMJAVARENDERING=com.my.forms.MyItemRevisionForm Далее в классах необходимо предусмотреть следующие варианты использования форм: * Создание нового объекта (изделия, совместно с модификацией) - при этом форма отображается внутри мастера создания нового Изделия. Самого Изделия и модификации на момент отображения формы ещё не существует в хранилище Teamcenter, существует только элемент в оперативной памяти связанный с свойством панели мастера (TCComponentItem)NewItemPanel.newComponent. Получить доступ к этому свойству можно через промежуточные родительские элементы ГПИ. Причем объект хранения формы (TCComponentForm) переданный конструктору класса формы не соответствует реальному объекту хранения ассоциированному с соответствующим Изделием или Модификацией. * Просмотр существующего объекта - при этом соответствующий объект хранения формы (TCComponentForm) передается конструктору класса формы, так как Изделия и Модификация уже есть в хранилище Teamcenter. * Пересмотр изделия (создание новой модификации) - следует учитывать при разработке формы модификации изделия (наследника Item Revision). В качестве примера приведу реализацию MyItemRevisionForm. Следует учитывать что данный класс не использовался в реальной разработке, конструируется исключительно для примера к статье, и возможно содержит ошибки. package com.my.forms; import com.teamcenter.rac.stylesheet.*; import com.teamcenter.rac.kernel.TCComponentForm; import com.teamcenter.rac.kernel.TCComponent; import com.teamcenter.rac.kernel.TCSession; import com.teamcenter.rac.kernel.TCException; import java.awt.BorderLayout; import java.awt.Container; import java.util.Date; import com.teamcenter.rac.aif.AbstractAIFOperation; import com.teamcenter.rac.aif.kernel.AIFComponentContext; import com.teamcenter.rac.util.MessageBox; import com.teamcenter.rac.kernel.TCComponentItem; import com.teamcenter.rac.kernel.TCComponentItemRevision; import com.teamcenter.rac.commands.newitem.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JViewport; import javax.swing.SwingUtilities; import com.teamcenter.rac.kernel.TCComponentItemType; import com.teamcenter.rac.util.Registry; public class MyItemRevisionForm extends AbstractRendering { TCComponentForm form = null; SmartTCEForm sform = null; TCComponentForm rev_form = null; SmartTCEForm sform_rev = null; TCSession session; InterfaceFormPanel innerPanel; DSEUserData data; // Класс используется для сохранения свойств формы в класс хранения class SaveOperation extends AbstractAIFOperation { protected void doSave(TCComponentForm form1, SmartTCEForm sform1) throws Exception { form1.lock(); sform1.setFormPropertySafe("HR100", data.diametr); sform1.setFormPropertySafe(NR.fld_DSE_CODE, data.code_dse); sform1.setFormPropertySafe(NR.fld_FORMAT, data.format); sform1.setFormPropertySafe(NR.fld_MASSA, data.massa); // ... заполняются поля в соответствии с NameResolver sform1.setFormPropertySafe(NR.fld_MARKA_MAT, data.mater_mark); sform1.setFormPropertySafe(NR.fld_VID_ZAGOT, data.mater_zagot); form1.save(); form1.unlock(); } public void executeOperation() throws Exception { innerPanel.saveToUserData(); if (sform_rev == null) { // открывается для просмотра существующая уже ревизия doSave(form, sform); } else { // создается новая ревизия для нового объекта doSave(rev_form, sform_rev); } } // Конструктор public MyItemRevisionForm(TCComponentForm theForm) throws Exception { super(theForm); form = theForm; session = (TCSession) form.getSession(); loadRendering(); } public void saveRendering() { // если форма используется для просмотра существующей ревизии то data.item_rev будет заполнена в loadRendering // если data.item_rev=null то значит форма либо используется в мастере создания, либо при создании нового Изделия, // либо при пересмотре существующего (создании новой Модификации) if (data.item_rev == null) { // проходим вверх по элементам ГПИ чтобы получить item JPanel parentPanel = (JPanel) ((JPanel) this).getParent(); JViewport enclosing = (JViewport) parentPanel.getParent(); JScrollPane scrolpan1 = (JScrollPane) enclosing.getParent(); ItemRevMasterFormPanel irmfp1 = (ItemRevMasterFormPanel) scrolpan1.getParent(); NewItemPanel itemPanel1 = (NewItemPanel) irmfp1.controlWizardPanel; data.item = (TCComponentItem) itemPanel1.newComponent; // получаем item // если null, то значит создается новая модификация (пересмотр), берем форму из текущего компонента if (data.item == null) { rev_form = (TCComponentForm) this.component; sform_rev = new SmartTCEForm(rev_form); } else { try { data.item_rev = data.item.getLatestItemRevision(); } catch (Exception e) { // TODO: Можно тут описать обработчик } if (data.item_rev != null) { try { rev_form = (TCComponentForm) data.item_rev.getRelatedComponent("IMAN_master_form_rev"); sform_rev = new SmartTCEForm(rev_form); } catch (TCException e) { e.printStackTrace(); } } //if } //else } //if SaveOperation operation = new SaveOperation(); // класс SaveOperation описан выше try { session.queueOperation(operation); // не ждет конца операции, чтобы не было фризов } catch (Exception ex) { MessageBox.post(ex); } } //saveRendering } Вспомогательные классы: * SmartTCEForm - используется для упрощения оперирования с свойствами формы * NameResolver - разрешает имена свойств в значения имен package com.my.forms; import com.teamcenter.rac.kernel.TCComponentForm; import com.teamcenter.rac.kernel.TCException; import com.teamcenter.rac.kernel.TCProperty; import com.teamcenter.rac.kernel.TCPropertyDescriptor; import com.teamcenter.rac.util.MessageBox; import java.io.PrintStream; import java.util.Date; public class SmartTCEForm { TCComponentForm form; public SmartTCEForm(TCComponentForm theForm) { System.out.println("SmartTCEForm"); this.form = theForm; } public Object getFormPropertyObj(String sName) throws TCException { TCProperty prop = this.form.getTCProperty(sName); if (prop == null) { String s = "Не найден атрибут формы " + this.form + ": '" + sName + "'"; throw new TCException(s); } TCPropertyDescriptor propDesc = prop.getDescriptor(); switch (propDesc.getType()) { case 8: return prop.getStringValue(); case 2: return prop.getDateValue(); case 3: return new Double(prop.getDoubleValue()); case 4: return new Float(prop.getFloatValue()); case 6: return new Boolean(prop.getLogicalValue()); } return null; } public void setFormPropertySafe(String sName, Object Value) throws TCException { TCProperty prop = this.form.getFormTCProperty(sName); if (prop == null) throw new TCException("Не найден атрибут формы " + this.form + ": '" + sName + "'"); TCPropertyDescriptor propDesc = prop.getDescriptor(); switch (propDesc.getType()) { case 8: int len = propDesc.getMaxStringLength(); String sValue = (String)Value; if (sValue.length() > len) { MessageBox.post("Значение '" + sValue + "' свойства '" + sName + "' превышает допустимую длину поля = " + len + "\nСтрока урезана до допустимой длины!", "Сохранение формы " + this.form.toString(), 4); sValue = sValue.substring(0, len); } prop.setStringValue(sValue); break; case 2: prop.setDateValue((Date)Value); break; case 3: prop.setDoubleValue(((Double)Value).doubleValue()); break; case 4: prop.setFloatValue(((Double)Value).floatValue()); } } public void setFormPropertySafe(String sName, boolean Value) throws TCException { this.form.getFormTCProperty(sName).setLogicalValue(Value); } }