| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Absturz durch REGEN (2113 mal gelesen)
|
Plenz Mitglied
Beiträge: 71 Registriert: 01.09.2010
|
erstellt am: 08. Sep. 2010 09:27 <-- editieren / zitieren --> Unities abgeben:
Ich habe eine kurze Routine geschrieben, die die Zeichnung regenerieren soll, wenn ein dynamischer Block geändert wurde: Code: Private Sub AcadDocument_ObjectModified(ByVal Object As Object) If InStr(TypeName(Object), "BlockReference") > 1 Then ThisDrawing.SendCommand ("_regen ") End If
Das funktioniert auch so weit. Ärgerlich ist nur, dass jedes Mal "regeneriert Modell" ausgegeben wird und dass man zum Rückgängigmachen zweimal Ctrl-Z drücken muss. Deshalb versuche ich das Regenerieren mit dem VBA-Befehl ThisDrawing.Regen acAllViewports, aber dabei stürzt mein AutoCAD regelmäßig ab (Unhandled Access Violation). Genauer gesagt: danach, denn der regenerierte Zustand der Zeichnung wird noch dargestellt. Bei folgendem Code wird auch die Messagebox noch angezeigt, bevor die Absturzmeldung kommt: Code: Private Sub AcadDocument_ObjectModified(ByVal Object As Object) If InStr(TypeName(Object), "BlockReference") > 1 Then ThisDrawing.Regen acAllViewports MsgBox ("regeneriert") End If
Irgendwelche Ideen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Sep. 2010 09:41 <-- editieren / zitieren -->
Hi, während einer Objektmodifikation (mitten drin!) ein REGEN zu starten ist ungefähr so, als würde beim Formel1-Rennen der Reifenwechsel vor dem Anhalten des Fahrzeugs durchgeführt werden. Das geht so nicht und ist, wie Du schon bemerkst, absturzgefährdend. Ein Workaround dazu könnte sein, dass Du zwar mit ObjectModified überwachst, wird ein solcher Event ausgelöst (und die Prüfung, ob es eine Blockreferenz ist, da würde ich gleich auch prüfen, ob es überhaupt ein dynamischer Block ist), dann setze eine Variable (als Flag, dass REGEN notwendig ist) und dann wartest Du auf den Event EndCommand und jetzt regenerierst Du.
Code: Private pDoRegen As BooleanPrivate Sub AcadDocument_EndCommand(ByVal CommandName As String) If pDoRegen Then pDoRegen = False ThisDrawing.Regen acAllViewports End If End Sub Private Sub AcadDocument_ObjectModified(ByVal Object As Object) If True Then 'hier Deine Prüfung einbauen pDoRegen = True End If End Sub
Dazu noch die Frage: wozu brauchst Du ein REGEN? - alfred - ------------------ www.hollaus.at |
Plenz Mitglied
Beiträge: 71 Registriert: 01.09.2010
|
erstellt am: 08. Sep. 2010 11:48 <-- editieren / zitieren --> Unities abgeben:
Zitat: während einer Objektmodifikation (mitten drin!) ein REGEN zu starten ist ungefähr so, als würde beim Formel1-Rennen der Reifenwechsel vor dem Anhalten des Fahrzeugs durchgeführt werden. Das geht so nicht und ist, wie Du schon bemerkst, absturzgefährdend.
Irgendwie einleuchtend, irgendwas in dieser Richtung hatte ich mir auch schon gedacht, aber der Befehl mit SendCommand funktioniert doch auch. Oder kommt der nur in ein Art Warteschleife? Zitat: Workaround dazu könnte sein [...]
Vielen Dank, das klappt wunderbar. Zwar steht da immer noch "Regeneriert Modell", aber für das Rückgängigmachen genügt jetzt ein Tastendruck. Zitat: da würde ich gleich auch prüfen, ob es überhaupt ein dynamischer Block ist
Ich überprüfe auch anhand des Blocknamens, ob es ein solcher ist, der eine Regenerierung benötigt, aber diesen Code hatte ich weggelassen wegen off-topic. Zitat: Dazu noch die Frage: wozu brauchst Du ein REGEN?
Weil der Block ein Attribut hat, dessen Inhalt von einem dynamischen Parameter abhängt, und dies wird leider nur durch REGEN aktualisiert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Sep. 2010 12:02 <-- editieren / zitieren -->
Hi, >> aber der Befehl mit SendCommand funktioniert doch auch. Oder kommt der nur in ein Art Warteschleife? Genau dieses. >> Weil der Block ein Attribut hat, dessen Inhalt von einem dynamischen Parameter abhängt, >> und dies wird leider nur durch REGEN aktualisiert.
Guck mal >>>hier<<<, sollte schneller sein als REGEN, weil REGEN viel mehr als Schriftfeldaktualisierung macht. - alfred - ------------------ www.hollaus.at |
Plenz Mitglied
Beiträge: 71 Registriert: 01.09.2010
|
erstellt am: 08. Sep. 2010 14:33 <-- editieren / zitieren --> Unities abgeben:
Ahnte ich's doch, dass deine Frage auf so was hinauslaufen sollte Mit SendCommand klappt das auch, aber ich tappe völlig im Dunkeln, wie das mit echtem VBA gemacht werden könnte. Weder finde ich, wie SCHRIFTFELDAKT auf englisch heißt, noch von welchem Objekt dies eine Methode sein könnte. Ich wäre dir für ein, zwei Stichwörter dankbar, dann kann ich selbst weitersuchen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Sep. 2010 14:46 <-- editieren / zitieren -->
Hi, ich hab's nicht probiert, aber ev. kommt ja schon bei BlockRef.Update oder .Update bei der AttributReference eine Schriftfeldaktualisierung zustande? Sonst probier mal >>>diese Suche<<<. - alfred - ------------------ www.hollaus.at |
dsh Mitglied
Beiträge: 35 Registriert: 03.08.2009
|
erstellt am: 08. Sep. 2010 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für Plenz
|
Plenz Mitglied
Beiträge: 71 Registriert: 01.09.2010 ACAD Archi 2015
|
erstellt am: 09. Sep. 2010 10:03 <-- editieren / zitieren --> Unities abgeben:
Sorry Leute, das alles bringt mich nicht weiter. UPDATEFIELD ist korrekt, aber die AutoCAD-VBA-Hilfe findet nichts in dieser Richtung. Es gibt nur Update als Methode für (u.a.) Attribute, aber diese Methode aktualisiert nicht die Schriftfelder in Attributen. Ärgerlicherweise gibt es auch nicht FIELD o.ä. im Objektkatalog. Schriftfeld ist offensichtlich kein eigenständiges AutoCAD-Objekt, sondern nur Bestandteil innerhalb eines Attributs oder Absatztextes. Mir scheint, ich muss bei ThisDrawing.Regen bleiben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 10. Sep. 2010 08:08 <-- editieren / zitieren --> Unities abgeben: Nur für Plenz
Hallo Plenz, UPDATEFIELD - ist ein AutoCAD-Befehl. AutoCAD-Befehle stehen dir in der VBA-Umgebung grundsätzlich nicht zur Verfügung. Dort gibt es Objecte/Eigenschaften/Methoden. Es ist reiner Zufall, dass eine Methode mal gleichnamig mit einem AutoCAD-Befehl ist. Willst du AutoCAD-Befehle in VB(A) nutzen, kannst du das lediglich mit ThisDrawing.SendCommand - wobei SendCommand wiederum eine Methode ist, die auf das ThisDrawing-Object angewandt wird. Grüße Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Plenz Mitglied
Beiträge: 71 Registriert: 01.09.2010
|
erstellt am: 10. Sep. 2010 10:18 <-- editieren / zitieren --> Unities abgeben:
Danke, aber das alles war mir schon klar. Ich hatte halt gehofft, dass die Hilfe zufällig was bringt, wenn ich nach UPDATEFIELD suche. SendCommand möchte ich aus genannten Gründen nicht benutzen. Bleibt die Frage: welche VBA-Methode macht das, was UPDATEFIELD macht, und zu welchem Objekt gehört sie? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|