| |
| KISTERS 3DViewStation: Mehr CAD Lizenzen durch 3D-Viewer ersetzen und Geld sparen, eine Pressemitteilung
|
Autor
|
Thema: Catiabaum automatisch neu zu ordnen. (11380 mal gelesen)
|
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 23. Mai. 2012 14:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Cad gemeine, Ich bin gerade am überlegen, den Catiabaum automatisch per *.CADSkript neu alphabetisch neu zu ordnen. Da ich ein eigenes kleines Tool gebaut habe (Excel mit UserForm), wo auch der Catiabaum ausgelesen wird. In dieser UserForm kann ich schon Sortieren einmal absteigend und wieder so wie der Baum in Catia ist. Deswegen bin ich darauf gekommen dieses auch nach Catia zu übertragen wenn gewünscht. ABER wie fange ich an? Mein erster Gedanke war: -> Von Excel Info holen welches Teil z.b. in Zelle A1 steht. -> In Catia Suchen Selektieren -> Mit Ausschneiden und wieder einfügen den Baum neu zu Sortieren ( mit der entsprechenden richtigen eingestellten Catia Option) Und jetzt das ganze wieder mit der Zelle A2 usw. .... oder habe ich da einen Falschen (Schlechten) Gedankengang. Würde es anders besser Laufen???? Danke schon mal für jede Antwort. ------------------ Sei Schlau bleib Dumm !!?!! 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: 23. Mai. 2012 14:24 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 23. Mai. 2012 15:22 <-- editieren / zitieren --> Unities abgeben:
Hallo, und danke genau dieses ist was ich gesucht habe!!!! Was mir noch aufgefallen ist, der Partname sollte mit dem Exemplarnamen vorher abgeglichen werden. ------------------ Sei Schlau bleib Dumm !!?!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 23. Mai. 2012 17:18 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Ich stand mal vor einem ähnlichem Problem. Dabei ging es um das Ordnen der Elemente in einem Geoset. Ich habe mir ein Anwendung mit Deplhi erstellt, welche sich quasi das Fenster "Reorder Children" greift und steuert. Bei dem "Graph Tree Reordering" wäre das genau das gleiche. Geht sehr schnell und die Links bleiben erhalten. Bei Bedarf kann ich die Lösung gerne mal raussuchen und weiter erläutern. 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: 23. Mai. 2012 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 23. Mai. 2012 22:22 <-- editieren / zitieren --> Unities abgeben:
|
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 25. Mai. 2012 10:17 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 31. Mai. 2012 17:58 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo zusammen! Ich habe den Code etwas abgeändert und auf den Strukturbaum angepasst. Quelle und Programm habe ich mit beigepackt, für alle, die sich ein damit auseinandersetzen wollen und oder auf ihre Bedürnisse anpassen möchten. Ich hoffe, anhand der Kommentare lassen sich viele Sachen nachvollziehen. Catia bitte auf die deutsche Umgebung umstellen, da sonst die Fenster und Steuerelemente nicht gefunden. Verwendung 1. In Catia das Fenster zum Ordnen des Strukturbaums öffnen 2. Programm starten 3. Auf den Button "Connect" klicken Das Programm sollte sich nun alle Infos geholt haben und diese auch anzeigen 4. Auf den Button "Inverse Direction" klicken Das Programm ordnen den Baum nun neu an und stellt ihn quasi auf den Kopf. Da alle Informationen vorhanden sind, kann man die Routine abändern und seine eigene Sortierung einbringen. Ich wünsche viel Spaß dabei!
Gruß....Mark
Code: var frmMain: TfrmMain; hWin, hListBox, hBtnUp, hBtnDown : Hwnd; implementation {$R *.dfm} //****************************************************************************** //** EnumProc //** Hier werden alle Childwindows durchlaufen. Wir greifen uns die nötigen //** Steuerelemente(Buttons, Listbox) ab, die wir brauchen //****************************************************************************** function EnumProc(wnd: HWND; Lines : TStrings) : BOOL; stdcall; var iLen : integer; sClass, sText : string; aDwordvar : DWORD; begin result := true; // Text iLen := SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0); SetLength(sText, iLen+1); SendMessage(wnd, WM_GETTEXT, iLen+1, Integer(PChar(sText))); // Klasse SetLength(sClass, 256); iLen := GetClassName(wnd, PChar(sClass), Length(sClass)); sClass := LeftStr(sClass,iLen); // Steuerzeichen in der Zeichenkette entfernen sText := Trim(sText); sClass := Trim(sClass); // Handle, Text, Klassenname in Listview eintragen With frmMain.lstvWindows.Items.Add do begin Caption := inttostr(wnd); SubItems.Add(sText); SubItems.Add(sClass); end; // Merken der Handles für Button und ListBox if (sText = 'ListProd') and (sClass = 'ListBox') then hListBox := wnd else if (sText = 'Nach oben verschieben') and (sClass = 'Button') then hBtnUp := wnd else if (sText = 'Nach unten verschieben') and (sClass = 'Button') then hBtnDown := wnd; end; //****************************************************************************** //** Button Connect //** Aufruf der Funktionen zur Fenstersuche und Strukturbaums //** //****************************************************************************** procedure TfrmMain.btnConnectClick(Sender: TObject); begin // Handle des Hauptfenster hWin := FindWindow(nil,'Neuordnung des Grafikstrukturbaums');
// Childwindows im Hauptfenster EnumChildWindows(hWin,@EnumProc, 0); // Anzahl der Produkte/Parts... edListCount.Text := IntToStr(SendMessage(hListBox,LB_GETCOUNT,0,0)); // Übertragen der Listeneinträge(Produkte/Parts) in eigene ListBox GetProdList; end; //****************************************************************************** //** GetProdList //** Funktion zum Übertragen der Listeneinträge(Produkte/Parts) in eigene ListBox //** //****************************************************************************** procedure TfrmMain.GetProdList; var i : integer; s : string; begin for i := 0 to strtoint(edListCount.Text) -1 do begin setlength(s,64); SetLength(s,SendMessage(hListBox,LB_GETTEXT,i,lParam(PChar(s)))); lstProdList.Items.Add(s); end; end;
//****************************************************************************** //** Button btnSelDown, btnSelUp, btnMoveDown, btnMoveUp //** Steuerung der Buttons //** //****************************************************************************** procedure TfrmMain.btnSelDownClick(Sender: TObject); begin SendMessage(hListBox,WM_KEYDOWN,VK_DOWN,0); end; procedure TfrmMain.btnMoveUpClick(Sender: TObject); begin SendMessage(hBtnUp,BM_CLICK,0,0); end; procedure TfrmMain.btnMoveDownClick(Sender: TObject); begin SendMessage(hBtnDown,BM_CLICK,0,0); end; procedure TfrmMain.btnSelUpClick(Sender: TObject); begin SendMessage(hListBox,WM_KEYDOWN,VK_UP,0); end; //****************************************************************************** //** Button btnInverse //** Einfaches Beispiel zum Invertieren des Strukturbaums //** //****************************************************************************** procedure TfrmMain.btnInverseClick(Sender: TObject); var i,c : integer; begin for i := strtoint(edListCount.Text)-1 downto 1 do begin for c := 1 to i do begin SendMessage(hBtnDown,BM_CLICK,0,0); // Sleep(200); end; for c := 1 to i do begin SendMessage(hListBox,WM_KEYDOWN,VK_UP,0); // Sleep(200); end; end; end; end.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
isegrimm Mitglied Konstrukteur
Beiträge: 2 Registriert: 23.07.2013
|
erstellt am: 23. Jul. 2013 13:14 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Mark, ich konstruiere in Catia Werkzeuge in einer flachen Baumstruktur. Da ich nicht vorher weiss wann welches Teil angelegt wird ist der Baum durcheinander. Die Nummer steht in den Eigenschaften unter "Teilenummer". Es ist eine 5-stellige Zahl. Dein Delphiscript sortiert einen Baum invers. Das hat so gut bei mir funktioniert das ich Fragen wollte ob Du das umschreiben kannst. Ich benötige eine aufsteigende Sortierung. Alle anderen Versuche sind gescheitert. Wenn ich ein Werkzeug sortiere kann das gut und gerne 2-3 Stunden dauern. Für Deine Hilfe wäre ich Dir dankbar. Mit freundlichen Grüßen Gordon Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 23. Jul. 2013 14:54 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo isegrimm, habe das Prog kurz um ein paar Elemente erweitert. Neben der Listbox, welche die Struktur aus Catia anzeigt, zeigt ein zweite Listbox die gleichen Daten sortiert an. So läßt sich am einfachsten nachvollziehen, um wieviel Einheiten ein Element verschoben werden soll. Ohne kleine Pause verschluckt sich das Prog ab und zu mal, daher die Sleep-Aufrufe. Damit auch nur nach Teilenummer sortiert wird, darf auch nur diese im Baum angezeigt werden. Dies kann unter "Options->Infrastruktur->Product Structure->Knotenanpassung" mit "#PN#" eingestellt werden.
Code: procedure TfrmMain.btnSortClick(Sender: TObject); var c, iDes, iSrc : integer; begin // Alle Positionen bis auf die letzte durchlaufen (wenn die vorrigen stimmen, muss dies auch passen) for iDes := 0 to lstProdList.Count -2 do begin // iDes : Zielposition // iSrc : Ursprung iSrc := lstProdList.Items.IndexOf(lstSort.Items[iDes]); if iDes <> iSrc then begin for c := iDes to (iSrc-1) do begin SendMessage(hListBox,WM_KEYDOWN,VK_DOWN,0); Sleep(200) end; for c := iDes to (iSrc-1) do begin SendMessage(hBtnUp,BM_CLICK,0,0); Sleep(200) end; lstProdList.Items.Move(iSrc,iDes); Application.ProcessMessages; Sleep(200) end; // Cursor auf nächste Position setzen SendMessage(hListBox,WM_KEYDOWN,VK_DOWN,0); Sleep(200) end; end;
Viele Grüße...Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
isegrimm Mitglied Konstrukteur
Beiträge: 2 Registriert: 23.07.2013
|
erstellt am: 24. Jul. 2013 10:31 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Mark, vielen vielen Dank. Das ist der Hammer. Genau das was ich gesucht habe. Damit hast Du wohl richtig vielen Leuten geholfen die das Problem seit Jahren haben. Das schönste ist das man in der Zeit was anderes machen kann. Grüße Isegrimm Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 19. Mai. 2014 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 17. Jun. 2014 17:28 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo, sry...bin etwas spät dran. Generell hast Du eine gute Auswahl an Sprachen, welche Du verwenden kannst. Da ich selber sehr viel mit Delphi programmiert habe, viel es mir damit auch recht einfach. Über VBA wirst Du dies zwar auch realisieren können, jedoch kann dies ab und an schon Nerven kosten und instabil laufen. Momentan würde ich Dir VB empfehlen. Was hast Du denn in etwa vor? Gruß...Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 30. Jun. 2014 12:20 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Ich würde gerne die Produktstruktur nach der Stücklistenposition sortieren. Also einfach die Zahlen sortieren. Kann ich mir über die WinAPI die Listbox aus dem Fenster Graph Tree Reordering kopieren, sortieren und wieder einfügen? Habe noch nicht so viel Erfahrung mit der WinAPI. ------------------ Anfänger! 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: 30. Jun. 2014 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Servus IMHO ist es leider nicht so einfach. Der Grobablauf könnte sein: - Baum auslesen - Einträge sortieren - Über die WinAPI die Tastendrücke im Fenster "Graph Tree Reordering" in der richtigen Reihenfolge nachbilden. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K.Siebert Mitglied Tech Zeichner
Beiträge: 415 Registriert: 19.05.2007 Win XP Catia V5 R19 Catia V5 R24
|
erstellt am: 01. Jul. 2014 21:47 <-- editieren / zitieren --> Unities abgeben:
Hallo, @IAmTheFabian du könntest das das Skript von dem Zweiten Post nehmen. (von bgrittmann) Bei diesem Skript wird von A-Z; 0-9 sortiert. Es ist unbedingt darauf zu achten das du unter den Optionen folgenden Punkt Aktivist: Ansonsten sind alle Bedingungen Kaputt
------------------ Sei Schlau bleib Dumm !!?!!
[Diese Nachricht wurde von K.Siebert am 01. Jul. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 07. Jul. 2014 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
IAmTheFabian Mitglied Konstrukteur
Beiträge: 58 Registriert: 17.10.2013 CATIA V5 R19 Windows 7 Professionel Intel Core 2 Duo8GB RAM 64Bit System
|
erstellt am: 08. Jul. 2014 06:55 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jul. 2014 20:42 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Servus Genau das wurde schon im 2. Beitrag angesprochen. Deshalb geht es IMHO nur über die WindowsAPI (einfach MarkS. Code in VB umschreiben) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 08. Feb. 2015 16:30 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Zusammen, ich möchte ein ähnliches Makro, wie von MarkS (Graph Tree Reordering) aber in VBA6 (Hilfe von WinAPI) schreiben. Dritte Element aus der ListBox selektieren (es funktioniert gut, wird das dritte Element selektiert):
Code: SendMessage ListBox_hWnd, LB_SETCURSEL, 2, 0
dann auf "Move Down" klicken:
Code: SendMessage MoveDown_hWnd, BM_CLICK, 0, 0)
Trotzdem geht immer nur das erste Element aus der ListBox nach unten. Was mache ich falsch? Danke im Voraus
[Diese Nachricht wurde von imation1999 am 08. Feb. 2015 editiert.] 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: 08. Feb. 2015 22:29 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 09. Feb. 2015 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
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: 13. Feb. 2015 00:38 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo imation, die Dame möchte offenbar noch einen 'Klick' auf das Listenelement. Wenn Du diesen Klick händisch setzt, funktioniert's. Probier mal Folgendes: In ein Modul:
Code:
'varianten von SendMessage Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, wParam As Long, lParam As Any) As Long Public Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, wParam As Any, lParam As Any) As Long Public Declare Function SendMessageByNum Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SendMessageString Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long'über findwindow und enumchildwindows ermittelt Public hWndListBox As Long 'hwnd der Catia List Box Public hWndLBUpArrow As Long 'hwnd des Catia Up Arrows Public hWndLBDownArrow As Long 'hwnd des Catia Down Arrows 'Hilfsfunktionen ' Combines two integers into a long integer Public Function MAKELONG(wLow As Long, wHigh As Long) As Long MAKELONG = LOWORD(wLow) Or (&H10000 * LOWORD(wHigh)) End Function ' Combines two integers into a long integer Public Function MAKELPARAM(wLow As Long, wHigh As Long) As Long MAKELPARAM = MAKELONG(wLow, wHigh) End Function 'messages Public Const LB_GETITEMRECT = &H198 'holt die lage eines listenelements Public Const WM_LBUTTONDOWN = &H201 'left button down Public Const WM_LBUTTONUP = &H202 'left button up Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type '----------------------------------------------------------------------------------------------------------------------------------------
In die routine zum bewegen der catia-elemente einfügen Code:
Dim rc As RECT 'rechteck des Listenelementes Dim iOldPos As Integer 'ist-position des elementes SendMessageAny hWndListBox, LB_GETITEMRECT, ByVal CLng(iOldPos), rc SendMessageByNum hWndListBox, WM_LBUTTONDOWN, 0&, MAKELPARAM((rc.Right - rc.Left) \ 2, rc.Top + (rc.Bottom - rc.Top) \ 2) SendMessageByNum hWndListBox, WM_LBUTTONUP, 0&, MAKELPARAM((rc.Right - rc.Left) \ 2, rc.Top + (rc.Bottom - rc.Top) \ 2) 'rauf SendMessageByNum hWndLBUpArrow, BM_CLICK, 0&, 0& 'oder runter 'SendMessageByNum hWndLBDownArrow, BM_CLICK, 0&, 0&
An dem Sortier-Algorithmus bin ich noch dran. Ich meld' mich, sobald ich da was hab. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 13. Feb. 2015 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Joe, vielen Dank für Deine Mühe. Ich habe schon alles gemacht. Nach der "LB_SETCURSEL" schicke ich noch ein "VK_SPACE", dann läuft alles problemlos. Sortierung: Ich füll die ListBox-Elemente in ein Array ein, es lässt sich gut sortieren. [Diese Nachricht wurde von imation1999 am 13. Feb. 2015 editiert.] 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: 13. Feb. 2015 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Das geht auch! Bei der Sortierung will ich etwas flexibler sein, d.h. im allgemeinen alphabetisch, aber mit Ausnahmen. Ich bin soweit fertig, muss nur noch ausputzen. Ich stell's dann rein. Tschau, Joe 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: 14. Feb. 2015 22:43 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Anbei das fertige Makro - .exe und Quell-Code. Nachfolgend noch ein paar Routinen zum Einstimmen: - Auslesen der Listeneinträge; Eintragen in VB-Listbox; Bestimmen des Dialog-Handles;
Code:
'--------------------------------------------------------------------------------------- ' Procedure : GetProductsListFromList ' Author : jherzog ' Date : 13.02.2015 ' Time : 15:03 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Read entries in 'Graph tree reordering' list box ' : adds the entries to an array and a list box ' Parms : strDlgWnd: string 'Graph tree reordering' (as of now) ' Ret. Value: (arrList: Array of list box entries ' ' Syntax : GetProductsListFromList "Graph tree reordering", arrProds ' ' Prereqs : opened catia dialog 'Graph tree reordering' ' Remarks : Since the VB-List box is not sorted, the array is used as buffer and sorted ' : May crash, if another programme titled 'Graph tree reordering' exists '--------------------------------------------------------------------------------------- ' Public Sub GetProductsListFromList(strDlgWnd As String, arrList() As String) Dim strBuff As String Dim iNum As Integer Dim n As Integer Dim iTextLen As Integer Dim iMaxTextLen As Integer Dim iMaxIndex As Integer frmProdSort.lb_Prods.Clear 'clear list hWndDlg = FindWindow(vbNullString, strDlgWnd) 'get parent handle If hWndDlg = 0 Then 'no such window MsgBox "Dialog not found!", vbOKOnly Or vbCritical, "GetProductsList" Exit Sub End If EnumChildWindows hWndDlg, AddressOf EnumChildProc, ByVal 0& 'get children handles iNum = SendMessageByNum(hWndListBox, LB_GETCOUNT, 0&, 0&) 'get number of entries ReDim arrList(iNum - 1) For n = 0 To iNum - 1 iTextLen = SendMessageByNum(hWndListBox, LB_GETTEXTLEN, n, 0&) strBuff = Space$(iTextLen) SendMessageString hWndListBox, LB_GETTEXT, n, strBuff 'read lb entry text frmProdSort.lb_Prods.AddItem strBuff 'add to list arrList(n) = strBuff 'add to array If iTextLen > iMaxTextLen Then iMaxIndex = n 'store max text length index Next End Sub
- Bestimmen der Kinder
Code:
'--------------------------------------------------------------------------------------- ' Procedure : EnumChildProc ' Author : jherzog ' Date : 13.02.2015 ' Time : 15:14 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Find and identify child windows ' Parms : hwndChild: handle to a child window ' : lParam: not used ' Ret. Value: Handles to three buttons and the list box holding the product entries ' ' The handles are declared 'Public' ' Syntax : - (callback function) ' ' Prereqs : Call to EnumChildWindows ' Remarks : Button and list box identifiers supplied by Spy++ '--------------------------------------------------------------------------------------- ' Public Function EnumChildProc(ByVal hwndChild As Long, ByVal lParam As Long) As Long Dim strBuff As String 'string buffer strBuff = Space$(GetWindowTextLength(hwndChild) + 1) 'Get the windowtext length GetWindowText hwndChild, strBuff, Len(strBuff) 'get the window text strBuff = Left$(strBuff, Len(strBuff) - 1) 'remove the last Chr$(0) Select Case strBuff Case "ListProd" 'look for 'ListProd' hWndListBox = hwndChild 'assign to public handle Case "Move Up" 'look for 'MoveUp' hWndLBUpArrow = hwndChild Case "Move Down" 'look for 'MoveDown' hWndLBDownArrow = hwndChild Case "Free Move" 'look for 'MoveDown' hWndLBFreeMove = hwndChild Case Else End Select EnumChildProc = 1 'continue enumeration End Function
- der QuickSort
Code:
' QuickSort-Algorithmus ' Autor: Dieter Otter ' www.tools4vb.de ' ' vSort() : zu sortierendes Array ' lngStart, lngEnd: zu sortierender Bereich ' ========================================== Public Sub QuickSort(vSort As Variant, _ Optional ByVal lngStart As Variant, _ Optional ByVal lngEnd As Variant) ' Wird die Bereichsgrenze nicht angegeben, ' so wird das gesamte Array sortiert If IsMissing(lngStart) Then lngStart = LBound(vSort) If IsMissing(lngEnd) Then lngEnd = UBound(vSort) Dim i As Long Dim j As Long Dim H As Variant Dim X As Variant i = lngStart j = lngEnd X = vSort((lngStart + lngEnd) / 2) ' Array aufteilen Do While (vSort(i) < X) i = i + 1 Wend While (vSort(j) > X) j = j - 1 Wend If (i <= j) Then ' Wertepaare miteinander tauschen H = vSort(i) vSort(i) = vSort(j) vSort(j) = H i = i + 1 j = j - 1 End If Loop Until (i > j) ' Rekursion (Funktion ruft sich selbst auf) If (lngStart < j) Then QuickSort vSort, lngStart, j If (i < lngEnd) Then QuickSort vSort, i, lngEnd End Sub
- Die Routine zum Ändern der Catia-Liste
Code:
'--------------------------------------------------------------------------------------- ' Procedure : btnSendToCatList_Click ' Author : jherzog ' Date : 14.02.2015 ' Time : 21:49 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : rearrange catia products list box according to sorted vb list box ' Parms : - ' Ret. Value: - ' ' Syntax : - (Press the button ' ' Prereqs : Filled vb list box ' Remarks : If the catia list box is not resized prior to sending the rearranging ' : commands, the routine fails miserably. ' : Increasing the loop delay time would not remedy the situation. '--------------------------------------------------------------------------------------- ' Private Sub btnSendToCatList_Click() Dim iOldPos As Integer Dim n As Integer btnGetList.Enabled = False 'no reentry please btnSortList.Enabled = False btnSendToCatList.Enabled = False btnExit.Enabled = False btnSetDelay.Enabled = False MousePointer = vbHourglass ResizeDialogWindow 'show all entries in catia dialog list box For n = 0 To lb_Prods.ListCount - 1 'work thru sorted vb-list iOldPos = SendMessageString(hWndListBox, LB_SELECTSTRING, -1&, lb_Prods.List(n)) ClickListItem iOldPos 'select the element to move PushFreeMove 'select free move button ClickListItem n 'select destination Sleep lDelay 'give catia time to react DoEvents Next MousePointer = vbNormal btnGetList.Enabled = True 'back to normal btnSortList.Enabled = True btnSendToCatList.Enabled = True btnExit.Enabled = True btnSetDelay.Enabled = True End Sub
Der restliche Code mit Deklarationen in der zip. Enjoy, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 26. Mrz. 2015 13:54 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Joe, das ist mal ein Ansatz, der mir gefällt; die Form anziehen und die Listeneinträge auslesen und sortieren Was ich allerdings nicht verstehe ist die Tatsache, das das Sortieren der Liste nur funktioniert, wenn das Menü so groß aufgeklappt wird, das alle Einträge gelesen werden können. Ragt das Menü über den unteren Bildschirmrand hinaus, so werden die unten stehenden (also sich auserhalb des Bildschirms befindenden) Einträge (z.B. bei Baugruppen mit >200 Teilen) nicht mehr sortiert. Kennst du den Grund hierfür? Danke & Gruß tomtom ------------------ tomtom1972 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: 27. Mrz. 2015 03:22 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hi Tom, und danke 8-). Das ist ein Timing-Problem. Der Klick kommt vor die Box runtergescrollt ist. Dadurch wird das falsche Element ausgewählt (deswegen verlängere ich auch die Liste). Um das zu umgehen hab ich den Delay eingeführt, aber scheinbar muss ich da noch nachdenken. Vielleicht komm ich am WE dazu. Womit programmierst Du? Wie steht's mit Deinen Api-Kenntnissen? Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 28. Mrz. 2015 07:03 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo joe, ich programmiere auf VB6. Ich habs zwischenzeitlich auch mal mit .net probiert, aber solange CATIA über .COM läuft werde ich bei VB6 bleiben. Deinen Code habe ich soweit ganz gut verstanden, nur der QuickSort-Algorithmus von Dieter Otter erschliesst sich mir nicht ganz, obwohl ich den vor ein paar Jahren schon mal in Verwendung hatte. Ich programmiere allerdings quick & dirty und nicht so schön wie du. Ich habe es auch mit einem sleep & und ohne das aufklappen versucht, aber das läuft nicht stabil. Danke & Gruß TomTom
------------------ tomtom1972
[Diese Nachricht wurde von tomtom1972 am 28. Mrz. 2015 editiert.] [Diese Nachricht wurde von tomtom1972 am 28. Mrz. 2015 editiert.] 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: 28. Mrz. 2015 23:18 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hi Tom, mir geht's nicht um Schönheit, nur um's verstehen. Anbei zwei 'leicht' abgeänderte Versionen; ein Mal wie die vorherige und ein Mal mit per Api erzeugter U/D-Control. Probier mal ein Element innerhalb der Liste zu verschieben, dann weisst warum. Die Sortier-Routine wandelt jetzt, vor dem eigentlichen Sortieren, die Instances in 4-stellige um, sortiert, und wandelt zu dem ursprünglichen Namen zurück. Warum? Sortierung bisher: 1,11,12,13,2,3,31,32,4,... Das Zurückschreiben der Products hab ich auch geändert. Aber sieh' selbst: Code:
'--------------------------------------------------------------------------------------- ' Procedure : btnSortList_Click ' Author : jherzog ' Date : 28.03.2015 ' Time : 15:08 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Calls Quick Sort; restores original product names ' Parms : - ' Ret. Value: - (Sorted list) ' ' Syntax : - ' ' Prereqs : ' Remarks : Improved sort due to 4-digit product instances '--------------------------------------------------------------------------------------- ' Changes : 28.03.2015: Added 4-digit instance counter; ' ' '--------------------------------------------------------------------------------------- Private Sub btnSortList_Click() Dim n As Integer Dim iPt As Integer 'location of point within name Dim strInst As String 'instance string Dim iBracket As Integer 'loc of bracket For n = 0 To UBound(arrProds) 'change instance counter to 4 digits 'check, if part/product is in design mode or visualization mode; '(' or '[' ? iPt = InStr(arrProds(n), ".") 'find point If InStr(arrProds(n), "[") Then 'visualization mode iBracket = InStr(arrProds(n), "[") strInst = Mid$(arrProds(n), iPt + 1, iBracket - iPt - 2) 'save original instance arrProds(n) = Left$(arrProds(n), iPt) & Format(strInst, "0000") _ & Right$(arrProds(n), Len(arrProds(n)) - iBracket + 2) 'format instance for sorting ElseIf InStr(arrProds(n), "(") Then 'design mode; instance is followed by single ')' 'convert instance counter to 4 digits before sorting; restore before rearranging product list strInst = Mid$(arrProds(n), iPt + 1, (Len(arrProds(n))) - iPt - 1) 'get instance arrProds(n) = Left$(arrProds(n), iPt) & Format(strInst, "0000") & ")" 'format instance for sorting End If Next lb_Prods.Clear 'clear list QuickSort arrProds 'sort array For n = 0 To UBound(arrProds) 'restore file names to original iPt = InStr(arrProds(n), ".") 'find point If InStr(arrProds(n), "[") Then 'visualization mode iBracket = InStr(arrProds(n), "[") 'find bracket arrProds(n) = Left$(arrProds(n), iPt) & CInt(Mid$(arrProds(n), iPt + 1, 4)) _ & Mid$(arrProds(n), iBracket - 1, Len(arrProds(n)) - iBracket + 2) ElseIf InStr(arrProds(n), "(") Then 'design mode; instance is followed by single ')' arrProds(n) = Left$(arrProds(n), iPt) & CInt(Mid$(arrProds(n), iPt + 1, 4)) & ")" End If lb_Prods.AddItem arrProds(n) Next lblListCount.Caption = "Entries: " & Format$(lb_Prods.ListCount, "0000") End Sub '--------------------------------------------------------------------------------------- ' Procedure : btnSendToCatList_Click ' Author : jherzog ' Date : 14.02.2015 ' Time : 21:49 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : rearrange catia products list box according to sorted vb list box ' Parms : - ' Ret. Value: - ' ' Syntax : - (Press the button ' ' Prereqs : Filled vb list box ' Remarks : '--------------------------------------------------------------------------------------- ' Changes : 28.03.2015 : Added delays; added LB_SETCURSEL message; ' : added counter + msgbox ' : ResizeDialogWindow removed '--------------------------------------------------------------------------------------- Private Sub btnSendToCatList_Click() Dim iOldPos As Integer Dim n As Integer Dim lRet As Long btnGetList.Enabled = False 'no reentry please btnSortList.Enabled = False btnSendToCatList.Enabled = False ' btnExit.Enabled = False btnSetDelay.Enabled = False MousePointer = vbHourglass ' ResizeDialogWindow 'show all entries in catia dialog list box lblListCount.Caption = "Entries: " & Format$(n + 1, "0000") 'reset counter For n = 0 To lb_Prods.ListCount - 1 'work thru sorted vb-list iOldPos = SendMessageString(hWndListBox, LB_SELECTSTRING, -1&, lb_Prods.List(n)) DoEvents Sleep lDelay \ 4 'give catia time to react ClickListItem iOldPos 'select the element to move DoEvents Sleep lDelay 'give catia time to react PushFreeMove 'select free move button DoEvents Sleep lDelay \ 4 'give catia time to react lRet = SendMessageByNum(hWndListBox, LB_SETCURSEL, n, 0&) If lRet < 0 Then MsgBox "error" DoEvents Sleep lDelay \ 4 'give catia time to react ClickListItem n 'select destination DoEvents Sleep lDelay \ 4 'give catia time to react lblListCount.Caption = "Entries: " & Format$(n + 1, "0000") Next MousePointer = vbNormal btnGetList.Enabled = True 'back to normal btnSortList.Enabled = True btnSendToCatList.Enabled = True ' btnExit.Enabled = True btnSetDelay.Enabled = True MsgBox "Sort finished!", vbOKOnly Or vbInformation, "SendToCatList" End Sub
Der Delay war bisher zu (ehr-)geizig. Jetzt lass ich der Catia deutlich mehr Zeit zum Reagieren. Das passiert hier: Code:
Private Sub btnGetList_Click() GetProductsListFromList "Graph tree reordering" lblListCount.Caption = "Entries: " & Format$(lb_Prods.ListCount, "0000") lDelay = 1000 + (lb_Prods.ListCount \ 10) * 100 '10 msec per entry lblDelay.Caption = "Delay: " & lDelay & "ms" btnSortList.Enabled = True btnSendToCatList.Enabled = True End Sub
und hier, wie bisher: Code:
Private Sub btnSetDelay_Click() Dim strRet As String SetDelay_Again: strRet = InputBox("Enter delay value!(500 - 5000)", "Set delay value", lDelay) If strRet <> "" Then 'then check the value entered If Val(strRet) >= 500 And Val(strRet) <= 5000 Then lDelay = CLng(strRet) 'if value OK set new delay time lblDelay.Caption = "Delay: " & strRet & "ms" Else 'invalid entry Beep GoTo SetDelay_Again 'do it again End If End If End Sub
Eh' ich's vergesse: Lass' die Finger von Keyboard/Maus solange das Makro läuft. Die DoEvents sollen der Catia Zeit geben, auf die Kommandos (Scrollen) zu reagieren. Wenn Du die CPU mit anderen Aufgaben in der gleichen Zeit zuballerst, verschluckt sich die Dame immer noch. Have fun, Joe PS: Wenn Du auch so schön programmieren magst :-), kann ich Dir die MZ-Tools http://www.mztools.com/index.aspx wärmstens empfehlen. Gibt's für VB und VBA. [Diese Nachricht wurde von joehz am 28. Mrz. 2015 editiert.] 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: 29. Mrz. 2015 20:07 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Mir ist noch eine kleine Optimierung eingefallen: Wenn in der Routine 'btnSendToCatList_Click' eine Abfrage, ob die Position schon richtig ist, eingebaut wird, läuft's uU schneller. Also:
Code:
'--------------------------------------------------------------------------------------- ' Procedure : btnSendToCatList_Click ' Author : jherzog ' Date : 14.02.2015 ' Time : 21:49 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : rearrange catia products list box according to sorted vb list box ' Parms : - ' Ret. Value: - ' ' Syntax : - (Press the button ' ' Prereqs : Filled vb list box ' Remarks : '--------------------------------------------------------------------------------------- ' Changes : 28.03.2015 : Added delays; added LB_SETCURSEL message; ' : added counter + msgbox ' : ResizeDialogWindow removed '--------------------------------------------------------------------------------------- Private Sub btnSendToCatList_Click() Dim iOldPos As Integer Dim n As Integer Dim lRet As Long btnGetList.Enabled = False 'no reentry please btnSortList.Enabled = False btnSendToCatList.Enabled = False btnSetDelay.Enabled = False MousePointer = vbHourglass For n = 0 To lb_Prods.ListCount - 1 'work thru sorted vb-list iOldPos = SendMessageString(hWndListBox, LB_SELECTSTRING, -1&, lb_Prods.List(n)) If iOldPos = n Then GoTo Skip 'skip if pos is already correct DoEvents Sleep lDelay \ 4 'give catia time to react ClickListItem iOldPos 'select the element to move DoEvents Sleep lDelay 'give catia time to react PushFreeMove 'select free move button DoEvents Sleep lDelay \ 4 'give catia time to react lRet = SendMessageByNum(hWndListBox, LB_SETCURSEL, n, 0&) If lRet < 0 Then MsgBox "error" DoEvents Sleep lDelay \ 4 'give catia time to react ClickListItem n 'select destination DoEvents Sleep lDelay \ 4 'give catia time to react Skip: lblListCount.Caption = "Entries: " & Format$(n + 1, "0000") Next MousePointer = vbNormal btnGetList.Enabled = True 'back to normal btnSortList.Enabled = True btnSendToCatList.Enabled = True btnSetDelay.Enabled = True MsgBox "Sort finished!", vbOKOnly Or vbInformation, "SendToCatList" End Sub
Exe anbei. Enjoy, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 30. Mrz. 2015 09:42 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hi Joe, und danke. Hhm. Das läuft bei mir nun gar nicht rund, ich habe aber noch nicht verstanden wo das Problem liegt. Ich hatte deinen Ursprungscode schon ein bischen verändert und die Form komplett beseitigt, d.h. ich sortierte direkt in eine Liste und von daraus zurück. Wenn ich das Aufklappen des Dialoges komplett auskomentiert lasse habe ich bei > 200 Nodes ca. 5% Ausreißer. Diesmal nicht nur am Ende, sondern auch direkt am Anfang; da hatte ich vorher keine. Trotz Delay und stillgehaltener Finger. Wenn ich mal ein paar ruhige Minuten finde muss ich mich erstmal vergewissern, ob ich alles richtig angepasst habe. Eine kurze Anmerkung zum Anpassen der Instancenamen. Neben den drei dokumentierten CatWorkModeTypes DEFAULT_MODE, VISUALIZATION_MODE und DESIGN_MODE gibts auch noch den STANDARD_MODE (welcher interaktiv gar nicht verfügbar ist) Ich schalte grundsätzlich alle Knoten rekursiv pro forma auf "Standard Mode" (...Products.Item.ApplyWorkMode STANDARD_MODE).Das geht auch bei sehr großen Strukturen sehr schnell; dann kannst du die Stringunterscheidung weglassen. Gruß TomTom
------------------ tomtom1972 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: 30. Mrz. 2015 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hi Tom, ich hab gestern probeweise 400+ Verbindungselemente sortiert. Der Job lief ca. 35', die Sortierung wurde fehlerfrei übernommen. Sowohl innerhalb der IDE, als auch kompiliert. Deshalb die Frage: Hast mal eine von den Exes probiert? Ausserdem: Das Vergrössern der Catia-ListBox ist nicht hilfreich, besonders dann, wenn nicht alle Einträge dadurch sichtbar werden. Zu den WorkModes: Interaktiv kann ich nur zwei vorgeben. Den 'DEFAULT_MODE' kann ich nur programmatisch vorgeben. 'Standard_Mode' kennt mein Catia nicht. Wenn ich's damit versuche, kommt ein 'Variable not defined'-Fehler. Würde ich jetzt die Variable definieren, aber 'Standard_Mode' keinen Wert zuweisen, so ist der NULL und entspricht somit dem 'DEFAULT_MODE'. Tschau, Joe 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: 14. Aug. 2015 14:58 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
Andreas aus E Mitglied Werkzeugkonstrukteur
Beiträge: 32 Registriert: 01.11.2001 V5R20SP5
|
erstellt am: 19. Okt. 2015 22:35 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Vielen Dank an Euch, dass Ihr dieses Sortierproblem endlich mal angegangen seid und diese schöne Lösung gefunden habt. Kann man diese Methode nicht auch im Partdesign anwenden? Der Dialog "Kinder neu ordnen" im Partdesign sieht ja dem "Grafikbaum sortieren" im Produktdesign sehr ähnlich. Ich muss ab und zu Step-Dateien einlesen, die ohne Struktur mit -zig Körpern in einem Part ankommen. Viele dieser Körper haben gleiche Namen und ich möchte diese gerne sortieren und danach die gleichnamigen von Hand oder vielleicht später auch mal autmatisch in jeweils eigene Parts reinkopieren. Oder geht das vielleicht gar nicht, weil die Körper keine eindeutigen Namen bzw. Suffix wie die Instanzen im Produkt haben? Ich weiss, ich könnte auch das PartToProduct-Makro nutzen und dann auf Produktebene sortieren. Bei 500 und mehr Körpern wird aber mein Rechner immer langsamer, weil die erzeugten Parts ja erst gespeichert werden können, wenn das Makro abgelaufen ist. Gruß aus Thüringen Andreas 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: 19. Okt. 2015 23:29 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Andreas, ja, ähnlich, aber mit ein paar Besonderheiten: Systemebenen und Achsen, Parameter u. ähnliches, Messungen etc. lassen sich nicht verschieben. Sie müssen aber auch nicht vorhanden sein. Ich hab's mal angedacht, bin aber noch nicht dazugekommen. Falls ja, wird's im 'Poor Man's Product To Part' auftauchen. Die Routine ist auch noch nicht fertig ausprogrammiert. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite 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: 20. Okt. 2015 06:59 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
Andreas aus E Mitglied Werkzeugkonstrukteur
Beiträge: 32 Registriert: 01.11.2001 V5R20SP5
|
erstellt am: 20. Okt. 2015 23:07 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Danke für Eure schnellen Antworten. Ich habe mir mal das Produktbaumsortieren-Makro zum partreorder umgestrickt. So einfach ist das aber garnicht, da im Partdesign cut&paste nicht zugelassen ist. Jedenfalls darf ich auch im normalen Umgang keinen Körper innerhalb eines Parts ausschneiden und in das gleiche Part wieder einfügen. Mit dem Hauptkörper, der an oberster Stelle steht, geht das erst recht nicht. Ich mache also copy&paste und kann damit in dem Part die Körper duplizieren und sortiert einfügen. Das klappt soweit und ist in diesem Makro drin. Aber wie bekomme die unsortierten Körper, die immer noch oben im Baum stehen wieder raus. Daran scheitere ich im Moment. Ich habe mir das so vorgestellt, dass ich einen zusätzlichen Körper einfüge, den als Hauptkörper deklariere, damit sollte der dann an erster Stelle stehen und dann kann ich eventuell die Selektion aus der vorherigen Sortiererei wieder aufrufen und diese Körper löschen. Kann das funktionieren und wie bekomme ich einen Körper zum Hauptkörper definiert? Danke schonmal im Voraus falls Ihr mir helfen könnt und wollt. Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas aus E Mitglied Werkzeugkonstrukteur
Beiträge: 32 Registriert: 01.11.2001 V5R20SP5
|
erstellt am: 28. Okt. 2015 11:43 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 28. Okt. 2015 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|
Andreas aus E Mitglied Werkzeugkonstrukteur
Beiträge: 32 Registriert: 01.11.2001 V5R20SP5
|
erstellt am: 28. Okt. 2015 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
Hallo Bernd, was verstehst Du unter "mit Euch teilen"? Ich dachte, ich gebe das Makro schon damit frei, in dem ich es als .txt-Anhang an einen Beitrag hänge, oder muss ich da noch mehr beachten? Ich würde ansonsten das Makro "PartBodyReorder", so wie ich es an den letzten Eintrag angehangen habe, für alle zur Verwendung freigeben. Ich habe ja auch nur vorhandene Sachen zusammenkopiert. Gruß Andreas 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: 28. Okt. 2015 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für K.Siebert
|