| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
| | |
 | Effiziente Migration nach PTC Windchill: Software Factory stellt Migration Factory für komplexe Transformationsprojekte vor, eine Pressemitteilung
|
|
Autor
|
Thema: Jlink: Variantenparameter in generisches Modell übernehmen? (1654 mal gelesen)
|
magic_halli Mitglied
 
 Beiträge: 361 Registriert: 03.07.2006 WF2 M210 / WF3 M110 Linux Fedora C4 WinXP Pro Java 1.6.0_06
|
erstellt am: 09. Jan. 2008 13:12 <-- editieren / zitieren --> Unities abgeben:         
Hi, ich habe ein generisches Model geöffnet. Jetzt habe ich mittels Jlink eine Variante des gen.Models, aufgrund bestimmter Berechnungen, erhalten... d.h. ich habe den Variantenname vorliegen. Ich möchte nun das generische Modell in meiner Baugruppe durch diese eine Variante ersetzen. Dazu habe ich mir überlegt, dass ich "einfach" alle Parameterwerte aus der Familientabelle von der Variante ins generische Modell einsetze. Somit wäre doch dann in meiner Baugruppe statt dem gen.Modell die eine Variante verbaut und sichtbar, oder? Wenn nicht, wie könnte ich sonst mein Vorhaben lösen (mit Jlink)? (ich suche eigentlich noch einen geeigneten Ansatz ) Danke und Gruß. PS: Es gibt doch die Funktion "Ersetzen" in ProE, wo ich quasi ein gen.Teil durch eine Variante ersetzen kann... das will ich eigentlich mit Jlink realisieren - also automatisch ausführen lassen. Gibts hierfür Jlink-Methoden??? [Diese Nachricht wurde von magic_halli am 09. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anagl Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 4566 Registriert: 28.05.2001 CREO2 M140 PDMLink 10.2 M020 HW diverse Das Schreiben bei CAD.de ist freiwillig und kein Muss !!!!!
|
erstellt am: 09. Jan. 2008 13:18 <-- editieren / zitieren --> Unities abgeben:          Nur für magic_halli
In der Baugruppe ersetzen siehe nachfolgenden Auszug aus der Doku Example Code: Replacing Instances The following example code contains a single static utility method. This method takes an assembly for an argument. It searches through the assembly for all components that are instances of the model "bolt". It then replaces all such occurrences with a different instance of bolt.
import com.ptc.cipjava.*; import com.ptc.pfc.pfcGlobal.pfcGlobal; import com.ptc.pfc.pfcSession.Session; import com.ptc.pfc.pfcModel.*; import com.ptc.pfc.pfcSolid.Solid; import com.ptc.pfc.pfcFeature.*; import com.ptc.pfc.pfcComponentFeat.*; import com.ptc.pfc.pfcFamily.FamilyTableRow; import com.ptc.pfc.pfcBase.*; import com.ptc.pfc.pfcSelect.*; import com.ptc.pfc.pfcModelItem.*; import com.ptc.pfc.pfcAssembly.*; public class pfcComponentFeatExamples { /** * replaceBolts automatically replaces all occurrences of the * bolt "phillips7_8" with a new instance "slot7_8". It uses * the methods available in the ComponentFeat class, including * CreateModelReplace (), which creates a replacement operation * for a component, and GetModelDescr (), which returns the model * descr corresponding to a particular component feature. */ public static void replaceBolts (com.ptc.pfc.pfcAssembly.Assembly assembly) { Session session = null; //The Pro/E session object Solid bolt = null; // The bolt solid model FamilyTableRow row = null; // The family table row corresponding // to the new instance Solid newBolt; // The new bolt instance Features components; //List of components in the assembly ComponentFeat component; ModelDescriptor desc; // Component model descriptor CompModelReplace replace; FeatureOperations replaceOps; String oldInstance = "PHILLIPS7_8"; String newInstance = "SLOT7_8"; try { session = pfcGlobal.GetProESession(); bolt = (Solid)session.GetModel ("BOLT", ModelType.MDL_PART); } catch (jxthrowable x) { System.out.println ("Caught exception: "+x); x.printStackTrace(); return; } try { row = bolt.GetRow (newInstance); newBolt = (Solid)row.CreateInstance(); replaceOps = FeatureOperations.create(); components = assembly.ListFeaturesByType (Boolean.FALSE, FeatureType.FEATTYPE_COMPONENT); for (int ii = 0; ii < components.getarraysize(); ii++) { component = (ComponentFeat)components.get(ii); desc = component.GetModelDescr(); if (desc.GetInstanceName().equals(oldInstance)) { replace = component.CreateReplaceOp (newBolt); replaceOps.insert(0, replace); } } assembly.ExecuteFeatureOps (replaceOps, null); } catch (jxthrowable x) { System.out.println ("Caught exception: "+x); x.printStackTrace(); return; } return; } } HTH ------------------ Servus Alois Keine Mouseover-Werbung zwischen den Zeilen!!!! [Diese Nachricht wurde von anagl am 09. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
magic_halli Mitglied
 
 Beiträge: 361 Registriert: 03.07.2006 WF2 M210 / WF3 M110 Linux Fedora C4 WinXP Pro Java 1.6.0_06
|
erstellt am: 09. Jan. 2008 15:01 <-- editieren / zitieren --> Unities abgeben:         
Hi, danke erstmal. Leider hat sich ergeben, dass ich es so nicht machen kann! Nach Rücksprache mit Chef hat dieser gemeint, es müssen die Werte der einzelnen FamTab-Zellen dieser einen Variante in die Paramterliste eingetragen werden (wegen Zeichnungsregenerierung!). Nun gut... Jetzt ist mir aber eines nicht ganz klar: Wie kann ich von einer mir bekannte Variante (entspricht einer FamTab-Zeile) alle FamTab-Spalten durchlaufen??? Hier mal ein kleiner Ansatz, wo ich dann aber nicht klarkommen, den Bezug von spezieller Zeile und den zugehörigen Spalten herzustellen:
Code:
FamilyMember mem = (Solid)model; FamilyTableRow row = mem.GetRow(sErgebnisVariante); //Zeile der Variante FamilyTableColumns columns = mem.ListColumns(); //Spalten //jede Spalte der einen Zeile durchgehen for(int i=0;i<columns.getarraysize();i++){ String sSpaltenname = ??? double dValue = ??? }
Mh, irgendwie hab ich mich gedanklich verrannt... kann mir jemand auf die Sprünge helfen?Danke. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anagl Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 4566 Registriert: 28.05.2001 CREO2 M140 PDMLink 10.2 M020 HW diverse Das Schreiben bei CAD.de ist freiwillig und kein Muss !!!!!
|
erstellt am: 09. Jan. 2008 15:17 <-- editieren / zitieren --> Unities abgeben:          Nur für magic_halli
Wie wäre es mit (Auszug aus Doku) SetCell void SetCell (FamilyTableColumn Column, FamilyTableRow Row, ParamValue Value) Sets the value of the specified cell in the family table. See Also: FamilyMember.GetCell(FamilyTableColumn, FamilyTableRow), pfcModelItem.CreateIntParamValue(int), pfcModelItem.CreateDoubleParamValue(double), pfcModelItem.CreateStringParamValue(String), pfcModelItem.CreateBoolParamValue(boolean) Manual References: Manual Reference 1, Manual Reference 2 Parameters: Column The column where the cell is located. Row The row where the cell is located. Value The new cell value.
------------------ Servus Alois Keine Mouseover-Werbung zwischen den Zeilen!!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
magic_halli Mitglied
 
 Beiträge: 361 Registriert: 03.07.2006 WF2 M210 / WF3 M110 Linux Fedora C4 WinXP Pro Java 1.6.0_06
|
erstellt am: 09. Jan. 2008 15:29 <-- editieren / zitieren --> Unities abgeben:         
Mh, also ich brauche ja die Cell´s für jede Spalte in der speziellen FamTab-Zeile! FamilyMember.GetCell(FamilyTableColumn, FamilyTableRow) wäre dann ja auch das Richtige?! Die FamilyTableRow (Zeile) habe ich ja auch bereits: Code:
FamilyMember mem = (Solid)model; FamilyTableRow row = mem.GetRow(sErgebnisVariante); //Zeile der Variante
Mir ist aber nur unklar, wie ich jede einzelne FamilyTableColumn (Spalte) dieser Zeile anspreche!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
magic_halli Mitglied
 
 Beiträge: 361 Registriert: 03.07.2006 WF2 M210 / WF3 M110 Linux Fedora C4 WinXP Pro Java 1.6.0_06
|
erstellt am: 09. Jan. 2008 15:50 <-- editieren / zitieren --> Unities abgeben:         
Ich habs hinbekommen! So kann ich jeden einzelnen Cell-Value EINER Zeile ermitteln:
Code:
FamilyMember mem = (Solid)model; FamilyTableRow row = mem.GetRow(sErgebnisVariante); //Zeile der Variante FamilyTableColumns columns = mem.ListColumns(); //Spalten FamilyTableColumn column; //jede Spalte der einen Zeile durchgehen for(int i=0;i<columns.getarraysize();i++){ column = columns.get(i); //jeweiliger Cell-Value ParamValue pValue = mem.GetCell(column, row); }
Gruß PS: Ich hatte doch einen kleinen Knoten im Denkvorgang...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |