Autor
|
Thema: Objekt MaterialManager erzeugen (4484 mal gelesen)
|
u01dz Mitglied
Beiträge: 76 Registriert: 12.07.2003 V5R15GA
|
erstellt am: 23. Jun. 2005 14:06 <-- editieren / zitieren --> Unities abgeben:
Hi World, in der Script-API gibt es ein Objekt des Typs "MaterialManager", mit dem man Materialien eines Bodies, HybridBodies, Parts und Products vergeben und auch auslesen kann. Allerdings frage ich mich: WIE ERZEUGT MAN EIN OBJECT DES TYPS "MATERIALMANAGER"???? Vielleicht kann mir jemand weiterhelfen. ------------------ Tschüß, Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steffen Hohmann Mitglied
Beiträge: 446 Registriert: 06.03.2002
|
erstellt am: 23. Jun. 2005 15:20 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Hallo Dieter, es gibt das folgende Beispielmakro von Dassault: Option Explicit
' COPYRIGTH DASSAULT SYSTEMES 2004 ' *********************************************************************** ' Purpose: Apply and retrieve materials onto Product, Part or Body ' Assumptions Looks for Product1.CATProduct, Part1.CATPart and MyCatalog.CATMaterial in the DocView ' Version: 1.0 ' Author: AST ' Languages: CATScript ' Locales: English ' CATIA Level: V5R14 ' *********************************************************************** ' Main Sub CATMain()
' ----------------------------------------------------------- ' Optional: allows to find the sample wherever it's installed ' Dim sDocPath As String sDocPath = CATIA.SystemService.Environ("CATDocView") If (Not CATIA.FileSystem.FolderExists(sDocPath)) Then Err.Raise 9999,,"No Doc Path Defined" End If ' ' ----------------------------------------------------------- ' Open the CATMaterial document (material library) ' ----------------------------------------------------------- Dim sFilePath sFilePath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _ "\online\CAAScdMatUseCases\samples\MyCatalog.CATMaterial") Dim oMaterial_document As Document Set oMaterial_document = CATIA.Documents.Open(sFilePath) Set oMaterial_document = CATIA.ActiveDocument ' ' ----------------------------------------------------------- ' Read materials in this catalog (which contains 3 families and 5 materials in each family) ' First retrieve the families of the library ' ----------------------------------------------------------- ' Dim cFamilies_list As MaterialFamilies Set cFamilies_list = oMaterial_document.Families Dim iNb_families As Integer iNb_families = cFamilies_list.Count Dim sFamiliesName As String sFamiliesName = cFamilies_list.Name ' ' ----------------------------------------------------------- ' Retrieve the first family of the library ' ----------------------------------------------------------- ' Dim oFirst_family As MaterialFamily Dim ifamily_no As Integer ifamily_no = 1 Set oFirst_family = cFamilies_list.Item(iFamily_no) Dim sFamilyName As String sFamilyName = oFirst_family.Name ' ' ----------------------------------------------------------- ' Retrieve the material number 1,2 and 3 of the family ' ----------------------------------------------------------- ' Dim cMaterials_list As Materials Set cMaterials_list = oFirst_family.Materials Dim iNb_materials As Integer iNb_materials = cMaterials_list.Count Dim imaterial_no As Integer imaterial_no = 1 Dim oMaterial1 As Material Set oMaterial1 = cMaterials_list.Item(imaterial_no) imaterial_no = 2 Dim oMaterial2 As Material Set oMaterial2 = cMaterials_list.Item(imaterial_no) imaterial_no = 3 Dim oMaterial3 As Material Set oMaterial3 = cMaterials_list.Item(imaterial_no) ' ' ----------------------------------------------------------- ' Read product file ' ----------------------------------------------------------- ' Dim oProductDocument As Document sFilePath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _ "\online\CAAScdMatUseCases\samples\Product1.CATProduct") Set oProductDocument = CATIA.Documents.Open(sFilePath) Set oProductDocument = CATIA.ActiveDocument ' ' ----------------------------------------------------------- ' Access on material manager on root product document ' ----------------------------------------------------------- ' Dim oRootProduct As Product Set oRootProduct = oProductDocument.Product Dim oManager As MaterialManager Set oManager = oRootProduct.GetItem("CATMatManagerVBExt") ' ' ----------------------------------------------------------- ' Apply the material on the Product (as a link) ' ----------------------------------------------------------- ' Dim linkMode As Integer linkMode = 1 oManager.ApplyMaterialOnProduct oRootProduct,oMaterial1,linkMode ' ' ----------------------------------------------------------- ' Retrieve the material applied on the Product ' ----------------------------------------------------------- ' Dim oAppliedMaterial As Material oManager.GetMaterialOnProduct oRootProduct,oAppliedMaterial oProductDocument.Close ' ' ----------------------------------------------------------- ' Open the Part document ' ----------------------------------------------------------- ' sFilePath = CATIA.FileSystem.ConcatenatePaths(sDocPath, _ "\online\CAAScdMatUseCases\samples\Part1.CATPart") Dim oPartDocument As Document Set oPartDocument = CATIA.Documents.Open(sFilePath) Set oPartDocument = CATIA.ActiveDocument ' ' ----------------------------------------------------------- ' Access on material manager on root part document ' ----------------------------------------------------------- ' Dim oRootPart As Part Set oRootPart = oPartDocument.Part ' Retrieve the extension object associated to Y under the key "MyCATIVBExtensionImpl" Set oManager = oRootPart.GetItem("CATMatManagerVBExt") ' ' ----------------------------------------------------------- ' Apply the material on the Part ' ----------------------------------------------------------- ' linkMode = 0 oManager.ApplyMaterialOnPart oRootPart,oMaterial2,linkMode ' ' ----------------------------------------------------------- ' Retrieve the material on the Part ' ----------------------------------------------------------- ' oManager.GetMaterialOnPart oRootPart,oAppliedMaterial ' ' ----------------------------------------------------------- ' Retrieve the Part Body ' ----------------------------------------------------------- ' Dim oMainBody As Body Set oMainBody = oRootPart.MainBody ' ' ----------------------------------------------------------- ' Apply the material on the Part Body (as a link) ' ----------------------------------------------------------- ' linkMode = 1 oManager.ApplyMaterialOnBody oMainBody,oMaterial3,linkMode ' ' ----------------------------------------------------------- ' Retrieve the material on the Part Body ' ----------------------------------------------------------- ' oManager.GetMaterialOnBody oMainBody,oAppliedMaterial ' ' ----------------------------------------------------------- ' End of Script ' ----------------------------------------------------------- ' ' Close the documents ' oMaterial_document.Close oPartDocument.Close Set oRootPart = Nothing Set oMainBody = Nothing Set oMaterial1 = Nothing Set oMaterial2 = Nothing Set oMaterial3 = Nothing Set oRootProduct = Nothing Set oProductDocument = Nothing Set oMaterial_document = Nothing Set oManager = Nothing End Sub Gruß Steffen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u01dz Mitglied
Beiträge: 76 Registriert: 12.07.2003 V5R15GA
|
erstellt am: 24. Jun. 2005 14:19 <-- editieren / zitieren --> Unities abgeben:
|
Athelas Mitglied Studentin
Beiträge: 29 Registriert: 08.12.2008
|
erstellt am: 17. Aug. 2009 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Hallo zusammen, ich habe mir das oben gezeigte Script aus der Automationsdatei geholt und den Abschnitt zum Zuweisen des Materials auf einen Body verwendet. Nun erscheint zwar der Parameter "Material", aber es wird kein Material zugewiesen (siehe Bilder). Arbeite mit V5R16 SP05 HF94. Hier ist mein Code: Dim sDocPath As String sDocPath = CATIA.SystemService.Environ("CATDocView") sFilePath = "C:\Programme\Dassault Systemes\VW\B16\intel_a\startup\materials\Catalog.CATMaterial" Dim oMaterial_document As Document Set oMaterial_document = CATIA.Documents.Open(sFilePath) Set oMaterial_document = CATIA.ActiveDocument Dim cFamilies_list As MaterialFamilies Set cFamilies_list = oMaterial_document.Families Dim iNb_families As Integer iNb_families = cFamilies_list.Count Dim sFamiliesName As String sFamiliesName = cFamilies_list.Name Dim oFirst_family As MaterialFamily Dim ifamily_no As Integer ifamily_no = 3 Set oFirst_family = cFamilies_list.Item(iFamily_no) Dim sFamilyName As String sFamilyName = oFirst_family.Name Dim cMaterials_list As Materials Set cMaterials_list = oFirst_family.Materials Dim iNb_materials As Integer iNb_materials = cMaterials_list.Count Dim imaterial_no As Integer imaterial_no = 18 Dim oMaterial3 As Material Set oMaterial3 = cMaterials_list.Item(imaterial_no) oMaterial_document.Close Dim oPartDocument As Document Set oPartDocument = CATIA.ActiveDocument Dim oRootPart As Part Set oRootPart = oPartDocument.Part Dim oManager As MaterialManager Set oManager = oRootPart.GetItem("CATMatManagerVBExt") Dim linkMode As Integer Dim oMainBody As Body Set oMainBody = oRootPart.MainBody linkMode = 1 oManager.ApplyMaterialOnBody oMainBody,oMaterial3,linkMode Set oRootPart = Nothing Set oMainBody = Nothing Set oMaterial1 = Nothing Set oMaterial2 = Nothing Set oMaterial3 = Nothing Set oMaterial_document = Nothing Set oManager = Nothing Kann mir da jemand weiterhelfen?
Gruß, Sarah Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gunn Mitglied
Beiträge: 7 Registriert: 12.03.2009
|
erstellt am: 21. Aug. 2009 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
|
mellas Mitglied Student
Beiträge: 29 Registriert: 14.03.2012 CATIA V5R21
|
erstellt am: 16. Aug. 2012 14:55 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Hallo, ich möchte den Thread nach fast genau 3 Jahren nochmal wieder aufgreifen, da ich grade versuche, das Beispielmakro so anzupassen, dass mehreren Körpern innerhalb eines Parts unterschiedliche Materialien zugewiesen werden. In dem Beispiel wird nach meinem Verständnis so getan, als ob die Makrobibliothek ein zweidimensionales und komplett gefülltes Array ist - guck ich mir die Materialbibliothek (Catalog.CATMaterial) dann ist das ja nicht der Fall. Welchen Index eine Materialfamilie hat, kann ich dort ja noch über Zählen der Registerkarten rauskriegen, aber wie geht des dann mit den einzelnen Materialien in den Familie weiter? Die kann ich ja beliebig anordnen. Ich habe ifamily_no=1 und imaterial_no=1 gesetzt und kriege dann in meinen Körpern auch den Materialparameter, der allerdings leer ist - meine Vermutung: Der Parameter ist leer, weil es das Material_1.1 nicht gibt und ich mach irgendwas falsch und noch eine kleine Frage am Rand: ich dachte bisher immer, die Elemente eines Array beginnen mit dem Index 0 - warum hat ein Array der Größe 3 ("Array(3)")dann die Elemente 0, 1, 2 und 3? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 16. Aug. 2012 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Servus Bitte Systeminfo ausfüllen. Innerhalb CATMaterial-Datei gibt es eine Collection für die Material-Familien, eine Familie ist auch wieder eine Collection die die Materialen enthält (siehe auch V5Automation.chm). Kopiere mal deinen Code in den VBA-Editor, und überprüfen, ob das entsprechende Objekt für das Material auch gefüllt wird. Collections beginnen mit dem Index 1 und nicht wie ein Array bei 0. Collections haben auch noch weitere Methoden siehe zB zb hier. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mellas Mitglied Student
Beiträge: 29 Registriert: 14.03.2012 CATIA V5R21
|
erstellt am: 16. Aug. 2012 15:49 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Danke für die schnelle Antwort und sorry wegen der fehlenden Systeminfo, die war untergegangen... Aber so wirklich weitergekommen bin ich noch nicht. Ich habe es erstmal mit einem Objekt "oMaterial" mit ifamily_no=1 und imaterial_no=1 versucht und der Wert dazu liegt laut dem Fenser Überwachungsausdrücke im VBA Editor "Außerhalb des Kontexts". Ich muss doch irgendwie die beiden Collections MaterialFamilies und Materials einsehen können, um die Position der gewünschen Familie bzw. des Materials für den Aufruf der Funktion Item (so wie in der V5Automatin.chm) zu bekommen. Um es mir etwas einfacher zu machen, habe ich im Materialkatalog eine neue Familie erstellt und dort alle benötigten Materialien reinkopiert bzw. drin erstellt - aber in Sachen Zugriff auf die Materialien hilft das erstmal auch nicht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 16. Aug. 2012 15:54 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Servus Im Local-Fesnter oder im Watch-Fenster kannst du doch den Inhalt der Objekte (zB der Materialfamilien-Collection) betrachten (Makro schrittweise ausführen oder Unterbrehungpunkt einfügen). Hast du auch die richtige CTMaterial-Datei geöffnet? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mellas Mitglied Student
Beiträge: 29 Registriert: 14.03.2012 CATIA V5R21
|
erstellt am: 16. Aug. 2012 17:34 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Hallo (besonders Bernd), mittlerweile haben die Objekte oMaterial1 bis ...5 lauf Local-Fenster die richtigen Werte (die Sache mit dem Fenster war übrigens ein super Tipp - jetzt kann ich nachgucken, was in den Collections drin ist und wie die Items heißen) allerdings funktioniert die Methode "ApplyMaterialOnBody" noch nicht und ich weiß nicht warum. deklariere ich partDocument1 als Document, dann kommt der Laufzeitfehler 438 (->=bjekt unterstützt Eigenschaft oder MEthode nicht) für die Zeile "Set part1 = partDocument1.Part" deklariere ich das partDocument1 as PartDocument, dann kommt für die Zeile "Set partDocument1 = CATIA.ActiveDocument" der Laufzeitfehler 13 (Typen unverträglich) Ist die Methode "GetMaterialOnBody" für die Materialzuweisung wichtig? hier mal der Auszug aus meinem Quellcode, die 8 Körper sollen jeweils eins der 5 Materialien bekommen: Sub Material_erzeugen() 'Material-Bibliothek (material library) oeffen: Dim sFilePath As String sFilePath = "\\Mitarb-und-stud\mus\Studenten\CATIA\Catalog_erweitert.CATMaterial" Dim oMaterial_document As Document Set oMaterial_document = CATIA.Documents.Open(sFilePath) Set oMaterial_document = CATIA.ActiveDocument 'Material-Familien im Materialkatalog auslesen Dim cFamilies_list As MaterialFamilies Set cFamilies_list = oMaterial_document.Families Dim iNb_families As Integer iNb_families = cFamilies_list.Count Dim sFamiliesName As String sFamiliesName = cFamilies_list.Name 'eine Materialfamilie aus der Collection aufrufen, hier die selbsterstellte Familie "Batteriezelle" (Nummer 9) Dim oFamily As MaterialFamily Dim iFamily_no As Integer iFamily_no = 9 Set oFamily = cFamilies_list.Item(iFamily_no) Dim sFamilyName As String sFamilyName = oFamily.Name 'die Materialien aus der Collection der Familie aufrufen (5 Materialien) Dim cMaterials_list As Materials Set cMaterials_list = oFamily.Materials Dim iNb_materials As Integer i_Nb_materials = cMaterials_list.Count Dim imaterial_no As Integer 'Material_1: "Separator" imaterial_no = 1 Dim oMaterial1 As Material Set oMaterial1 = cMaterials_list.Item(imaterial_no) 'Material_2: "Kathodenschicht" imaterial_no = 2 Dim oMaterial2 As Material Set oMaterial2 = cMaterials_list.Item(imaterial_no) 'Material_3: "Anodenschicht" imaterial_no = 3 Dim oMaterial3 As Material Set oMaterial3 = cMaterials_list.Item(imaterial_no) 'Material_4: "Kathodensubstrat" imaterial_no = 4 Dim oMaterial4 As Material Set oMaterial4 = cMaterials_list.Item(imaterial_no) 'Material_5: "Anodensubstrat" imaterial_no = 5 Dim oMaterial5 As Material Set oMaterial5 = cMaterials_list.Item(imaterial_no) Dim linkMode As Integer linkMode = 1 Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Set oManager = part1.GetItem("CATMatManagerVBExt") Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body 'Separatorlage_1 -> Material: Separator (oMaterial1) Set body1 = bodies1.Item("Separatorlage_1") oManager.ApplyMaterialOnBody body1, oMaterial1, linkMode 'Kathodenschicht_1 -> Material: Kathodenschicht (oMaterial2) Set body1 = bodies1.Item("Kathodenschicht_1") oManager.ApplyMaterialOnBody body1, oMaterial2, linkMode 'Kathodensubstrat -> Material Kathodensubstrat (oMaterial4) Set body1 = bodies1.Item("Kathodensubstrat") oManager.ApplyMaterialOnBody body1, oMaterial4, linkMode 'Kathodenschicht_2 -> Material: Kathodenschicht (oMaterial2) Set body1 = bodies1.Item("Kathodenschicht_2") oManager.ApplyMaterialOnBody body1, oMaterial2, linkMode 'Separatorlage_2 -> Material: Separator (oMaterial1) Set body1 = bodies1.Item("Separatorlage_2") oManager.ApplyMaterialOnBody body1, oMaterial1, linkMode 'Anodenschicht_1 -> Material: Anodenschicht (oMaterial3) Set body1 = bodies1.Item("Anodenschicht_1") oManager.ApplyMaterialOnBody body1, oMaterial3, linkMode 'Anodensubstrat -> Material Anodensubstrat (oMaterial5) Set body1 = bodies1.Item("Anodensubstrat") oManager.ApplyMaterialOnBody body1, oMaterial5, linkMode 'Anodenschicht_2 -> Material: Anodenschicht (oMaterial3) Set body1 = bodies1.Item("Anodenschicht_2") oManager.ApplyMaterialOnBody body1, oMaterial3, linkMode oMaterial_document.Close part1.Update End Sub Viele Grüße, mellas
[Diese Nachricht wurde von mellas am 16. Aug. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 16. Aug. 2012 17:46 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
Servus Nach dem Öffnen der Material-Datei ist diese dein aktuelles Dokument, und somit kannst du mit ActiveDocument nicht auf das PartDocument zugreifen. Ist dein Part vor dem Ausführen schon geöffnet? Dann kannst du die Zuweisung des PartDocuments schon am Anfang machen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mellas Mitglied Student
Beiträge: 29 Registriert: 14.03.2012 CATIA V5R21
|
erstellt am: 16. Aug. 2012 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für u01dz
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|