| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY präsentiert die PRO Elite™ High Endurance microSD-Flash-Speicherkarten für Videoüberwachung und kontinuierliche Aufzeichnung, eine Pressemitteilung
|
Autor
|
Thema: Schleifenabbruch mit ESC-Taste (4767 mal gelesen)
|
Huebi Mitglied Vermessungsing.
 
 Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 23. Jun. 2008 11:22 <-- editieren / zitieren --> Unities abgeben:         
Hallo an Alle! Ich hab ein Problem mit dem Abbruch einer Schleife. Also: Ich hab ein Progrämmchen gebastelt, das zwei Linien miteinander verschneidet, die nicht in einer Ebene liegen (nicht koplanar). Das hat soweit schon ganz gut funktioniert und ich wende es ständig an. Jetzt kommt ein Komfort-Problem dazu. Da ich ein sehr schusseliger CAD-Bearbeiter bin, klicke ich öfter schon mal daneben (Nein, ich gehe noch nicht bald in Rente!). Wenn ich mir Standard-AutoCAD-Befehle wie "Ausrunden" ansehe, fängt dieser befehl dieses ab, indem man in einer Schleife hängt, bis ein gültiges AutoCAD-Element ausfewählt wurde. Und genau so eine Schleife würde ich auch gerne basteln. Also dachte ich mir, ich mach eine Schleife, die ich erst verlasse, wenn ich ein gültiges AutoCAD-Element gewählt habe (Also hier eine Linie) oder aber die ESC-Taste gedrückt wird. Als Abbruch-Index wollte ich die Variable Err.Number nutzen, doch dummerweise ist diese identisch - ob man ESC drückt, oder ob man in's Leere klickt... Anbei mal der Rumpf des Progrämmchens mit der Bitte um weise Ratschläge! Code:
Sub Problem_Schleifen_Abbruch() Dim Ent1 As AcadEntity Dim Ent2 As AcadEntity Dim Lin1 As AcadLine Dim Lin2 As AcadLine Dim Pick1 As Variant Dim Pick2 As Variant' Erste Linie auswählen On Local Error Resume Next 'Falls Ent1 noch nicht definiert While Ent1.ObjectName <> "AcDbLine" On Local Error Resume Next ThisDrawing.Utility.GetEntity Ent1, Pick1, "Erste Linie angeben: " If Err.Number = "-2147352567" Then GoTo ENDE 'hier sollte das Abbruchkriterium für die ESC-Taste rein If Ent1.ObjectName <> "AcDbLine" Then ThisDrawing.Utility.Prompt "Dies ist keine Linie sondern: " & Ent1.ObjectName & "!! " Else Set Lin1 = Ent1 Lin1.Highlight True End If Wend ' Zweite Linie auswählen On Local Error Resume Next 'Falls Ent2 noch nicht definiert While Ent2.ObjectName <> "AcDbLine" On Local Error Resume Next ThisDrawing.Utility.GetEntity Ent2, Pick2, "Zweite Linie angeben: " If Err.Number = "-2147352567" Then GoTo ENDE 'hier sollte das Abbruchkriterium für die ESC-Taste rein If Ent2.ObjectName <> "AcDbLine" Then ThisDrawing.Utility.Prompt "Dies ist keine Linie sondern: " & Ent2.ObjectName & "!! " Else Set Lin2 = Ent2 Lin2.Highlight True End If Wend ENDE: End Sub
Vorab einen herzlichen Dank an alle, die sich an der Lösung des Problemchens beteiligen wollen :-) Gruß, Hübi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2855 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2025 Plateia, Canalis Visual Basic
|
erstellt am: 23. Jun. 2008 23:42 <-- editieren / zitieren --> Unities abgeben:          Nur für Huebi
Hallo Hübi, ich mach das immer so wie im getentity Beispiel. Damit kannst Du Deine Elemente prima abfragen, aber auch die Funktion abbrechen lassen. Wenn die goto - Sprünge nicht zu groß sind und der Code übersichlich spricht doch nichts dagegen !? Grüße, Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Huebi Mitglied Vermessungsing.
 
 Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 24. Jun. 2008 07:18 <-- editieren / zitieren --> Unities abgeben:         
Hallo Klaus! Danke für Deinen Beitrag! Leider ist's in dem Beispiel von "GetEntity" auch nicht anders - es bricht bei einem Fehler komplett ab.
Code: Sub Example_GetEntity() ' This example creates several objects in model space. It then ' prompts the user to select an object. The example continues to ' have the user select objects until the user selects in empty space. '.............(Beitrag gekürzt *g*) ' Begin the selection Dim returnObj As AcadObject Dim basePnt As Variant On Error Resume Next ' The following example waits for a selection from the user RETRY: ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object" If Err <> 0 Then Err.Clear MsgBox "Program ended.", , "GetEntity Example" Exit Sub Else returnObj.Update MsgBox "The object type is: " & returnObj.EntityName, , "GetEntity Example" returnObj.Update End If GoTo RETRY End Sub
Dummerweise erzeugt man auch einen Fehler (noch dazu mit der gleichen Fehlernummer), wenn man in's Leere klickt (also beim Klicken kein Element erwischt).
Als Vorbild dient mir die AutoCAD-Funktion "Abrunden". Wenn man da eine Linie nicht erwischt, dann macht das nichts, weil man in einer Schleife aufgefordert wird, das Element nochmals anzuklicken. Und das würde ich in VBA gerne nachbilden. Vielleicht fällt Dir (oder jemand anderem) doch noch eine elegante Lösung ein. Liebe Grüße, Hübi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2855 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2025 Plateia, Canalis Visual Basic
|
erstellt am: 24. Jun. 2008 08:48 <-- editieren / zitieren --> Unities abgeben:          Nur für Huebi
Hallo, Nur mal so auf die Schnelle (bin in der Arbeit und hab leider keine Zeit). Da gab's doch mal die Abfrage nach keypressed oder so ähnlich, mit der der Tastencode abgefragt werden konnte. Falls Du es nicht findest, kann ich abends mal nachsehen. Grüße, Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Huebi Mitglied Vermessungsing.
 
 Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 24. Jun. 2008 18:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo Klaus, jaaaa keypressed, das kenn ich auch - leider aber nur von TurboPascal *g* (waren das noch Zeiten *g*). In VBA hab ich's (noch?) nicht gefunden. Ich bin aber für jede Hilfe dankbar ;o) Gruß, Hübi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stechi Mitglied Informatiker

 Beiträge: 75 Registriert: 17.01.2008
|
erstellt am: 26. Jun. 2008 15:31 <-- editieren / zitieren --> Unities abgeben:          Nur für Huebi
Hallo Huebi, in VBA sieht der Code für das "keypressed"-Ereignis so aus: Code: Private Sub <Textfeld-Name>_KeyPress(KeyAscii As Integer)Dim pos As Long Dim textString As String If KeyAscii = KEY_RETURN Then KeyAscii = 0 ElseIf KeyAscii >= KEY_SPACE Then ' aktuelle Cursorposition ermitteln pos = <Textfeld-Name>.SelStart ' Eingabestring (mit neu eingegebenem Zeichen) textString = Mid$(<Textfeld-Name>.text, 1, pos) & Chr$(KeyAscii) ' Zeichen selektiert - Cursorposition für Ende ermitteln If Len(<Textfeld-Name>.SelText) Then pos = pos + Len(<Textfeld-Name>.SelText) ' restliche Zeichen (ohne eventuell selektierte Zeichen) anhängen textString = textString & Mid$(<Textfeld-Name>.text, pos + 1) ' Eingabestring auf Gültigkeit überprüfen If ChkStrOnTyp(textString, CHK_FLOAT) = False Then KeyAscii = 0 Beep End If End If End Sub
Für den Code brauchst Du im Verzeichnis "c:\windows\system32\" die Datei "Ekktools32.dll" und im entsprechenden VB-Programm bzw. VBA-Programm folgende Programmzeile: Code: Declare Function ChkStrOnTyp Lib "ekktools32.dll" (ByVal strText As String, ByVal chkTyp As Integer) As Long
Ich hoffe, ich konnte Dir damit bzgl. des "key_pressed"-Ereignisses weiterhelfen! Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 14. Jul. 2008 12:01 <-- editieren / zitieren --> Unities abgeben:          Nur für Huebi
Code:
Declare Function GetAsyncKeyState Lib "user32" ( _ ByVal vKey As Long) As IntegerSub test() Dim iEntity As AcadEntity Dim iPoint As Variant Dim iKeyCode On Local Error Resume Next ThisDrawing.Utility.GetEntity iEntity, iPoint, "Objekt wählen: " iKeyCode = GetAsyncKeyState(&H1B) ' gleich mal abfragen, ob ESC noch gedrückt ist ! If Err.Number <> 0 then Err.Clear If (iKeyCode And &H1B) = 1 Then MsgBox "ESC" Else MsgBox "ins Leere geclickt" End If Else MsgBox "Eigentlich müsste was gewähllt worden sein" End If End Sub
[Diese Nachricht wurde von fuchsi am 14. Jul. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Huebi Mitglied Vermessungsing.
 
 Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 16. Jul. 2008 10:43 <-- editieren / zitieren --> Unities abgeben:         
Hallo Anton!!!!! Herzlichen Dank für Deine Antwort. Das war genau das, was ich gesucht hab! Und jetzt funktioniert das Ganze genau so, wie ich's mir vorgestellt hab! Sonnige Grüße aus München Hübi [Diese Nachricht wurde von Huebi am 17. Jul. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Jul. 2008 09:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Huebi
Zitat: Original erstellt von Huebi: Hallo Wilfried!Herzlichen Dank für Deine Antwort. Das war genau das, was ich gesucht hab! Und jetzt funktioniert das Ganze genau so, wie ich's mir vorgestellt hab! Sonnige Grüße aus München Hübi
Hm. Wen meinst denn mit Wilfried? Geantwortet haben Dir Klaus, Markus und ich (Anton) ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC [Diese Nachricht wurde von fuchsi am 17. Jul. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Huebi Mitglied Vermessungsing.
 
 Beiträge: 107 Registriert: 08.01.2004 Intel Core Duo E6750@2.66GHz NVIDIA GeForce 8600 GT AutoCAD 2004, 2007, 2008 AcadMAP 2004 und 2007 Civil 3D 2008 ADT 2009
|
erstellt am: 17. Jul. 2008 12:39 <-- editieren / zitieren --> Unities abgeben:         
|