| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
|
Autor
|
Thema: Objekt kopieren solange bis Taste E es beendet (1456 mal gelesen)
|
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 08. Nov. 2006 23:51 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ist dieses in VBA ACAD möglich? ich erzeuge ein zB Rechteckobjekt per VBA, dann soll dieses Objekt solange kopiert werden bis ich zB die Taste "E" drücke. Die Flächen der Objekte sollen dabei summiert werden. Gruß Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 10. Nov. 2006 18:51 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
Hallo Tom, das kannste mit VB machen. Nur sollte es wohl nicht die Taste E sein sondern wie üblich ESC oder RT. Hast du denn schon den Code um das Rechteck zu erzeugen oder willst du ein vorhandenes wählen und dann nur kopieren ? Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 10. Nov. 2006 19:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, nach Stunden des wühlens im Forum und das berühmte try and error Prinzip, habe ich ein fast lauffähigen code zusammengebastet. Die User wollen aber mit der "Ende" Taste abbrechen. Mir ist das egal - wenn die es wollen Bei meinem Code Beispiel, wird immer noch nach dem Betätigen der Ende-Taste ein Befehl im Autocad weiter ausgeführt. Habe da wohl noch ein Gedankenfehler drin. Vielleicht sollte ich jetzt erstmal ein Glas Wein trinken, um mein Gehirn zu kühlen Weiss du, wie man sofort nach dem Betätigen der ENDE Taste, die Befehlsfolge in ACAD abbricht? LG Tom
Code:
Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerSub test() Dim test As Double Dim i As Integer Dim Antwort Dim Gesamtflaeche On Error GoTo test_Error i = 1 'Anzahl Objekte test = 0 Do If checkkey(vbKeyEnd) = True Then Exit Do End If i = i + 1 Gesamtflaeche = Gesamtflaeche + rechtlb(5, 5) 'for testing x=5 y=5 test = rechtlb(5, 5) If i = 5 Then Exit Do Loop Gesamtflaeche = Gesamtflaeche + test ' adding area MsgBox "Gesamtfläche= " & (Format(Gesamtflaeche, "##,##0.00")) & " m²" & " mit " & (i - 0) & " Objekten" test_exit: Exit Sub test_Error: If Err.Number = -2145320928 Or Err.Number = -2147352567 Then Antwort = MsgBox("Wollen Sie abbrechen?", vbYesNo, "Hinweis") If Antwort = "Ja" Then Exit Sub Else Resume End If Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure test of Modul Allgemein" Resume test_exit Err.Clear End If End Sub Function rechtlb(laenge As Double, breite As Double) As Double 'Zeichnet Rechteck mit Läne und Breiteangaben Dim p1 As Variant Dim pl As AcadLWPolyline Dim re(0 To 7) As Double Dim Antwort 'Startpunkt On Error GoTo rechtlb_Error p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Bitte den Startpunkt wählen: ") 'Rechteckkonstruktion re(0) = p1(0): re(1) = p1(1) re(2) = p1(0) + breite: re(3) = p1(1) re(4) = re(2): re(5) = re(3) + laenge re(6) = p1(0): re(7) = re(5) Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(re) pl.Closed = True 'Fläche rechtlb = pl.Area 'On Error GoTo 0 rechtlb_exit: Exit Function rechtlb_Error: If Err.Number = -2145320928 Or Err.Number = -2147352567 Then Antwort = MsgBox("Wollen Sie abbrechen?", vbYesNo, "Hinweis") If Antwort = "Ja" Then Exit Function Else Resume End If Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure rechtlb of Modul Allgemein" Resume rechtlb_exit Err.Clear End If End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 11. Nov. 2006 12:40 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
Hallo Tom, wie schon gesagt. Ich würde es bei den Tasten RT oder ESC belassen. Dann wäre dein Programmcode fertig. In dem Augenblick wo du mit ThisDrawing.Utility.GetPoint einen Punkt in AutoCAD abfragst, ist dein Programmcode in VB unterbrochen und reagiert nicht auf eine andere Taste weil AutoCAD die Kontrolle übernommen hat. Vielleicht versuchst du es mit einem Trick (ungetestet, weil ich das auch nicht gut finde ) Wenn du vor dem Abfragen des Punktes in AutoCAD einen Timer initialisierts der im Takt prüft ob eine Taste gedrückt wurde, könnstes du per SendKeys ein ESC an AutoCAD schicken um den Befehl zu beenden. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 11:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, vielen Dank fuer deine Hilfe. Ich habe nun mit Escape probiert, leider wird nach dem Escape immer noch ein Zeichenbefehl (hier das Rechtzeichnen) ausgeführt. d.h. wenn ich nach zwei Rechtecken auf Escape drücke, erwartet ACAD wie du schon sagtest noch immer einen Befehl. Baue ich einen Senkeys mit Esc und einen Enter ein, laeuft es immer noch "schief". Irgendwie ist in der Abbruchroutine noch ein Gedankenfehler bei mir drin. Kann doch nicht wahr sein, dass es kompliziert ist ,grummel Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 13. Nov. 2006 11:48 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
Hallo Tom, läuft denn der Timer Event wenn du in AutoCAD nach dem Punkt fragst? Setze doch mal eine MSGBOX in den Code des Timers. Dann kannst du sehen ob AutoCAD den Event zulässt. Stelli PS: Welche Sorte Wein ??? ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 12:20 <-- editieren / zitieren --> Unities abgeben:         
Servus, der Timer scheint zu gehen. Ich poste mal den jetzigen Code Stand. Den Sendkeys ESC mag er nicht, dafuer anscheinend eher die Enter Version: (der Wein: 2001 Fatalone giolia Del Colle, Primitivo)
Code:
Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerSub test() Dim test As Double Dim i As Integer Dim Antwort Dim Gesamtflaeche Dim loeschen As Integer On Error GoTo test_Error i = 1 'Anzahl Objekte 'test = kreisd(10) test = 0 loeschen = 0 Do 'test = rechtlb(5, 5) If checkkey(vbKeyEscape) = True Then loeschen = 1 Exit Do Else i = i + 1 Gesamtflaeche = Gesamtflaeche + rechtlb(5, 5) test = rechtlb(5, 5) Debug.Print "fl= " & test If test = 0 Then 'Abbruch Exit Do End If End If If i = 4 Then Exit Do Loop If loeschen = 1 Then End If Gesamtflaeche = Gesamtflaeche + test MsgBox "Gesamtfläche= " & (Format(Gesamtflaeche, "##,##0.00")) & " m²" & " mit " & (i - 1) & " Objekten" test_exit: Exit Sub test_Error: If Err.Number = -2145320928 Or Err.Number = -2147352567 Then Antwort = MsgBox("Wollen Sie abbrechen?", vbYesNo, "Hinweis Test") If Antwort = "Ja" Then Exit Sub Else Resume End If Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure test of Modul Allgemein" Resume test_exit Err.Clear End If End Sub Function rechtlb(laenge As Double, breite As Double) As Double 'Zeichnet Rechteck mit Länge und Breiteangaben Dim p1 As Variant Dim pl As AcadLWPolyline Dim re(0 To 7) As Double Dim Antwort 'Startpunkt On Error GoTo rechtlb_Error
p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Bitte den Startpunkt wählen: ") 'Rechteckkonstruktion re(0) = p1(0): re(1) = p1(1) re(2) = p1(0) + breite: re(3) = p1(1) re(4) = re(2): re(5) = re(3) + laenge re(6) = p1(0): re(7) = re(5) 'Timer Dim Pausenlänge, Start, Ende, Gesamtdauer Pausenlänge = 0.5 ' Dauer festlegen. Start = Timer ' Anfangszeit setzen. Do While Timer < Start + Pausenlänge If checkkey(vbKeyEscape) = True Then Exit Function End If DoEvents ' Steuerung an andere Prozesse ' abgeben. Loop Ende = Timer ' Ende festlegen. Gesamtdauer = Ende - Start ' Gesamtdauer berechnen. Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(re) pl.Closed = True 'Fläche rechtlb = pl.Area
rechtlb_exit: Exit Function rechtlb_Error: If Err.Number = -2145320928 Or Err.Number = -2147352567 Then Antwort = MsgBox("Wollen Sie abbrechen?", vbYesNo, "Hinweis -rechtlb-") If Antwort = vbYes Then rechtlb = 0 Debug.Print rechtlb SendKeys "~", True SendKeys "ESC", True Exit Function Else Resume End If Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure rechtlb of Modul Allgemein" Resume rechtlb_exit Err.Clear End If End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 13. Nov. 2006 13:10 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
|
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 13:20 <-- editieren / zitieren --> Unities abgeben:         
diese Fkt hat wohl noch gefehlt. Die ganze DVB dran zu haengen waere zu verwirrend. Weil das meiste garnichst damit zu tuen hat. Leider ist die Flasche leer. Daher wohl mein Stillstand hier ;-) Function checkkey(lngKey As Long) As Boolean 'Prueft Tastatureingabe If GetAsyncKeyState(lngKey) Then checkkey = True Else checkkey = False End If End Function Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 16:18 <-- editieren / zitieren --> Unities abgeben:         
sodele, nach einem heißem Tee mit Schokostueck, scheine ich ein Stueck weiter gekommen zu sein: Habe im Error handling diese beiden ausgetauscht: SendKeys "~", True SendKeys "ESC", True mit thisdrawing.sendcommand chr(27) das scheint besser in ACAD "durchzukommen" Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 13. Nov. 2006 16:38 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
|
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 16:57 <-- editieren / zitieren --> Unities abgeben:         
da steckt noch ein kleiner Wurm drin. Es wird zwar wieder nach einem Startpunkt gefragt, aber wenn ich dann einen Punkt klicke, wird aber nichts gezeichnet (soll ja auch nicht mehr). Komisch, ich koennte schwoeren, vorhin kam diese Befehlsnachfrage nicht mehr. Koenntest du dennoch mal bei dir es durchlaufen lassen? Vielleicht sollte ich fuer nachher noch ne Weinflasche organisieren. Eigentlich muesste Autodesk automatisch als Schmerzensgeld regelmaessig Wein liefern Gruß Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 13. Nov. 2006 20:59 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
Hallo Tom, habs mal abgespeckt. Es läuft, aber so macht man das nicht. Mir ist AutoCAD 2mal abgeschmiert. Machs wie in allen anderen Funktionen mit der RT/ESC. Aber wie auch immer. Du musst schon ein Timer Kontroll einbinden. EIne Zählschleife bringt es nicht da sie nicht abgearbeitet wird.
Code: Modul1 Option Explicit Public E_gedrückt As BooleanDeclare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer Sub test() Dim dbltest As Double Dim i As Integer Dim Antwort Dim Gesamtflaeche Dim loeschen As Integer i = 1 'Anzahl Objekte dbltest = 0 loeschen = 0 Do i = i + 1 dbltest = rechtlb(5, 5) Gesamtflaeche = Gesamtflaeche + dbltest If dbltest = 0 Then Exit Do Loop MsgBox "Gesamtfläche= " & (Format(Gesamtflaeche, "##,##0.00")) & " m²" & " mit " & (i - 1) & " Objekten" End Sub Function rechtlb(laenge As Double, breite As Double) As Double 'Zeichnet Rechteck mit Länge und Breiteangaben Dim p1 As Variant Dim pl As AcadLWPolyline Dim re(0 To 7) As Double Dim Antwort 'Startpunkt ' Timer initialiseren ' Beim Timer Event werden die Tasten abgefragt E_gedrückt = False UserForm1.xTimer1.SetTime = 1000 On Error GoTo rechtlb_Error p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Bitte den Startpunkt wählen: ") ' Wurde während des Befehls die Taste E gedrückt If E_gedrückt = True Then Exit Function End If On Error GoTo 0 ' Timer abschalten UserForm1.xTimer1.SetTime = 0
'Rechteckkonstruktion re(0) = p1(0): re(1) = p1(1) re(2) = p1(0) + breite: re(3) = p1(1) re(4) = re(2): re(5) = re(3) + laenge re(6) = p1(0): re(7) = re(5) Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(re) pl.Closed = True pl.Update 'Fläche rechtlb = pl.Area rechtlb_exit: Exit Function rechtlb_Error: If Err.Number Then Antwort = MsgBox("Wollen Sie abbrechen?", vbYesNo, "Hinweis -rechtlb-") If Antwort = vbYes Then rechtlb = 0 'Timer abschalten UserForm1.xTimer1.SetTime = 0 Exit Function Else Resume End If End If End Function Function checkkey(lngKey As Long) As Boolean 'Prueft Tastatureingabe If GetAsyncKeyState(lngKey) Then checkkey = True Else checkkey = False End If End Function
Code:
Userform mit Timer Private Sub xTimer1_ZeitIstUm(Interval As Long) If checkkey(69) Then E_gedrückt = True SendKeys Chr$(27) End If End Sub
Viel Spass damit Übringens meine Primitivo Vorräte sind auch am Ende Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 13. Nov. 2006 22:36 <-- editieren / zitieren --> Unities abgeben:         
mal wieder ich .... UserForm1.xTimer1.SetTime , öhm - was mache ich denn damit? userform, das verstehe ich noch. aber was ist mit xtimer1.setTime , das kann ich nicht nachvollziehen. wie sähe es denn nur mit esc/RT aus? ich bekomme dein Beispiel wegen diesem UserForm1.xTimer1.SetTime nicht zum laufen. aber du hast sicherlich noch genuegend andere gute Weine Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 14. Nov. 2006 11:58 <-- editieren / zitieren --> Unities abgeben:          Nur für tomww
Hallo Tom, so meine letzte Version. Ist mal auf das wesentliche reduziert und läüft einwandfrei. Ich würde allerdings noch die Blöde Frage ob der Benutzer wirklich beenden will entfernen. Mir geht so was auf den Keks.
Code:
'' Modul Option Explicit Sub test() Dim Fläche As Double Dim GesamtFläche As Double Dim Anzahl As Integer ThisDrawing.Utility.Prompt Chr$(10) & "*** Flächen erfassen ***" Do ' Rechteck auf Benutzereingabe setzen Fläche = rechtlb(5, 5) If Fläche = 0 Then Exit Do ' Statistik Anzahl = Anzahl + 1 GesamtFläche = GesamtFläche + Fläche ThisDrawing.Utility.Prompt Chr$(10) & "Gesamtfläche= " & (Format(GesamtFläche, "##,##0.00")) & " m²" & " mit " & Anzahl & " Objekten" Loop End SubFunction rechtlb(laenge As Double, breite As Double) As Double 'Zeichnet Rechteck mit Länge und Breiteangaben Dim p1 As Variant Dim pl As AcadLWPolyline Dim re(0 To 7) As Double Dim Antwort 'Startpunkt On Error GoTo rechtlb_Error p1 = ThisDrawing.Utility.GetPoint(, " / Bitte den Startpunkt wählen: ") On Error GoTo 0 'Rechteckkonstruktion re(0) = p1(0): re(1) = p1(1) re(2) = p1(0) + breite: re(3) = p1(1) re(4) = re(2): re(5) = re(3) + laenge re(6) = p1(0): re(7) = re(5) Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(re) pl.Closed = True pl.Update 'Fläche rechtlb = pl.Area rechtlb_exit: Exit Function rechtlb_Error: ' benutzer hat Funktion beendet If MsgBox("Wirklich schon beenden ?", vbQuestion + vbYesNo, "Ganz wichtige Frage") = vbYes Then Exit Function Else Resume End If End Function
Viel Spass damitStelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomww Mitglied

 Beiträge: 37 Registriert: 27.10.2006
|
erstellt am: 14. Nov. 2006 12:58 <-- editieren / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |