Autor
|
Thema: For-Schleife mit Aktivitätsabfrage (1818 mal gelesen)
|
Chrisma Mitglied Ingenieur
Beiträge: 85 Registriert: 29.03.2010
|
erstellt am: 04. Mai. 2010 12:18 <-- editieren / zitieren --> Unities abgeben:
Servus alle zusammen, habe eine Menge Intersects. Um diese zu überprüfen möchte ich Sie zur Sicherheit erst alle aktivieren auf einen Fehler überprüfen und falls sie einen liefern sie deaktivieren. Läuft ganz normal durch, nur übergeht die Aktivierung der intersects. Hier der Code bis jetzt: Sub CATMain() Version = "1.0" Makroname = "automatisches De-/aktivieren von Intersects" On Error Resume Next '----Überprüfung ob Dokument geöffnet ist If CATIA.Documents.Count = 0 Then MsgBox ("Kein Dokument geöffnet!") Exit Sub End If '----Auswahl der Intersects Dim sel As Selection Set sel = CATIA.ActiveDocument.Selection sel.Clear sel.Search ".Intersect.name=Intersect*;Alle" '----Umbennen der Intersects For iname = 1 To sel.Count Set oItem = sel.Item(iname).Value oItem.Name = "Intersect_" & iname Next '----Aktivieren der Intersects und Überprüfung auf Fehler For iname = 1 To sel.Count Set countname = sel.Item(iname).value If countname.IsInactive Then countname.Activate End If If Err.Number <> 0 Then countname.Inactive End If Next Next Bei der For-Schleife komm ich nicht weiter. 1.Wie kann ich die Aktivität eines Intersects steuern? 2.Wenn ich mir über eine Message box den countname zurückgeben will bekomme ich keine messagebox. Was befindet sich bei mir in Countname? Was bedeutet das .value in "countname=sel.Item(iname).value" 3. Ich gehe davon aus, dass ich irgendeinen Parameter von Countname auslesen muss (kenn nur die aktivity) Meine Alternative mit aktivity, geht aber auch nicht: For iname = 450 To 550 Set countname = sel.Item(iname).Value If countname.Activity = False Then countname.Activity = True MsgBox ("Alles Klar" & iname) End If If Err.Number <> 0 Then countname.Activity = False End If Next ------------------ Hihihi, lol, hihihi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 04. Mai. 2010 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
1: über der betreffende Parameter, und nicht über HybridShapeIntersection.Activate weil es diese Eigenschaft für HybridShapeIntersection nicht gibt 2: in dein countname befindet sich (hoffentlich) ein Object vom Typ HybridShapeIntersection, du solltest aber lieber sel.Search "(CATGmoSearch.GSMIntersect),all" verwenden um sicher zu sein das sich alle Intersects und nur Intersects in deine Selection befinden 3: um die betreffende Parameter zu finden könntest du so was ähnliches verwenden: Dim body1 As Variant Dim chck1 As String For I = 1 To sel.Count2 Set countname = selection1.Item(I).Value Set body1 = countname.Parent chck1 = "" Do Until TypeName(body1) = "Part" If TypeName(body1) = "HybridBody" Then chck1 = body1.Name & "\" & chck1 Set body1 = body1.Parent Loop chck1 = chck1 & countname.Name & "\Activity" Set param1 = params1.Item(chck1) If param1.Value = False Then param1.Value = True Next
------------------ - Robert [Diese Nachricht wurde von EngineeredByRobberts am 04. Mai. 2010 editiert.] [Diese Nachricht wurde von EngineeredByRobberts am 04. Mai. 2010 editiert.] [Diese Nachricht wurde von EngineeredByRobberts am 04. Mai. 2010 editiert.] [Diese Nachricht wurde von EngineeredByRobberts am 04. Mai. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zwenne12 Mitglied Werkzeugkonstrukteur
Beiträge: 26 Registriert: 23.08.2004
|
erstellt am: 05. Mai. 2010 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo Chrisma, um auf die Methoden Activate, InActivate und IsInactive zuzugreifen musst Du noch ein Objekt der Klasse Part deklarieren.
Code:
Set intPartObj = CATIA.ActiveDocument.Part For i = 1 To sel.Count Set countname = sel.Item (i).Value If intPartObj.IsInactive (countname) Then On Error Resume Next intPartObj.Activate countname intPartObj.UpdateObject countname If Err.Number <> 0 Then intPartObj.Inactivate countname intPartObj.UpdateObject countname End If On Error Goto 0 End If Next
Wenn Du den Code an die Stelle Deiner Markierung einfügst müsste das eigentlich funktionieren . Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chrisma Mitglied Ingenieur
Beiträge: 85 Registriert: 29.03.2010 Solid Works 2013 Professional Win7 SP1 Intel Xeon 2,67GHz 12GB Ram
|
erstellt am: 05. Mai. 2010 10:17 <-- editieren / zitieren --> Unities abgeben:
Fettes Merci, war gerade am tippen und zack komtm dei Rettung. Läuft super. Zwei Fragen noch: 1. Wo findest du diese Befehle (Bsp. Isinaktiv)? Hatte weder über Netz noch Ziethen Glück. 2. Set countname = sel.Item (i).Value was bedeutet dieses .Value? Hier der gesamte Code: Sub CATMain() Version = "1.0" Makroname = "automatisches De-/aktivieren und Überprüfen von Intersects" On Error Resume Next '----Überprüfung ob Dokument geöffnet ist If CATIA.Documents.Count = 0 Then MsgBox ("Kein Dokument geöffnet!") Exit Sub End If '----Auswahl der Intersects Dim sel As Selection Set sel = CATIA.ActiveDocument.Selection sel.Clear sel.Search ".Intersect.name=Intersect*;Alle" ' In der Zeile hierüber kann auch sel.Search "(CATGmoSearch.GSMIntersect),all" stehen, dann wird nach allen Intersects gesucht '----Umbennen der Intersects For iname = 1 To sel.Count Set oitem = sel.Item(iname).Value oitem.Name = "Intersect_" & iname Next
'----Aktivieren der Intersects und Überprüfung auf Fehler Set intPartObj = CATIA.ActiveDocument.Part For i = 1 To sel.Count Set countname = sel.Item(i).Value If intPartObj.IsInactive(countname) Then On Error Resume Next intPartObj.Activate countname intPartObj.UpdateObject countname If Err.Number <> 0 Then intPartObj.Inactivate countname intPartObj.UpdateObject countname End If On Error GoTo 0 End If Next '----Ausgabe der Aktivität Dim r As Integer r = sel.Count
MsgBox ("Anzahl gefundener und umbenannter Intersekt: " & i) End Sub
------------------ Hihihi, lol, hihihi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zwenne12 Mitglied Werkzeugkonstrukteur
Beiträge: 26 Registriert: 23.08.2004
|
erstellt am: 05. Mai. 2010 10:36 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo Chrisma, die Befehle stehen im Ziethen unter der Klasse Part auf S. 378. Mit der Eigenschaft Value der Klasse SelectElement beschreibst Du das Objekt des selektierten Elementes. Du kannst dann wiederum auf dessen Eigenschaften und Methoden zugreifen (im Ziethen auf S. 48 und S.399) Gruß Sven Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 13. Mrz. 2017 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo Zusammen, erstmal muss ich loswerden das dieses Forum mir schon einige Male sehr geholfen hat. Super hilfreich alles ! zu diesem Thema hätte ich noch eine Frage... ist es auch möglich herauszufinden ob ein Intersect geschlossen oder offen ist ? ich habe gerade ein Problem, das ich an einem Punkt mit unterschiedlichen Winkeln eine Menge Intersects habe, und ich mit den geschlossenen Intersects weiterarbeiten möchte bzw. die nicht geschlossenen (für mich uninteressanten) löschen möchte. Habe mal ein Bild mit angehängt in dem 3 Intersects vollständig sind, (orange, blau und grün) die anderen alle nicht. Ich hoffe ich konnte mein Problem halbwegs verständlich erklären
Viele Grüße Micha 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: 13. Mrz. 2017 13:00 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Servus Willkommen im Forum. Eine Möglichkeit wäre wohl über eine Messung (SPA Workbench). Dabei mit der Methode "GetPointsOnCurve" den Anfangs- und Endpunkt zu ermitteln und dann zu vergleichen (ggf schlägt die Messung bei einer geschlossenen Kurve auch fehl). Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 13. Mrz. 2017 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
|
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 16. Mrz. 2017 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo Zusammen, habe mich jetzt mal an einer Abfrage mit Löschen des nicht geschlossenen Intersects versucht. Leider löscht es mir den Intersect nicht... habe ich den delete Befehl falsch geschrieben oder kann man einzelne Teile in einer Selection garnicht löschen ? hier noch der Quellcode. 'Selection starten ----------------------------------------------------------------------------------- Dim usel As selection Set usel = CATIA.ActiveDocument.selection usel.Clear usel.Search "Name = Schnitt_*" 'Y ist nur zur Info wieviele es insgesamt sind... ---------------------------------------------------- Y = usel.Count 'Abfrage starten ------------------------------------------------------------------------------------- Set frage = usel.Item(1).Value Set Ref1 = part1.CreateReferenceFromObject(frage) Set Measurable = TheSPAWorkbench.GetMeasurable(Ref1) Dim Gcoord(8) Measurable.GetPointsOnCurve Gcoord
If Gcoord(0) = Gcoord(6) And Gcoord(1) = Gcoord(7) And Gcoord(2) = Gcoord(8) Then
Else usel.Item(1).Delete End If In den Locals sehe ich das die Koordinaten 0,1,2 und 6,7,8 voneinander abweichen. Intersect ist also definitiv nicht geschlossen...
Hat da jemand eine Idee ? Viele Grüße Michael 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. Mrz. 2017 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Servus Du kannst nicht einzelne Elemente der Selektion löschen sondern nur alle Selektierten Element auf einmal: Code: usel.Delete
Schau dir mal diesen Code an wie man in solchen einem Fall vorgehen kann. Ich empfehle dir den Filter für die Selektion weiter einzuschränken sonst werden zB auch Körper gelöscht/selektiert die "Schnitt_1" heißen. Gruß Bernd ------------------ 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: 16. Mrz. 2017 16:20 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hi MichaX, mehrere. Zuerst etwas Lektüre(aus der CAA-Doku): -- Count:
Zitat:
Property Count( ) As long (Read Only) Deprecated: V5R16 #Count2 . The Count and Item Methods have been replaced by the Count2 and Item2 methods because they did not process correctly features which are not exposed to automation (such as a ResourcesList feature of a .CATProcess document).
--Delete: Zitat:
Sub Delete( ) Deletes all selected objects. Role: For all the SelectedElement objects contained by the selection, the SelectedElement.Value automation object is deleted from the document. Note: If a selected feature is not exposed to automation, it will deleted all the way. Example: This example deletes all the selected objects. A selected DMU Navigator URL will be removed from the document, although it is not exposed to automation. CATIA.ActiveDocument.Selection.Delete()
Somit geht oSel.Item(1).delete nicht, da falsch. Frage: Prüfst Du nur einen einzigen InterSect, oder mehrere in einer Schleife. Falls mehrere in einer Schleife, musst rückwärts zählen, die guten per 'Remove' aus der Selection entfernen und was übrigbleibt am Ende löschen. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 20. Mrz. 2017 07:15 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo, vielen Dank für die schnellen Antworten! Ich möchte ca. 190 Intersects prüfen, wollte es aber mal an einem versuchen bevor ich die Schleife anfange. werde mir jetzt mal so eine Abfrage zusammenbasteln und mich dann wieder melden ! Grüße Micha Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 20. Mrz. 2017 08:06 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Habe die Abfrage mal so in die Schleife eingepasst. Danke für den Denkanstoß ! Wenn ich die Schleife von Hand durchklicke sehe ich im Locals-Fenster das er mir die vollständigen Schnitte aus der Selection rausnimmt. Schon mal Perfekt In den vorherigen Schritten benenne ich immer alle anderen Schnitte anders, deshalb müsste es da keine Komplikationen geben. Jedoch kommt nach der Schleife beim Delete-Vorgang folgender Fehler. Please reconsider your operation. you can't delete a private component. Ich habe letztens beim stöbern im Forum etwas von veröffentlichen gelesen... Das wird damit zusammenhängen oder? Hier noch der angepasste Quellcode: Set drawingDocument1 = CATIA.ActiveDocument 'Selection starten------------------------------------------------------------ Set sel = drawingDocument1.selection sel.Search "Name = Schnitt_*" E = sel.Count 'E zur Info und als Max-Wert für die Schleife--------------------------------- For i = 1 To E Step 1 Set frage = sel.Item(i).Value Set Ref1 = part1.CreateReferenceFromObject(frage) Set Measurable = TheSPAWorkbench.GetMeasurable(Ref1) Dim Gcoord(8) Measurable.GetPointsOnCurve Gcoord If Gcoord(0) = Gcoord(6) And Gcoord(1) = Gcoord(7) And Gcoord(2) = Gcoord(8) Then sel.Remove (i) End If Next sel.Delete Viele Grüße Micha EDIT: Habe die Schleife jetzt noch geändert das sie von hinten nach vorne durchläuft, wegen dem Index. [Diese Nachricht wurde von MichaX am 20. Mrz. 2017 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: 20. Mrz. 2017 09:16 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Servus Micha Bitte den Code in Zukunft in entsprechende [CODE ][ /CODE]-Tags posten. Deine Schleife läuft noch nicht von hinten nach vorne durch (siehe mein verlinktes Beispiel) Was wurde denn alles Selektiert? Stimmt die Auswahl? In welcher Worbench arbeitest du? Was willst du denn Selektieren? (ggf Screenshot des Baumes posten) Intersects aus der GSD-Workbench? Dann solltest du auch deinen Filter entsprechend einengen zB Code: "sel.Search ((CATGmoSearch.GSMIntersect + CATGmoSearch.Intersect) & Name=Schnitt_*),all"
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 20. Mrz. 2017 09:39 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Hallo Bernd, alles klar, wird in Zukunft so gemacht! Schleifendurchlauf von hinten habe ich geändert, die Eingrenzung mit der Selection habe ich auch gleich mal umgesetzt, Danke ! hier gleich mal gesamte Code: Vor dem eigentlichen Problem werden noch ein paar Sachen neu benannt und gezählt... Code:
Sub Test()Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument1 As PartDocument Set partDocument1 = documents1.Item("Kabelkanal.CATPart") Dim part1 As Part Set part1 = partDocument1.Part Dim hybridShapeFactory1 As HybridShapeFactory Set hybridShapeFactory1 = part1.HybridShapeFactory Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Item("Schnitte_01") Dim hybridShapes1 As HybridShapes Set hybridShapes1 = hybridBody1.HybridShapes Dim selection1 As selection Set Document = CATIA.ActiveDocument Set selection1 = Document.selection selection1.Search "Name = Intersect.*" Count1 = selection1.Count X = Count1 Dim TheSPAWorkbench As Workbench Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") On Error Resume Next '----Auswahl der Intersects Dim selection2 As selection Set selection2 = CATIA.ActiveDocument.selection selection2.Clear selection2.Search ".Intersect.name=Intersect.*;all" ' In der Zeile hierüber kann auch sel.Search "(CATGmoSearch.GSMIntersect),all" stehen, 'dann wird nach allen Intersects gesucht '----Umbenennen der Intersects For iName = 1 To selection2.Count Set oitem = sel.Item(iName).Value oitem.Name = "Schnitt_" & iName Next Set drawingDocument1 = CATIA.ActiveDocument 'Selection starten------------------------------------------------------------------------------------ Set selection3 = drawingDocument1.selection selection3.Search "((CATGmoSearch.GSMIntersect + CATGmoSearch.Intersect) & Name=Schnitt_*),all" E = selection3.Count 'E zur Info und als Max-Wert für die Schleife--------------------------------------------------------- For i = E To 1 Step -1 Set frage = sel.Item(i).Value Set Ref1 = part1.CreateReferenceFromObject(frage) Set Measurable = TheSPAWorkbench.GetMeasurable(Ref1) Dim Gcoord(8) Measurable.GetPointsOnCurve Gcoord If Gcoord(0) = Gcoord(6) And Gcoord(1) = Gcoord(7) And Gcoord(2) = Gcoord(8) Then sel.Remove (i) End If Next sel.Delete End Sub
Die Selection stimmt so, alle nicht geschlossenen Intersects sind markiert(Siehe Anhang). Ich bin hier im Generative Shape Design unterwegs. Diesen Fehler habe ich so noch nie in Catia gesehen ... Grüße Micha [Diese Nachricht wurde von MichaX am 20. Mrz. 2017 editiert.] [Diese Nachricht wurde von MichaX am 20. Mrz. 2017 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: 20. Mrz. 2017 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Servus Warum hast du denn ein "Multi Output "interscet.1"? Kannst du da von Hand einen Verschneidung rauslöschen? Ich würde die Verschneidungen umdefinieren dass nur einzelne Outupts rauskommen (wie weiß ich auch nicht genau) Oder die offenen Intersetions nicht löschen sondern nur ausblenden. Gruß Bernd PS: Bitte "On Error Resume Next" nur nutzen wenn du weißt was passiert. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MichaX Mitglied Bachelorand
Beiträge: 20 Registriert: 13.03.2017 Windows 7 Professional Catia V5 R19
|
erstellt am: 20. Mrz. 2017 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für Chrisma
Grüß Dich Bernd, stimmt, das ist wohl das Problem, kann von Hand keine Verschneidungen aus dem MultiOutput löschen ! Dann werde ich den Weg mit ausblenden weitergehen. Alles klar, On Error Resume Next ist Geschichte Werde euch auf dem laufenden halten. Tausend Dank bisher !!! Grüße Micha
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |