Autor
|
Thema: Makro verliert die Selektion nach laden des Parts (2160 mal gelesen)
|
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 27. Jun. 2013 17:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich habe mir ein VBA-Makro geschrieben, welches die Benennung der Parts in einem Product in die Zwischenablage kopiert. Einige Parts in meinem Product sind jedoch nach dem öffnen noch nicht geladen. Deshalb kann das Makro von diesen Parts die Benennung nicht ziehen. Es kommt dann immer die Error-Number: -2147418113. Deshalb habe ich mein Makro so ergänzt, dass wenn diese Error-Number kommt, dann soll das Part zuerst geladen werden und danach das Makro nochmal von vorne gestartet werden.
Code: 'Wenn Bauteil nicht geladen, dann...************************************************ If Err.Number = -2147418113 Then CATIA.StartCommand ("Load") 'Makro nochmal von vorne starten******************************************** End If
Das Problem ist, dass die Selektion des Parts nach "CATIA.StartCommand ("Load")" verloren geht. Ist es möglich, dass die Selektion am Anfang des Makros gespeichert wird und das Makro nach dem Laden des Bauteils wieder mit dieser Selektion weitermacht? Gruß graaas 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: 27. Jun. 2013 19:04 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Servus Ich hätte zwei Ideen dazu: - vor dem start des Makros mit einer Schleife alle Teile prüfen, ob diese gelanden sind und ggf nachladen - Selection zunächst in einer Collection zwischen speichern Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 01. Jul. 2013 09:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, danke für die schnelle Antwort. Alle Bauteile vorher zu laden würde sehr lange dauern, weil es auch nicht wenige Bauteile sind. Was bedeutet die Selection in einer Collection zu speichern? Wie macht man sowas? 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. Jul. 2013 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Servus das geht zB so (ungetestet): Code: dim oCollection as Collectionfor I = 1 to oselection.count oCollection.Add oselection.item2(I).value next
Danach kannst du per oCollection.Item auf die Elemente zugreifen.Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 01. Jul. 2013 12:01 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Fast, Bernd, die Collection hat, wie das Dictionary immer 2 Werte, also Key und Objekt. Ansonsten hat bernd aber alles geschrieben. :-) Je nach Release vielleicht Count2() der Selection benutzen. ------------------ 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 |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 01. Jul. 2013 12:06 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
|
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 01. Jul. 2013 14:05 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 01. Jul. 2013 17:11 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Servus Da du nur ein Teil selektiert hast (oder nur eines abarbeitest) sollte es ganz einfach gehen: Code: Dim selProduct as Product 'oder was ist den selektiert?? Set oProduct = CATIA.ActiveDocument.Selection.Item2(1).Value sText = oProduct.PartNumber
Wo führst du nach dem laden das Makro erneut aus (manuell)?Gruß Bernd EDIT: Code korrigiert ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 02. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 01. Jul. 2013 21:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, es wird ein Part selektiert. Mit "Set oProduct = CATIA.ActiveDocument.Selection.Item2(1).Value.PartNumber" greift man ja auf die Properties des Parts zu und da kommt bei mir immer der Error. Das ist aber nur bei den Parts die nicht geladen sind. Deshalb lade ich diese dann:
Code: 'Wenn Bauteil nicht geladen, dann...************************************************ If Err.Number = -2147418113 Then CATIA.StartCommand ("Load") 'Makro nochmal von vorne***************** End If
Wenn man z.B. händisch ein Part läd dann verliert er auch die Selektion. Und das passiert hald mit dem Makro auch. Deshalb muss ich dann das Bauteil nochmal händisch selektieren und das Makro nochmal starten. Das würd ich hald gerne automatisieren, dass die Selektion irgendwie gespeichert wird. Gruß, graaas 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. Jul. 2013 21:43 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Servus Du könntest doch zunächst das selektierte Part/Product einer Variable zuweisen, dann prüfen, ob die PartNumber auszulesen ist. Wenn dies nicht funktioniert das Part/Product nachladen und die PartNumber auslesen/weiterverarbeiten. Dabei brauchst du nur beim ersten Schritt die Selektion (bis das Part/Product/Instance einer Variabel zugewiesen wurde) danach nicht mehr. Gruß Bernd EDIT: In meinem vorherigen Code war ein Fehler, es müsste: Set oProduct = CATIA.ActiveDocument.Selection.Item2(1).Value heißen. ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 02. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 02. Jul. 2013 12:24 <-- editieren / zitieren --> Unities abgeben:
Ok, wenn ich das so mache wie du geschrieben hast und dann nach dem Laden das "oProduct" als Test in einer MsgBox anzeigen lassen will funktioniert das nicht. Denn bei den ungeladenen Teilen funktioniert der Teil Set oProduct = CATIA.ActiveDocument.Selection.Item2(1).Valueschon nicht. Da kommt nämlich dann die Err.Number -2147418113. Und da verweise ich ja dann darauf, dass wenn diese Err.Number kommt soll er mir das Bauteil laden. Und nach dem Laden mit diesem Bauteil weiter arbeiten. Kann ich nicht irgendwie die "CATIA.ActiveDocument.Selection" als Variable speichern sodass ich dann nach dem Laden auf diese Selektion nochmal zugreifen kann? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 02. Jul. 2013 12:34 <-- editieren / zitieren --> Unities abgeben:
Ich habe jetzt mal versucht die Selektion zu speichern mit: Code: Dim selProduct As Product Set oProduct = CATIA.ActiveDocument.Selection
um dann danach darauf zuzugreifen:
Code: 'Wenn Bauteil nicht geladen, dann...************************************************ If Err.Number = -2147418113 Then CATIA.StartCommand ("Load") With oProduct If .Count <> 0 Then sText = .Item(1).Value.PartNumber MsgBox sText End If End With End If
Das funktioniert aber dann gar nicht. Da läuft er ohne Error durch, läd das Bauteil und macht aber dann nichts danach. 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: 02. Jul. 2013 12:35 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Servus Um was für ein Objekt handelt sich das selektierte Element (Product, Document, Part, ...)? (ggf Deklaration berichtigen oder allgemein als Object deklarieren) Gruß Bernd EDIT: Was soll schon nach dem laden des Bauteils passieren, gemäß Code ist danach das Makro zu Ende (keine Schleife, kein erneuter Aufruf, ...) ------------------ Warum einfach, wenn es auch kompliziert geht.
[Diese Nachricht wurde von bgrittmann am 02. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 02. Jul. 2013 12:44 <-- editieren / zitieren --> Unities abgeben:
Es ist eigenlich ein Part. Angehängt ein Beispiel wie sich die Benennung im Strukturbaum nach dem Laden verändert. Nach dem Laden soll das Makro nochmal durchlaufen werden, sprich die Benennung in die Zwischenablage gespeichert werden. Zum Test würde es mir reichen, wenn er mir die Benennung einfach mal in einer MsgBox angibt. Deshalb der Code: Code: 'Wenn Bauteil nicht geladen, dann...************************************************ If Err.Number = -2147418113 Then CATIA.StartCommand ("Load") With oProduct If .Count <> 0 Then sText = .Item(1).Value.PartNumber MsgBox sText End If End With End If
[Diese Nachricht wurde von graaas am 02. Jul. 2013 editiert.] [Diese Nachricht wurde von graaas am 02. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 02. Jul. 2013 14:33 <-- editieren / zitieren --> Unities abgeben:
Also ich hab die Lösung. Ich lese einfach den Instance Name anstatt der PartNumber aus. Das geht auch bei ungeladenen Bauteilen. Vielen Dank aber trotzdem für deine Bemühungen Bernd. Gruß, graaas [Diese Nachricht wurde von graaas am 02. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 02. Jul. 2013 14:55 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
Hallo graaas, Zitat: Ich lese einfach den Instance Name anstatt der PartNumber aus.
Dir ist ja bekannt das der Instance Name sich von dem Partnamen unterscheiden kann. Wollte es nur mal erwähnen. ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
graaas Mitglied
Beiträge: 40 Registriert: 15.04.2010
|
erstellt am: 03. Jul. 2013 20:57 <-- editieren / zitieren --> Unities abgeben:
|
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 03. Jul. 2013 21:44 <-- editieren / zitieren --> Unities abgeben: Nur für graaas
moin moin, wieso kannst du nicht einfach für jedes Bauteil eine extra sub einfügen welches die BAuteil lädt? Sind sie schon geladen würde es nicht länger dauern. zB sub CATMain() hier passiert dein selection set oProd = CATIA.ActiveDocument.Selection.Item(1).Value LoadSub oProd 'hier ruft er das extra sub auf und übergibt das Selektiere CATIA.ActiveDocument.Selection.add(oProd) sonstiges code end sub sub LoadSub (oProd) CATIA.StartCommand ("Load") end Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |