Autor
|
Thema: Material nach Combobox zuweisen (5349 mal gelesen)
|
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 28. Jun. 2010 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe mit ein VBA-Makro geschrieben, welches mir aus meiner eigenen Materialdatenbank alle Materialien in eine ComboBox einfügt, und nach Auswahl über die Codezeilen: Code: Dim strParam1 As StrParam Set strParam1 = parameters2.Item("Part1\Material") strParam1.Value = Userform1.ComboBox1.Value
auch einfügt. Allerdings gefällt mir diese Art der Materialübergabe nicht. Vorgestellt habe ich mir
Code: Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim Return1 As Material Eingabe = Userform1.ComboBox1.Value Set Return1 = cMaterials_list.GetItem(Eingabe) 'Hier kommt der Fehler: Objekt unterstützt diese Aktion nicht linkMode = 0 oManager.ApplyMaterialOnPart part1, return1, linkMode
Also die Materialübergabe wollte ich mit ApplyMaterialonPart durchführen aber das funktioniert so leider nicht. Mein restlicher Code sieht eigentlich wie dieser hier aus http://ww3.cad.de/foren/ubb/Forum137/HTML/001194.shtml nur mit zwei Schleifen erweitert in denen die ifamily_no und die imaterial_no durchgezählt werden und dann entsprechend mit omaterial1.name in die Combobox geladen werden. Vielen Dank für euere Hilfe im Vorraus Lg Weylin Edit: Ziel ist es also (zusammenfassend), dass durch die Eingabe des Materialnamens als String ( in der Combobox), die Familiennummer und Materialnummer in der Materialdatenbank ausgelesen wird und anschließend über den ApplyMaterialonPart das Material geändert wird. Der Befehl funktioniert, wenn ich die Materialfamiliennummer und die Materialnummer fest definier aber sobald der Input ein String ist mit nur dem Materialnamen kommt der Fehler. [Diese Nachricht wurde von weylin am 28. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 28. Jun. 2010 23:47 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo weylin, probiere es doch mal wie folgt: Code: Set Return1 = cMaterials_list.Item(Eingabe)
mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 30. Jun. 2010 14:01 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Jun. 2010 22:11 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Servus Zitat aus der Doku zum Objekt "Materials": Zitat:
Func Item( CATVariant iIndex) As CATIAMaterial Returns a material from its index in the Material collection. iIndex The index of the material to retrieve in the collection of materials. Compared with other collections, you cannot use the name of the material as argument.
Somit kannst du dass Material nicht über den Namen ansprechen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 30. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 30. Jun. 2010 23:32 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo allerseits! @bgrittmann: So ist das halt mit der Dokumentation, nicht immer stimmt das, was da steht. Wer viel programmiert und auf dieses "Nachschlagewerk" zurückgreifen muss, der wird dies wissen. Ich habe nicht nachgelesen sondern getestet. Und auch der heutige Test bestätigt dies: Es funktioniert in R17! @weylin: Dein Problem wird wahrscheinlich die vorherige richtige Auswahl der Material-Familie sein. Wähle ich ein Material, dass nicht Teil der aktuell gewählten Familie ist, bekomme ich den gleichen Fehler. Allerdings hattest Du hier keinen Code davon aufgezeigt, wodurch man auch nicht auf diesen Fehler hinweisen konnte! Falls Du nicht klar kommst, poste doch hier den Code für die Auswahl der Material-Familie. Dann können wir Dir sicher helfen! mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 02. Jul. 2010 11:35 <-- editieren / zitieren --> Unities abgeben:
Hallo ich poste mal meinen ganzen Code rein, da der Fehler offensichtlich auch wo anders liegen könnte: Code: Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument
Dim part1 As Part Set part1 = partDocument1.Part Dim parameters1 As Parameters Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "C:\Temp\MeinCatalog.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name Dim parameters2 As Parameters Set parameters2 = part1.Parameters Userform1.ComboBox1.AddItem (Ausgabe) Loop Until (imaterial_no = Mat_Anzahl) '(IsMissing(imaterial_no + 1) = True) Loop Until (ifamily_no = List_Anzahl) oMaterial_document.Close part1.Update Userform1.Show Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim Return1 As Material Eingabe = Userform1.ComboBox1.Value Set Return1 = cMaterials_list.GetItem(Eingabe) 'Hier kommt der Fehler: Objekt unterstützt diese Aktion nicht linkMode = 0 oManager.ApplyMaterialOnPart part1, return1, linkMode End Sub
Danke für euere Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 04. Jul. 2010 01:34 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo weylin, es ist genau so. wie ich dachte. So wie Du das abarbeitest, kannst Du nur Materialien aus der letzten eingelesenen Familie nutzen. Das muss anders gelöst werden! Weiterhin ergibt sich aus Deinem Code noch ein anderer Fehler: Du schließt das Material-Dokument vor der Zuweisung. Das funktioniert nicht oder nicht immer(?), je nach Einstellung der Settings! Ich habe den Code mal angepasst: Code: Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim parameters1 As Parameters Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "C:\Temp\MeinCatalog.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Dim aMaterialArray() Dim A As Integer A = 0 ReDim aMaterialArray(A) Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name A = A + 1 ReDim Preserve aMaterialArray(A) aMaterialArray(A) = Ausgabe & ";" & sFamilyName Dim parameters2 As Parameters ' Wozu? Set parameters2 = part1.Parameters ' Wozu? Userform1.ComboBox1.AddItem (Ausgabe) Loop Until (imaterial_no = Mat_Anzahl) '(IsMissing(imaterial_no + 1) = True) Loop Until (ifamily_no = List_Anzahl) 'oMaterial_document.Close 'part1.Update Userform1.Show Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim Return1 As Material Eingabe = Userform1.ComboBox1.Value Dim K As Integer Dim aList(1) Dim L As Integer For K = 1 To A For L = 0 To 1 aList(L) = Split(aMaterialArray(K), ";")(L) Next If aList(0) = Eingabe Then Set Return1 = oMaterial_document.Families.Item(aList(1)).Materials.Item(aList(0)) Exit For End If Next linkMode = 0 oManager.ApplyMaterialOnPart part1, Return1, linkMode oMaterial_document.Close part1.Update End Sub
Ich lese die Materialien mit Name und "Familien-Name" in ein Array und weise dann das ausgewählte Material aus der gespeicherten Material-Familie zu. mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 05. Jul. 2010 09:47 <-- editieren / zitieren --> Unities abgeben:
Super vielen dank dir hat wunderbar funktioniert. Eine Frage hätt ich noch: Könnte man das auch sortieren in der Combobox ? Also das die Materialien Alphabetisch von oben nach unten gelistet werden? 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: 05. Jul. 2010 09:56 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Servus Wenn du die Material eh schon in einem Array drin hast kannst du einfach einen Sortier-Algorithmus drüber laufen lassen (zB Bubbel-Sort siehe Inet-Suche zB bei Wikipedia) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 06. Jul. 2010 10:27 <-- editieren / zitieren --> Unities abgeben:
Sortiere ich dann nicht nur das Array aber nicht die Combobox?? Code:
Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim parameters1 As Parameters Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "C:\Temp\MeinCatalog.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Dim aMaterialArray() Dim A As Integer A = 0 ReDim aMaterialArray(A) Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name A = A + 1 ReDim Preserve aMaterialArray(A) aMaterialArray(A) = Ausgabe & ";" & sFamilyName For X = UBound(aMaterialArray) - 1 To LBound(aMaterialArray) Step -1 ' Alle links davon liegenden Zeichen auf richtige Sortierung ' der jeweiligen Nachfolger überprüfen: For Y = LBound(aMaterialArray) To X ' Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert? If aMaterialArray(Y) > aMaterialArray(Y + 1) Then ' Element und seinen Nachfolger vertauschen. vTemp = aMaterialArray(Y) aMaterialArray(Y) = aMaterialArray(Y + 1) aMaterialArray(Y + 1) = vTemp End If Next Y Next X Userform1.ComboBox1.AddItem (Ausgabe) Loop Until (imaterial_no = Mat_Anzahl) '(IsMissing(imaterial_no + 1) = True) Loop Until (ifamily_no = List_Anzahl) 'oMaterial_document.Close 'part1.Update Userform1.Show Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim Return1 As Material Eingabe = Userform1.ComboBox1.Value Dim K As Integer Dim aList(1) Dim L As Integer For K = 1 To A For L = 0 To 1 aList(L) = Split(aMaterialArray(K), ";")(L) Next If aList(0) = Eingabe Then Set Return1 = oMaterial_document.Families.Item(aList(1)).Materials.Item(aList(0)) Exit For End If Next linkMode = 0 oManager.ApplyMaterialOnPart part1, Return1, linkMode oMaterial_document.Close part1.Update End Sub
So hab ich den Bubblesort im Internet gefunden. VBA bringt zwar keine Fehler sortiert aber auch nicht. Hab schon damit rumprobiert aber bin noch nciht auf die Lösung gekommen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 06. Jul. 2010 18:41 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo, deine Reihenfolge ist falsch. Die Schritte müssen wie folgt ausgeführt sein: 1) Mit den Schleifen den Array füllen 2) Sortieralgorithmus auf Array laufen lassen 3) Mit einer weiteren Schleife Combobox füllen. (Ähnlich wie die äußere im Sortierer, nur nicht rückwärts durchlaufen) Hoffe, es ist klarer. Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 08. Jul. 2010 15:50 <-- editieren / zitieren --> Unities abgeben:
Hallo Danke zoltan für deinen Tipp das hat mich weitergebracht. Allerdings bin ich immer noch nciht ganz bei der Lösung 2 Probleme hab ich noch: 1. Mir fällt keine Abbruchbedinung für die Combobox-befüllung ein 2. Bringt er nurn bei der Materialübergabe einen Fehler, warum weis ich leider nicht Code: Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim parameters1 As Parameters Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "C:\Temp\MeinCatalog.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Dim aMaterialArray() Dim A As Integer A = 0 ReDim aMaterialArray(A) Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name A = A + 1 ReDim Preserve aMaterialArray(A) aMaterialArray(A) = Ausgabe '& ";" & sFamilyName Loop Until (imaterial_no = Mat_Anzahl) Loop Until (ifamily_no = List_Anzahl) For X = UBound(aMaterialArray) - 1 To LBound(aMaterialArray) Step -1 ' Alle links davon liegenden Zeichen auf richtige Sortierung ' der jeweiligen Nachfolger überprüfen: For Y = LBound(aMaterialArray) To X ' Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert? If aMaterialArray(Y) > aMaterialArray(Y + 1) Then ' Element und seinen Nachfolger vertauschen. vTemp = aMaterialArray(Y) aMaterialArray(Y) = aMaterialArray(Y + 1) aMaterialArray(Y + 1) = vTemp End If Next Y Next X Dim Ausgabe1 As String Dim v As Integer v = 0 Do v = v + 1 Ausgabe1 = aMaterialArray(v) userform1.ComboBox1.AddItem (Ausgabe1) Loop Until v = 15 'Abbruch bedingung ??? userform1.Show Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim Return1 As Material Eingabe = userform1.ComboBox1.Value Dim K As Integer Dim aList(1) Dim L As Integer For K = 1 To A For L = 0 To 1 aList(L) = Split(aMaterialArray(K), ";")(L) 'Fehler index außerhalb des gültogen Bereichs Next If aList(0) = Eingabe Then Set Return1 = oMaterial_document.Families.Item(aList(1)).Materials.Item(aList(0)) Exit For End If Next LinkMode = 0 oManager.ApplyMaterialOnPart part1, Return1, LinkMode oMaterial_document.Close part1.Update End Sub
Wär super wenn jemand eine Idee zu den Problemen hätte Dank euch schonmal im Vorraus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 08. Jul. 2010 16:55 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo, ich habe die Diskussion nicht ganz verfolgt und mir den Code auch nicht angeschaut, aber die Fehlermeldung sagt aus, dass Du auf Element eines Arrays zugreifen möchtest, welches es nicht gibt, glaube ich. ich mute daher:
Code:
aList(L) = Split(aMaterialArray(K), ";")(L)
Entweder es gibt in aMaterialArray(K) kein ";" oder es gibt kein aMaterialArray(K), also K könnte zu groß sein.Schau's Dir bitte im Debugger an, wenn der Fehler auftritt springste dann ja auch an die Stelle im Pause-Modus. Dann einfach aMaterialArray(K) markieren und in die Watchlist ziehen via Drag & Drop. Die Watchlist unter Ansicht anschalten. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
weylin Mitglied
Beiträge: 25 Registriert: 16.06.2010 Catia V5 R18 Win 7 Core 2 Quad 2,4 Ghz
|
erstellt am: 09. Jul. 2010 10:29 <-- editieren / zitieren --> Unities abgeben:
Hab die Lösungen gefunden Bei der Materialübergabe hatte Hoblila recht ( Danke für deine Hilfe ) Und ein weiterer Fehler war noch drin bei dem Befüllen der Combobox hab ich das Array nicht gesplittet sodass der Material und familie übergeben hatte (wobei die familie im weiteren codeverlauf ja explizit weggelassen wurde ) Danke euch allen nochmal für euere Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 16. Mai. 2013 18:47 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo Leute, ich hole mal den Beitrag hervor, weil ich einfach nicht weiterkomme. Da ich kein VB habe dachte ich mir, gut für ein CATScript ein paar Variablen und ein Auswahl Fester für das Material bekomme ich schon hin. Ja das habe ich auch Geschaft. Aber jetzt komme ich einfach nicht mehr weiter, könnte mir da jemand helfen? Ich weiß nicht wo der Fehler ist. Auch ein Versuch mit V5Automation.chm den Fehler zu lokalisieren ist gescheitert. Na ja ich hoffe ihr könnt mir helfen. Code: 'CATScriptSub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim parameters1 As Parameters Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "\\SRVSBS2011\Catia_Produktion\Aufträge\_STANDARTS + VORLAGEN\Material\Werner.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Dim aMaterialArray() Dim A As Integer A = 0 ReDim aMaterialArray(A) '************************************************************************************************************************ Dim u As Integer u=0 Dim s As String '*********************************************************************************************************************** Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name A = A + 1 ReDim Preserve aMaterialArray(A) aMaterialArray(A) = Ausgabe '& ";" & sFamilyName Loop Until (imaterial_no = Mat_Anzahl) Loop Until (ifamily_no = List_Anzahl) For X = UBound(aMaterialArray) - 1 To LBound(aMaterialArray) Step -1 ' Alle links davon liegenden Zeichen auf richtige Sortierung ' der jeweiligen Nachfolger überprüfen: For Y = LBound(aMaterialArray) To X ' Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert? If aMaterialArray(Y) > aMaterialArray(Y + 1) Then ' Element und seinen Nachfolger vertauschen. vTemp = aMaterialArray(Y) aMaterialArray(Y) = aMaterialArray(Y + 1) aMaterialArray(Y + 1) = vTemp End If 'Next Y Next 'Next X Next Dim Ausgabe1 As String Dim v As Integer v = 0 Do v = v + 1 Ausgabe1 = aMaterialArray(v) '************************************ Liste fuer das Menu *************************************************** 'msgbox "Ausgabe: " & Ausgabe1 u = u + 1 s = s & u & ". " & Ausgabe1 & Chr(10) & Chr(10) '************************************ Liste fuer das Menu *************************************************** 'userform1.ComboBox1.AddItem (Ausgabe1) Loop Until v = 15 'Abbruch bedingung ??? 'userform1.Show
'**************************************** InputBox mit auswahl (nur Nr.) ************************************ DasMenu = "Wähle ein Material aus:" +Chr(10)+_ " "+Chr(10)+_ s 'liste fuer die Auswahl (InputBox) Antwort = InputBox(DasMenu,"Auswahl:") If IsNumeric(Antwort) then 'msgbox Antwort End If '**************************************** InputBox mit auswahl (nur Nr.) ************************************ Set oManager = part1.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim LinkMode As Integer Dim Return1 As Material
'Eingabe = userform1.ComboBox1.Value
'********* mit der Antwort von Inputbox das Material von ArrayList holen ************************************ Eingabe = aMaterialArray(Antwort) 'Msgbox "Eingabe: " & Eingabe '********* mit der Antwort von Inputbox das Material von ArrayList holen ************************************ Dim K As Integer Dim aList(1) Dim L As Integer For K = 1 To A For L = 0 To 1 'aList(L) = Split(aMaterialArray(K), ";")(L) 'Fehler index außerhalb des gültogen Bereichs aList(L) = Eingabe 'Msgbox "aList(L): " & Eingabe Next If aList(0) = Eingabe Then Set Return1 = oMaterial_document.Families.Item(aList(1)).Materials.Item(aList(0)) Exit For End If Next LinkMode = 0 oManager.ApplyMaterialOnPart part1, Return1, LinkMode oMaterial_document.Close part1.Update End Sub
------------------ Sei Schlau bleib Dumm !!?!! [Diese Nachricht wurde von K.Siebert am 16. Mai. 2013 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. Mai. 2013 19:03 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Servus Welche Werte haben "aList(1)" und "aList(0)"? Gibt es diese Familie bzw Material? ggf musst den String des Arrays casten (in einen iteger). Gruß Bernd EDIT: Auf welche Familie willst du zugreifen? In der Auswahl hast du die Familien entfernt, trotzdem wird in der Zeile in der der Fehler kommt eine Familien über aList1 definiert ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 16. Mai. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 16. Mai. 2013 22:49 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo nochmal, ich habe das noch mal überarbeitet die neuen Zeilen sind aus dem Script von der V5Automation.chm. Jetzt aber was neues wo ich leider nicht weiter weiß. Meine bescheide frage ist wo liegt den jetzt schon wieder mein Fehler? Code: 'http://ww3.cad.de/foren/ubb/Forum137/HTML/004137.shtml 'http://ww3.cad.de/foren/ubb/Forum137/HTML/001194.shtml#000003Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part '****************************************************************************************** Dim oPartDocument As Document Set oPartDocument = CATIA.ActiveDocument Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim oRootPart As Part 'Set oRootPart = oPartDocument.Part Dim oMainBody As Body 'Set oMainBody = oRootPart.MainBody Set productDocument1 = CATIA.ActiveDocument Set product1 = productDocument1.Product Name_Part = product1.PartNumber 'msgbox Name_Part
'**************************************************************
'***************************************************** Dim parameters1 As Parameters 'Set parameters1 = part1.Parameters Dim sFilePath As String sFilePath = CATIA.SystemService.Environ("CATDocView") sFilePath = "\\SRVSBS2011\Catia_Produktion\Aufträge\_STANDARTS + VORLAGEN\Material\Werner.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 Variant Dim I As Integer Dim imaterial_no As Variant Dim J As Integer I = 0 Dim aMaterialArray() Dim A As Integer A = 0 ReDim aMaterialArray(A) '************************************************************************************************************************ Dim u As Integer u=0 Dim s As String '*********************************************************************************************************************** Do I = I + 1 J = 0 ifamily_no = I Dim List_Anzahl As Long List_Anzahl = cFamilies_list.Count Do J = J + 1 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 Mat_Anzahl As Long Mat_Anzahl = cMaterials_list.Count imaterial_no = J Dim Material1 As Material Set Material1 = cMaterials_list.Item(imaterial_no) Dim Ausgabe As String Ausgabe = Material1.Name A = A + 1 ReDim Preserve aMaterialArray(A) aMaterialArray(A) = Ausgabe '& ";" & sFamilyName Loop Until (imaterial_no = Mat_Anzahl) Loop Until (ifamily_no = List_Anzahl) For X = UBound(aMaterialArray) - 1 To LBound(aMaterialArray) Step -1 ' Alle links davon liegenden Zeichen auf richtige Sortierung ' der jeweiligen Nachfolger überprüfen: For Y = LBound(aMaterialArray) To X ' Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert? If aMaterialArray(Y) > aMaterialArray(Y + 1) Then ' Element und seinen Nachfolger vertauschen. vTemp = aMaterialArray(Y) aMaterialArray(Y) = aMaterialArray(Y + 1) aMaterialArray(Y + 1) = vTemp End If 'Next Y Next 'Next X Next Dim Ausgabe1 As String Dim v As Integer v = 0 Do v = v + 1 Ausgabe1 = aMaterialArray(v) '************************************ Liste fuer das Menu *************************************************** 'msgbox "Ausgabe: " & Ausgabe1 u = u + 1 s = s & u & ". " & Ausgabe1 & Chr(10) & Chr(10) '************************************ Liste fuer das Menu *************************************************** 'userform1.ComboBox1.AddItem (Ausgabe1) Loop Until v = 15 'Abbruch bedingung ??? 'userform1.Show
'**************************************** InputBox mit auswahl (nur Nr.) ************************************ DasMenu = "Wähle ein Material aus:" +Chr(10)+_ " "+Chr(10)+_ s 'liste fuer die Auswahl (InputBox) Antwort = InputBox(DasMenu,"Auswahl:") If IsNumeric(Antwort) then 'msgbox Antwort End If '**************************************** InputBox mit auswahl (nur Nr.) ************************************ Set oManager = part1.GetItem("CATMatManagerVBExt") 'Set oManager = oRootPart.GetItem("CATMatManagerVBExt") Dim Eingabe As String Dim LinkMode As Integer ' Dim Eingabe As Material
'Eingabe = userform1.ComboBox1.Value
'********* mit der Antwort von Inputbox das Material von ArrayList holen ************************************ Eingabe = aMaterialArray(Antwort) Msgbox "Eingabe: " & Eingabe '********* mit der Antwort von Inputbox das Material von ArrayList holen ************************************ '******************************************************************* Dim specsAndGeomWindow1 As Window Set specsAndGeomWindow1 = CATIA.ActiveWindow specsAndGeomWindow1.WindowState = catWindowStateMinimized Dim windows1 As Windows Set windows1 = CATIA.Windows LinkMode = 0 'oManager.ApplyMaterialOnPart part1, Eingabe, LinkMode 'oManager.ApplyMaterialOnBody oMainBody,oMaterial3,linkMode Set body1 = bodies1.Item("Hauptkörper") oManager.ApplyMaterialOnBody oMainBody,Eingabe,linkMode oMaterial_document.Close part1.Update End Sub
------------------ Sei Schlau bleib Dumm !!?!!
[Diese Nachricht wurde von K.Siebert am 16. Mai. 2013 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. Mai. 2013 23:10 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Servus oMainBody ist nicht definiert. Du hast die Zeile "Set oMainBody = oRootPart.MainBody" auskommentiert. Muss linkMode nicht als Short deklariert sein? Liefert dir "Eingabe" ein Material zurück (bzw hat es bei ApplyMaterialOnPart funktoniert)? Schreib doch das Makro im VBA-Editor, der Code läuft fast immer auch als CATScript (wenn du keine VBA spezifischen Objekte verwendest) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 17. Mai. 2013 12:23 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Servus Ich hab mal den Code komplett überarbeitet (ohne Sortierung), der vorherige ist sehr unübersichtlich: Code: Sub CATMain() Dim sFilePath As String Dim oMaterial_document As Document Dim cFamilies_list As MaterialFamilies Dim oFamily As MaterialFamily Dim sFamilie As String Dim Inputtext As String Dim i As Integer Dim cMaterial_list As Materials Dim oMaterial As Material Dim sMaterial As String Dim Antwort As String Dim oDocument As Document Dim oMainBody As Body Dim oManager As MaterialManager Dim LinkMode As Integer sFilePath = "C:\temp\MatCatalog.CATMaterial" LinkMode = 0 'Part geöffnet If CATIA.Windows.Count = 0 Then Exit Sub End If Set oDocument = CATIA.ActiveDocument If TypeName(oDocument) <> "PartDocument" Then Exit Sub End If 'Mainbody auslesen Set oMainBody = oDocument.Part.MainBody 'Materialdokument öffnen Set oMaterial_document = CATIA.Documents.Read(sFilePath) Set cFamilies_list = oMaterial_document.Families 'Liste der Familien erstellen For i = 1 To cFamilies_list.Count Set oFamily = cFamilies_list.Item(i) sFamilie = sFamilie + Chr(13) + CStr(i) + " " + oFamily.Name Next 'Familie abfragen Inputtext = "Bitte Materialfamilie auswählen:" + Chr(13) + sFamilie Antwort = InputBox(Inputtext, "Materialfamilie-Auswahl") If Not IsNumeric(Antwort) Then MsgBox "Keine Auswahl getroffen. Das Makro wird beendet" End If Set cMaterial_list = cFamilies_list.Item(CInt(Antwort)) 'Liste der Materialien erstellen For i = 1 To cMaterial_list.Count Set oMaterial = cMaterial_list.Item(i) sMaterial = sMaterial + Chr(13) + CStr(i) + " " + oMaterial.Name Next 'Material abfragen Inputtext = "Bitte Materiale auswählen:" + Chr(13) + sMaterial Antwort = InputBox(Inputtext, "Material-Auswahl") If Not IsNumeric(Antwort) Then MsgBox "Keine Auswahl getroffen. Das Makro wird beendet" End If Set oMaterial = cMaterial_list.Item(CInt(Antwort)) 'Material dem MainBody zuweisen zuweisen Set oManager = oDocument.Part.GetItem("CATMatManagerVBExt") oManager.ApplyMaterialOnBody oMainBody, oMaterial, LinkMode oDocument.Part.Update 'Aufräumen oMaterial_document.Close End Sub
Ich hoffe jetzt wird es etwas klarer.Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 17. Mai. 2013 13:22 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo, Leider kommt ein Fehler bei cMaterial_list, aber ich danke dir Trotzdem für deine Hilfe! Ich habe auch ein wenig weiter Geschieben und habe es geschafft das Teil zum Laufen zu bringen. Bei mir ist allerdings die Family hardcodiert ich werde das von dir übernehmen und den Code aufräumen, Und nachreichen. Unities unterwegs ------------------ Sei Schlau bleib Dumm !!?!! 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: 17. Mai. 2013 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
|
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 17. Mai. 2013 17:45 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Hallo, Wenn ich das könnte wäre ich echt Happy. Hier mal die Fehlermeldung von VBA und auch selbst aufgezeichnete Module laufen nicht. Und wenn ich eine einfache UserForm erstellen will sagt mir der Rechner das ich keine Butten erstellen kann weil nicht genügend Speicher da ist. Und wenn ich zum Admin gehe wird gesagt „wie Programme du sollst mit Catia Zeichnen und nicht Programmieren. ------------------ Sei Schlau bleib Dumm !!?!! 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: 17. Mai. 2013 18:00 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
|
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 17. Mai. 2013 18:23 <-- editieren / zitieren --> Unities abgeben: Nur für weylin
Läuft DANKE hier noch einmal der Komplette Laufende code: Code: Sub CATMain() Dim sFilePath As String Dim oMaterial_document As Document Dim cFamilies_list As MaterialFamilies Dim oFamily As MaterialFamily Dim sFamilie As String Dim Inputtext As String Dim i As Integer Dim cMaterial_list As Materials Dim oMaterial As Material Dim sMaterial As String Dim Antwort As String Dim oDocument As Document Dim oMainBody As Body Dim oManager As MaterialManager Dim LinkMode As Integer sFilePath = "\\SRVSBS2011\Catia_Produktion\Aufträge\_STANDARTS + VORLAGEN\Material\Werner.CATMaterial" LinkMode = 0 'Part geöffnet If CATIA.Windows.Count = 0 Then Exit Sub End If Set oDocument = CATIA.ActiveDocument If TypeName(oDocument) <> "PartDocument" Then Exit Sub End If 'Mainbody auslesen Set oMainBody = oDocument.Part.MainBody 'Materialdokument öffnen Set oMaterial_document = CATIA.Documents.Read(sFilePath) Set cFamilies_list = oMaterial_document.Families 'Liste der Familien erstellen For i = 1 To cFamilies_list.Count Set oFamily = cFamilies_list.Item(i) sFamilie = sFamilie + Chr(13) + CStr(i) + " " + oFamily.Name Next 'Familie abfragen Inputtext = "Bitte Materialfamilie auswählen:" + Chr(13) + sFamilie Antwort = InputBox(Inputtext, "Materialfamilie-Auswahl") If Not IsNumeric(Antwort) Then MsgBox "Keine Auswahl getroffen. Das Makro wird beendet" End If 'msgbox Antwort Set cMaterial_list = cFamilies_list.Item(CInt(Antwort)).Materials 'Liste der Materialien erstellen For i = 1 To cMaterial_list.Count Set oMaterial = cMaterial_list.Item(i) sMaterial = sMaterial + Chr(13) + CStr(i) + " " + oMaterial.Name Next 'Material abfragen Inputtext = "Bitte Materiale auswählen:" + Chr(13) + sMaterial Antwort = InputBox(Inputtext, "Material-Auswahl") If Not IsNumeric(Antwort) Then MsgBox "Keine Auswahl getroffen. Das Makro wird beendet" End If Set oMaterial = cMaterial_list.Item(CInt(Antwort)) 'Material dem MainBody zuweisen zuweisen Set oManager = oDocument.Part.GetItem("CATMatManagerVBExt") oManager.ApplyMaterialOnBody oMainBody, oMaterial, LinkMode oDocument.Part.Update 'Aufräumen oMaterial_document.Close End Sub
------------------ Sei Schlau bleib Dumm !!?!! [Diese Nachricht wurde von K.Siebert am 17. Mai. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |