| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA - getpoint - keine tranparenten Befehle möglich (2141 mal gelesen)
|
mallorca7 Mitglied Konstrukteur
Beiträge: 165 Registriert: 07.05.2002 Windows 7 Autocad Mechanical 2011
|
erstellt am: 04. Sep. 2002 15:19 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe CAD-User, Wenn man in lisp eine getpoint Abfrage macht sind transparente Befehle möglich, (zoom, pan ...) Wenn man das aber in vba macht bricht der Befehl dauernd ab. Was mache ich dabei falsch??? Im Detail sieht das so aus: 1. in Lisp: Befehl: (setq x (getpoint "Wähle einen Punkt")) Wähle einen Punkt'_zoom >>Fensterecke angeben, Skalierfaktor eingeben (nX oder nXP) oder [Alles/Mitte/Dynamisch/Grenzen/Vorher/FAktor/Fenster] <Echtzeit>: _w >>Erste Ecke angeben: >>Entgegengesetzte Ecke angeben: Wähle einen Punkt'_pan >>Mit ESC oder EINGABETASTE beenden oder rechte Maustaste klicken, um das Kontextmenü zu aktivieren. Wähle einen Punkt(10.4054 244.095 0.0) 2. In VBA : Sub Test() returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ") End Sub Wenn man mit F5 startet und zu Autocad wechselt (ich habe ACAD 2000) und man versucht zu zoomen, was für Punktwählen nicht schlecht wäre bricht das VBA-Programm ab. Auch on error resume next hilft nicht weiter. Weiß irgendjemand einen Rat???? lg Fred
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UJJ Mitglied
Beiträge: 190 Registriert: 05.03.2002
|
erstellt am: 04. Sep. 2002 16:19 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Ich weiss auch keinen Rat, aber die Knowledge Database: Sub test() Dim pt As Variant On Error GoTo herr pt=ThisDrawing.Utility.GetPoint( , "Specify a point or use a transparent command: ") Exit Sub herr: Resume End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 04. Sep. 2002 23:42 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Das Problem ist so alt wie VBA in AutoCAD, transparente Befehle über das Menü aufgerufen erzeugen einen Fehler, über die Befehlszeile (z.B. 'zoom) nicht. Die Resume Anweisung tut auch nichst anderes als das Ding wiederholen bis eine Punkteingabe kommt, auch eine Leereingabe oder ESC bewirken einen Error und somit eine Wiederholung, auf gut Deutsch: Aus der Anweisung kommst du nur mehr raus wenn du einen Punkt eingibst oder AutoCAD abwürgst. Ich habe an einer Lösung lange gebastelt, das Ergebnis: Eine ActiveX-Dll, aber vorerst nur für Getpoint Getcorner Getobject Getkeyword Die Dll und eine Test-Dvb (GetXX.dvb) sind im Attachment enthalten. Da es eine ActiveX-Dll muß sie im System registriert werden: entweder: Start>Ausführen regsvr32 *:\***\CCNC_Getxx oder mit beiliegendem Programm klemens.inf (rechte Maustaste auf klemens.inf > installieren = installiert klemens.inf) registrieren. Wenn klemens.inf installiert ist, einfach auf die DLL rechtsklicken und Register wählen. Um die DLL in einem neuen AutoCAD VBA Projekt zu verwenden muß im Projekt unter Menü->Extras->Verweise die CCNC_GetXX.dll ausgewählt werden. Die Verwendung der DLL ist aus der beigefügten DVB ersichtlich. Achtung: wenn die DLL verändert wird (neue DLL, etc) kann es vorkommen das das VBA Projekt die DLL nicht mehr findet, in diesem Fall DLL neu registriern, im Projekt den Verweis löschen und anschließend neu zuweisen. Wenn jemand den Quellcode der DLL (VB) haben möchte, bitte Email an mich, ich sende in gerne zu. Bei Fragen ebenfalls Email an mich. ------------------ Ing. Bernd Cuder Cad&Co makes CAD easy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mallorca7 Mitglied Konstrukteur
Beiträge: 165 Registriert: 07.05.2002 Windows 7 Autocad Mechanical 2011
|
erstellt am: 05. Sep. 2002 08:27 <-- editieren / zitieren --> Unities abgeben:
|
idraH Mitglied
Beiträge: 64 Registriert: 22.04.2002 ACAD 2004/Netzwerklizenz Win 2000
|
erstellt am: 09. Jul. 2003 20:26 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
also eine super Lösung ist es nicht was ich zu bieten habe und man kommt auch nur wieder heraus, wenn man einen Punkt wählt (ist noch ein Manko an dem ich arbeite) aber es funktioniert auch ohne zusätzliche Dateien (zumindest bei mir) und das kann ja auch wichtig sein... Hier also mein Vorschlag: Dim Eingabe1 As String Dim EinfuegePkt As Variant Me.Hide Do On Local Error Resume Next Eingabe1 = vbCrLf & "Einfügepunkt wählen:" EinfuegePkt = ThisDrawing.Utility.GetPoint(, Eingabe1) Loop Until EinfuegePkt = "Leer" .... Me.Show bis jetzt hat es bei mir gut funktioniert, ob Fangart wählen oder Zoom, scheint alles zu gehen (sowohl ACAD 2000 als auch 2002. ist zwar eine Krüke aber davon braucht man ja einige in VBA ich sage nur "Round" oder "lengt" um nur zwei Variablen zu nennen die ich vermisse (zumindest in ACAD 2000 in 2002 ist "round" dann definiert aber bei Mischarbeitsplätzen....) Übrigens, wenn jemand dazu noch eine Verbesserung hat, bin ich sehr interessiert viele Grüße aus Dresden, Hartmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 09. Jul. 2003 20:31 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Ein Workarround User.XXX ist ein Public Struct Public Function Userinput(Typ As Integer, Eingabeaufforderung As String, Optional Initget As Integer, Optional Keywords As String, Optional ByVal Vorgabe As String, Optional Vortext As String) On Error GoTo Fehler Dim Fehler As Integer Dim Ernum As Long Dim Keylist As String Dim Text1 As String Dim Text2 As String Dim Text3 As String Dim Vorher As String Dim Rz As Integer User.Antwort = "" User.Befehl = "Befehl" Text2 = Keywords Keylist = "" Rz = 0 If Len(Keywords) > 0 Then While Rz = 0 Text1 = Erste(Text2) If Keylist = "" Then Keylist = " [" & Text1 End If If Text1 <> "" Then If Keylist <> " [" & Text1 Then Keylist = Keylist & "/" & Text1 End If End If Text2 = Rest(Text2) If Text2 = "" Then Rz = 1 If Keylist <> "" Then Keylist = Keylist & "]" End If End If Wend End If If Len(Vorgabe) > 0 Then Text3 = Vorgabe Vorgabe = " <" & Vorgabe & ">" End If Do User.Keyword = "" Err.Clear If Vortext <> "" Then THISDRAWING.SetVariable "CMDECHO", 1 THISDRAWING.Utility.Prompt vbCrLf & "Objekt2000" THISDRAWING.Utility.Prompt vbCrLf & Vortext & " ..." THISDRAWING.SetVariable "CMDECHO", 0 End If On Error Resume Next THISDRAWING.SetVariable "ERRNO", 0 THISDRAWING.Utility.InitializeUserInput Initget, (Keywords & " ") If Typ = 1 Then THISDRAWING.Utility.GetEntity User.Objekt, User.Punkt, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":" ElseIf Typ = 2 Then User.Punkt = THISDRAWING.Utility.GetPoint(, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 3 Then User.Punkt = THISDRAWING.Utility.GetPoint(User.Bezug, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 4 Then User.Punkt = THISDRAWING.Utility.GetCorner(User.Bezug, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 5 Then User.Angle = THISDRAWING.Utility.GetAngle(, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 6 Then User.Angle = THISDRAWING.Utility.GetAngle(User.Bezug, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 7 Then User.Angle = THISDRAWING.Utility.GetOrientation(, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 8 Then User.Angle = THISDRAWING.Utility.GetOrientation(User.Bezug, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 9 Then User.Real = THISDRAWING.Utility.GetReal(vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 10 Then User.Integer = THISDRAWING.Utility.GetInteger(vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") ElseIf Typ = 11 Then User.String = THISDRAWING.Utility.GetString(False, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ": ") ElseIf Typ = 12 Then THISDRAWING.Utility.GetKeyword vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":" ElseIf Typ = 13 Then User.Abstand = THISDRAWING.Utility.GetDistance(User.Bezug, vbCrLf & Eingabeaufforderung & Keylist & Vorgabe & ":") End If User.Keyword = THISDRAWING.Utility.GetInput() Fehler = THISDRAWING.GetVariable("Errno") Ernum = Err.Number User.Befehl = "Befehl" If Ernum = 0 Then User.Befehl = "" User.Antwort = "G": Exit Do ElseIf Ernum = -2147467259 Or Ernum = -2145320928 Then User.Befehl = "" If User.Keyword = "" Then User.Antwort = "L" Else User.Antwort = "K" End If Exit Do ElseIf (Ernum = -2147352567 And Fehler = 0) Or (Ernum = -2147352567 And Fehler = 52) Then SendKeys vbCr User.Befehl = THISDRAWING.Utility.GetString(True, "") If User.Befehl = "" Then User.Antwort = "A" Exit Do End If If User.Befehl = "'_zoom " Then THISDRAWING.Utility.GetString True, "" User.Befehl = User.Befehl & " " End If If User.Befehl = "Befehl" Then On Error Resume Next User.Befehl = THISDRAWING.Utility.GetString(True, "") If User.Befehl = "Befehl" Then User.Befehl = THISDRAWING.Utility.GetString(True, "") End If On Error GoTo Fehler User.Antwort = "B" Exit Do Else If Left(User.Befehl, 1) = "_" Then SendKeys User.Befehl ElseIf User.Befehl = "'_layer " Or User.Befehl = "'_matchprop " Then SendKeys User.Befehl Else SendKeys User.Befehl & vbCr End If End If End If Loop Fehler: Fehler = True End Function ------------------ Bernd Cuder Cad&Co makes CAD easy
[Diese Nachricht wurde von Bernd Cuder am 09. Juli 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 10. Jul. 2003 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Ich kann dazu nur sagen, Bernds GetXX funktioniert sehr gut, ich hab sie schon seit langer Zeit in Verwendung und finde es einfach sehr gut. Ich hab mir lediglich die Abfragemöglichkeiten geändert. ------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BerndE Mitglied Hochbautechniker
Beiträge: 557 Registriert: 05.07.2003 Revit 2013 ACA 2012 deutsch BuildingOne 5.4.5 Win7 WindowsNetz
|
erstellt am: 21. Jul. 2003 00:20 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
|
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 22. Jul. 2003 01:59 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Einfache Problemlösung ja, aber: Wenn du Code damit programmierst solltest nur Du in benutzten, bei jeden anderen Anwender bringt er Irritationen. Warum, weil AutoCAD nicht so reagiert wie es der Anwender gewohnt ist. Irgendwie tut es mir weh das ich diesen Code reingestellt habe, und niemand (ausser RoSiNiNo) hat sich die Mühe angetan in näher anzusehen. Diese Halblösungen die dem Benutzer nie mehr raus lassen ausser er hat einen Punkt etc. gewählt hatte ich schon vor Jahren gefunden. Bei meinen Code kann der Benutzer zwei Ebenen von transparenten Befehlen (mehr ist eh nicht zulässig) ausführen, und trotzdem kriegt der Programmierer die richtige Meldung zurück. Macht nicht den selben Fehler wie ich, vor 10 Jahren habe ich einfach programmiert, umgestellte Sytemvariablen einfach ignoriert, aber gute Programme stellen bei Abbruch alles auf vorher zurück. Das gehört zur Programmierkultur. @RoSiNiNo verwendest du den Code nur oder hast du dir ihn auch näher angesehen? Wenn ja, ist schon krank welche Luftsprünge man manchmal machen muss (siehe GetString, da fange ich die Menümeldung ab) zum Abschluss, ich programmiere seit zwei Jahren nur mehr in ARX, da gibt es diese Probleme nicht, dafür ganz neue aber die sind wenigstens lösbar. Zur Information: AutoCAD ist in C++ geschrieben es gibt drei Programmierschnittstellen: AutoLISP VBA ObjectARX (C++) In ObjectARX hast du die meisten Möglichkeiten, NoNaNet (heisst na sicher) da diese ausdokumentiert ist und wers nicht glaubt soll seine acadvba.arx löschen und mal sehen wieviel in vba dann noch geht. Nix geht dann, wurde ja in C++ für VBA geschrieben, wenn also der Schmied sich auskennt, du aber zum Bäcker gehst, was wirst du bekommen? Semmeln oder Auskunft?
------------------ Bernd Cuder Cad&Co makes CAD easy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 22. Jul. 2003 07:54 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
Hallo Bernd, ich bin voll deiner Meinung, was deine Funktion anbelangt. Ich bin mittlerweile draufgekommen (und ich kann nicht behaupten ein guter Programmierer zu sein, dafür mach ich es zu selten, hab es mir zum größten teil auch selber beigebracht), immer mehr in kleinen Funktionen erledigen zu lassen. Man programmiert dann nur einmal und kann es immer wieder verwenden. Genau wie bei deiner GetXX-Funktion. Es hat auch sehr lange gedauert bis ich mir eigene Funktionen geschrieben hatte die mir Objekte im richtigen Bereich einsetzten (Hab sonst immer nach dem aktuellen Space gefragt,...). Über ObjectARX trau ich mich noch nicht drüber, ich hatte gehofft das du auf deiner HP die Grundlagen für die Programmierung mir ObjectARX beschreibst (Wie fange ich an? Welche Programme brauch ich dafür? ...). Bisher hat man mir abgeraten, mit Ausnahme von dir, mit ObjectARX ohne Kenntnisse in C++ anzufangen. Hätte aber trotzdem Lust es zu probieren (bin mir aber sicher man benötigt irgendwelche teuren Programme um damit anzufangen). Zum Schluß rate ich auch Fred, schau dir mal die Funktion von Bernd genauer an. ------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BerndE Mitglied Hochbautechniker
Beiträge: 557 Registriert: 05.07.2003 Revit 2013 ACA 2012 deutsch BuildingOne 5.4.5 Win7 WindowsNetz
|
erstellt am: 22. Jul. 2003 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
@Bernd Cuder hallo namensvetter. habe mich bereits seit längerer zeit mit vba im allgemeinen, mit vab für autocad erst seit kurzer zeit beschäftigt. auch mich stören diverse sachen an vba und ich bin seit einiger zeit dabei, nach alternativen zu suchen. visual basic scheint mit da auch keine lösung zu sein (extrem langsam). immer wieder werde ich aber in diesem zusammenhang auf delphi hingewiesen. (nen erstes buch hätte ich mir da auch schon angetan). ObjectARX (C++) wäre auch ne möglichkeit, an die ich mich aber irgendwie noch nicht herangewagt habe. einfach deswegen, weil ein einstieg nicht zu finden ist. wie soll man sich am besten an diese materie herantasten? bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mallorca7 Mitglied Konstrukteur
Beiträge: 165 Registriert: 07.05.2002 Windows 7 Autocad Mechanical 2011
|
erstellt am: 22. Jul. 2003 14:59 <-- editieren / zitieren --> Unities abgeben:
Hi, @Alle leider habe ich keine Zeit gehabt mich weiter in VBA zu beschäftigen, wollte ich ja, deshalb habe ich dieses Problem ins Forum gestellt. Ich programmiere in letzter Zeit auch sehr wenig. Wie ist das dann eigentlich in ObjectArx, habe die Programmierertools von der Autodeskhomepage downgeladen. Habe aber gelesen, das dort (bei Acad 2004) auch mit .Net programmiert wird, heißt also dann C# (Sharp) und dann wieder Windows XP Professional oder Win2000 Prof. Nachdem ich ja verzweifelt und vergeblich versucht habe C# zu installieren, habe ich das aufgegeben, habe eben nur Windows ME. Ob mir der Borland C Compiler weiterhilft weiß ich nicht, braucht wahrscheinlich auch das .Net und das ist irgendwie im Betriebssystem verankert. Dann eben nicht. @RoSiNiNo: Habe mal bei Amazon ein Büch über ObjectARX gekauft, ist aber auf English. Bei kurzer Durchsicht habe ich gesehen, daß die Befehle vom Ausdruck Lisp-ähnlich sind (ssget ...). Sonst muß man natürlich ein bißchen C können. lg manfred
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 22. Jul. 2003 15:35 <-- editieren / zitieren --> Unities abgeben: Nur für mallorca7
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|