icon

Support Forum

[Frage] C0000005 Access Violation in PythonPart Interactor mit DrawElementPreview

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
19-mal heruntergeladen
Größe: 10,96 KiB
Typ: text/x-script.python
19-mal heruntergeladen
Größe: 21,41 KiB
Typ: text/x-script.python
19-mal heruntergeladen
Größe: 12,25 KiB

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
26-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...