Pr��fen, ob nur die I-Properties ge��ndert wurden (Geometrie unber��hrt) / Inventor .NET
mb-ing 30. Nov. 2021, 16:51

Hallo zusammen,

wie kann ich bei einem Inventor-Dokument herausfinden, ob nur die I-Properties geändert wurden und beispielsweise nicht die eigentliche Geometrie (IPT) oder Abhängigkeiten (IAM) etc.?
Vorrangig würde mich dies bei IPTs interessieren. Wenn man es auch bei IAM und IDW anwenden kann, umso besser 

Theoretisch gibt es ja das Attribut "RecentChanges" am Dokument.
Ist das für mein Anliegen zielführend und zuverlässig?

Ich habe die Eigenschaft mal mit folgendem Code analysiert:

Code:
...
[Enum].GetName(GetType(Inventor.CommandTypesEnum), g_inventorApplication.ActiveEditDocument.RecentChanges)

Dim enumType As Inventor.EnumType = g_inventorApplication.TestManager.GetEnumType("CommandTypesEnum")
Dim index As Integer = 0
Do While index < enumType.Count
  Debug.Print(enumType.ValueName)
  Debug.Print(enumType.Value)
  enumType.MoveNext()
  index += 1
Loop
...


Die Konsole wirft nur ein paar wenige Ausgaben raus :(
Kann das generell an dem TestManager liegen?

Auch ist der Wert

Code:
[Enum].GetName(GetType(Inventor.CommandTypesEnum), g_inventorApplication.ActiveEditDocument.RecentChanges)
nach dem manuellen Ändern der I-Properties unterschiedlich 

Hintergrund:
Ich reagiere mit einem Trigger auf das Speichern des Dokuments und aktualisiere im Zuge dessen die I-Properties.

Problem:
Es gibt eine Funktion der PDM-CAD-Integration, welche PDM-Relevante I-Properties aktualisiert. (Funktion wird manuell ausgelöst...)
Werden dann die "modifizierten" Dokumente gespeichert, soll meine Funktion die I-Properties nicht erneut aktualisieren.
Dazu müsste ich natürlich bei jedem Dokument prüfen, ob nur die I-Properties verändert wurden 

Bei einem einzelnen Teil (IPT) ist das natürlich egal, aber wenn der Kollege eine Baugruppe komplett traversiert, sieht es gleich anders aus 

Danke und Grüße
MB-Ing.

rkauskh 01. Dez. 2021, 11:08

Moin

Was ist der TestManager? 

Der Wert von RecentChanges sollte nach dem Ändern eines iProps mW eigentlich immer 10 sein. Die 10 ist die Summe der beiden CommandTypesEnumeratoren 8 (kFilePropertyEditCmdType) und 2 (kQueryOnlyCmdType). Alles darüber sollten Änderungen am Modell und/oder den Referenzen sein.
Ich habe keine Erfahrung wie zuverlässig die Angabe ist. Man kann in den eigenen ControlDefinitions ja selbst definieren welcher CommandType das angeblich ist. Da würde ich definitiv mal testen, einem Command nur ein kQueryOnlyCmdType zu verpassen, das die Geometrie ändert (falls das geht).

Alternativ:
Das Abfragen von iPropertywerten verbraucht nur minimal Zeit. Wenn du vor dem Schreiben den bestehenden und den neuen Wert vergleichst und nur neu schreibst wenn sie differieren, kannst du deutlich Zeit sparen. Ich hab vor Jahren mal irgendwo gelesen, das man hier von Zehnerpotenzen Geschwindigkeitsunterschied ausgehen kann.

mb-ing 01. Dez. 2021, 14:45

Zitat:
Original erstellt von rkauskh:
Moin

Was ist der TestManager? 

Der Wert von RecentChanges sollte nach dem Ändern eines iProps mW eigentlich immer 10 sein. Die 10 ist die Summe der beiden CommandTypesEnumeratoren 8 (kFilePropertyEditCmdType) und 2 (kQueryOnlyCmdType). Alles darüber sollten Änderungen am Modell und/oder den Referenzen sein.
Ich habe keine Erfahrung wie zuverlässig die Angabe ist. Man kann in den eigenen ControlDefinitions ja selbst definieren welcher CommandType das angeblich ist. Da würde ich definitiv mal testen, einem Command nur ein kQueryOnlyCmdType zu verpassen, das die Geometrie ändert (falls das geht).

Alternativ:
Das Abfragen von iPropertywerten verbraucht nur minimal Zeit. Wenn du vor dem Schreiben den bestehenden und den neuen Wert vergleichst und nur neu schreibst wenn sie differieren, kannst du deutlich Zeit sparen. Ich hab vor Jahren mal irgendwo gelesen, das man hier von Zehnerpotenzen Geschwindigkeitsunterschied ausgehen kann.


Hi Ralf,

vielen Dank für Deine Antwort.

Der TestManager ist ein "Hidden Object"...
In VBA zwecks der Gaudi einfach mal unter "ThisApplication.TestManager." schmöckern 

Woher weißt Du sowas, wie die Summer gebildet wird? Unglaublich  Ändere mal Dein Namen auf Ralfipedia :P

Was meinst Du mit eigene "CommandTypes" definieren?

Interessanter Ansatz mit dem Vergleichen der I-Properties-Values...
Ich ermittle zum Beispiel Länge, Breite und Höhe über die "RangeBox". Diese Ermittlung müsste ich ja erst durchführen bevor ich den Wert für das I-Property zum Vergleich habe.
Denkst Du, dass ich da immer noch einen Zeitvorteil habe, als wenn ich dann gleich den Wert reinschreibe?

Danke und Grüße

rkauskh 01. Dez. 2021, 20:38

Hallo

Da is nix unglaublich, das steht alles so in der API Hilfe. Gut das mit dem zusammen addieren jetzt nicht direkt, aber wenn man sich die Werte so anschaut...

Zitat:

CommandTypesEnum Enumerator

Description
Constants that stand for the different types of commands.

Methods
Name Value  Description
kEditMaskCmdType   57  Commands that cause the document to become 'dirty'. Includes ShapeEdit, FilePropertyEdit, NonShapeEdit and UpdateWithReferences commands.
kFileOperationsCmdType 4  Commands that manage file operations - e.g. File Save.
kFilePropertyEditCmdType 8  Commands that edit File Properties (a.k.a Document Properties).
kModelStateUpdatesCmdType  256  Commands that cause model state updates (e.g. generate model state member document).
kNonShapeEditCmdType   32  Commands that edit data (other than File Properties) that is not directly related to the geometry of the model (e.g. color, style).
kQueryOnlyCmdType   2  Commands that purely query data. These do not 'dirty' the document.
kReferencesChangeCmdType   64  Commands that cause this document to change which files it references.
kSchemaChangeCmdType 128  Commands that change the format of the data, but do not change it otherwise (e.g. from the format of one Inventor release to another).
kShapeEditCmdType   1  Commands that can affect the geometry of the model.
kUpdateWithReferencesCmdType 16  Commands that cause this document to recalculate its contents with respect to changes that may have occurred in files it is referencing.


Da hast mich falsch verstanden. Man kann bei der Definition eines eigenen Buttons (ControlDefinition) die Classification angeben.

Code:
ControlDefinitions.AddButtonDefinition( DisplayName As String, InternalName As String, Classification As CommandTypesEnum, [ClientId] As Variant, [DescriptionText] As String, [ToolTipText] As String, [StandardIcon] As Variant, [LargeIcon] As Variant, [ButtonDisplay] As ButtonDisplayEnum ) As ButtonDefinition


Wenn der Versuch mit RecentChanges funktioniert, ist das definitiv das schnellste Vorgehen. Ich vermute aber, eure User werden eher selten die Dateien öffnen, den PDM-SchreibmeineIProps-Button drücken und speichern. Da wird vermutlich meistens noch irgendwas geändert. Und dann musst du deine iProps prüfen, hilft nix. Ich hab nochmal gesucht, es aber leider nicht mehr gefunden. Ich bin mir aber sicher das Brian Ekins in seinem Blog auf modthemachine.com das Lesen und Schreiben von iProps mal verglichen hat.
Das Abfragen der Rangeboxproperties und Vergleich mit den vorhandenen Werten in den iProps ist nur ein Bruchteil des Schreibvorganges. Brian Ekins aht das damals mit zusätzlich dabei ablaufenden Transaktionen und dem Aktualisieren interner Caches usw. erklärt, die alle Zeit brauchen.

bwr 01. Dez. 2021, 21:31

Hallo mb-ing,

alternativ gibt es auch die ModelGeomertyVersion (ComponentDefinition.ModelGeometryVersion), die sich bei Bearbeitungen ständig ändert. Die Eigenschaft gibt's für alle Typen von Documenten.

Dazu muss der aktuelle Wert beim Speichern in die Datei geschrieben werden (iProperty oder Attribut). Später kannst du diesen Wert dann mit dem aktuellen Wert vergleichen. Bei Änderungen an den iProperties bleibt der Wert gleich, ansonsten ändert er sich.

mb-ing 02. Dez. 2021, 09:55

Hallo zusammen,

vielen herzlichen Dank für Euren Input.

Vielleicht noch ergänzend:
Die Funktion der PDM-CAD-Integration, welche PDM-Relevante I-Properties aktualisiert, bereitet mir nur Probleme, wenn diese in einer Baugruppe ausgeführt wird.
Die Funktion durchläuft von der Baugruppe aus alle Komponenten und aktualisiert deren I-Properties, sodass beim Schließen der Baugruppe die Komponenten auch gespeichert werden wollen und meine getriggerte Funktion anspringt.

@Ralf:
Der Knopf für die Funktion der PDM-CAD-Integration ist von einem Drittanbieter Add-In also dem PDM-System...
Soll ich den Button nachträglich eine Classification zuweisen?

@Andreas:
Sehr interessanter Ansatz, den muss ich mir mal durchdenken 
Da viele Dateien Schreibgeschützt (im PDM freigegeben) sind, wird müsste ich das Attribut bei jedem Öffnen schreiben, oder?

Danke und Grüße
MB-Ing.

rkauskh 02. Dez. 2021, 12:55

Hallo

Nein, du kommst mW an die Eigenschaft nur in der Activate Sub des Addins heran. Da brauchst/kannst du nichts ändern. Mir ging es darum, das du für deine eigenen Buttons weißt wofür diese Option ist und woher RecentChanges seine Werte bekommt.

mb-ing 02. Dez. 2021, 13:55

Zitat:
Original erstellt von rkauskh:
Hallo

Nein, du kommst mW an die Eigenschaft nur in der Activate Sub des Addins heran. Da brauchst/kannst du nichts ändern. Mir ging es darum, das du für deine eigenen Buttons weißt wofür diese Option ist und woher RecentChanges seine Werte bekommt.


Hi Ralf,

danke, ah again what learned. 

Danke und Grüße
MB-Ing.

mb-ing 02. Dez. 2021, 16:57

Ok, jetzt bin ich schlauer 

Werden wirklich nur die I-Properties modifiziert ist der Wert für "RecentChanges" immer 10.

Aber die Funktion der PDM-CAD-Integration, welche vorrangig PDM-Relevante I-Properties aktualisiert, überschreibt anscheinend auch beispielsweise den DisplayName, etc., so dass die Summe für "RecentChanges" eine andere ist. Ansonsten ändert die Funktion auch weitere Sachen, so dass sehr oft unterschiedliche Werte rauskommen. Aber sie ändert eben nie etwas an der Geometrie...

Das Wegschreiben der ModelGeomertyVersion (ComponentDefinition.ModelGeometryVersion) in ein AttributeSet wäre wahrscheinlich eine zuverlässige Lösung.
Jedoch scheint mir das mit einem größeren Aufwand einherzugehen, so dass ich noch nicht implementieren möchte.

Vielen herzlichen Dank für Eure tolle Hilfe und Input.

Danke und Grüße
MB-Ing.

CIDEON-RGH 27. Apr. 2022, 10:02

Alternativ könnte man auch probieren in ApplicationEvents.OnDocumentChange den Context auswerten und schauen ob iProperties betroffen sind.

mb-ing 28. Apr. 2022, 07:30

Zitat:
Original erstellt von CIDEON-RGH:
Alternativ könnte man auch probieren in ApplicationEvents.OnDocumentChange den Context auswerten und schauen ob iProperties betroffen sind.

Danke für Ihre Antwort.
Klingt sehr interessant, das werde ich mir mal anschauen.

Danke und Grüße
MB-Ing.