| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Parameter der Bauteile innerhalb der Baugruppe ändern (2776 / mal gelesen)
|
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 12. Nov. 2021 22:03 <-- editieren / zitieren --> Unities abgeben:
Guten Abend Zusammen, ich habe bereits einige Foren und Beiträge durchsucht, aber leider keine zufriedenstellenden Lösungen zu meinem Problem gefunden. Ich habe mehrere Bauteile einzeln erstellt und mit Benutzerparametern innerhalb der Parameterliste und Regeln in iLogic hinterlegt. Ich würde gerne die Parameter in den einzelnen Bauteilen über die Baugruppe ändern, um nicht immer in die einzelnen Bauteile zu gehen und diese zu ändern. Ich hatte es bereits mit "Verknüpfen" versucht, die Parameter können dann aber nicht geändert werden. Ich hoffe mir kann jemand weiterhelfen. Mit freundlichen Grüßen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manfred Gündchen Ehrenmitglied V.I.P. h.c. SelbstständIng mit Planungsbüro Anlagenbau, Dipl.-Ing.-Maschinenbau
Beiträge: 2369 Registriert: 08.03.2008 IV seit den 5.3Er aktuell den 2014Ner WIN7pro-64bit SP das jeweils aktuelle
|
erstellt am: 13. Nov. 2021 07:41 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Umgekehrt würde ein paar Schuhe draus. Ein Mastermodell (MM) bildet mit ggf. verschiedenen Skizzen den Zusammenbau ab. Alle erforderlichen Parameter sind in diesem Modell, in den Skizzen und/oder der Parameterliste enthalten. Per Abgeleiteter Komponente (AK) wird dieses Modell jeweils in die einzelnen schon modellierten Teile gebracht,. Die abgeleiteten und eingeblendeten Skizzen können als Basis der einzelnen Teile verwendet werden. Quasi als eingeblendetes Skelett. Siehe hierzu, und zu den beiden anderen Begriffen, per Suchfunktion mal hier im WBF nach. Änderungen im MM werden über die jeweilige AK, nach einer Aktualisierung der Teile, übernommen. Diese Vorgehensweise kann auch nachträglich noch eingesetzt werden. Wie, einfach hier nochmals die Suchfunktion nutzen. ------------------ In diesem Sinne wünsche ich allen, weiterhin effektives Schaffen ---------------- Manfred Gündchen www.guendchen.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 13. Nov. 2021 08:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Manfred Gündchen, danke für die Antwort. Ich habe die Suchfunktion genutzt, trotzdem ist mir nicht klar geworden wie das Vorgehen ist, um das Problem zu lösen. Könntest du oder jemand anderes die Vorgehensweise beschreiben? Ich habe mein Modell (Baugruppe) mal angehängt, vielleicht wird das dadurch verständlicher oder man kann es anhand dessen erklären. Mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manfred Gündchen Ehrenmitglied V.I.P. h.c. SelbstständIng mit Planungsbüro Anlagenbau, Dipl.-Ing.-Maschinenbau
Beiträge: 2369 Registriert: 08.03.2008 IV seit den 5.3Er aktuell den 2014Ner WIN7pro-64bit SP das jeweils aktuelle
|
erstellt am: 13. Nov. 2021 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Anderer Weg, aber von der Vorgehensweise sehr ähnlich, dass nachfolgende Verfahren. Das ist im Übrigen seit über 10 Jahren die Vorgehensweise meines Büros. In dieser Zeit wurde das Verfahren weitgehend perfektioniert. Der Zusammmenbau wird in einem MM in einem Skizzenblock erstellt. Da der einzelne Skizzenblock nur zweidimensional ist, muss ggf. etwas mehr abstrahiert werden, um den Zusammenbau abzubilden. Ist, bzw. sollte aber kein wirklicher Hindernisgrund sein. Der Inventor (IV) ist ein Konstruktionsprogramm, hauptsächlich für den Maschinenbau. Anwender aus diesem Bereich sollten technisches Zeichnen beherrschen. In diesem Sinne kann der Skizzenblock auch mit verschiedenen, vereinfachten Ansichten dargestellt werden, die die Linien für die erforderlichen Parameter abbilden. Der Skizzenblock wird, wie oben beschrieben, per AK in das jeweilige Teil geholt. Hier den Skizzenblock nach Erfordernissen in die jeweilige Skizze einfügen. In den Skizzen die zu ändernden bzw. zu parametrisierenden Linien mit dem „= gleich-Parameter“ auf die entsprechende Linien des Skizzenblocks verweisen. Für Änderungen der Einzelteile wird, wie schon oben beschrieben, dann der Skizzenblock geändert, Einzelteile/ bzw. Zusammenbau mit den Einzelteilen aktualisieren, Änderungen sind somit in alle Teile umgesetzt. Dieses Verfahren kann leicht auch nachträglich nachgepflegt werden. Die zu ändernden Parameter, vor der Zuweisung auf den Skizzenblock, dazu am besten zum Referenzmaß ändern. Unbedingt ist hier zu beachten, dass der abgeleitete Skizzenblock in keiner Weise „festgemacht“ wird. Die offenen Freiheitsgrade in der Skizze sind für jeden Skizzenblock drei (3). Der Skizzenblock wird nur zum „Transport“ von Längenparametern verwendet (!)! Mit Skizzenblöcken wird bei uns nie direkt modelliert. Winkel können als Dreiecke übertragen werden.
------------------ In diesem Sinne wünsche ich allen, weiterhin effektives Schaffen ---------------- Manfred Gündchen www.guendchen.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manfred Gündchen Ehrenmitglied V.I.P. h.c. SelbstständIng mit Planungsbüro Anlagenbau, Dipl.-Ing.-Maschinenbau
Beiträge: 2369 Registriert: 08.03.2008 IV seit den 5.3Er aktuell den 2014Ner WIN7pro-64bit SP das jeweils aktuelle
|
erstellt am: 13. Nov. 2021 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Zitat: Original erstellt von Philfi: …Ich habe die Suchfunktion genutzt, trotzdem ist mir nicht klar geworden wie das Vorgehen ist, um das Problem zu lösen…
Okay dann nochmal auf Anfang. Nachfolgend mein Standarttext, den ich jetzt nicht weiter angepaßt habe. … Zunächst einmal von mir ein herzliches Willkommen. Füll' doch mal die Systeminfo unter Deinem Profil aus. Da erscheint dann all das, was Du da reinschreibst. Uns interessiert immer welchen IV Du benutzt... Mal etwas OT. Offensichtlich bist Du ja wohl ein IV-Neuling, also sind IMHO nicht zu viele Deiner Bemühungen in die "falsche Richtung" gelaufen. Deshalb hier ein grundlegender Tipp.
Versuch Dich mal in die Konstruktionssystematik des Mastermodelling oder der Top Down-Modellierung. Das ist schön direkt. Dabei funktioniert der IV immer am besten. Sauber durchkonstruiert. Parameter im Master festgelegt. Mit AKs modelliert. Mit Nullpunktfixierung platziert. Fettich, eigentlich kein Hexenwerk Dann braucht's auch nicht so'n "Zeugs" wie Ilogic, oder-was-auch-immer. Hier ein Link aus dem WBF , mit einer Zusammenfassung hierzu, von unserem sehr geschätzten Andreas Gawin. http://ww3.cad.de/foren/ubb/Forum50/HTML/019398.shtml oder der „Hammerbeitrag“ von Andreas als Lernanleitung: http://ww3.cad.de/foren/ubb/Forum50/HTML/029654.shtml#000000 ...mein Tipp, mal durcharbeiten und - viel Erfolg bei der Umsetzung... ...oder auf der offiziellen IV-Hilfeseite, allgemeine Hinweise zu der von mir bevorzugten Top Down-Modellierung http://help.autodesk.com/view/INVNTOR/2016/DEU/?guid=GUID-C68767BC-9398-4D2A-8DF5-B87184E396B3 ...und hier die IMHO sinnigsten Workflows in Inventor: - Skelettmodellierung - Gemeinsamer Ursprung MG zu: Gemeinsamer aber doch flexibler Ursprung http://ww3.cad.de/foren/ubb/Forum50/HTML/030486.shtml#000011 ------------------ In diesem Sinne wünsche ich allen, weiterhin effektives Schaffen ---------------- Manfred Gündchen www.guendchen.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michael Puschner Moderator Rentner
Beiträge: 13003 Registriert: 29.08.2003 Toshiba Encore mit MS Office Ein Programm sollte nicht nur Hand und Fuß, sondern auch Herz und Hirn haben. (Michael Anton)
|
erstellt am: 13. Nov. 2021 12:36 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
|
Manfred Gündchen Ehrenmitglied V.I.P. h.c. SelbstständIng mit Planungsbüro Anlagenbau, Dipl.-Ing.-Maschinenbau
Beiträge: 2369 Registriert: 08.03.2008 IV seit den 5.3Er aktuell den 2014Ner WIN7pro-64bit SP das jeweils aktuelle
|
erstellt am: 13. Nov. 2021 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Moin Michael, „der Strom“ und damit die Richtung ist der der Mastermodellierer. Andere Ströme geben andere Richtungen vor. Okay genug der Allgemeinplätze. Über dem in Deinem angehängten Beispiel, und wohl auch in dem vom Philfi, ist das alles auch - natürlich - möglich. Bei meinem Verfahren wird aber schon im MM oder im Skizzenblock gezeigt wie‘s aussieht. Ist, IMHO, nicht die schlechteste der Lösungen. ------------------ In diesem Sinne wünsche ich allen, weiterhin effektives Schaffen ---------------- Manfred Gündchen www.guendchen.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 13. Nov. 2021 18:20 <-- editieren / zitieren --> Unities abgeben:
|
Lothar Boekels Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau und CAD-Trainer
Beiträge: 3823 Registriert: 15.02.2001 DELL Precision 7520 Win10Pro-64 Inventor mit Vault Professional 2024 --------------------- Während man es aufschiebt, verrinnt das Leben. Lucius Annaeus Seneca (ca. 4 v. Chr - 65 n. Chr.)
|
erstellt am: 13. Nov. 2021 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
|
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 13. Nov. 2021 18:28 <-- editieren / zitieren --> Unities abgeben:
Hätte noch eine weitere Frage und würde die mal direkt hier stellen. Habe dazu leider auch nichts hilfreiches gefunden. In einer Baugruppe kann die Kollosion analysiert werden. Gibt es die Möglichkeit in iLogic (hier nötig für weiteren Verlauf der Arbeit) bestimmte Überschneidungs/Schnitt Volumen bzw. Flächen zwischen 2 oder mehreren Bauteilen ausgeben zu lassen? Vielleicht auch schon ein vorgefertigter Code? Bislang habe ich nur gefunden, dass man bei iLogic einen Code ausführen kann, der mir anzeigt wie viele Überschneidungen es gibt und dann welche. Ich würde aber gerne die genauen Werte haben und diese dann in der Parameterliste der Baugruppe hinterlegen, die sich bei Veränderung der Bauteile entsprechend mit verändern. Vielen Dank im Voraus. Oder sollte ich lieber ein neues Thema dafür aufmachen? MfG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 13. Nov. 2021 18:50 <-- editieren / zitieren --> Unities abgeben:
|
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 13. Nov. 2021 21:16 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Lösen wir gerade deine Semesterarbeit? Wenn du schon einen iLogic Code hast, wäre es (mit Angabe der Quelle) sinnvoll gewesen ihn auch zu posten. So dürfen wir raten wie weit du bereits bist. Die Kollisionsanalyse kann mit 2 oder mehr Komponenten in einer Baugruppe durchgeführt werden. Zurück kommt je Kollision ein InterferenceResult. Darin enthalten die beiden kollidierenden Komponenten, das Kollisionsvolumen, der Schwerpunkt des Kollisionsvolumens und eine transienter SurfaceBody des Kollisionsvolumens. Welche Flächen der beiden Bauteile kollidieren bzw. sich durchdringen ist so direkt nicht herauszufinden. Der Prozess ist recht rechenintensiv. Bei komplexeren Baugruppen kann das quälend zäh werden, wenn man die Veränderungen über einen iLogic Schieberegler hin und her fahren will. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lothar Boekels Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau und CAD-Trainer
Beiträge: 3823 Registriert: 15.02.2001 DELL Precision 7520 Win10Pro-64 Inventor mit Vault Professional 2024 --------------------- Während man es aufschiebt, verrinnt das Leben. Lucius Annaeus Seneca (ca. 4 v. Chr - 65 n. Chr.)
|
erstellt am: 13. Nov. 2021 21:23 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
|
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 14. Nov. 2021 12:27 <-- editieren / zitieren --> Unities abgeben:
Hallo rkauskh, nein, das ist nicht der Fall und außerdem ist es doch wohl nicht verwerflich mehr als eine Frage zu stellen oder. Ich bin seit geraumer Zeit am Suchen und habe mich schließlich an die Community gewendet. Den Code den ich bislang habe:
Code: Sub MainDim oAsmDoc As AssemblyDocument oAsmDoc = ThisApplication.ActiveDocument Dim oAsmCompDef As AssemblyComponentDefinition oAsmCompDef = oAsmDoc.ComponentDefinition ' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection Dim oOcc As ComponentOccurrence For Each oOcc In oAsmCompDef.Occurrences oCheckSet.Add (oOcc) Next ' Call the AnalyzeInterference method, passing in a single ' collection. This will cause it to compare everything against ' everything else. Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet) ' Display the results of the interference. MessageBox.Show(oResults.Count & " Interferences found ","iLogic") Dim oResult As InterferenceResult Dim iCount As Integer iCount = 0 For Each oResult In oResults If oResult.Volume > .1 Then iCount = iCount + 1 Component.Color(FullOccurrenceName(oResult.OccurrenceOne)) = "Yellow" Component.Color(FullOccurrenceName(oResult.OccurrenceTwo)) = "Magenta" MessageBox.Show(" " & FullOccurrenceName(oResult.OccurrenceOne) & " (colored yellow)" _ & vbLf & "interferes with " _ & vbLf & " " & FullOccurrenceName(oResult.OccurrenceTwo) & " (colored magenta)" _ & vbLf & "" _ & vbLf & "Volume: " & Round(oResult.Volume,5) & " cm^3", _ " Interference "& iCount) Component.Color(FullOccurrenceName(oResult.OccurrenceOne)) = "As Material" Component.Color(FullOccurrenceName(oResult.OccurrenceTwo)) = "As Material" End If Next End Sub ' Used to display the full path of an occurrence. This is the path of the ' occurrence within the assembly structure. Private Function FullOccurrenceName(Occ As ComponentOccurrence) As String Dim i As Integer For i = 1 To Occ.OccurrencePath.Count If i = 1 Then FullOccurrenceName = Occ.OccurrencePath.Item(i).Name Else FullOccurrenceName = FullOccurrenceName & "\" & Occ.OccurrencePath.Item(i).Name End If Next End Function
Den Code habe ich aus dem "Inventor iLogic, API & VBA Forum" in Autodesk. Damit ist es mir bislang möglich alle verfügbaren Schnittvolumen als MessageBox auszugeben. Gerne würde ich die Werte aber in der Parameterliste speichern und nach Möglichkeit innerhalb von iLogic von vornerein definieren welche Schnittvolumen (also zwischen welchen Bauteilen) ich ausgeben möchte. MfG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 14. Nov. 2021 13:59 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Nein es is natürlich nicht verboten Fragen zu stellen. Hab ich ja auch gemacht. Man kann dem Set der Teilnehmer zwei Occurrences (Exemplare) mit ihrem Namen aus dem Teilebrowser einfach hinzufügen und einen entsprechenden Parameter erstellen bzw. aktualisieren. Die Namen der Occurrences solltest du eventuell vorher stabilisieren/normalisieren, sonst gibt's Probleme beim Kopieren der Baugruppe.
Code:
Option Explicit On Sub MainDim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition Dim oCheckSet As ObjectCollection = ThisApplication.TransientObjects.CreateObjectCollection Dim sOccName_1 As String = "Boden_als_Platte-01:1" Dim sOccName_2 As String = "Auto_als_Block-01:1" ' Add 2 occurrences by it's name Dim oOcc As ComponentOccurrence For Each oOcc In oAsmCompDef.Occurrences If oOcc.Name = sOccName_1 Or oOcc.Name = sOccName_2 Then oCheckSet.Add(oOcc) End If Next Dim oResults As InterferenceResults = oAsmCompDef.AnalyzeInterference(oCheckSet) Dim oParam As UserParameter Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(sOccName_1 & "_vs_" & sOccName_2).Value = Round(oresults(1).Volume,3) Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(sOccName_1 & "_vs_" & sOccName_2, Round(oresults(1).Volume,3) , "cm^3") End Try End Sub
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 14. Nov. 2021 17:31 <-- editieren / zitieren --> Unities abgeben:
Hallo danke für den Code. Leider bekomme ich bei der Verwendung und Implementierung des Codes immer eine Fehlermeldung: Unbekannter Fehler (Ausnahme von HRESULT: 0x80004005 (E_FAIL)) Keine Veränderungen haben bislang geholfen. MfG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 14. Nov. 2021 18:51 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Achja, Bindestriche sind im Parameternamen nicht erlaubt. Muss man ersetzen. Code:
Option Explicit On Sub MainIf Not ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then Exit Sub End If Dim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition ' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection Dim sOccName_1 As String = "Boden_als_Platte-01:1" Dim sOccName_2 As String = "Auto_als_Block-01:1" ' Add 2 occurrences by it's name Dim oOcc As ComponentOccurrence For Each oOcc In oAsmCompDef.Occurrences If oOcc.Name = sOccName_1 Or oOcc.Name = sOccName_2 Then oCheckSet.Add(oOcc) End If Next If oCheckSet.Count<2 Then MsgBox("Es werden mindestens 2 Bauteile benötigt." & vbCrLf & "Zur Zeit sind " & oCheckSet.Count & " Bauteile in der Auswahl.", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet) If oResults Is Nothing MsgBox("Fehler in der Kollisionsanalyse", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim dVolume As Double If oResults.Count=0 Then MsgBox("Keine Kollisionen gefunden.", MsgBoxStyle.Critical, "iLogic Analyze Interference") dVolume = 0 Else dVolume=Round(oresults(1).Volume,3) End If Dim oParam As UserParameter Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_")).Value = dVolume Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_"), dVolume , "cm^3") End Try End Sub
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 19. Nov. 2021 18:07 <-- editieren / zitieren --> Unities abgeben:
Hallo, super danke, der Code hat funktioniert. (Tatsächlich haben die Bindestriche im Parameternamen keine Probleme bereitet ) Ich bin jetzt seit einiger Zeit am versuchen, den Code anzupassen, sodass ich gleichzeitig mehrere Überschneidungsvolumen ausgeben kann. Meine Idee war es eine Art Liste (Array) oder Vektor mit Bauteilen zu definieren, zwischen denen das Überschneidungsvolumen definiert werden kann. (Da es sich bei meinem Fall um ein Optimierungsproblem handelt, werden im Laufe der Zeit mehr Bauteile hinzukommen, somit müsste es flexibel gehalten werden.) Bislang hat aber leider kein Versuch einen Erfolg gebracht. Beim Hinzufügen von weiteren Bauteilen wird immer wieder das gleiche Überschneidungsvolumen ausgegeben. Hättest du eventuell eine Idee, wie man das lösen könnte? MfG Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 702 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 19. Nov. 2021 19:28 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Die Ergebnisse der Analyse sind in einer collection enthalten (oResults). Im Code wird aber bisher nur das erste Ergebnis ausgegeben ( oResults(1).... ) Hilfe - InterferenceResults Object Alle Ergebnisse kannst du mit einer Schleife durchgehen: dim oRes as interferenceResult for each oRes in oResults ... Next Jetzt sehe ich, dass das schon in Deinem Beispiel enthalten ist. Nun verstehe ich das Problem nicht ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 19. Nov. 2021 21:09 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Mir ist auch nicht ganz klar, was du jetzt machen möchtest. Wenn man in das Set für die Analyse nur zwei benannte Bauteilexemplare einfügt, können rundherum tausende andere hinzukommen, die Analyse betrachtet nur die beiden. Man könnte alle Bauteile in das Set einfügen. Als Ergebnis bekommt man eine Sammlung aller Kollisionen. Die Sammlung kann man schrittweise durchlaufen und jeweils einen Parameter mit den Namen der beiden Beteiligten und dem Kollisionsvolumen erzeugen. Die erzeugten Ergebnisse könnte man natürlich auch nach bestimmten Kombinationen von Bauteilexemplaren durchsuchen und nur diese ausgeben.
Code:
If Not ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then Exit Sub End IfDim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition ' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection ' Add all occurrences by it's name Dim oOcc As ComponentOccurrence For Each oOcc In oAsmCompDef.Occurrences oCheckSet.Add(oOcc) Next If oCheckSet.Count<2 Then MsgBox("Es werden mindestens 2 Bauteile benötigt." & vbCrLf & "Zur Zeit sind " & oCheckSet.Count & " Bauteile in der Auswahl.", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet) If oResults Is Nothing MsgBox("Fehler in der Kollisionsanalyse", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim dVolume As Double If oResults.Count=0 Then MsgBox("Keine Kollisionen gefunden.", MsgBoxStyle.Critical, "iLogic Analyze Interference") dVolume = 0 End If Dim oResult As InterferenceResult Dim sOccName_1 As String Dim sOccName_2 As String Dim oParam As UserParameter For Each oResult In oResults dVolume = Round(oResult.Volume, 3) sOccName_1 = oResult.OccurrenceOne.Name sOccName_2 = oResult.OccurrenceTwo.Name Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_")).Value = dVolume Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_"), dVolume , "cm^3") End Try Next
Man kann alternativ das Set differenziert um ein drittes, viertes usw. benanntes Bauteilexemplar erweitern und nur diese Kollisionen untersuchen.
Code:
If Not ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then Exit Sub End IfDim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition ' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection Dim sOccNames() As String = New String() { "Boden_als_Platte-01:1", "Auto_als_Block-01:1", "Boden"} ' Add occurrences by it's name if exist in ass Dim oOcc As ComponentOccurrence Dim i As Integer For Each oOcc In oAsmCompDef.Occurrences For i=0 To UBound( sOccNames)-1 If oOcc.Name = sOccNames(i)Then oCheckSet.Add(oOcc) End If Next Next If oCheckSet.Count<2 Then MsgBox("Es werden mindestens 2 Bauteile benötigt." & vbCrLf & "Zur Zeit sind " & oCheckSet.Count & " Bauteile in der Auswahl.", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet) If oResults Is Nothing MsgBox("Fehler in der Kollisionsanalyse", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim dVolume As Double If oResults.Count=0 Then MsgBox("Keine Kollisionen gefunden.", MsgBoxStyle.Critical, "iLogic Analyze Interference") dVolume = 0 End If Dim oResult As InterferenceResult Dim sOccName_1 As String Dim sOccName_2 As String Dim oParam As UserParameter For Each oResult In oResults dVolume = Round(oResult.Volume, 3) sOccName_1 = oResult.OccurrenceOne.Name sOccName_2 = oResult.OccurrenceTwo.Name Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_")).Value = dVolume Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_"), dVolume , "cm^3") End Try Next
Eine dritte Variante, man kann zwei Sets von Bauteilexemplaren erzeugen und deren Kollisionen ermitteln. Dabei werden nur Kollisionen von einem Teil aus Set 1 mit einem Teil aus Set 2 ausgegeben.
Code:
If Not ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then Exit Sub End IfDim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition ' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection Dim sOccNames() As String = New String() { "Boden_als_Platte-01:1", "Auto_als_Block-01:1", "Boden:1"} ' Add occurrences by it's name if exist in ass Dim oOcc As ComponentOccurrence Dim i As Integer For Each oOcc In oAsmCompDef.Occurrences For i = 0 To UBound(sOccNames) -1 If oOcc.Name = sOccNames(i)Then oCheckSet.Add(oOcc) End If Next Next Dim oCheckSet2 As ObjectCollection oCheckSet2 = ThisApplication.TransientObjects.CreateObjectCollection Dim sOccNames2() As String = New String() { "Sensor1:1", "Sensor2:1", "Sensor1:2"} ' Add occurrences by it's name if exist in ass Dim oOcc As ComponentOccurrence Dim i As Integer For Each oOcc In oAsmCompDef.Occurrences For i = 0 To UBound(sOccNames2) -1 If oOcc.Name = sOccNames2(i)Then oCheckSet2.Add(oOcc) End If Next Next If oCheckSet.Count=0 Or oCheckSet2.Count=0 Then MsgBox("Es werden mindestens 1 Bauteil je Set benötigt.", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet,oCheckSet2) If oResults Is Nothing MsgBox("Fehler in der Kollisionsanalyse", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim dVolume As Double If oResults.Count=0 Then MsgBox("Keine Kollisionen gefunden.", MsgBoxStyle.Critical, "iLogic Analyze Interference") dVolume = 0 End If Dim oResult As InterferenceResult Dim sOccName_1 As String Dim sOccName_2 As String Dim oParam As UserParameter For Each oResult In oResults dVolume = Round(oResult.Volume, 3) sOccName_1 = oResult.OccurrenceOne.Name sOccName_2 = oResult.OccurrenceTwo.Name Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_")).Value = dVolume Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(Replace(sOccName_1 & "_vs_" & sOccName_2,"-","_"), dVolume , "cm^3") End Try Next
Da nicht mehr bestehende Kollisionen ihre Parameter nicht selbst löschen, musst du dir da auch noch was überlegen alle zu Beginn zu löschen bzw. das Volumen auf null zu setzen.
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 25. Nov. 2021 11:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für die Antwort KraBBy. Tatsächlich ging es mir um sowas, wie Ralf es formuliert hat. Danke für die Codes, ich habe sie ausprobiert und das sind sehr gute Lösungsmöglichkeiten. Tatsächlich stellt das Löschen oder Überschreiben nicht mehr bestehender Kollisionen kein triviales Problem dar. Die Parameter werden momentan sofort aktualisiert bis zum Moment wenn ein Kollisionsvolumen 0 ist, dann wird der letzte Werte davor angezeigt und nicht als 0 ausgegeben oder halt gelöscht (wobei 0 setzen besser wäre, dann kann ich mit den Parametern weiter rechnen). Muss ich die Ausführung mehrere Regeln gleichzeitig über iTrigger lösen oder geht das über eine zusätzliche Regel in der die Ausführung der Regeln definiert ist? MfG Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 25. Nov. 2021 20:17 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Geht beides. Ich würde es aber über eine Regel machen. Gleichzeitig geht bei beiden Varianten nicht. Die Regeln werden nacheinander in der Reihenfolge wie sie in der Hauptregel stehen abgearbeitet. Beim Trigger bin ich mir nicht sicher, ob die Reihenfolge der in der Definition entspricht oder unvorhersehbar ist. Um nicht mehr kollidierende Paare zu "finden", könnte man bei jeder Änderung erst alle Volumenwerte auf null setzen und dann die neuen Kollisionswerte schreiben. Alle die keine Kollision mehr haben bleiben dann auf null. Ich weiß nur ehrlich gesagt nicht, ob Inventor bei den Kollisionsergebnissen mal die Reihenfolge der Occurrences umdreht. Das könnte man vielleicht verhindern, indem man die beiden Occurrencenames alphabetisch sortiert und dadurch den Parameternamen immer in der gleichen Reihenfolge zusammensetzt.
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 26. Nov. 2021 19:39 <-- editieren / zitieren --> Unities abgeben:
Für das Setzen des Volumens auf 0 habe ich zunächst die erzeugten Parameter aus den Benutzerparametern am Anfang des Codes gleich 0 gesetzt: Bsp. Boden_vs_Pyramide1 = 0 Damit hat es geklappt, aber bei dazu kommenden Bauteilen müsste ich jedes mal wieder manuell diesen Parameter definieren. Daher habe ich zahlreiche Versuche gestartet und es letztendlich mit einer If-Bedingung versucht: If dVolume <> 0 Then sOccName_1_vs_sOccName_2 = dVolume Else sOccName_1_vs_sOccName_2 = 0 End If Habe es für den dritten Code, also die dritte Möglichkeit versucht, welche du geteilt hattest. Leider funktioniert es damit nicht, die Volumen werden aktualisiert, aber sobald kein Überschneidungsvolumen vorliegt, wird der letzte Wert angezeigt anstatt 0. Gibt es innerhalb des Codes bzw. allgemein die Möglichkeit einen berechneten Parameter als Objekt oder neues Bauteil zu definieren? Zur Erklärung was ich meine: Ich habe 2 Sensoren (Kameras auf einem Fahrzeug) als Volumenkörper (Pyramide), die ein Überschneidungsvolumen bilden. Außerdem habe einen Raum über dem Boden und einer unter dem Boden. Über den Code kann ich alle gewünschten Volumen berechnen und den nicht gewollten Bereich unter dem Boden rausschneiden. Soweit so gut. Ich würde aber bspw. nur den Teil des Überschneidungsvolumens oberhalb des Bodens haben wollen. Dies ist aber nicht möglich weil es sich um kein Bauteil handelt welches ich innerhalb des Codes Dim sOccNames() As String = New String() { "Unterboden", "Oberboden", "Pyramide1_vs_Pyramide2"} implementieren kann. Ich habe versucht diesen Parameter zu definieren, aber er wird nicht als neuer Volumenkörper angesehen. Ich hoffe das war soweit verständlich, ansonsten kann ich nochmal anders versuchen. MfG Philipp [Diese Nachricht wurde von Philfi am 29. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Philfi Mitglied Student
Beiträge: 14 Registriert: 12.11.2021
|
erstellt am: 09. Dez. 2021 16:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, für das die zweite Frage habe ich rausgefunden dass es nicht möglich ist ein berechnetes Schnittvolumen als neuen Körper zu definieren und diesen für eine neue Kollisionsanalyse zu verwenden. Somit habe ich versucht den von dir (@rkauskh) geteilten Code (den zur Berechnung des Schnittvolumens zwischen allen auftretenden Bauteilen) anzupassen: Code: If Not ThisDoc.Document.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then Exit Sub End If Dim oAsmDoc As AssemblyDocument = ThisDoc.Document Dim oAsmCompDef As AssemblyComponentDefinition= oAsmDoc.ComponentDefinition' Add each occurrence in the assembly to the object collection. Dim oCheckSet As ObjectCollection oCheckSet= ThisApplication.TransientObjects.CreateObjectCollection ' Add all occurrences by it's name Dim oOcc As ComponentOccurrence For Each oOcc In oAsmCompDef.Occurrences oCheckSet.Add(oOcc) Next If oCheckSet.Count<3 Then MsgBox("Es werden mindestens 3 Bauteile benötigt." & vbCrLf & "Zur Zeit sind " & oCheckSet.Count & " Bauteile in der Auswahl.", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim oResults As InterferenceResults oResults = oAsmCompDef.AnalyzeInterference(oCheckSet) If oResults Is Nothing MsgBox("Fehler in der Kollisionsanalyse", MsgBoxStyle.Critical, "iLogic Analyze Interference") Exit Sub End If Dim dVolume As Double If oResults.Count=0 Then MsgBox("Keine Kollisionen gefunden.", MsgBoxStyle.Critical, "iLogic Analyze Interference") dVolume = 0 End If Dim oResult As InterferenceResult Dim sOccName_1 As String Dim sOccName_2 As String Dim sOccName_3 As String Dim oParam As UserParameter For Each oResult In oResults dVolume = Round(oResult.Volume, 3) sOccName_1 = oResult.OccurrenceOne.Name sOccName_2 = oResult.OccurrenceTwo.Name sOccName_3 = oResult.OccurrenceThree.Name Try oAsmDoc.ComponentDefinition.Parameters.UserParameters.Item(Replace(sOccName_1 & "_vs_" & sOccName_2 & "_vs_" & sOccName_3,"-","_")).Value = dVolume Catch oAsmDoc.ComponentDefinition.Parameters.UserParameters.AddByExpression(Replace(sOccName_1 & "_vs_" & sOccName_2 & "_vs_" & sOccName_3,"-","_"), dVolume , "cm^3") End Try Next
Leider bekomme ich die Fehlermeldung: "Der öffentliche Member OccurrenceThree für den Typ InterferenceResult wurde nicht gefunden." Gibt es anderweitig die Möglichkeit das gemeinsamen Volumen zwischen mehr als 2 Bauteilen/Körpern zu bestimmen. Vielen Dank im Voraus. MfG Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2428 Registriert: 15.11.2006 Windows 10 x64, AIP 2023
|
erstellt am: 17. Dez. 2021 20:11 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Hallo Zitat: für das die zweite Frage habe ich rausgefunden dass es nicht möglich ist ein berechnetes Schnittvolumen als neuen Körper zu definieren und diesen für eine neue Kollisionsanalyse zu verwenden.
Jein. Das Kollisionsvolumen ist ein transienter SurfaceBody, der z.B. als NonParametricBaseFeature in ein temporäres Bauteil kopiert werden könnte. Damit wäre eine nachfolgende zweite Kollisionsanalyse möglich. Das aber als Schleife in quasi Echtzeit durchlaufen lassen und immer wieder aktualisieren ... vermutlich eher nicht. Inventor ist halt ein Kontruktionsprogramm und für Simulationen nur bedingt geeignet. Zitat: Gibt es anderweitig die Möglichkeit das gemeinsamen Volumen zwischen mehr als 2 Bauteilen/Körpern zu bestimmen.
Kollisionen bestehen immer nur zwischen zwei Körpern. Es kann der Fall eintreten, dass die Kollisionsvolumen von drei Körpern sich überschneiden. Man könnte dann die Kollisionsvolumen in ein neues Bauteil kopieren und mit einem Combine Feature verbinden. Entsteht ein Volumen, haben sich die drei Volumina überschnitten. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Roland Schröder Moderator Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen
Beiträge: 13310 Registriert: 02.04.2004 IV 2019 + 2020 + 2021 W7pro64 F-Secure-Safe Dell-M4600 2,13GHz 12GB Quadro2000M 15,4"1920x1080 MS-IntelliMouse-Optical SpacePilotClassic
|
erstellt am: 18. Dez. 2021 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für Philfi
Zitat: Original erstellt von Philfi: Gibt es anderweitig die Möglichkeit das gemeinsamen Volumen zwischen mehr als 2 Bauteilen/Körpern zu bestimmen.
Wenn Du die beteiligten Bauteile kennst, kannst Du mit der Funktion Abgeleitete Komponenten (AK) einen Schnittkörper auch aus mehreren Bauteilen als ganz normales stabiles Modell erstellen. Die Schnittlogik kannst Du schon in der AK wählen, oder Du leitest einzelne Volumenkörper ab und erzeugst die Schnitte mit der Funktion "Volumenkörper kombinieren", die kann ebenfalls boolesch. Die Schnittmengen sind allerdings oder-verknüpft. Es muss immer ein Bauteil 1 geben und des Ergebnis ist dann >1und2 oder 1und3<. Wenn Du 1und2und3 willst, musst Du zwei Ableitungen hintereinander hängen: >(1und2)und3<. Mit Volumenkörper kombinieren geht das in einer ipt. (Kleine Erinnerung: Um nicht zwangsweise alle sichtbaren Komponenten zu erhalten, auf der dritten Seite des AK-Dialogfensters ("Darstellung") den Haken bei Assoziativ rausmachen!) ------------------ Roland www.Das-Entwicklungsbuero.de It's not the hammer - it's the way you hit! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|