Autor
|
Thema: Variablen dynamisch erstellen und damit rechnen (1532 mal gelesen)
|
iddqdidkfa Mitglied Student
Beiträge: 4 Registriert: 13.01.2015 Catia V5 R19
|
erstellt am: 01. Feb. 2015 12:37 <-- editieren / zitieren --> Unities abgeben:
Hallo alle zusammen! Dieses Forum gefällt mir sehr gut und es hat mir schon viel geholfen, ohne mich aktiv mit Beiträgen zu beteiligen. Aber leider komme ich jetzt nicht weiter und brauche Hilfe… Zuerst meine Fragen: Kann ich in einem Catia V5 Makro in einer Schleife Variablen dynamisch erstellen? Kann der Variablenname in der Schleife hochgezählt werden? Kann ich auf diese Variablen nach der Schleife gezielt zugreifen und mit ihnen rechnen? Wie geht das? Der Sachverhalt: Ich habe ein Makro, das auf einem Spline Punkte erstellt. Die Punkte werden benannt:
Code: Punkt.Name = „Startpunkt.“ & Nr 'Nr ist die Laufvariable die bei der gezielten Benennung hilft
Später werden die erstellten Punkte gesucht und selektiert. Code: selection1.Search "Name = *Startpunkt.* ,all"
Und über Code: GetCoordinates
bekomme ich die Koordinaten der Punkte. So weit so gut. Ich möchte die Koordinaten in den dynamisch erstellten Variablen speichern und danach gezielt auf sie zugreifen und mit ihnen weiterrechnen, z.B. Mittelwerte bilden. Hier komme ich nun leider nicht weiter. Ich bin für jeden Hilfeansatz dankbar!
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: 01. Feb. 2015 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für iddqdidkfa
Servus Willkommen im Forum. Du könntest die Punkte zB in einem Array (ggf mehrdimensional) oder einer Collection zwischenspeichern. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
iddqdidkfa Mitglied Student
Beiträge: 4 Registriert: 13.01.2015 Catia V5 R19
|
erstellt am: 01. Feb. 2015 19:27 <-- editieren / zitieren --> Unities abgeben:
Danke für den Schubs in die richtige Richtung! Auf die Gefahr hin, dass ich dumme Fragen stelle, ich bin jetzt soweit: Code: Dim Koord(3) As Integer Dim Arraygroesse As Integer Set Arraygroesse = selection1.Count Dim x_Speicher() Dim y_Speicher() Dim z_Speicher() ReDim x_Speicher( Arraygroesse) As Integer ReDim y_Speicher( Arraygroesse) As Integer ReDim z_Speicher( Arraygroesse) As Integer for i = 1 To selection1.Count Set element = selection1.Item(i) Set point = element.Value point.GetCoordinates(Koord)'Koordinaten werden korrekt an Koord übergeben
'Nun sollen die Koordinaten an das jeweilige Array weitergegeben werden, das klappt jedoch nicht x_Speicher(i) = Koord(0) y_Speicher(i) = Koord(1) z_Speicher(i) = Koord(2) Dim Rechnung as Integer 'Rechnung = 0 Rechnung = x_Speicher(1) + x_Speicher(2) 'Ausgabe in MsgBox zur Kontrolle MsgBox ("Ausgabe Variable x_Speicher: " & x_Speicher(2)) MsgBox ("Ausgabe Variable Rechnung: " & Rechnung) 'Box gibt nur den Text wieder, keinen Wert
Ich seh meinen Fehler nicht. Kann ich die Arraygröße nicht über selection1.Count angeben? Und/oder ist das i als Pointer für das Array falsch?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 01. Feb. 2015 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für iddqdidkfa
Hallo, Die ersten Bugs sind: Code:
Dim Arraygroesse As Integer Set Arraygroesse = selection1.Count
Fehlermeldung: 'Object required'; -> Arraygroesse = selection1.Count Code:
Dim x_Speicher() Dim y_Speicher() Dim z_Speicher() ReDim x_Speicher( Arraygroesse) As Integer ReDim y_Speicher( Arraygroesse) As Integer ReDim z_Speicher( Arraygroesse) As Integer
Fehlermeldung: 'Can't change data types' -> Dim x_Speicher()as integer etc. Code:
Set point = element.Value
Fehlermeldung: 'Argument not optional'; 'Point' is eine VB-Funktion! -> Set MyPoint = element.Value Weiter komm' ich ohne Catia nicht. Ich finde im Code auch nicht, wo Du die Elemente abholst/übergibst. So wie das im Moment dasteht, bezweifele ich, dass es überhaupt gelaufen ist. Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
iddqdidkfa Mitglied Student
Beiträge: 4 Registriert: 13.01.2015 Catia V5 R19
|
erstellt am: 01. Feb. 2015 21:14 <-- editieren / zitieren --> Unities abgeben:
Ich habe das Ganze mal zusammengekürzt: Code: 'CatScript 'Punkt(e) mit Namen "Startpunkt." muss (müssen) vorhanden seinSub CATMain() On Error Resume Next Set document = CATIA.ActiveDocument Set filesys = CATIA.FileSystem Dim selection1 As Selection Set selection1 = document.Selection selection1.Search "Name = *Startpunkt.* ,all" if err <> 0 Then msgbox("Keine Punkte selektiert!") End If Dim Koord(3) As Integer Dim Arraygroesse As Integer Set Arraygroesse = selection1.Count Dim x_Speicher() Dim y_Speicher() Dim z_Speicher() ReDim x_Speicher( Arraygroesse) As Integer ReDim y_Speicher( Arraygroesse) As Integer ReDim z_Speicher( Arraygroesse) As Integer for i = 1 To selection1.Count Set element = selection1.Item(i) Set point = element.Value point.GetCoordinates(Koord) x_Speicher(i) = Koord(0) y_Speicher(i) = Koord(1) z_Speicher(i) = Koord(2) if i <> selection1.Count Then End If Next Dim Rechnung_1 As Integer Dim Rechnung_2 As Integer Rechnung_1 = Koord(0) Rechnung_2 = x_Speicher(1) + x_Speicher(2) msgbox ("Script wurde ausgeführt ") MsgBox ("Ausgabe Rechnung_1 - (Koord(0): " & Rechnung_1) MsgBox ("Ausgabe Rechnung_2 (x_Speicher(1) + x_Speicher(2)) -: " & Rechnung_2) End Sub
In CATScript läuft es durch. Koord enthält die richtigen Koordinaten, die Weitergabe an x_Speicher(i) funktioniert aber nicht. MsgBox mit Rechnung_1 ist korrekt, die Andere gibt nur den Text zurück und keinen Wert. In MS VBScript kommen Fehlermeldungen. Es tut mir leid, dass das in CATScript ist hätte ich vorher sagen müssen! 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: 01. Feb. 2015 21:33 <-- editieren / zitieren --> Unities abgeben: Nur für iddqdidkfa
Servus Schalte am besten mal die Fehlerbehandlung mit "On error goto 0" wieder ein, sonst werden dir keine Fehler angezeigt. Wenn du die Tipps von Joe einbaust läuft dein Code durch. (ggf noch manche Dimensionen anpassen (zB Double statt Integer). Gruß Bernd PS: Vorsicht, bei Arrays läuft der Zähler bei 0 los. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 01. Feb. 2015 21:33 <-- editieren / zitieren --> Unities abgeben: Nur für iddqdidkfa
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 01. Feb. 2015 22:59 <-- editieren / zitieren --> Unities abgeben: Nur für iddqdidkfa
Etwas versteh ich noch nicht ganz: Du hast die Punkte eben erstellt, d.h. Du kennst sowohl Name als auch Anzahl und Ablageort(Geom. Set/HybridBody). Anstatt die Punkte später nochmal zu suchen, könntest sie gleich in ein Array schreiben und später der Routine das Array übergeben. In der Routine greifst dann über Hybridbodies.Item(<AblageOrt> ).Hybridshapes.Item(<Name> ) auf die Punkte zu. Die Redims sind dann überflüssig, die Selektion auch. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
iddqdidkfa Mitglied Student
Beiträge: 4 Registriert: 13.01.2015 Catia V5 R19
|
erstellt am: 03. Feb. 2015 20:48 <-- editieren / zitieren --> Unities abgeben:
Guten Abend! Ich hab leider mal wieder zu kompliziert gedacht. Die Variablen spreche ich nun direkt über:
Code: HybridBodies.Item("SetName").HybridShapes.Item("PunktName." &i)
Danke für den Tipp! Es funktioniert nun auch, dass die Werte aus dem Koord Array in einen anderen übergeben werden, der Start des Arrays bei 0 wird nun auch berücksichtigt. Danke für Eure Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |