| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Auf dem Weg zur digitalen Auftragsmappe. , ein Anwenderbericht
|
Autor
|
Thema: iLogic Property in ReferencedDocuments schreiben (754 mal gelesen)
|
OibelTroibel Mitglied Konstrukteur
Beiträge: 602 Registriert: 18.04.2014 ACAD/Inventor 2018-21
|
erstellt am: 07. Jun. 2023 11:34 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich möchte gerne in einer Baugruppe eine iLogic-Regel ausführen, die die Abmessungen aller Unterbaugruppen und Bauteilen in die jeweiligen iProperties schreibt. Dazu habe ich folgendes Script: Code: Sub Main() Dim oADoc As AssemblyDocument = ThisDoc.Document Dim oAsmDef As AssemblyComponentDefinition oAsmDef = oADoc.ComponentDefinition Dim oRefDef As Document For Each oRefDoc As Document In oADoc.AllReferencedDocuments If oRefDoc.IsModifiable = True 'Abmessungen auslesen oRefDef = oRefDoc.ComponentDefinition oMinP = oRefDef.RangeBox.MinPoint oMaxP = oRefDef.RangeBox.MaxPoint oXDiff = oMaxP.X - oMinP.X oYDiff = oMaxP.Y - oMinP.Y oZDiff = oMaxP.Z - oMinP.Z oSize = oXDiff & " x " & oYDiff & " x " & oZDiff oRefDef.PropertySet.Add(oSize, "Abmessung") End If Next End Sub
Leider erhalte ich eine Fehlermeldung "Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "Inventor.Document" umgewandelt werden". Sieht ihr an was das liegen könnte? Vielen Dank und beste Grüsse Raphael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 07. Jun. 2023 12:34 <-- editieren / zitieren --> Unities abgeben: Nur für OibelTroibel
Ich bin nur am Handy und kann es nicht ausprobieren. Meine Gedanken: Beim if fehlt ein then. (wieso startet die Regel dann überhaupt?) oSize ist nicht deklariert (und auch kein object). Auch die anderen Variablen im if-Block. Die ComponentDefinition hat kein propertySet, oder? Müsste das oRefDoc sein...? Und dann müsste man auch erst das PropertySet angeben. Hat aber alles nix unmittelbar mit der Fehlermeldung zu tun. oRefDef ist falsch deklariert (als document, sollte aber componentDefinition sein. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 07. Jun. 2023 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für OibelTroibel
Unabhängig vom Code sei noch folgende Frage erlaubt: Bei den ganzen Einschränkungen, die es bei der RangeBox gibt, bringt die Info dann was? Schräg im Raum liegende Volumen Stützpunkte von Splines Es ist nur sichergestellt, dass die Geometrie innerhalb der Box liegt. Nicht dass die Box "eng anliegt". ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 07. Jun. 2023 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für OibelTroibel
Und noch ein Gedanke: funktioniert das .Add auch wenn das iProperty bereits existiert? Ich kenne es so, dass erst versucht wird, den Wert in das existierende iProp zu schreiben. Im Fehlerfall wird es erstellt. Ähnlich wie hier. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2630 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 07. Jun. 2023 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für OibelTroibel
Moin Gewöhn dir einfach an, ein "Option Explicit On" in den Header deiner Regel zu schreiben. Das erzwingt eine saubere Deklaration aller Variablen. Das kostet etwas Zeit beim Schreiben, spart aber hinterher jede Menge Zeit weil man nicht solche Typenkonflikte suchen muss. Die Einschränkungen einer so einfachen Abmessungsermittlung hat KraBBy ja schon genannt.
Code:
Sub Main() Dim oADoc As AssemblyDocument = ThisDoc.Document Dim oAsmDef As AssemblyComponentDefinition = oADoc.ComponentDefinition Dim oRefDoc As Document For Each oRefDoc In oADoc.AllReferencedDocuments If oRefDoc.IsModifiable = True 'Abmessungen auslesen Dim oRefDef As ComponentDefinition = oRefDoc.ComponentDefinition Dim oMinP As Point = oRefDef.RangeBox.MinPoint Dim oMaxP As Point = oRefDef.RangeBox.MaxPoint Dim oXDiff As Double= oMaxP.X - oMinP.X Dim oYDiff As Double = oMaxP.Y - oMinP.Y Dim oZDiff As Double = oMaxP.Z - oMinP.Z Dim oSize As String= oXDiff.ToString & " x " & oYDiff.ToString & " x " & oZDiff.ToString Try oRefDoc.PropertySets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}").Item("Abmessung").Value = oSize Catch oRefDoc.PropertySets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}").Add(oSize, "Abmessung") End Try End If Next End Sub
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
OibelTroibel Mitglied Konstrukteur
Beiträge: 602 Registriert: 18.04.2014 ACAD/Inventor 2018-21
|
erstellt am: 07. Jun. 2023 14:44 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank KraBBy und Ralf. Ihr habt vollkommen recht, das Script war nicht wirklich sauber und eher ein zusammengebastelter Schnellschuss. Ich habe für ein Bauteil folgenden Code verwendet Code: iProperties.Value("Custom", "Abmessung") = Round(Measure.ExtentsLength,1) & "x" & Round(Measure.ExtentsWidth,1) & "x" & Round(Measure.ExtentsHeight,1)
den ich nun auch in der Baugruppe ausführen wollte. Nach etwas googeln habe ich mir dann den obigen Code zusammengebastelt. Den von Ralf optimierten Code funktioniert nun bestens und ich bin mir der Einschränkungen bewusst. Nochmals vielen Dank euch beiden Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |