Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Absturz durch REGEN

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von Plenz an!   Senden Sie eine Private Message an Plenz  Schreiben Sie einen Gästebucheintrag für Plenz

Beiträge: 71
Registriert: 01.09.2010

erstellt am: 08. Sep. 2010 09:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 Boolean

Private 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



Sehen Sie sich das Profil von Plenz an!   Senden Sie eine Private Message an Plenz  Schreiben Sie einen Gästebucheintrag für Plenz

Beiträge: 71
Registriert: 01.09.2010

erstellt am: 08. Sep. 2010 11:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von Plenz an!   Senden Sie eine Private Message an Plenz  Schreiben Sie einen Gästebucheintrag für Plenz

Beiträge: 71
Registriert: 01.09.2010

erstellt am: 08. Sep. 2010 14:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von dsh an!   Senden Sie eine Private Message an dsh  Schreiben Sie einen Gästebucheintrag für dsh

Beiträge: 35
Registriert: 03.08.2009

erstellt am: 08. Sep. 2010 16:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Plenz 10 Unities + Antwort hilfreich

Hallo,

der AUtocad-Befehl "Schriftfeldakt" sollte auf englisch "UPDATEFIELD" heissen.

Kann das aber grade nicht ausprobieren.

Gruss

Dieter

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Plenz
Mitglied



Sehen Sie sich das Profil von Plenz an!   Senden Sie eine Private Message an Plenz  Schreiben Sie einen Gästebucheintrag für Plenz

Beiträge: 71
Registriert: 01.09.2010

ACAD Archi 2015

erstellt am: 09. Sep. 2010 10:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 10. Sep. 2010 08:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Plenz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Plenz an!   Senden Sie eine Private Message an Plenz  Schreiben Sie einen Gästebucheintrag für Plenz

Beiträge: 71
Registriert: 01.09.2010

erstellt am: 10. Sep. 2010 10:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz