| |
 | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 |
| |
 | KISTERS 3DViewStation - Der Schlüssel zur Einsparung von CAD-Lizenzen, eine Pressemitteilung
|
Autor
|
Thema: Array Problem (2402 mal gelesen)
|
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 07. Sep. 2010 11:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich habe mal wieder (wie so oft :-) ein kleines problemchen und hoffe auf eure Hilfe. In meinen Drawing splitte ich einen Parameter folgendermaßen: VAR_TABLE = Split((parameters1.Item("VARIANT_CODE").Value)," ") Mit den Werten des sich daraus ergebenden Arrays erzeuge ich Views (als ViewName benutze ich die Werte des Arrays): For i = 0 to UBound(VAR_TABLE) n = VAR_TABLE(i) Set oView = oSheet.Views.Item("V" + n) If err.number <> 0 Then Set oView = oSheet.Views.Add("V" + n) Darin erzeuge ich dann Tabellen, fülle diese etc. etc. Mein Problem: Sobald alles angeschlossen ist (Views erzeugt und gefüllt) möchte ich das aktive Detail Sheet nach allen darauf befindlichen Views durchsuchen und alle Views löschen, deren ViewName keinem der Array Werte identisch ist. Sprich ich möchte den Namen jeder View mit ALLEN Werten des vorliegenden Arrays vergleichen; entspricht der Name KEINEM Array Wert möchte ich die View löschen. Habe schon alles versucht mit verschiedenen Schleifen, aber diese "überschlagen" sich immer irgendwo. Ich komme nicht darauf, wie ich den Namen mit allen Array Werten vergleichen kann um daraus die Entscheidung Löschen Ja / Nein abzuleiten. Hat jemand einen Lösungsansatz? Danke und Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
 
 Beiträge: 175 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Sep. 2010 12:16 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Hallo Sven, ich schätze mal du hast bei dir die Views innerhalb deiner Schleife löschen wollen. Das ist auch ok aber deine Schleife ignoriert die gelöschten Views und läuft über die vorhandene Item-Anzahl darüber hinaus. Versuch mal die Schleife vom größten Item bis zum kleinsten Item zudurchlaufen siehe Bsp.: Dim MyArray(2)
Dim i As Integer Dim c As Integer Dim MyDrawing As DrawingDocument Dim MySheet As DrawingSheet Dim MyView As DrawingView Dim MyViews As DrawingViews 'Aktive View holen Set MyDrawing = CATIA.ActiveDocument Set MySheet = MyDrawing.Sheets.ActiveSheet Set MyViews = MySheet.Views 'Dummy Array fuellen MyArray(0) = "VIEW1" MyArray(1) = "VIEW2" MyArray(2) = "VIEW3" 'Views scannen For c = MyViews.Count To 1 Step -1 Set MyView = MyViews.Item(c) For i = 0 To UBound(MyArray) If MyView.Name = MyArray(i) Then MyViews.Remove c Exit For End If Next Next End Sub mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 07. Sep. 2010 12:54 <-- editieren / zitieren --> Unities abgeben:         
Hi Mario, mein Problem ist, dass ich die Views dann löschen möchte, wenn sie keinem der Array werte entsprechen!!! Beispiel: View1: 00 View2: 01 View3: 02 Array-Werte: Array(0) = 00 Array(1) = 01 Heisst in diesem Fall möchte ich nicht die Views 1 + 2 löschen (das wäre mit deinem Code möglich), sondern die View 3 (da kein Array Wert = 02 ist). Es bedeutet eben ich muss den Viewname erst mit allen Array Werten vergleichen bevor ich die Entscheidung treffen kann die View zu löschen oder nicht. Und das scheint mir über eine Schleife nicht möglich (da ich in der Schleife immer nacheinander mit jedem einzelnen Array Wert vergleiche und in der Schleife somit noch keine Entscheidung zum Löschen treffen kann, sondern erst später..) Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
 
 Beiträge: 175 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Sep. 2010 13:12 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Ok, Sorry jetzt hab ich´s begriffen Ist aber auch kein Problem Sub CATMain() Dim MyArray(2) Dim i As Integer Dim c As Integer Dim MyDrawing As DrawingDocument Dim MySheet As DrawingSheet Dim MyView As DrawingView Dim MyViews As DrawingViews Dim IsInArray As Boolean 'Aktive View holen Set MyDrawing = CATIA.ActiveDocument Set MySheet = MyDrawing.Sheets.ActiveSheet Set MyViews = MySheet.Views 'Dymmy Array fuellen MyArray(0) = "VIEW1" MyArray(1) = "VIEW2" MyArray(2) = "VIEW3" 'Views scannen For c = MyViews.Count To 1 Step -1 IsInArray = False Set MyView = MyViews.Item(c) For i = 0 To UBound(MyArray) If MyView.Name = MyArray(i) Then IsInArray = True End If Next If IsInArray = False Then MyViews.Remove c End If Next End Sub mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 07. Sep. 2010 14:18 <-- editieren / zitieren --> Unities abgeben:         
Wow, das ging ja flott :-) Mein Code sieht nun so aus: For i = oSheet.Views.Count to 1 Step -1 IsInArray = False Set oView = oSheet.Views.Item(i) For m = 0 to VAR_TABLE_MAX If oView.Name = ("V" + VAR_TABLE(m)) Then IsInArray = True End If Next If oView.Name <> "Variant_table_header" Then If IsInArray = False Then oSheet.Views.Remove (i) End If End If IsInArray = False Next VAR_TABLE_MAX ist mein Array UBound. Läuft ganz gut, bis auf ein Problem: Ich muss eine View namens "Variant_table_header" (wird weiter oben im Script erzeugt) aus der Lösch-Aktion ausschliessen. Diese wird mit dem Code auch nicht gelöscht, jedoch ist sie im Strukturbaum der Zeichnung nicht mehr zu finden. D.h. auf dem Detail Sheet gibt es die View noch, im Baum wird sie aber gelöscht... sehr seltsam so was habe ich noch nie zuvor gesehen. Irgendeine Idee an was das liegen könnte??? Danke und Gruß Sven PS: 10 Unities sind auf dem Weg zu dir!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
 
 Beiträge: 175 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Sep. 2010 14:44 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
