| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: iLogic - benutzerdef. iPart generieren (802 / mal gelesen)
|
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 22. Jan. 2024 11:46 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich bastle mal wieder ein wenig in iLogic herum. Aktuell versuche ich ein Standardteil von uns als benutzerdefiniertes iPart (Factory) zu generieren. Wenn das Teil in einer neuen Ausführung benötigt wird soll der Ablauf die folgt sein: Ziel: 1) iPartFactory öffnen; Formular öffnet sich und ich gebe die benutzerdef. Parameter ein (über Änderung des Modellparameters). 2) iPartFactory aktiviert den entsprechenden Member mit den benutzerdef. Parameter (ist in Inventor sichtbar). 3) iPartMember (das aktuell aktivierte) soll exportiert werden. Beim letzten Schritt hakt es jetzt. Ich bekomme es hin, dass das iPartMember exportiert wird, aber eben nur mit den Default Einträgen der benutzerdef. Parameter.
Code: CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object])
Den "Kursiven" Teil bekomme ich nicht hin, da fehlt mir ehrlich gesagt das Verständnis wie ich das definiere... es kommt immer zu Fehlermeldungen. Hier der vollständige Code:
Code: Dim oDoc As PartDocument = ThisApplication.ActiveDocument Dim oCompDef As ComponentDefinition = oDoc.ComponentDefinition Dim iPF As iPartFactory = oCompDef.iPartFactory Dim iPM As iPartMember 'Generiere das aktuelle aktiviere iPart Member, wenn noch nicht im Ordner vorhanden Try 'Generiere - Benutzerdefiniertes iPart Dim Path As String = ThisDoc.Path Dim Name As String = InputBox("Bitte gebe den Dateinamen an", "iLogic", "Default Entry") Dim SaveAs As String = Path & "\" & Name & ".ipt" iPM = iPF.CreateCustomMember(SaveAs) 'iPM = iPF.CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object]) Catch i = MessageBox.Show("Es ist etwas schief gelaufen", "Überprüfen", MessageBoxButtons.OK) End Try 'Meldung wo die Datei erstellt wurde Dim x As String = iPF.MemberCacheDir & "\" & iPM.Name MessageBox.Show(x, "Die Datei wurde im folgenden Ordner erstellt")
Nebenfrage (falls da jmd. eine Idee oder Beispiel hat wie sowas gehen könnte): Wenn das läuft, soll im nächsten Schritt, eine "Vorlage" IDW geöffnet werden in welchen ein anders iPartMember bemaßt ist. Die Modellreferenz soll dann auf das neu generierte iPartMember geändert werden und über SaveAs gespeichert werden. Ziel ist also auch da die repetitive Arbeit immer eine fast identische Zeichnung zu erstellen, möglichst gering zu halten - also nur noch Maße ausrichten usw. Das bekomme ich (denke ich), bis auf die neu Referenzierung, hin. Hier also die Frage, wie hier der "Befehl" lauten könnte.
------------------ MfG Pablo lesen gefährdet die Dummheit 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: 22. Jan. 2024 23:27 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
Moin Ich bin mir relativ sicher, das die Parameteränderung nicht automatisch in die iParttabelle geschrieben wird. Die Tabelle wird aber mW für den CustomMember benutzt. Also wirst du wohl den bzw. die Parameterwerte in die iPartFactory Tabelle schreiben müssen. Über iPartMember.Row kommt man an die aktive Reihe. Den Index der jeweiligen Zelle musst du entweder hart coden oder über die iPartFactory.TableColumns iterieren, jeweils TableColumn.Heading auslesen und mit deinem Parameterwerten abgleichen. Das hier zeigt dir das Prinzip für einen Parameter "Hoehe": Code:
Dim oDoc As PartDocument = ThisApplication.ActiveDocument Dim oCompDef As PartComponentDefinition = oDoc.ComponentDefinition Dim iPF As iPartFactory = oCompDef.iPartFactory Dim iPM As iPartMember=oCompDef.iPartMember'Generiere das aktuelle aktiviere iPart Member, wenn noch nicht im Ordner vorhanden Try 'Generiere - Benutzerdefiniertes iPart Dim Path As String = ThisDoc.Path Dim Name As String = InputBox("Bitte gebe den Dateinamen an", "iLogic", "Default Entry") Dim SaveAs As String = Path & "\" & Name & ".ipt" Dim oFacCol As iPartTableColumn Dim z As Integer
Parameter.UpdateAfterChange = True Hoehe = InputBox("Wert angeben:") For z = 1 To iPF.TableColumns.Count If iPF.TableColumns(z).Heading = "Hoehe" Then iPM.Row(z).Value = Hoehe Exit For End If Next iPM = iPF.CreateCustomMember(SaveAs) 'iPM = iPF.CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object]) Catch i = MessageBox.Show("Es ist etwas schief gelaufen", "Überprüfen", MessageBoxButtons.OK) End Try 'Meldung wo die Datei erstellt wurde Dim x As String = iPF.MemberCacheDir & "\" & iPM.Name MessageBox.Show(x, "Die Datei wurde im folgenden Ordner erstellt")
Zu deiner Nebenfrage, der Befehl lautet ReplaceReference. Ich gehe der Einfachheit halber davon aus, dass in der IDW nur der alte CustomMember referenziert ist. Ansonsten musst du den korrekten ReferencedFileDescriptor selbst heraussuchen. Die Bemaßung sollte, soweit keine Kanten wegfallen, erhalten bleiben. Code:
doc = ThisDoc.Document Dim oFD As FileDescriptor oFD = doc.ReferencedFileDescriptors(1).DocumentDescriptor.ReferencedFileDescriptor oFD.ReplaceReference("Pfad/zum/neuen/Part.ipt") doc.Update()
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 23. Jan. 2024 07:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, vielen Danke für deine Hilfe/Antwort. Ich kann mich da leider erst morgen wieder ran setzen und es austesten. Es scheint mir, dass ich da in meiner Herangehensweise einen Denkfehler hatte. Meine Vermutung war, dass ich irgendwie die Info in den [CustomInput As Object] meine benutz. def. Variable einspeisen muss. CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object]) Naja, ich bin schon sehr gespannt und freu mich auf das testen. Und danke auch für den direkten Antwort-Einwurf auf meine Nebenfrage ------------------ lesen gefährdet die Dummheit Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 25. Jan. 2024 13:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, ich bin nur endlich dazu gekommen, dass ich den Code testen konnte. Leider ist es geblieben wie bisher. Die Änderung wird eher "beantragt", aber noch nicht in die Zelle geschrieben. Erst wenn ich die Tabelle öffne (egal ob in Inventor oder per Excel) bekomme ich die Meldung/Frage: "die Werte in der aktiven Zeile nicht den entsprechenden Dokument entsprechen - möchten Sie aktualisieren?" - so ungefähr. Wenn ich das tue wird der Wert mit dem im Code (InputBox) abgefragten Werten überschrieben - anschließend klappt auch der korrekte iPartMember export. Vorher leider nicht. Hast du da noch eine Idee, wie ich eine Art "force update" auf die Tabelle ausüben kann? Ich habe die Datei angehangen, falls das jmd. testen möchte. PS: der zweite Code zum Referenzaustausch hat übrigens hervorragend funktioniert. Danke schon mal dafür ------------------ lesen gefährdet die Dummheit
[Diese Nachricht wurde von Bienenkopf am 25. Jan. 2024 editiert.] 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: 25. Jan. 2024 23:41 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
Moin Ich hab es nochmal getestet. Lag wohl daran, das mein Testpart nur eine Zeile in der Tabelle hatte. Probier es bitte mal so:
Code:
Dim oDoc As PartDocument = ThisApplication.ActiveDocument Dim oCompDef As ComponentDefinition = oDoc.ComponentDefinition Dim iPF As iPartFactory = oCompDef.iPartFactory 'Dim iPM As iPartMember 'Generiere das aktuelle aktiviere iPart Member, wenn noch nicht im Ordner vorhanden Try 'Generiere - Benutzerdefiniertes iPart Dim Path As String = ThisDoc.Path Dim Name As String = InputBox("Bitte gebe den Dateinamen an", "iLogic", "Default Entry") Dim SaveAs As String = Path & "\" & Name & ".ipt" Dim oFacCol As iPartTableColumn Dim z As Integer Parameter.UpdateAfterChange = True LängeA = InputBox("Wert angeben:") For z = 1 To iPF.TableColumns.Count If iPF.TableColumns(z).Heading = "LängeA" Then '"LängeA<free>10</free>" Then 'iPM.Row(z).Value = LängeA iPF.DefaultRow(z).Value = LängeA Exit For End If Next iPM = iPF.CreateCustomMember(SaveAs) 'iPM = iPF.CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object]) 'Generiere - Norm iPart 'iPM = iPF.CreateMember i = MessageBox.Show("Member wurde erstellt", "Überprüfen", MessageBoxButtons.OK) Catch ex As Exception i = MessageBox.Show("Es ist etwas schief gelaufen", "Überprüfen", MessageBoxButtons.OK) MsgBox(ex.Message ) End Try 'Meldung wo die Datei erstellt wurde Dim x As String = iPF.MemberCacheDir & "\" & iPM.Name MessageBox.Show(x, "Die Datei wurde im folgenden Ordner erstellt") 'Dim curFile As String = ThisDoc.PathAndFileName(True) 'If System.IO.File.Exists(x) Then 'frage = MessageBox.Show("Datei existiert. Überschreiben", "Hab da mal ne Frage",MessageBoxButtons.YesNo,MessageBoxIcon.Question) ' If frage = vbYes Then ' ThisDoc.Save ' Else If frage = vbNo Then ' MsgBox ("OK, nicht gespeichert") ' End If 'Else 'MsgBox ("Datei existiert nicht") 'ThisDoc.Document.SaveAs("C:\_DOCS\Samples + Tutorial Files Inventor\Konstruktion\_Tests\dreieck1.ipt" , True) 'End If
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 26. Jan. 2024 08:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, mit "DefaultRow" hat es jetzt wunderbar geklappt. Danke für deine Hilfe! Mal eine persönliche Frage. Kommst du aus dem IT-Bereich oder wie/wo hast du dir das Wissen bzgl. iLogic angeeignet? Autodidaktische Fleißarbeit oder eher über Schulungen? Ich bin da eigentlich mehr oder weniger reingerutscht (Autodidakt). Finde die ganze Thematik sehr interessant, aber merke doch, dass mir da gelegentlich das Logik Wissen fehlt. Ich schaue mir Youtube zum Thema an und lese in Foren usw. Vllt hast du ja ein Tipp für mich oder eine gute Internetseite (neben CAD.de natürlich )
------------------ lesen gefährdet die Dummheit 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: 26. Jan. 2024 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
Moin Zitat: Mal eine persönliche Frage. Kommst du aus dem IT-Bereich oder wie/wo hast du dir das Wissen bzgl. iLogic angeeignet? Autodidaktische Fleißarbeit oder eher über Schulungen?
- 20 Jahre Arbeit als Sysadmin, CAD-Manager und Programmierer für Inventor Zusatzanwendungen - Autodidakt, keine kommerziellen Schulungen, nur frei verfügbarer Lesestoff - viel Probieren, viel Scheitern, viel nochmal Probieren Es gibt meines Wissens immer noch keine Bücher oder Schulungen zum Thema Inventor Programmierung, lasse mich aber gern eines besseren belehren. Hier und da wird ein bißchen iLogic gezeigt, aber das sind in der Regel nur spezifische Lösungen für Einzelthemen. Immer empfehlenswert für Einsteiger ist der Blog ModTheMachine. Er ist alt, aber die Grundlagen gelten noch immer. Es ist meiner Meinung zu Beginn wichtig zu begreifen wie das Inventor Objektmodell aussieht und funktioniert. Schau dir vielleicht mal die Einführungslektionen an (https://modthemachine.typepad.com/my_weblog/2013/02/inventor-api-training-lesson-1.html). Die meisten Beispiele sind in VBA, aber das macht nichts. Für den Anfang würde ich eh VBA empfehlen, da es einen Editor mit Debugger mitbringt. Gerade bei der Fehlersuche und dem Erkunden zur Laufzeit welche Info in welchem Objekt gespeichert sein könnte, von unschätzbarem Vorteil. iLogic versteckt etlichen Programmieraufwand hinter vorgefertigten Bausteinen (inkl. der Ereignisauslöser). Das ist praktisch für einen schnellen Anfang, aber man kommt auch sehr schnell an die Grenzen.
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 30. Jan. 2024 10:04 <-- editieren / zitieren --> Unities abgeben:
Danke Ralf, danke für deine Ausführung. Modthemachine, war ich auch schon mal unterwegs. Aber gerade die von dir empfohlene Lektion werde ich mir mal genauer ansehen. Ich glaube gerade bei dieser Thematik hakt es nämlich bei mir. ------------------ lesen gefährdet die Dummheit Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
iogurt Mitglied Konstrukteur
Beiträge: 287 Registriert: 30.09.2005 Inventor 2021 Professional
|
erstellt am: 30. Jan. 2024 10:10 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
|
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 07. Mrz. 2024 16:03 <-- editieren / zitieren --> Unities abgeben:
Hello again, ich habe festgestellt, dass zu dem Zeitpunkt an dem die Funktion Code: ... iPM = iPF.CreateCustomMember(SaveAs) ...
ausgeführt wird auch die Factory-Datei überschrieben/gespeichert wird. Ich begreife nicht, warum dies passiert. Kann man das irgendwie unterbinden? ------------------ lesen gefährdet die Dummheit 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: 08. Mrz. 2024 00:15 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
Moin Du darfst nicht in dem Factoryteil herumschreiben und musst die Option "CustomInput" der CreateCustomMember Methode verwenden. Dann könnte es funktionieren. Die Eingabewerte (z.B. die Länge) müssen in lokalen Variablen gespeichert werden, nicht in Parametern. Ebenso welche Tabellenzeile als Basis benutzt werden soll. Code:
Dim oDoc As PartDocument = ThisApplication.ActiveDocument Dim oCompDef As ComponentDefinition = oDoc.ComponentDefinition Dim iPF As iPartFactory = oCompDef.iPartFactory 'Dim iPM As iPartMember'Generiere das aktuelle aktiviere iPart Member, wenn noch nicht im Ordner vorhanden Try 'Generiere - Benutzerdefiniertes iPart Dim Path As String = ThisDoc.Path Dim Name As String = InputBox("Bitte gebe den Dateinamen an", "iLogic", "Default Entry") Dim SaveAs As String = Path & "\" & Name & ".ipt" Dim oFacCol As iPartTableColumn Dim z As Integer = 1 'Parameter.UpdateAfterChange = True 'LängeA = InputBox("Wert angeben:") Dim aArr(0) As String aarr(0) = InputBox("Wert angeben:") Dim oList As New List(Of String) For z = 1 To iPF.TableColumns.Count If iPF.TableColumns(z).Heading = "Variante" Then '"LängeA<free>10</free>" Then For Each iTC As iPartTableCell In iPF.TableColumns(z) oList.Add(iTC.Value ) Next 'iPM.Row(z).Value = LängeA ' iPF.DefaultRow(z).Value = LängeA Exit For End If Next If z > iPF.TableColumns.Count Then Exit Sub ' wenn z größer ist, wurde die Spalte nicht gefunden sSelection = InputListBox("Variante auswählen ", oList, olist(0), Title := "iLogic CustomiPart", ListName := "Varianten") ipm = iPF.CreateCustomMember(SaveAs, sselection, aArr) 'iPM = iPF.CreateCustomMember(SaveAs) 'iPM = iPF.CreateCustomMember(FullFileName As String, [Row As Object], [CustomInput As Object]) 'Generiere - Norm iPart 'iPM = iPF.CreateMember i = MessageBox.Show("Member wurde erstellt", "Überprüfen", MessageBoxButtons.OK) Catch ex As Exception i = MessageBox.Show("Es ist etwas schief gelaufen", "Überprüfen", MessageBoxButtons.OK) MsgBox(ex.Message ) End Try 'Meldung wo die Datei erstellt wurde Dim x As String = iPF.MemberCacheDir & "\" & iPM.Name MessageBox.Show(x, "Die Datei wurde im folgenden Ordner erstellt") 'Dim curFile As String = ThisDoc.PathAndFileName(True) 'If System.IO.File.Exists(x) Then 'frage = MessageBox.Show("Datei existiert. Überschreiben", "Hab da mal ne Frage",MessageBoxButtons.YesNo,MessageBoxIcon.Question) ' If frage = vbYes Then ' ThisDoc.Save ' Else If frage = vbNo Then ' MsgBox ("OK, nicht gespeichert") ' End If 'Else 'MsgBox ("Datei existiert nicht") 'ThisDoc.Document.SaveAs("C:\_DOCS\Samples + Tutorial Files Inventor\Konstruktion\_Tests\dreieck1.ipt" , True) 'End If
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 11. Mrz. 2024 12:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, hat wieder mal super funktioniert Nun ist es aber so, dass ich in meiner vorangeschrittenen FactoryPart-Version, darauf aufbaue die Variantenauswahl und benutzerdef. Parameter in einem einzigen Formular darzustellen und eintragen zu lassen. Das Problem dabei: Die Einträge im Formular speichere ich als Benutzerparameter ab um dann bei der Ausführung des iLogic-Codes drauf zugreifen zu können. Damit habe ich aber gleichzeitig eine "Änderung" an dem FactoryPart durchgeführt, sodass die Funktion "CreateCustomMember" leider doch zu einer Speicherung des FactoryPart führt. Gibt es da eine Alternative bzw. ein Möglichkeit die Einträge in dem Formular nur temporär zu speichern bis der Code ausgeführt wurde? Ich hoffe es ist einigermaßen Verständlich beschrieben ------------------ lesen gefährdet die Dummheit 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: 11. Mrz. 2024 21:11 <-- editieren / zitieren --> Unities abgeben: Nur für Bienenkopf
Moin Ich sehe keine Möglichkeit das mit einem iLogic Formular zu lösen. Die Auswahlmenüs basieren auf den fx-Parametern, daran lässt sich nichts ändern. Sobald man da was umstellt, wird das ins Modell zurück geschrieben. Wenn du aus der Einschränkung heraus willst, musst du auf ein Windows Form wechseln. Ich hatte mal eine dreiteilige Tutorialreihe im Bereich Gut zu wissen dazu verfasst, wie man das in iLogic erstellt und einbindet. Damit kann man auch die Werte und Wertelisten aus den fx-Parametern einlesen und benutzen, ohne dass das sofort ins Modell zurückwirkt. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bienenkopf Mitglied Maschinenbau Ingenieur
Beiträge: 212 Registriert: 04.11.2005 Inventor Professional 2022
|
erstellt am: 12. Mrz. 2024 07:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, okay, dann weiß ich da erst mal bescheid. Hatte mir schon sowas in die Richtung gedacht, da ich trotz ewigen googlen nicht ansatzweise etwas gefunden habe. Dann schau mich mal wie ich mit dem Wissen weitermache. Danke ------------------ lesen gefährdet die Dummheit Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|