Autor
|
Thema: Eigenschaften von Selektion zurücksetzen (2796 mal gelesen)
|
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 02. Okt. 2012 10:00 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, mal eine kurze Frage: Gibt es Möglichkeit die Grafikeigenschaften (inkl. Anwenden auf Kinder) per Makro auszuführen? Also abgesehen vom Startcommand.. Gruß ------------------ Seid nicht dumm, lest drin rum! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 02. Okt. 2012 12:04 <-- editieren / zitieren --> Unities abgeben:
Hatte jetzt zwei Ideen: 1) Die einzelnen Eigenschaften manuell auf einen von mir gewählten Standardwert setzen (Farbe, Transparenz, Linienstärke usw..) -> Anwendung auf Kinder? (großer Aufwand?) 2) Das Fenster per Startcommand aufrufen und mit der Win32 API die Checkbox setzen und "OK" klicken.. Edit: Habs hinbekommen, hier Variante (2) mit anschließender Änderung der Linienstärke: Code:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Const WM_GETTEXT = &HD Const BM_CLICK = &HF5& Const BM_SETCHECK = &HF1 Const BST_CHECKED = &O1 Const BST_INDETERMINATE = &O2 Const BST_UNCHECKED = &O0 Dim Text As StringSub CATMain() Dim selection1 As Selection Dim vispropertyset1 As VisPropertySet Set selection1 = CATIA.ActiveDocument.Selection Set vispropertyset1 = selection1.VisProperties Text = "" CATIA.StartCommand ("Eigenschaften zurücksetzen") Sleep 500 CATIA.RefreshDisplay = True F_hwnd = FindWindow(vbNullString, "Eigenschaften zurücksetzen") Text = "Anwenden auf Kinder" EnumChildWindows F_hwnd, AddressOf EnumChildWindow, 0 Text = "OK" EnumChildWindows F_hwnd, AddressOf EnumChildWindow, 0 vispropertyset1.SetRealWidth 1, 1 End Sub Function EnumChildWindow(ByVal hChild As Long, ByVal lParam As Long) As Long Dim iClass As String Dim iText As String Dim j As Integer iClass = Space(256) j = GetClassName(hChild, iClass, 63) iClass = Left(iClass, j) iText = Space(256) j = SendMessage(hChild, WM_GETTEXT, 255, iText) iText = Left(iText, j) Select Case iText Case "Anwenden auf Kinder" If iText = Text Then SendMessage hChild, BM_SETCHECK, ByVal CLng(BST_CHECKED), ByVal CLng(0) Case "OK" If iText = Text Then SendMessage hChild, BM_CLICK, 0, 0 End Select EnumChildWindow = 1 End Function
------------------ Seid nicht dumm, lest drin rum! [Diese Nachricht wurde von geekv5 am 02. Okt. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 27. Nov. 2012 18:39 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, melde mich mal wieder zurück, nachdem ich viel zutun hatte in letzter Zeit.. Leider funktioniert mein Makro doch nicht wie gedacht und es ist so verrückt, dass ich mit meinem Latein komplett am Ende bin.. Und zwar klappt die Anwendung auf Kinder einfach nicht.. Die CheckBox wird optisch gecheckt und wenn ich den Status auslese ist sie auch gecheckt, allerdings ist sie es wohl doch nicht (Eigenschaften der Kinder werden nicht zurückgesetzt).. Wenn ich nach dem automatischen Setzen der CheckBox das Makro stoppe und per Hand nochmal drauf klicke und dann manuell auf OK klicke klappt es.. Kurz um, wie kann es sein, dass die CheckBox optisch wie gecheckt aussieht, via BM_GETSTATE den Status checked zurückgibt, aber es in Wirklichkeit gar nicht ist??? Solltet ihr eine Lösung parat haben, habe ich ein nettes Makro für euch, wofür ich das Zurücksetzen brauche.. Gruß ein verzweifelter geek ^^ ------------------ Seid nicht dumm, lest drin rum! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 28. Nov. 2012 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Gib ihm mal die Chance für ein DoEvents und mach dann noch einmal ein RefreshDisplay. Allgemein halte ich eine Schleife mti DoEvents für besser als eine Sleep()-Operation. Ansonsten sieht Dein Code witzig aus, wäre mir aber zu Fehleranfällig um ihn produktiv zu schalten. - weiß nicht wie Alternativenlos die Geschichte ist ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 28. Nov. 2012 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Lila, das Problem ist ja, wenn ich direkt nach dem das Makro die CheckBox geklickt hat stoppe und mir das Fenster anschaue, ist ja die CheckBox geklickt.. Wenn ich den Status an der Stelle auslese sagt der auch checked.. Jetzt klicke ich per Hand auf ok und es ist als ob die CheckBox nicht gecheckt gewesen wäre.. Eigentlich funktioniert ja alles, aber auch wiederum nicht.. P.S. Wenn mein Code schon nicht funktioniert, hat er wenigstens bei dir für Unterhaltung gesorgt, ist doch auch schon mal was ------------------ Seid nicht dumm, lest drin rum! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 28. Nov. 2012 17:05 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Habe keine Lust mir nen Testfall dafür zu bauen, könntest Du daher einmal Code:
If iText = Text Then Call SendMessage (hChild, &HF1, &H1, ByVal 0&) End If
versuchen? Ich verstehe leider auch Deine TypeCasts nichts, wenn Du doch schon Konstanten verwendest. :-( Auch Deine globale Variable Text hätte ich besser benannt, hatte mir nen Wolf nach der Variable in der Methode gesucht... :-( ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 29. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 28. Nov. 2012 18:41 <-- editieren / zitieren --> Unities abgeben:
Habs probiert und bekomme das selbe Ergebnis, Box optisch gecheckt aber erst "richtig" gecheckt, wenn ich nochmal drauf klicke.. Werde nochmal ein Testbeispiel erstellen.. ------------------ Seid nicht dumm, lest drin rum! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 29. Nov. 2012 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Schade :-( Wie wäre es wenn Du die Checkbox selektierst und dann die Leertaste via SendKeys() schickst? Edit: Ein Kollege meinte gerade, im QTP nutzen wir in solch einem Fall oft die Methode FireEvent(). Mit etwas Glück gibt's die auch im VBA oder lässt sich nachbauen, so dass man das _OnClick-Event lostreten kann. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 29. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 03. Dez. 2012 13:31 <-- editieren / zitieren --> Unities abgeben:
SendKeys hatte ich schon probiert, aber leider kommt kein Tastendruck an.. In die Befehlszeile kann ich schreiben via SendKeys, aber wenn ein Dialogfenster offen ist, scheint es nicht zu funktionieren.. Code:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Sub CATMain() CATIA.StartCommand ("Eigenschaften zurücksetzen") CATIA.RefreshDisplay = True Sleep 2000 SendKeys "{TAB}", True SendKeys "{TAB}", True SendKeys "{ENTER}", True End Sub
Gruß ------------------ Seid nicht dumm, lest drin rum! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 03. Dez. 2012 17:38 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Nee ich mein nach dem SendMessage(), wenn die Checkbox aktiviert ist, noch einmal die Leertaste hinterher schieben. Für SendKeys musste vorher das Dialogfenster aktivieren. Das kann auch schon über AppActivate() klappen. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Stammtisch in Wolfsburg am 03.12.2012 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: 03. Dez. 2012 18:13 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Hallo zusammen, die Lösungsansätze sind eigentlich ganz gut. Wie oben aber schon erwähnt, wird mit "BM_SETCHECK" quasi nur der Zustand geändert. Man weiß also nicht, ob da noch weitere Methoden aufgerufen werden. Ich würde daher auch versuchen, Befehle über die Tastatur zu simulieren, um dieses Problem zu umgehen. Mit "BM_GETCHECK" könnte man aber auslesen, ob der Haken gesetzt ist. "SendMessage" sollte beim Senden der Tastaturbefehle durch "PostMessage" ersetzt werden. Habe das eben kurz mal ausprobiert und das Fenster reagiert dabei auf "Tab" und "Space". Bei "SendMessage" tut sich nichts. Code: Private Declare Function PostMessage Lib "user32.dll" _ Alias "PostMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long
Der Sleep-Befehl kann an dieser Stelle auch Probleme bereiten. Damit schläft Catia wirklich und das Fensterhandle ist evt. null. Ich würde dies in eine Schleife packen. Bei Bedarf, kann man auch noch einen Timer einbauen und über einen Timeout abbrechen. Code: hwin = 0Do While hwin = 0 hwin = FindWindow(vbNullString, "Eigenschaften zurücksetzen") Loop
Gruß Mark
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|