| |
| KISTERS 3DViewStation: 3D-Visualisierung für After Sales, Service und Ersatzteile, eine Pressemitteilung
|
Autor
|
Thema: Aktivierungsstatus der Komponente / Component Activation State (2326 / mal gelesen)
|
C.Samer Mitglied CAD Administrator
Beiträge: 72 Registriert: 03.05.2017
|
erstellt am: 09. Aug. 2017 11:13 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Community, ich habe schon einiges darüber recherchiert, aber mir ist meine jetzige Lösung
Code: actProd.Parameters.Item(actProd.Parent.Parent.PartNumber & "\" & actProd.Name & "\" & "Component Activation State")
einfach viel zu langsam. Bei kleine Baugruppen funktioniert diese Methode sofort, bei großen Baugruppen warte ich teilweise bis zu 10 Sekunden Der alternative Code
Code: actProd.Parameters.Item("Aktivierungsstatus der Komponente")
dauert sogar noch länger! Eine weitere Alternative
Code: actProd.Parameters.Item(actProd.Parameters.Count)
geht relativ schnell, ist aber leider unzuverlässig. Nicht immer ist der letzte Parameter der Activation State.. Bitte, bitte, wenn irgendjemand eine schnellere Methode kennt, wäre ich sehr dankbar!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Mitglied 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: 09. Aug. 2017 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Aug. 2017 12:27 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Servus Ich nehme an dass bei dir actProd die Product-Instanz ist. Schon mal probiert deinen dritten Ansatz so umgestalteten (ungetestet und nur grobe Fehlerbehandlung): Code: Function GetComponentActivationState (InstanceProduct as Product) as Parameter dim oParameters as Parameters dim i as IntegerSet oParameters = InstanceProduct.Parameters for i = oParameters.Count to 1 Step -1 if (InStr(oParameters.item(i), "Component Activation State" <> 0) or InStr(oParameters.item(i), "Aktivierungsstatus der Komponente" <> 0) then GetComponentActivationState = oParameters.item(i) exit function end if next GetComponentActivationState = Nothing end function
Ist das schneller als die ersten beiden Ansätze? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
C.Samer Mitglied CAD Administrator
Beiträge: 72 Registriert: 03.05.2017
|
erstellt am: 09. Aug. 2017 14:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, den Thread habe ich in meiner Recherche auch schon gefunden. Ich habe tomtom1972's Ansatz versucht, verstehe ihn jedoch nicht so richtig: Zitat: Moin Jens, dafür gibt es zwar keine eigene Methode oder Property, aber Möglichkeiten den "Status" eines Knoten abzufragen gibt es viele. Ich mache mir dabei folgende Eigenart eines deaktivierten Knoten zu Nutze: ein .CreateReferenceFromName liefert keine "echte" Reference; soll heißen: jedes Modell (egal was es ist) hat schon Aufgrund seiner Existenz mindestens einen Parameter (also ein ....Product.Parameter.Item(1)). Auf diesen ein .CreateReferenceFromName versuchen. Bekommst du eine "echte" Reference auf den Parameter zurück (der Parameter.Name ist im Reference.Displayname enthalten) heißt das, der "Status" des Knoten ist aktiviert, geht die Ref nur auf die Instanz des Products heißt das der "Status" des Knoten ist deaktiviert. Das funktioniert seit vielen Releases stabil und schnell. Gruß
Hallo Bernd, habe den Code jetzt so probiert:
Code: Dim mySel As Selection Set mySel = Catia.ActiveDocument.Selection If (mySel.Count = 0) Then Exit Sub End If Set actProd = mySel.Item(1).value CATIA.StatusBar = "Counting Parameters.." Catia.RefreshDisplay = True For i = actProd.Parameters.Count To 1 Step -1 CATIA.StatusBar = "Checking Parameters: " & i Catia.RefreshDisplay = True If InStr(actProd.Parameters.Item(i).Name, "Aktivierungsstatus der Komponente") <> 0 Then MsgBox actProd.Parameters.Item(i).Name & " - " & actProd.Parameters.Item(i).Value Exit For End If If i = 200 Then Exit Sub End If Next MsgBox "Not Found" Exit Sub
Das Problem ist, dass ein großes Produkt (Mit vielen Unterprodukten und Teilen) auch sehr viele Parameter hat. Mein Testprodukt hat z.B. 155000 Parameter . Da dauert Parameters.Count alleine schon 6 Sekunden. Danke an euch Beide. Vielleicht fällt ja jemandem noch eine Möglichkeit ein [Diese Nachricht wurde von C.Samer am 09. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Aug. 2017 15:33 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Servus Ein Idee hab ich noch (ungetestet): Code:
dim oParameterActivationState as ParameterSet oInstanceProduct = oRootProduct.Products.item(1) 'Instanz die abgefragt werden soll Set oParameterActivationState = oRootProduct.Parameters.Sublist(oInstanceProduct, false).item(1) 'ist der Status immer der einzige/erste Parameter?
Wie schnell ist dies den bei großen Baugruppen? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
C.Samer Mitglied CAD Administrator
Beiträge: 72 Registriert: 03.05.2017
|
erstellt am: 16. Aug. 2017 12:09 <-- editieren / zitieren --> Unities abgeben:
Du bist genial Bernd! Für alle zukünftigen Leidensgenossen, hier ein funktionierendes Codebeispiel:
Code:
Dim iObjectPos As Integer Dim iObjectMax As Integer iObjectMax = 0 iObjectPos = 0Function countMaxObjects(p As Product) iObjectPos = iObjectPos + 1 CATIA.StatusBar = "Counting Active Objects: " & iObjectPos Catia.RefreshDisplay = True Dim oRootProduct As Product Set oRootProduct = p.parent.parent Dim oInstanceProduct As Product Set oInstanceProduct = p Dim oParameterActivationState As Parameter Set oParameterActivationState = oRootProduct.Parameters.SubList(oInstanceProduct, False).Item(1) If oParameterActivationState.value <> "Wahr" and oParameterActivationState.value <> "True" Then Exit Function End If Dim pp As Products Set pp = p.Products For i = 1 To pp.Count countMaxObjects(pp.Item(i)) Next iObjectMax = iObjectMax + 1 End Function
Diese Funktion zählt alle aktiven Products & Parts in einem an die Funktionen übergebenen Product p. Schnell wie ein Blitz. Liebe Grüße aus Wien, Christoph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 01. Dez. 2020 08:57 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Hallo Christoph, wollte deine Funktion in meinen Code einbauen. Leider scheitere wahrscheinlich an der richtigen Übergabe des Products. Fehler kommt in der Zeile:
Zitat: Set oRootProduct = p.Parent.Parent
"Type mismatch" Hast du einen Tipp für mich? Besten Dank
Code: Sub CATMain() Dim oProduct As Product Set oProduct = CATIA.ActiveDocument.Product Dim iObjectPos As Integer Dim iObjectMax As Integer iObjectMax = 0 iObjectPos = 0 countMaxObjects oProduct End Sub Function countMaxObjects(p As Product) iObjectPos = iObjectPos + 1 CATIA.StatusBar = "Counting Active Objects: " & iObjectPos CATIA.RefreshDisplay = True Dim oRootProduct As Product Set oRootProduct = p.Parent.Parent Dim oInstanceProduct As Product Set oInstanceProduct = p Dim oParameterActivationState As Parameter Set oParameterActivationState = oRootProduct.Parameters.SubList(oInstanceProduct, False).Item(1) If oParameterActivationState.Value <> "Wahr" And oParameterActivationState.Value <> "True" Then Exit Function End If Dim pp As Products Set pp = p.Products For i = 1 To pp.Count countMaxObjects (pp.Item(i)) Next iObjectMax = iObjectMax + 1 End Function
------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 01. Dez. 2020 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Servus Uwe Übergib mal der Unterroutine eine Unterproduct (nicht das Rootproduct). Für das Zählen des Rootproduct müsstest du die Routine etwas umschreiben. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 01. Dez. 2020 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Hallo Bernd, Danke dir. Leider klappt das nicht. Bin damit auch noch auf Kriegsfuß. Code: Dim ProdDoc Set ProdDoc = CATIA.ActiveDocument.Product Dim oProducts As Products Set oProducts = ProdDoc.Products
Fehler kommt immer noch an der gleichen Stelle.
------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 01. Dez. 2020 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Servus Uwe Hier ein überarbeiteter Code der die Anzahl der aktivierten Instanzen in einer übergebenen Products-Collection ausgibt.
Code: Sub CATMain()Dim oProduct As Product Set oProduct = CATIA.ActiveDocument.Product MsgBox "Anzahl: " & CStr(countMaxObjects(oProduct.Products)) End Sub Function countMaxObjects(oProducts As Products) as Integer
Dim oParameterActivationState As Parameter Dim oParentProduct As Product Dim iObjectMax as Integer Dim i as Integer Dim oParameters as Parameters 'CATIA.StatusBar = "Counting Active Objects: " & iObjectPos 'CATIA.RefreshDisplay = True Set oParentProduct = oProducts.Parent Set oParameters = oParentProduct.Parameters iObjectMax = 0 if oProducts.Count <> 0 then for i = 1 to oProducts.Count Set oInstanceProduct = oProducts.Item(i) Set oParameterActivationState = oParameters.SubList(oInstanceProduct, False).Item(1) If oParameterActivationState.Value = "Wahr" Or oParameterActivationState.Value = "True" Then iObjectMax = iObjectMax + 1 end if next end if countMaxObjects = iObjectMax End Function
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 01. Dez. 2020 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Hi Bernd, Danke Dir. Dadurch das du Code: Dim oRootProduct As Product Set oRootProduct = p.Parent.Parent
rausgenommen hast werden die unterprodukte nicht mitgezählt. Sehe ich das richtig?
------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 01. Dez. 2020 13:26 <-- editieren / zitieren --> Unities abgeben: Nur für C.Samer
Servus Uwe Nein, ich hab den rekursiven Aufruf (countMaxObjects (pp.Item(i))) entfernt. Deshalb werden die Unterprodukte nicht aufgelöst. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |