| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: iLogic: Wie erfolgt die Abfrage ob Modellzustand vorhanden ist um ihn auszuwählen (276 / mal gelesen)
|
FroSte Mitglied Bauingenieur
Beiträge: 23 Registriert: 09.06.2009 Inventor 2021
|
erstellt am: 20. Feb. 2024 18:38 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe mal wieder eine Herausforderung in iLogic, für die ich noch keine Lösung gefunden habe. Ich hoffe, hier kann mir jemand weiterhelfen. Meine Inventor-Version ist 2023. Ich habe einen Funktion geschrieben, mit der ich Bauteile oder Baugruppen in eine neuen Baugruppe platziere. Das/die zu platzierende Bauteil/Baugruppe wähle ich mit einem Dateiaswahldialog "Öffnen" aus und übergebe die Informationen an die Funktion zum platzieren. Wenn ein Bauteil/eine Baugruppe platziert wurde, möchte ich den Modellzustand auf den bestimmten Modellzustand "Nur Steine" ändern. Da ich nicht sicher sein kann, dass dieser Modellzustand auch in der ausgewählten Baugruppe/Bauteil vorhanden ist, versuche ich einen Fehler mit "Try-Catch-End Try" abzufangen, falls es den bestimmten Modellzustand nicht gibt. Leider bekomme ich aber immer einen Fehler und das Skript steigt aus, wenn der Modellzustand "Nur Steine" nicht vorhanden ist. Kann mir jemand sagen, woran das liegt? Ich dachte, dass das Programm mit einem Hinweis beendet wird, wenn der Modellzustand nicht ausgewählt werden kann, da er nicht vorhanden ist. Vermutlich muss ich vorher prüfen, ob er vorhanden ist und erst dann auf den Modellzustand wechseln. Wie kann ich das vorhanden sein des Modellzustands prüfen? Danke für eure Unterstützung. Liebe Grüße Stephan Hier ist mein iLogic-Code.
Code:
Public Sub AddComponent(oPath As String, Ringnr As Integer, Typ As String ,Stellung As Integer, Stat As Double, XAchseX As Double, XAchseY As Double, XAchseZ As Double, YAchseX As Double, YAchseY As Double, YAchseZ As Double, ZAchseX As Double, ZAchseY As Double, ZAchseZ As Double, UrsprungX As Double, UrsprungY As Double, UrsprungZ As Double) If System.IO.File.Exists(oPath) Then Dim oAsmCompDef As AssemblyComponentDefinition = ThisApplication.ActiveDocument.ComponentDefinition Dim oTG As TransientGeometry = ThisApplication.TransientGeometry Dim oMatrix = oTG.CreateMatrix oMatrix.Cell(1, 1) = XAchseX oMatrix.Cell(2, 1) = XAchseY oMatrix.Cell(3, 1) = XAchseZ oMatrix.Cell(1, 2) = YAchseX oMatrix.Cell(2, 2) = YAchseY oMatrix.Cell(3, 2) = YAchseZ oMatrix.Cell(1, 3) = ZAchseX oMatrix.Cell(2, 3) = ZAchseY oMatrix.Cell(3, 3) = ZAchseZ oMatrix.Cell(1, 4) = UrsprungX oMatrix.Cell(2, 4) = UrsprungY oMatrix.Cell(3, 4) = UrsprungZ
Dim oOcc As ComponentOccurrence = oAsmCompDef.Occurrences.Add(oPath, oMatrix) oOcc.Grounded = True ' "True" zum Fixieren des Bautels bzw. der Baugruppe, "False" für keine Fixierung oOcc.Name = "Ring_" & Format(Ringnr, "000") & " - Stat. " & Format(Stat, "0.000") & " - Typ " & Typ & " - Ringstellung " & Format(Stellung, "00") ' Umbenennen der eingefügten Elemente im Browser Try oOcc.SetLevelOfDetailRepresentation("Nur Steine", True) ' Detailgenauigkeit "Nur Steine" muss vorhanden sein!!! Catch MsgBox("Es ist keine Detailgenauigkeit ""Nur Steine"" vorhanden!" & Chr(13) & "Es werden keine Ringe eingelesen und das Programm beendet.", "Dialog Detailgenauigkeit") Exit Sub End Try End If End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2422 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 20. Feb. 2024 19:57 <-- editieren / zitieren --> Unities abgeben: Nur für FroSte
|
FroSte Mitglied Bauingenieur
Beiträge: 23 Registriert: 09.06.2009 Inventor 2021
|
erstellt am: 23. Feb. 2024 09:11 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Ralf, vielen Dank für Deine Antwort. Leider bin ich (noch) nicht der große iLogic-Experte. Was ist denn genau der Unterschied zwischen Modellzustand und Detailgenauigkeit. Ich weiß, die Modellzustände gibt es erst seit IV2022, vorher waren das Detailgenauigkeiten. ich weiß auch, dass mit den Modellzuständen viel mehr möglich ist, als mit den bisherigen Detailgenauigkeiten, aber in der Baugruppe sind sie ja doch vergleichbar. Der Befehl LevelOfDetail (oOcc.SetLevelOfDetailRepresentation("Nur Steine", True) ) funktioniert ja. Wenn der benannte Modellzustand (hier "Nur Steine" in dem Modell (egal ob Baugruppe oder Bauteil) vorhanden ist, wird dieser auch ausgewählt. Nur kann ich den Fehler nicht abfangen, falls der Modellzustand in der Baugruppe oder dem Bauteil nicht vorhanden ist. Für mich stellt sich die Frage, wie ich den Fehler abfangen kann. Wenn es besser oder sinnvoller ist anstelle von LevelOfDetail den Befehl ActiveModelState zu verwenden, kann ich das natürlich ändern. Wie müsste denn die Zeile dann aussehen? oOcc.ActiveModelState("Nur Steine", True) funktioniert leider nicht. Ich leg mal noch einen Screenshot von der Fehlermeldung bei, die erscheint, wenn das/die ausgewählte Bauteil / Baugruppe den benannten Modellzustand nicht enthält. Vielen Dank für die Unterstützung und Hilfe. Gruß Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2422 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 23. Feb. 2024 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für FroSte
Moin Deatilgenauigkeiten gibt es nicht mehr. Mit Version 2022 wurden Detailgenauigkeiten durch Modellzustände ersetzt. Bei der Migration alter Daten sollen Detailgenauigkeiten in Modellzustände konvertiert werden. Detailgenauigkeiten sind in der API nur zwecks Kompatibilität zu Altdaten noch erreichbar. In irgendeinem zukünftigen Release wird das ausgeblendet und nochmal irgendwann später möglicherweise ganz entfernt. Es empfiehlt sich daher diese Objekte nicht mehr zu verwenden. Das SetLevelOfDetailRepresentation funktioniert ist Teil der Rückwärtskompatibilität. Inventor sucht im Hintergrund sowohl Detailgenauigkeit als auch Modelzustand mit dem gegebenen Namen. Es gibt mehrere Möglichkeiten vorab zu prüfen ob der Modellzustand existiert. Variante 1 - Holzhammer Mit einem TryCatch Statement probieren und den ausgelösten Fehler selbst behandeln
Code:
Try oOcc.ActiveModelState = "Nur Steine" 'alternativ kann hier auch der Parametername oder der Rückgabetext eines Dialoges eingesetzt werden Catch 'hier den Code einfügen der ausgeführt werden soll, wenn der Modellzustand nicht existiert, im einfachen Fall Exit Sub End Try
Variante 2 dezent nachfragen In einer Schleife durch alle vorhandenen Modellzustände gehen und bei jedem den Namen vergleichen
Code:
Dim oMS As ModelState For Each oMS in oOcc.Definition.ModelStates If oMS.Name = "Nur Steine" Then oOcc.ActiveModelState = "Nur Steine" ' alternativ müsste auch gehen ' oMS.Activate Exit For End If Next
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FroSte Mitglied Bauingenieur
Beiträge: 23 Registriert: 09.06.2009 Inventor 2021
|
erstellt am: 01. Mrz. 2024 11:06 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|