mmmh, sowas ist mir noch nicht aufgefallen. Ich kann das auch so schlecht nachprüfen sollte aber mit deiner Ausschlußzeile If oView.Name <> "Variant_table_header" Then auch kein Problem mehr sein, oder? mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 07. Sep. 2010 16:17 <-- editieren / zitieren --> Unities abgeben:         
Leider doch :-( Trotz dieser Zeile wird die View im Baum der zeichnung gelöscht, obwohl sie noch vorhanden ist auf der Detail Sheet. Hab mal mein komplettes Script inkl. Testdaten (R19) angehängt. Wenn Zeit hast könntest das CatScript mal bei dir ausführen und mir sagen was passiert. Sorry für das chaotische Script, muss ich wenn ich Zeit hab mal strukturieren. Danke und Gruß Sven 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: 07. Sep. 2010 19:22 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Hallo Sven, als generelles Konzept könnte ich es vorstellen, dass du die Sache doch mit deiner Schleife machst, aber einen weiteren Array oder Collection anlegst. In diesen sammelst du dann die Views, die du löschen möchtest. Dann brauchst du nur eine weitere (einfache) Schleife, um dann den Inhalt dieser Array zu löschen. Es kann sein, dass dein anderer Skript nicht funktioniert, da deine Schleifen bei den Views von 0, bzw. 1 anfangen (wie üblich) und du zwischenzeitlich schon so viele Views gelöscht hast, dass der Item mit den aktuellen Zählerwert gar nicht mehr existiert. Ein anderer Ansatz hier könnte sein, dass du bei der Schleife von hinten anfängst und rückwärts zählst. Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
   
 Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 07. Sep. 2010 23:43 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Hallo Sven2010, versuch doch mal diese Variante: Code: Set oViews = oSheet.Views For i = oViews.Count to 1 Step -1 IsInArray = False Set oView = oViews.Item(i) If oView.Name <> "Variant_table_header" Then For m = 0 to VAR_TABLE_MAX If oView.Name = ("V" & VAR_TABLE(m)) Then IsInArray = True Exit For End If Next If IsInArray = False Then oViews.Remove (i) End If End If Next
Eventuell kannst Du auch noch Code: oViews.Remove (i)
durchCode: oViews.Remove oView.Name
austauschen, wenn die View-Namen (Detail-Namen) einmalig sind. [Edit] Vielleicht solltest Du auch in Deinem Script die Deklaration der Sprache als erste Zeile einfügen. Das hilft schon mal bei Problemen, z.B. mit Arrays...:
Code: Language = "VBSCRIPT" Sub CATMain()
[/Edit] mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!!
frei nach größeren Geistern [Diese Nachricht wurde von Lusilnie am 07. Sep. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 08. Sep. 2010 09:37 <-- editieren / zitieren --> Unities abgeben:         
Hi Lusilnie, leider hat diese Variante auch nicht zum gewünschten Ergebnis geführt! Folgender Code läuft nun einwandfrei: If oView.Name <> "Variant_table_header" and oView.Name <> "Main View" and oView.Name <> "Background View" Then... Ich musste neben der nicht zu löschenden View "Variant_table_header" ausserdem noch die "Views" Vordergrund(1) und Hintergrund(2) ausschliessen. Scheinbat hat Catia etwas mit diesen Systemviews durcheinander gebracht als sie nicht explizit ausgeschlossen waren und normale Views im Strukturbaum gelöscht... Scripts können schon ungewöhnliche Dinge anrichten Danke an alle für eure Hilfe Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
 
 Beiträge: 175 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 08. Sep. 2010 10:39 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Hallo Sven, also ich hab mal deine Struktur angeschaut. Die besagte View war wie du schon sagst im Hintergrund noch vorhanden aber nicht im Baum. Ist wohl bei der Programmierung irgendwie (keine Ahnung wie ) nur halb gelöscht wurden. Ich habe diese dann nochmal mit nen Script gelöscht und dann funktioniert dein Makro nach meinen dafür halten. Das ausklammern der Background und Main View ist auf jeden Fall kein Fehler, beim löschen von allen Views hab ich das auch immer so gemacht. Hast da ja ganz schön was zusammengebastelt... mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sven2010 Mitglied

 Beiträge: 56 Registriert: 20.04.2010 V5R19SP3 Hotfix 50
|
erstellt am: 08. Sep. 2010 10:58 <-- editieren / zitieren --> Unities abgeben:         
Hi du, ja, ist über die vergangenen Wochen einiges zusammen gekommen bei meinem Title Block Macro (eines von 9 neuen Macros); deshalb auch die chaotische Struktur  Aber tut jetzt alles was es soll  Danke und nochmal Gruß an alle Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
   
 Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 08. Sep. 2010 18:11 <-- editieren / zitieren --> Unities abgeben:          Nur für Sven2010
Hallo Sven2010, sorry, das mit den 2 Standard-Views (Main & Background) hatte ich nicht mit bedacht. Da aber die Main-View immer ".Item(1)" und die Background-View immer ".Item(2)" sind, kannst Du dies auch einfacher machen: Code: For i = oViews.Count to 3 Step -1
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 |