Autor
|
Thema: Inhalt einer Selektion über eine Schleife hinaus behalten (1199 mal gelesen)
|
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 09. Mrz. 2015 16:48 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe das Problem, dass die selection "all" nachdem die Schleife erfolgreich durchlaufen wurde, keine Elemente mehr enthält. Solange sich das Macro in der Schleife befindet füllt sich die selection "all" wie gewünscht. Wie verhindere ich, dass die selection nachdem die Schleife durchlaufen wurde ihren Inhalt vergisst. hier der entsprechende Auszug: dim dummy dim all as selection set all = drawingDocument1.Selection all.clear for k = 0 to 9 for l = 0 to 9 searchstring = "CATDrwSearch.DrwText.TextString="&star&Eingabe&Cstr(l)&star&"),sel" call search.add(drawingsheet1) search.search searchstring for m =1 to search.count set dummy = search.item(m).value all.add dummy next next next Msgbox "all: " + Cstr(all.count) Danke und Gruß 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: 09. Mrz. 2015 17:55 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Servus Was hast du mit dem Code genau vor? Es gibt nur eine Selektion in einem Dokument. Somit musst du, wenn du die Selektion/Suche mehrfach ansprechen willst, den Inhalt der Sektion zwischenspeichern (array, Collection, ..) 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: 09. Mrz. 2015 18:20 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
'---------- Bernd war wieder schneller ------------- Hallo ashneel, es sieht für mich so aus, als würdest Du eine Selection mit einer anderen befüllen wollen. Die Zeilen
Code:
searchstring = "CATDrwSearch.DrwText.TextString="&star&Eingabe&Cstr(l)&star&"),sel" call search.add(drawingsheet1) search.search searchstring
sagen - 1) entweder hast Du den Suchstring falsch abgeschrieben oder das Makro ist nie fehlerlos gelaufen - 2) 'search' wird von Catia als Selektion verstanden Anschliessend weist Du der Selection 'all' die Values(Namen?) der Items von 'Search' zu. Probier mal (ungetestet):
Code:
Dim oSel as Selection Dim n as integer Dim strSearch as stringset oSel = Catia.ActiveDocument.Selection oSel.clear strSearch = " ... was auch immer ...,sel" oSel.Search strSearch for n = 1 to oSel.count MsgBox oSel.item(n).value next
Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 10. Mrz. 2015 08:21 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, Vielen Dank für eure Antworten. Geplant ist mit dem Code auf dem aktiven Sheet einer Zeichnung die Anzahl der Positionsnummern automatisch zählen zu lassen. Heißt, der Nutzer gibt die Positionsnummer ein und das System spuckt die Anzahl aus. Problem des Ganzen ist, dass oft mehrere Positionsnummern in einem Textfeld mit Komma getrennt oder untereinander zusammengefasst werden. Das führt dazu, dass eine Suche nach beispielsweise der Positionsnummer 2 auch nur das Textfeld, in dem die 2 alleine steht, findet. Suche ich nach *2* wird auch eine 324 oder alles was die 2 enthält mitgezählt. Zählen und aufaddieren funktionierte im Prinzip fehlerfrei, d.h. der Suchstring ist bis grundsätzlich korrekt. Nur habe ich da die Problematik, dass Dinge doppelt gefunden werden und somit die Anzahl nicht stimmt. Die Schleife ist nur ein Auszug aus dem Gesamten. Sie geht im Prinzip alle Zahlen von 0 bis 9 vor der gewünschten Zahl durch und erlaubt ein beliebiges Zeichen nach der Zahl und speichert die gefundenen Objekte in die selection „all“. Das Suchkriterium wird später angepasst und dient nur zur Funktionsprüfung der Schleife und der selection. Mein Plan war über die selection (hier die selection „all“) doppelte Erfassungen zu vermeiden. Meinem Verständnis nach wird nichts einer Selektion hinzugefügt, was bereits in ihr enthalten ist. Nur „vergisst“ die selection „all“ nachdem das Makro die Schleife verlässt ihren Inhalt. Das mit dem Array bzw. der collection klingt nach einer Lösung. Überprüft eine dieser Dinge, ob ein Objekt bereits enthalten ist oder fügt es dieses noch einmal hinzu? Die Anzahl der darin enthaltenen Objekte lässt sich ähnlich einfach wie die Anzahl der Objekte einer Selektion bestimmen, nehme ich an. Grüße
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: 11. Mrz. 2015 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Servus Könntest du nicht deinen Suchstring entsprechend anpassen, dass alle vier Fälle für die Positionsnummer erfasst werden: - Positionsnummer allein: Eingabe - Positionsnummer vorne: Eingabe & ", " - Positionsnummer in der Mitte: ", " & Eingabe & ", " - Positionsnummer am Ende: ", " & Eingabe Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 11. Mrz. 2015 14:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, das war mein erster Gedanke und Versuch. Funktioniert auch für die Konstellationen allein, vorne, in der Mitte und am Ende. Allerdings machen mir da die untereinander geschriebenen Positionsnummern einen Strich durch die Rechnung. Einzelne Positionsnummern werden nur erfasst, wenn sie wirklich alleine stehen und kein Zeilenumbruch vorhanden ist; der Zeilenumbruch lässt sich jedoch nicht erfassen. Ich habe alle kombinationen aus Chr(10) und Chr(13) ausprobiert (10 allein, 13 allein, 10 + 13, 13 + 10). Der Suchstring wird zwar mit Zeilenumbruch erstellt, aber die Suche endet mit negativem Ergebnis. Nur mit dem * als Zeichenersatz werden auch die Positionsnummernblöcke mit Zeilenumbrüchen erfasst. Blöderweise auch alles andere. Gruß [Diese Nachricht wurde von ashneel am 11. Mrz. 2015 editiert.] 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: 11. Mrz. 2015 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
|
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 11. Mrz. 2015 16:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, kein Problem. Anbei ein Bild, wie der String aussehen kann. Gesucht wird die Anzahl der Positionsnummer 2 Auftrag an das Makro: Frage den User nach der zu suchenden Positionsnummer. Suche die gewünschte Positionsnummer (hier: 2) und gebe die korrekte Anzahl in einer MsgBox wieder. Die richtige Anzahl wäre hier 2. Gruß ashneel [Diese Nachricht wurde von ashneel am 11. Mrz. 2015 editiert.] 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: 11. Mrz. 2015 21:26 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Hallo ashneel, der Zeilenumbruch erfolgt durch chr$(10) oder vbLf. Zu prüfen mit: Code:
set drTxts = drView.Texts instr(drTxts.Item(1).Text,vblf)
wobei drView das Object der jeweiligen View ist, also set drView = Catia.ActiveDocument.Sheets.Activesheet.views.item(x). Den Text zerhackst in Zeilen mit 'Split', also Code:
Dim strText As String Dim arrStr() As String Dim n As Integer strText = "Just a Test" & vbLf & "to demonstrate" & vbLf & "the split function" Debug.Print strText arrStr = Split(strText, vbLf) For n = 0 To UBound(arrStr) Debug.Print arrStr(n) Next
Die einzelnen Array-Elemente aus arStr() vergleichst mit strPosNr, wobei strPosNr die PositionsNummer sein soll: Code:
dim strPosNr as stringif arrStr = strPosNr then MsgBox "Got one!"
Was Du jetzt also brauchst ist eine Schleife, - die durch alle Sheets geht - die durch alle Views geht - die durch alle View-Texte geht und diese zersplittet - die alle split-elemente mit '2' vergleicht. Um Buch zu führen wirst auch noch einen globalen Zähler brauchen, den Du bei Auffinden einer Position erhöhst. Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 12. Mrz. 2015 11:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, habe es dank deinen Tipps und, da ich in CATScript schreibe, kleineren Anpassungen hinbekommen, die mit Zeilenumbruch getrennten Positionsnummern zu erfassen! Code:
Dim strText as CATBstr Dim arrStr Dim n, m, counter As Integer counter = 0searchstring = "CATDrwSearch.DrwText.TextString="&star&Eingabe&star&",sel" call search.add(drawingsheet1) search.Search searchstring if search.count <> 0 then For n = 1 to search.count strtext = Cstr(search.item(n).value.text) arrStr = split(strText, vblf) For m = 0 to UBound(arrStr) if arrStr(m) = Cstr(Eingabe) then counter = counter + 1 end if next next end if
In Verbindung mit den anderen Routinen kommt das Macro jetzt auf die korrekte Anzahl. Vielen Dank nochmal und schöne Grüße ashneel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |