Autor
|
Thema: Reorder Blatt im Drawing (1483 mal gelesen)
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 13. Aug. 2020 10:12 <-- editieren / zitieren --> Unities abgeben:
Hallo, hat von euch jemand ein paar Codeschnipsel zum reordern von Blättern im Drawing? Meine Suche und der Makrorecorder blieb erfolglos. Besten dank ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dewei Mitglied Konstrukteur // Vertriebler
Beiträge: 22 Registriert: 10.03.2020 Catia V5 R29
|
erstellt am: 13. Aug. 2020 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 18. Aug. 2020 12:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Dewei, danke für die Zeilen. Ich möchte mir nun gerne die Blattnamen in ein Array schaufeln. (um iOrderedSheets als Liste zu haben) Wie kann ich das nun umsetzen? Hier mal das was ich bis jetzt habe. Code: Sub CATMain()Dim sheetcount As Integer Dim ViewCount As Integer Dim Ausgabe As String Dim DrawDoc As DrawingDocument Dim DrawSheets As DrawingSheets Dim DSheet As DrawingSheet Dim sheetName As String 'On Error Resume Next Set DrawDoc = CATIA.ActiveDocument If DrawDoc Is Nothing Then MsgBox "Kein Drawing offen.", , "Abbruch" Exit Sub End If On Error GoTo 0 'Alle Sheets holen Set DrawSheets = DrawDoc.Sheets sheetcount = DrawDoc.Sheets.Count For Each DSheet In DrawSheets 'Detailssheets rausnehmen If DSheet.IsDetail Then sheetcount = sheetcount - 1 Else sheetName = DSheet.Name Debug.Print sheetName 'AddSheetToArray (sheetName) Ausgabe = Ausgabe & sheetName & vbCrLf End If Next MsgBox Ausgabe, , "Struktur" End Sub
------------------ 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: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 18. Aug. 2020 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Servus Warum willst du die Namen der Blätter? IMHO erwartet reorder_Sheets alle Blätter als Sheet und nicht deren Namen. Der Array muss dann auch alle Blätter enthalten. Code: Dim aSheetArray() as DrawingSheet 'oder Variant?ReDim aSheetArray(DrawSheets.Count -1) For I = 1 to DrawSheets.Count Set aSheetArray(I - 1) = DrawSheets.Item(I) next
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: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 18. Aug. 2020 12:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, danke dir. Code: Warum willst du die Namen der Blätter? IMHO [In my humble opinion (Meiner Meinung nach)] erwartet reorder_Sheets alle Blätter als Sheet und nicht deren Namen. Der Array muss dann auch alle Blätter enthalten.
das war mir so nicht bewust. Leider werden mit deinem Code alle Sheets ink. Detailsheets in den Arry geschaufelt. Ich benötige aber nur die Sheets.
------------------ 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: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 18. Aug. 2020 13:21 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Servus Uwe Ich würde es so probieren:Code: ReDim aSheetArray(DrawSheets.Count - 1) For I = 1 to DrawSheets.Count If Not DrawSheets.Item(I).IsDetail then Set aSheetArray(I - 1) = DrawSheets.Item(I) iCounter = iCounter + 1 end if nextReDim Preserve aSheetArray(iCounter - 1)
Gruß Bernd
EDIT: Fehler im Code: Wenn ein Detail-Sheet vorkommt bleibt der "Platz" im Array leer und beim ReDim fliegt ein Blatt raus ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 18. Aug. 2020 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Da du bisher nicht erwähnt hattest, was du an den DetailSheets nicht magst, rate ich auch einfach mal ins Blaue: Erzeug dir ein Bool-Array, in dem du speicherst ob es ein DetailSheet ist. Das kannst du dann verwursten. Code: ReDim bIsDetail(DrawSheets.Count - 1) For I = 1 to DrawSheets.Count Set bIsDetail(I - 1) = DrawSheets.Item(I).IsDetail next
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: 27. Aug. 2020 20:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Lionel, Mein Anliegen ist folgendes. Ein automatisches erzeugen von Blattnummern aufzählend von 1 bis n im bestehenden Baum. Natürlich ohne Detail Sheets Wenn nun ein Blatt oder Blätter nachträglich im Baum eingefügt werden wird ein interner Index, so vermute ich, der Blätter erzeugt. Auch wenn die Blätter immer vor den Detail Sheets im Baum angeordnet sind. Ein Reordern eines Blattes bringt wohl den Blattindex in die richtige Reihenfolge und somit auch meine generiert Balttnummern. ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 28. Aug. 2020 07:35 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Dann würde ich alle Sheets durchgehen und, wenn ich ein Detail-Sheet finde, es an die letzte Stelle reordern. Achtung, der Index, wo das Detail-Sheet lag, ist jetzt neu besetzt und muss erneut geprüft werden. Vorgefundene Detail-Sheets mitzählen und die Prüfung rechtzeitig einstellen, damit nicht der Vorletzte in Endlosschleife auf den letzten Platz geschoben wird. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 28. Aug. 2020 07:51 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
...oder geh die Sheets von hinten nach vorne durch. Dann muss du nicht aufpassen durch das Verschieben etwas zu verpassen und musst nicht mitzählen. Einfach in einer Schleife von n to 1 vorgefundene Detail-Sheets hinten einsortieren. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 04. Sep. 2020 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Die REorder-Funktion ist doch ekelhafter als ich es mir vorgestellt habe. Ein Beispiel von http://www.coe.org/p/fo/et/thread=24160Da müssen alle Views in ein Array geschaufelt werden, das die neue Reihenfolge darstellt. Code: Sub CATMain()' Access through document's structure Dim DrwDoc As DrawingDocument Set DrwDoc = CATIA.ActiveDocument Dim colSheets As DrawingSheets Set colSheets = DrwDoc.Sheets Dim objActSheet As DrawingSheet Set objActSheet = colSheets.ActiveSheet Dim colViews As DrawingViews Set colViews = objActSheet.Views ' get views Dim vwBackground As DrawingView Dim vwMain As DrawingView Dim vwUserView1 As DrawingView Dim vwUserView2 As DrawingView Dim vwUserView3 As DrawingView Set vwBackground = colViews.Item(1) Set vwMain = colViews.Item(2) Set vwUserView1 = colViews.Item(3) Set vwUserView2 = colViews.Item(4) Set vwUserView3 = colViews.Item(5) ' form an array of reordered views Dim ArrViews(4) Set ArrViews(0) = vwBackground Set ArrViews(1) = vwMain Set ArrViews(2) = vwUserView3 Set ArrViews(3) = vwUserView2 Set ArrViews(4) = vwUserView1 ' reoder views according to array Dim varActSheet As Variant Set varActSheet = objActSheet Call varActSheet.reorder_Views(ArrViews) ' update sheet Call objActSheet.Update End Sub
Edit: Ja, du willst Sheets ordnen. Aber das ist ja dasselbe in grün. [Diese Nachricht wurde von Lionel Hutz am 04. Sep. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 04. Sep. 2020 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Ich hatte jetzt kein Drawing mit Detailsheet da. Von vorne nach hinten sortieren funktioniert. Code: 'Language VBScript Sub CATMain ()Dim oDoc As Document Dim drawingSheet1 As DrawingSheet Dim iDetailCounter As Int Dim iSheets As Int set oDoc = CATIA.ActiveDocument iSheets = oDoc.Sheets.Count iDetailCounter = 0 Dim NewSheetOrder() 'Keine Ahnung, warum ich nicht direkt Dim NewSheetOrder(iSheets-1) benutzen konnte. Redim NewSheetOrder(iSheets-1) For j=1 To iSheets Set drawingSheet1 = oDoc.Sheets.Item(j) 'Füllt ein Array von vorne nach hinten mit Sheets und von hinten nach vorne mit DetailSheets If drawingSheet1.IsDetail Then Set NewSheetOrder(iSheets-iDetailCounter-1) = drawingSheet1 iDetailCounter = iDetailCounter + 1 Else Set NewSheetOrder(j-iDetailCounter-1) = drawingSheet1 End If Next 'Sheetnames anzeigen lassen For i=0 to ubound(NewSheetOrder) 'MsgBox NewSheetOrder(i).Name Next 'http://catiadoc.free.fr/online/interfaces/interface_DrawingRoot.htm oDoc.DrawingRoot.reorder_Sheets(NewSheetOrder) End Sub
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: 26. Sep. 2020 09:54 <-- editieren / zitieren --> Unities abgeben:
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 26. Sep. 2020 18:55 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal, nach meinem fehlerlosen Test deines Codes habe ich diesen nun in mein Makro eingearbeitet. Leider bekomme ich nun in der Zeile. Code: oDoc.DrawingRoot.reorder_Sheets(NewSheetOrder)
eine Fehlermeldung. Zitat: Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic
Hat jemand eine Idee was das sein könnte? ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! [Diese Nachricht wurde von moppesle am 26. Sep. 2020 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: 26. Sep. 2020 19:02 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Servus Uwe Das schaut nach dem hier aus. Eventuell folgendes ergänzen: Code: Dim oRootObject as Object Set oRootObject = oDoc.DrawingRootoRootObject.reorder_Sheets(NewSheetOrder)
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: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 26. Sep. 2020 19:13 <-- editieren / zitieren --> Unities abgeben:
|
Lionel Hutz Mitglied
Beiträge: 363 Registriert: 26.03.2014 CATIA V5 R20
|
erstellt am: 28. Sep. 2020 07:27 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Das freut uns. Jetzt habe ich noch ein Verständnisfrage: Code: Dim NewSheetOrder() 'Keine Ahnung, warum ich nicht direkt Dim NewSheetOrder(iSheets-1) benutzen konnte. Redim NewSheetOrder(iSheets-1)
Warum funktioniert es nicht so: Code: Dim NewSheetOrder(iSheets-1)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |