icon

[Frage] C0000005 Access Violation in PythonPart Interactor mit DrawElementPreview [Gelöst]

Schlagworte:
  • Allplan
  • 2024
  • Interactor

Hallo,

ich erhalte in einem eigenen PythonPart Interactor wiederholt eine Access Violation und komme der Ursache nicht auf die Spur.

Fehlermeldung Beispiel:
Exception nr C0000005 -access violation is occured at 00007FFC4C64E3D5, while reading from address FFFFFFFFFFFFFFF9

Setup:
- Allplan 2024
- BaseInteractor mit Preview und Modifikationsmodus
- DrawElementPreview wird in process_mouse_msg aufgerufen (bei IsMouseMove)
- PythonPartGroup mit mehreren PythonParts, Geometrie aus JSON via GeometryStringValueConverter

Beobachtetes Muster:
- Ohne DrawElementPreview → Crash selten, aber gelegentlich vorhanden
- Mit DrawElementPreview in process_mouse_msg → deutlich häufiger
- Mit DrawElementPreview zusätzlich bei Palettenänderung → fast jedes Mal
- Nie zuverlässig reproduzierbar

Danke

Anhänge (3)

Typ: text/xml
41-mal heruntergeladen
Größe: 10,96 KiB
Typ: text/x-script.python
45-mal heruntergeladen
Größe: 21,41 KiB
Typ: text/x-script.python
45-mal heruntergeladen
Größe: 12,25 KiB

Lösung anzeigen Lösung verbergen

Du hast Dir scheinbar eine JSON-Bauteil-Bibliothek aufgebaut, aus der die zu bauende Tür zusammengesetzt wird.
Keine Ahnung, ob das nur statische Geometrie-Objete sind, oder diese noch parametrische verändert werden.
Wenn ja, sollte man z.B. bei Skalierungen von Polyhedren aufpassen, dass dadurch nicht die Toleranz für minimalen Punktabstand
unterschritten oder die für die Koplanarität der Flächen überschritten wird. Solche Objekte werden nicht in die Datenbank
"gelassen", aus oben genannten Gründen.

Ich würde auch die JSON-Serialisierung als Fehlerquelle nicht ausschließen.
Selbst wenn das Objekt bei der Übernahme aus Allplan noch korrekt war, kann doch beim Schreiben nach JSON
irgendetwas schief gegangen seit. Diese Schnittstelle ist von Allplan implementiert worden, und möglicherweise ist
diese nicht mit allen in Frage kommenden Objekten ausreichend getestet worden.
Auch beim Parsen aus JSON könnte natürlich was schiefgegangen sein!

Da müsste man mal bei STOGeo.create_geometry_from_string(..) nachschauen.

Und noch etwas: Das Tür-Previews wird scheinbar bei jedem Mouse-Move komplett neu erzeugt!
Das ist nicht sehr performant. Besser wäre die Preview-Objekte einmalig am Nullpunkt zu erzeugen, und dann nur mit einer Verschiebungs-Matrix an's Fadenkreuz zu hängen.

Geometrie aus JSON via GeometryStringValueConverter

Diese Geometrie ist offensichtlich falsch!
Da die Geometrie, z.B. Polyhedron beim Preview ungeprüft an die Graphicsengine weitergeleitet wird, kann eine defekte Punkten-oder Kantenliste diese Exception verursachen.

Allplan geht davon aus, dass alle Objekte, die zum "Preview" gelangen, aus dem Array (der Zeichnungs-Datenbank) kommen, und diese beim Schreiben in die Datenbank geprüft werden. Deshalb wird aus Performance-Gründen beim Preview die Geometrie nicht geprüft, sondern ungeprüft in den OpenGL-Treiber geschoben.

Das Problem ist dass ich die Geometrie direkt aus dem Tool SelectDrawingGeometryForPythonpart der Beispielscripts übernehme.
Kann die Geometrie die ich direkt aus dem Werkzeug übernehme denn Fehlerhaft sein?
Außerdem funktioniert die Preview grundsätzlich ja.
Der Fehler wird an verschiedensten Zeitpunkten geworfen, manchmal wenn ich die Parameter zurücksetze, manchmal wenn ich die Palette schließe usw. Nie aber zuverlässig bei der selben Aktion.

Anhänge (1)

Typ: video/mp4
47-mal heruntergeladen
Größe: 3,11 MiB

Du hast Dir scheinbar eine JSON-Bauteil-Bibliothek aufgebaut, aus der die zu bauende Tür zusammengesetzt wird.
Keine Ahnung, ob das nur statische Geometrie-Objete sind, oder diese noch parametrische verändert werden.
Wenn ja, sollte man z.B. bei Skalierungen von Polyhedren aufpassen, dass dadurch nicht die Toleranz für minimalen Punktabstand
unterschritten oder die für die Koplanarität der Flächen überschritten wird. Solche Objekte werden nicht in die Datenbank
"gelassen", aus oben genannten Gründen.

Ich würde auch die JSON-Serialisierung als Fehlerquelle nicht ausschließen.
Selbst wenn das Objekt bei der Übernahme aus Allplan noch korrekt war, kann doch beim Schreiben nach JSON
irgendetwas schief gegangen seit. Diese Schnittstelle ist von Allplan implementiert worden, und möglicherweise ist
diese nicht mit allen in Frage kommenden Objekten ausreichend getestet worden.
Auch beim Parsen aus JSON könnte natürlich was schiefgegangen sein!

Da müsste man mal bei STOGeo.create_geometry_from_string(..) nachschauen.

Und noch etwas: Das Tür-Previews wird scheinbar bei jedem Mouse-Move komplett neu erzeugt!
Das ist nicht sehr performant. Besser wäre die Preview-Objekte einmalig am Nullpunkt zu erzeugen, und dann nur mit einer Verschiebungs-Matrix an's Fadenkreuz zu hängen.

Verändert wird die aus .json geladene Geometrie eigentlich nur durch transformieren, spiegeln und rotieren.
Wenn ich auch nur Line2D lade kommt der Fehler zwar seltener aber doch gerne vor.

Der Code wäre im Anhang des ersten Posts, im zweiten habe ich auch noch ein Video wie das ganze in der Verwendung aussieht. Falls es dich noch interessiert könntest du drüber schauen ob dass was ich da schreibe so sinn macht. Würdest mir auf jeden fall sehr helfen...

Im Video gehst Du auf den Reset-Knopf unten in der Palette!
Es sieht so aus, als ob das den Absturz auslöst!
Was bezweckst Du damit bzw. was soll dieser Knopf bewirken?
Passiert der Absturz auch ohne diesen Knopf zu klicken?

Wenn ja, würde ich gern mal sehen wobei...

Am Reset Knopf selbst kann es eigentlich nicht liegen, darin setze ich nur Standardmäßig die Parameter zurück (er funktioniert ganz am Anfang des Videos auch).

Ich habe mir jetzt aber folgenden Vorschlag von dir zu herzen genommen...

Zitiert von: nemo
Und noch etwas: Das Tür-Previews wird scheinbar bei jedem Mouse-Move komplett neu erzeugt!

Das ist nicht sehr performant. Besser wäre die Preview-Objekte einmalig am Nullpunkt zu erzeugen, und dann nur mit einer Verschiebungs-Matrix an's Fadenkreuz zu hängen.

... und erstelle die Tür Previews nun nur neu sobald die Palette geändert wird bzw. sobald der Handle gegriffen wurde. Bis jetzt ist es noch kein einziges mal abgestürzt! Bin mir zwar noch nicht im klaren woher der Fehler kam aber so lange es jetzt einigermaßen stabil läuft bin ich zufrieden.

Danke für deinen Input!
LG