| |  | 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: Problem mit getentity (VBA) und vla-runmacro (1224 mal gelesen)
|
simsl Mitglied

 Beiträge: 13 Registriert: 06.12.2010
|
erstellt am: 14. Jun. 2012 11:52 <-- editieren / zitieren --> Unities abgeben:         
Hallo, habe ein für mich (anscheinend) unlösbares Problem, bei dem ich leider aufgeben und euch um Hilfe bitten muss. Folgendes: Ich habe ein kleines VBA-Programm geschrieben, bei dem ich die Nummerierung meiner Vermessungspunkte (Blockreferenz mit Attributen) etwas automatisieren möchte, d.h. die Punktnummer wird mit jeder Anwahl eines neuen Blockes um 1 erhöht und das betreffende Blockattribut dann mit der neuen Nummer überschrieben. Bei Aktivierung des Programmes erscheint die Userform, wo verschiedene Einstellungen gemacht werden können. Über einen Commandbutton blende ich anschließend die Userform aus ("Hide") und kann dann anschließend die gewünschten Blöcke über den VBA-Befehl
Code: ThisDrawing.Utility.GetEntity obj, Punkt, "Vermessungspunkt wählen: "
auswählen. So, das ganze funktioniert PROBLEMLOS, wenn ich das Makro über den VBA-Editor starte. Auch beim Start über die Befehlszeile ("-vbarun" => Makroname) funktioniert es ohne Probleme.Jetzt hätte ich aber gerne das Makro über eine LISP-Zeile als "Autocadbefehl" eingebunden, um das Makro durch die ENTER-Taster schnell und einfach wieder aufrufen (wiederholen) zu können. Habe dazu ein kleines LISP geschrieben mit folgendem Inhalt:
Code: (defun c:TH_NeunummVerPunkt (/) (vla-runmacro(vlax-get-acad-object) "TH_NeunummVerPunkt_Start"))
Der Aufruf des Makros über LISP funktioniert auch problemlos, bis ich an den Punkt komme, wo ich die Userform ausblende und über die GetEntity-Funktion die Blöcke auswählen möchte. Die Userform blendet sich zwar aus, aber das Problem ist jetzt, dass ich keine Objekte auswählen kann (Fadenkreuz bzw. Pickbox ist nicht mehr sichtbar). Wenn ich mit der Maus (blind) über die Zeichnungsfläche fahre, heben sich die Objekte auch hervor, allerdings kann kein Objekt ausgewählt werden!Mir scheint, dass Autocad (oder LISP??) hier irgendwie auf eine (zusätzliche?) Eingabe wartet... Ich kann mir das allerdings nicht erklären, da wie gesagt der Aufruf über den VBA-Editor und die Befehlszeile problemlos funktioniert, nur eben beim LISP-Aufruf bleibt das Programm beim "GetEntity"-Aufruf stecken! Mir bleibt dann nur die Möglichkeit, AutoCAD zu killen und neu zu starten, da die Zeichnungsfläche "abstürzt". Über den Symbolleisten ist die Maus allerdings sichtbar - es kann aber nichts ausgewählt werden. Ach ja, ich verwende AutoCAD 2011! Frage: Ist das Problem bekannt? Wie könnte man es lösen?
Hier noch der betreffende Programmcode, mit dem ich die Userform ausblende und die Objekte auswählen kann:
Code: Private Sub cmd_Auswahl_Click() Dim obj As AcadEntity Dim Punkt As Variant Dim iKeyCode Dim i As Long 'Zähler Dim Blockattribute As Variant 'Attribute des Vermessungsblockes Dim Blockattribut As AcadAttributeReference 'Einzelnes Attribut des Vermessungsblockes Dim PktNummer As Integer TH_NeunummVerPunkt.Hide PktNummer = cbxStartwert.Value - 1
Do On Local Error Resume Next ThisDrawing.Utility.GetEntity obj, Punkt, "Vermessungspunkt 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" TH_NeunummVerPunkt.Show Exit Do Else ThisDrawing.Utility.Prompt ("Keine Auswahl! Bitte Vermessungspunkt wählen..." & vbCrLf) End If Else 'MsgBox "Eigentlich müsste was gewähllt worden sein" If TypeName(obj) = "IAcadBlockReference" Or TypeName(obj) = "IAcadBlockReference2" And obj.Name = "GDS1" Then PktNummer = PktNummer + 1 If PktNummer > PktNummerMax Then Call MsgBox("Maximale Punktnummer für aktuelle Station erreicht! => " & PktNummerMax & vbCrLf & "Funktion wird abgebrochen!", vbCritical) TH_NeunummVerPunkt.Show Exit Do End If 'Attributwert "BEZ" setzen Blockattribute = obj.GetAttributes For i = 0 To UBound(Blockattribute) Set Blockattribut = Blockattribute(i) If Blockattribut.TagString = "BEZ" Then Blockattribut.TextString = PktNummer Next obj.Update Else ThisDrawing.Utility.Prompt (vbCrLf & "Objekt ist kein Vermessungspunkt!" & vbCrLf) End If End If Loop End Sub
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. Jun. 2012 14:53 <-- editieren / zitieren --> Unities abgeben:          Nur für simsl
Hallo, das liegt wohl daran, dass du in deiner SUB TH_NeunummVerPunkt_Start() das Formular modal aufrufst. Dann bleibt die das Programm so lange stehen, bis das Formular geschlossen wird. Dummerweise ist aber durch ".hide" nicht mehr sichtbar. Setze mal "UserForm.show (false)" ein. Dann sollte es gehen. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |