| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Mit SAP ERP/PLM den Anlagenbau perfekt organisiert - NEUMAN & ESSER GROUP , ein Anwenderbericht
|
Autor
|
Thema: BOM API Export über iLogic (622 / mal gelesen)
|
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 29. Jul. 2024 10:07 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte gerne eine BOM Liste aus dem 3D Modell ziehen und ins Excel Format übertragen. Zeile A Soll Level of Detail sein, B Item Number, C Objektmenge, D Summe Objektmenge, E Revisionsnummer, F Titel, G Icon (Bild des Bauteils/Baugruppe), H Beschreibung, I Bauteilnummer, J Bestandsnummer, K BOM (Normal und Gekauft), L Material, M Masse , N Dichte, O iPropertie benutzerdefiniert "Zuschnitt", P Part Color Level of Detail wenn möglich soll von der obersten baugruppe bis zur tiefsten Unterbaugruppe bis zu jedem Bauteil (auch wenn es in der obersten Baugruppe verbaut ist) alle erfassen. Vorgabe Stücklistenstruktur soll Normal und Gekauft sein, da andere (Phantom, Unteilbar und Referenz in der Stückliste wohl nicht angezeigt werden) Sollte es da Probleme geben reicht mir die Vorgabe Stückliste "Normal". Inhaltscenter Bauteile wie Schrauben solle auch in den BOM Export. Die Excelliste soll im Pfad des Projekts erstellt werden und der Name soll dem der Baugruppe entsprechen aber ggf. im Fenster was beim speichern angezeigt wird, geändert werden können. Trotz Recherche habe ich irgendwie nicht brauchbares gefunden. Daher habe ich meine Goldrandlösung oben formuliert. Bin gespannt. Vielen Dank im voraus. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 29. Jul. 2024 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Dichte gibt es in der BOM so nicht. Die Dichte kannst du z.B. über eine kleine iLogicregel, die beim Speichern das benutzerdefinierte iProp mit der gewünschten Formatierung schreibt, in die Stückliste holen. Dazu im aktiven Material des Bauteiles im PhysicalPropertiesAsset nach "structural_Density" schauen. Level of Detail gibt es nicht mehr. Ist vielleicht der model state gemeint? Wie ergibt sich die Summe Objektmenge? Ich rate mal damit ist die Anzahl gemeint, also Objektmenge multipliziert mit Basismenge? Part Color = Darstellung? Du solltest die Stückliste einmal manuell so hinfummeln und die Anpassung als XML-Datei eportieren. Dann suchst du dir einen BOM Export Code der diese Stücklistenanpassung importiert und dann den Export durchzieht. Etwas in der Art müsste sogar hier im Forum rumliegen. Code zum Auslesen des Projektpfades (Application.DesignProjectManager.ActiveDesignProject.WorkSpacePath-Property), des Baugruppennamen (System.IO.Path.GetFileNameWitoutExtension-Methode) und für einen Dateidialog gibt's auch zu Hauf im Netz. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 29. Jul. 2024 15:30 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für die Rückmeldung. Dichte über eine kleine Ilogicregel klingt gut, so mache ich es auch mit dem Zuschnitt. Allerdings weiß ich nicht wie "xlsRow.Add(propSets("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}")("Title").Value)" als Benutzerdefinierte iPropertie ausformuliert mit der richtigen ID, also dem Code stimmt. Im Handbuch zum Thema API habe ich schon mal gestöbert. Genau die Anzahl ist gemeint. Bei einer idw kann mal ja die Objektmenge nehmen, da sonst bei einem Träger 1000mm lang die Menge bei zweien auf 2000mm als Anzahl steht. Part Color ist die aktuelle Bauteilfarbe, wird auch wohl eine kleine Ilogicregel werden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 30. Jul. 2024 08:03 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Schreibst du die Stückliste von Excel aus, indem du jeden Wert einzeln aus der Inventor BOM holst? Oder wo kommt so was wie "xlsRow.Add..." her? Da machst du dir das Leben mM schwerer als es sein müsste. Falls du schon Codeteile hast, wäre es vielleicht hilfreich die zu posten, damit wir nicht aneinander vorbei reden. iLogic für die Dichte als benutzerdef. iProp:
Code:
Dim oDoc As PartDocument = ThisDoc.Document Dim oMat As MaterialAsset = oDoc.ActiveMaterial Dim dDensity As Double = oMat.PhysicalPropertiesAsset.Item("structural_Density").value iProperties.Value("Custom", "Dichte") = dDensity.ToString & " kg/m³"
Part Color gibt es nicht, auch nicht als iLogic. Die "Darstellung" fasst diverse Optionen (Farbe, Muster, Relief usw.) zusammen. Eine Darstellung kann natürlich "Blau" heißen und so den Eindruck erwecken einfach nur eine Farbe zu sein. Schau mal in der Stückliste in die Spalte "Darstellung", ich denke das ist das gesuchte. Die Spalte "Objektmenge" in der Stückliste ist in der API die "ItemQuantity". Das entspricht der Anzahl wie oft das Bauteil in der Baugruppe enthalten ist. Leider gibt es bei der Spalte ANZAHL ein echtes Übersetzungchaos. Die Spalte "ANZAHL" in der Stückliste ist in der API die "TotalQuantity" (ist gleich ItemQuantity * Basismenge). Das hätte man eher mit Gesamtmenge übersetzen sollen. Wie gesagt, stellt dir einmal die Stückliste manuell korrekt ein, exportier diese Anpassung als XML-Datei und lies die Anpassungsdatei vor jedem Export ein. Dann die BOM einfach als Excel exportieren, fertig. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 30. Jul. 2024 10:02 <-- editieren / zitieren --> Unities abgeben:
Hallo und nochmals vielen Dank für die Antwort. Ich möchte mit ilogic eine BOM ziehen und in Excel übertragen. Die Datei ist dann für weitere Arbeiten in Excel. Mit dem Inventor muss dann nix mehr gemacht werden. Part color habe ich >> iProperties.Value("Custom", "Part color") =iProperties.PartColor als externe Regel erstellt, Dichte werden ich dann auch wie von Ihnen geschrieben umsetzen. Ich bin durch Zufall über diese Lösung vom Herrn Navara gestolpert: https://forums.autodesk.com/t5/inventor-programming-ilogic/export-bom-model-data-to-excel/td-p/12176183 habe diese gestern schon getestet und diese läuft bis auf die benutzerdefinierten iProperties "Zuschnitt, Part color und Dichte" (die als iPropertie nun mit jeweils einer kleinen externen Regel erstellt werden. Die Anzahl ist bei der Regel https://forums.autodesk.com/t5/inventor-programming-ilogic/export-bom-model-data-to-excel/td-p/12176183 vom Herrn Navara für mich passend. Es fehlen mir eigentlich "nur" noch die benutzerdefinierten iProperties und wenn möglich die Möglichkeit mit der Namensgebung der Datei. Für mich ist die iLogic Lösung einfacher, da Vorlagen schnell mal verschwinden und überspeichert werden. Außerdem ist wie ich festgestellt habe, nicht Excel gleich Excel. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 30. Jul. 2024 10:32 <-- editieren / zitieren --> Unities abgeben:
|
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 30. Jul. 2024 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Die Anpassungsdatei legt man sich z.B. mit in den Ordner für externe iLogicregeln. Ist der Ordner weg, macht es auch nix wenn die Datei fehlt. Gegen unbeabsichtigte oder böswillige Veränderungen, könnte man Zugriffsrechte setzen. Theoretisch könnte man auch den Inhalt, ist ja lesbarer Text, in eine eigene Sub in der Exportregel legen und halt immer wenn die Datei benötigt wird, an einer definierten Stelle neu erstellen und anschließend wieder löschen. Aber wie du willst. Warum Autodesk für die Thumbnails immer noch keine sinnvolle Alternative zu den IPictureDisp gebracht hat...keine Ahnung. Es ist ein Krampf damit. Hab es nicht getestet, aber so sollte es gehen. In den Header deiner Regel:
Code: AddReference "System.Drawing" AddReference "stdole" AddReference "System.Windows.Forms"
Deine ganze bisherige Regel muss als "Sub Main" in Class "ThisRule", da unten drunter noch die AxHostConverter Klasse muss.
Code:
Class ThisRule Sub Main '############################################## ' HIER KOMMT DEINE GANZE STÜCKLISTENREGEL REIN ' mittels: ' Dim oImg As System.Drawing.Image = MakeThumb(oDoc) ' holst du dir in jeder Stücklistenzeile das ' Thumbnail als Image und fügst es in die xlsRow ' Liste ein. Speichern muss nicht sein. '############################################## End Sub Private Function MakeThumb(byVal oDoc As Document) as System.Drawing.Image Dim oDoc As Document = ThisDoc.Document Dim oThumb As stdole.IPictureDisp Do oThumb = oDoc.Thumbnail Loop While oThumb.Handle<0 Dim myPict As New AxHostConverter Dim oImage As System.Drawing.Image=myPict.GetImageFromIPictureDisp(oThumb) 'Optional Speichern 'Dim sPath As String = System.IO.Path.ChangeExtension(oDoc.FullFileName, "jpg") 'oImage.Save(sPath,System.Drawing.Imaging.ImageFormat.Jpeg ) End Function End ClassClass AxHostConverter Inherits System.Windows.Forms.AxHost Public Sub New() MyBase.New("{63109182-966B-4e3c-A8B2-8BC4A88D221C}") End Sub Public Function GetImageFromIPictureDisp(ByVal pictureDisp As stdole.IPictureDisp) As System.Drawing.Image Return CType(MyBase.GetPictureFromIPicture(pictureDisp), System.Drawing.Image).GetThumbnailImage(150,150,a,b) End Function End Class
iProperties.PartColor ist die Darstellung des Bauteiles. Warum die iLogic Programmierer da jetzt wieder mit Farbe anfangen ... Beachte aber, das gibt dir die Einstellung des Bauteiles an. Die kann aber je Exemplar in der Baugruppe überschrieben werden.
Für die benutzerdefinierten iProps müsste es dann so lauten:
Code:
xlsRow.Add(propSets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}")("Zuschnitt").Value) xlsRow.Add(propSets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}")("Part color").Value)
Die Position innerhalb der Objektliste "xlsRow" beachten und in der Sub "GetBOMHeader" die Spaltenüberschriften ergänzen. Für den Dialogzum Speicherort und Name, in der Regel von M.Navara die Zeile
Code:
Dim excelFileName As String = System.IO.Path.ChangeExtension(asm.FullFileName, ".xlsx")
ersetzen mit: Code:
Dim oApp As Inventor.Application = ThisApplication Dim sPath As String = oApp.DesignProjectManager.ActiveDesignProject.WorkspacePath Dim sName As String = System.IO.Path.GetFileNameWithoutExtension(asm.FullFileName)Dim oDlg As Inventor.FileDialog oApp.CreateFileDialog(oDlg) oDlg.Filter = "Excel Files (*.xlsx)|*.xlsx|All Files (*.*)|*.*" oDlg.FilterIndex = 1 oDlg.DialogTitle = "iLogic - Export BOM" oDlg.InitialDirectory = sPath oDlg.FileName = sPath & "\" & sName oDlg.CancelError = True oDlg.ShowSave If oDlg.FileName <> "" Then Dim excelFileName As String = oDlg.FileName End If
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 30. Jul. 2024 13:40 <-- editieren / zitieren --> Unities abgeben:
|
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 31. Jul. 2024 08:19 <-- editieren / zitieren --> Unities abgeben:
Hallo , ich habe die Regel mal zusammengefügt und bekomme "Fehler in Zeile 25 : Die Variable "excelFileName" verbirgt eine Variable in einem einschließenden Block." als Fehlermeldung. Zeile 25 Dim excelFileName As String = oDlg.FileName "Die Position innerhalb der Objektliste "xlsRow" beachten und in der Sub "GetBOMHeader" die Spaltenüberschriften ergänzen" soll wo ergänzt werden? "Dim oImg As System.Drawing.Image = MakeThumb(oDoc)" soll wo genau rein? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 31. Jul. 2024 09:31 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Mach aus
Code: If oDlg.FileName <> "" Then Dim excelFileName As String = oDlg.FileName End If
Code:
Dim excelFileName As String If oDlg.FileName <> "" Then excelFileName = oDlg.FileName Else Exit Sub End If
VB mag es nicht wenn eine Variable in einer IF-Abfrage deklariert wird. Das Exit Sub im ELSE-Zweig führt zum Abbruch, wenn der Benutzer im Dialog den Abbrechen-Button gedrückt hat. M. Navara hat für die Spaltenüberschriften diese Funktion:
Code:
Function GetBomHeader() As List(Of Object) Dim header As New List(Of Object) header.Add("Level") header.Add("ItemNumber") header.Add("ItemQuantity") header.Add("TotalQuantity") header.Add("BOMStructure") header.Add("Part Number") header.Add("Title") Return header End Function
Da muss an der gewünschten Stelle z.B. ein Eintrag header.Add("Zuschnitt") rein, sonst fehlt diese Spaltenüberschrift und deine Werte stehen in der falschen Spalte. In der Sub GetBomRowData werden die einzelnen Werte einer Stücklistenzeile in der Reihenfolge geholt, wie sie später von links nach rechts in der Exceltabelle stehen sollen. Soll das Thumbnail hinter die Spalte "Title", muss also in der Sub unter die Zeile
Code:
xlsRow.Add(propSets("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}")("Title").Value)
das Thumbnail eingefügt werden mit
Code:
xlsRow.Add(MakeThumb(oDoc))
Soweit der Plan, ich hab's nicht ausprobiert. Vielleicht funktioniert es so einfach nicht.
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 31. Jul. 2024 10:08 <-- editieren / zitieren --> Unities abgeben:
|
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 31. Jul. 2024 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Schreib in die Sub GetBomRowData unter die Zeile
Code: Dim compDef As ComponentDefinition = oBomRow.ComponentDefinitions(1)
noch Code: Dim oDoc as Document = oCompDef.Document
Es ist halt schwer, wenn der Quellcode nicht vorliegt, immer alle Variablendeklarationen im Auge zu behalten. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 31. Jul. 2024 12:49 <-- editieren / zitieren --> Unities abgeben:
Moin, das hat auch wieder Fehler behoben nun ist aber noch diese Meldung aufgetaucht: Fehler in Zeile 159 : "a" ist nicht deklariert. Auf das Objekt kann aufgrund der Schutzstufe möglicherweise nicht zugegriffen werden. Fehler in Zeile 159 : "b" ist nicht deklariert. Auf das Objekt kann aufgrund der Schutzstufe möglicherweise nicht zugegriffen werden. Zeile 159 Return CType(MyBase.GetPictureFromIPicture(pictureDisp), System.Drawing.Image).GetThumbnailImage(150,150,a,b) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 31. Jul. 2024 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Achja, die hatte ich als Platzhalter eingesetzt und dann vergessen. Das Alter Die ganze AxHostConverter Klasse ersetzen mit: Code:
Class AxHostConverter Inherits System.Windows.Forms.AxHostPublic Sub New() MyBase.New("{63109182-966B-4e3c-A8B2-8BC4A88D221C}") End Sub Public Function ThumbnailCallback() As Boolean Return False End Function Public Function GetImageFromIPictureDisp(ByVal pictureDisp As stdole.IPictureDisp) As System.Drawing.Image Dim Cb As New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback) Return CType(MyBase.GetPictureFromIPicture(pictureDisp), System.Drawing.Image).GetThumbnailImage(150,150,Cb,IntPtr.Zero) End Function End Class
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 31. Jul. 2024 13:18 <-- editieren / zitieren --> Unities abgeben:
Hallo, dafür ist der Prozess um diese Regel doch recht fortgeschritten, möchte ich meinen. Fehler in Zeile 161 : Der Typ "Image.GetThumbnailImageAbort" ist nicht definiert Zeile 161 >> Dim Cb As New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 31. Jul. 2024 13:32 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Ändere bitte Code: Dim Cb As New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)
in Code: Dim Cb As New System.Drawing.Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 31. Jul. 2024 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmals vielen Dank, der Fehler ist weg. Das Thumb (Bildchen des Bauteils oder Baugruppe) fehlt im Excel Auszug aus dem Code Function GetBOMHeader() As List(Of Object) Dim header As New List(Of Object) header.Add("Level") header.Add("ItemNumber") header.Add("ItemQuantity") header.Add("TotalQuantity") header.Add("BOMStructure") header.Add("Title") header.Add("Thumb") header.Add("Description") header.Add("Part Number") header.Add("Stock Number") header.Add("Zeichnungsnummer") header.Add("Material") header.Add("BenDichte") header.Add("Zuschnitt") header.Add("Part color") weiterer Auszug aus der Regel xlsRow.Add(System.Enum.GetName(GetType(BOMStructureEnum), compDef.BOMStructure)) xlsRow.Add(propSets("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}")("Title").Value) xlsRow.Add(MakeThumb(oDoc)) xlsRow.Add(propSets("{32853F0F-3444-11D1-9E93-0060B03C1CA6}")("Description").Value) Wenn iPropertie leer sein sollten aber angelegt oder ganz fehlen (kann bei Step Daten) passieren, stoppt die Regel und erstellt nicht die Excelliste. Geht in der Richtung noch was? Läuft bei der schlimmsten Baugruppe die ich habe Step Import (11163 Bauteile und 610 Baugruppen) fast durch. Fast. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 31. Jul. 2024 21:52 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Langsam wird es schwierig noch nachzuvollziehen was du wo ändern musst. Also, für die nicht vorhandenen benutzerdefinierten iProps (die Standardprops sind immer da, leere iProps stören nicht) füge in Class ThisRule irgendwo die Funktion
Code:
Private Function GetPropValue(ByVal oDoc As Document, ByVal sPropSet As String, ByVal sPropName As String) As String Dim oPropSet As PropertySet = oDoc.PropertySets(sPropSet) Try GetPropValue = oPropSet.item(sPropName).value Catch GetPropValue = String.Empty End Try End Function
ein. In der Sub GetBomRowData änderst du die beiden Zeilen für die benutzerdefinierten iProps in
Code:
xlsRow.Add(GetPropValue(oDoc,"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}","Zuschnitt")) xlsRow.Add(GetPropValue(oDoc,"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}","Part color"))
Außerdem änderst du in der gleichen Sub GetBomRowData die Zeile
Code: xlsRow.Add(MakeThumb(oDoc))
in
Code:
Dim oImg As System.Drawing.Image = MakeThumb(oDoc) xlsRow.Add(oImg)
Die Sub WriteDataToExcel ersetzt du, falls die noch original von Navara ist, mit:
Code:
Sub WriteDataToExcel(xlsFileName As String) StartExcel() Dim workBook = GoExcel.Application.Workbooks.Add() Dim iPicCol As Integer Dim rowsCount As Integer = Rows.Count Dim columnsCount As Integer = rows(0).Count Dim data(rowsCount, columnsCount) As Object For c As Integer = 0 To columnsCount - 1 For r As Integer = 0 To rowsCount - 1 If Not TypeOf rows(r)(c) Is System.Drawing.Image Then data(r, c) = rows(r)(c) Else iPicCol = c+1 End If Next Next Dim columnName As String = Char.ConvertFromUtf32(columnsCount + 64) workBook.Worksheets(1).Range("A1:" & columnName & rowsCount).Value2 = data Dim PicColName As String = Char.ConvertFromUtf32(iPicCol + 64) For r As Integer = 1 To rowsCount - 1 Dim myPic As System.Drawing.Bitmap = rows(r)(iPicCol-1) System.Windows.Forms.Clipboard.Clear() System.Windows.Forms.Clipboard.SetDataObject(myPic, True) Dim myRange = workBook.worksheets(1).Range(PicColName & r+1) workBook.Worksheets(1).Paste(myRange, myPic) Next workBook.SaveAs(xlsFileName) workBook.Close() GoExcel.QuitApplication End Sub
Die Funktion MakeThumb ersetzen mit:
Code:
Private Function MakeThumb(ByVal oDoc As Document) As System.Drawing.Image Dim oThumb As stdole.IPictureDisp Do oThumb = oDoc.Thumbnail Loop While oThumb.Handle<0 Dim myPict As New AxHostConverter Dim oImage As System.Drawing.Image=myPict.GetImageFromIPictureDisp(oThumb) Return oImage End Function
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 01. Aug. 2024 07:22 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, die Regel läuft sogar bei der extremen Step Datei so durch (11163 Bauteile, 610 Baugruppen). Zeit ca. 5 Minuten (nur zur Info, habe mit deutlich mehr gerechnet). 860 Zeilen im Excel. Eine bescheidene Sache noch (wenn es nicht geht ist meine Anfrage zu 100% gelöst): Die Bilder der Bauteile und Baugruppen sind überlappend da die Zeilenhöhe Standard ist. Die Spaltenbreite von 150 und Zeilenhöhe von 150 kann ich händisch eingeben. Eine Formatierung kann man da nicht einstellen oder? Vielen Dank für Ihre Bemühungen und die starke Umsetzung meiner Anfrage. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 01. Aug. 2024 16:24 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Die Zeilenhöhe rechnet Excel aber in Points und die Spaltenbreite in Anzahl Zeichen der Standardschrift. Die Pixelwerte helfen da nur bedingt weiter. Die Umrechnung klappt oft nur mäßig gut. Ich würde es einfach iterativ ermitteln und komme bei mir auf Spaltenbreite ungefähr 20 und Zeilenhöhe ungefähr 115. Code:
Sub WriteDataToExcel(xlsFileName As String) StartExcel() Dim workBook = GoExcel.Application.Workbooks.Add() Dim iPicCol As Integer Dim rowsCount As Integer = Rows.Count Dim columnsCount As Integer = rows(0).Count Dim data(rowsCount, columnsCount) As Object For c As Integer = 0 To columnsCount - 1 For r As Integer = 0 To rowsCount - 1 If Not TypeOf rows(r)(c) Is System.Drawing.Image Then data(r, c) = rows(r)(c) Else iPicCol = c+1 End If Next Next Dim columnName As String = Char.ConvertFromUtf32(columnsCount + 64) workBook.Worksheets(1).Range("A1:" & columnName & rowsCount).Value2 = data Dim PicColName As String = Char.ConvertFromUtf32(iPicCol + 64) Dim myRange As Object For r As Integer = 1 To rowsCount - 1 Dim myPic As System.Drawing.Bitmap = rows(r)(iPicCol-1) System.Windows.Forms.Clipboard.Clear() System.Windows.Forms.Clipboard.SetDataObject(myPic, True) myRange = workBook.worksheets(1).Range(PicColName & r+1) myRange.rowheight = 115 Try workBook.Worksheets(1).Paste(myRange, myPic) Catch ex As Exception Logger.Debug(ex.Message) End Try Next myRange = workBook.worksheets(1).Range(PicColName & 1) myRange.columnwidth = 20 workBook.SaveAs(xlsFileName) workBook.Close() GoExcel.QuitApplication End Sub
Bei den ganzen Schleifendurchläufen pro Stücklistenzeile ist der Wert gar nicht so schlecht. Die Krücke das Thumbnail über die Zwischenablage einzufügen, bremst vermutlich auch. Könntest ja mal die Zeiten vergleichen, wenn in der Sub WriteDataToExcel diese ganze Schleife auskommentiert ist. Bei mir war das mal eben Faktor 4-5 schneller ohne den Thumbnailkonvertierungskram.
Code:
For r As Integer = 1 To rowsCount - 1 Dim myPic As System.Drawing.Bitmap = rows(r)(iPicCol-1) System.Windows.Forms.Clipboard.Clear() System.Windows.Forms.Clipboard.SetDataObject(myPic, True) myRange = workBook.worksheets(1).Range(PicColName & r+1) myRange.rowheight = 115 Try workBook.Worksheets(1).Paste(myRange, myPic) Catch ex As Exception Logger.Debug(ex.Message) End Try Next
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 02. Aug. 2024 07:31 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, die Regel ist getestet und läuft einwandfrei. Die extreme Baugruppe 11163 Bauteile und 610 Baugruppen läuft so durch. Nochmals ein dickes DANKE für Unterstützung und die Umsetzung dieser Anfrage. Wiedermal 120% getroffen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 02. Aug. 2024 07:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, die Masse selber kann ich anders als gedacht nicht einstellen. Ich hätte hier gerne 3 Nachkommastellen und kg drin. Sonst schrreib ich mir den mit der Formatierung als benutzerdefinierten iPrpopertie. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 02. Aug. 2024 09:36 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Und woher und wie holst du die Masse? Ist es eine Spalte der BOM oder greifst du in jedem Teil in die physischen Eigenschaften? In den physischen Eigenschaften steht die Masse eh schon in kg drin, muss man nur noch runden und die Einheit ankleben. Den Umweg ein iProp zu erzeugen kann man sich sparen, wenn es nur dafür benötigt wird. Code:
Try xlsRow.Add(Round(compDef.massproperties.mass, 3) & " kg") Catch 'virtuelle Bauteile haben keine Masseeigenschaften xlsRow.Add("0 kg") End Try
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 02. Aug. 2024 09:58 <-- editieren / zitieren --> Unities abgeben:
|
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 07. Aug. 2024 08:55 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, eine Frage habe ich noch. Ich habe die Blechstärke auch als iPropertie zum BOM Export hinzugefügt xlsRow.Add(GetPropValue(oDoc,"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", "Stärke")) Ich hätte da gerne eine Nachkommastelle. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 07. Aug. 2024 10:30 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Der Code zeigt, dass du ein benutzerdefiniertes iProp "Stärke" ausliest. Vermutlich ist dieses bereits vom Format her Text. Die Nachkommastelle solltest du einen Schritt vorher, beim Auslesen der Blechstärke und schreiben in dieses iProp einfügen. Woher holst du denn den Wert für "Stärke"? Der simpelste Weg wäre den fx-Parameter als "Export" zu markieren und in den Exporteinstellungen das Format korrekt einzustellen. Kein Code erforderlich. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RP4711 Mitglied Technischer Produktdesigner
Beiträge: 24 Registriert: 01.03.2024 Inventor 2024
|
erstellt am: 07. Aug. 2024 14:59 <-- editieren / zitieren --> Unities abgeben:
Moin, das war mir schon bekannt trotzdem danke. Ich habe leider den Fall, dass ich ein Step Modell bekomme, bei dem die Standard Vorlage ja zum einlesen der Daten benutzt wird. In der normalen Vorlage habe ich eine Nachkommastelle eingestellt. Wenn ich die AV mache wählt der eine, für mich nicht greifbare Vorlage aus oder das ist da so programmiert. Daher wäre dieses iLogic Schnippsel für mich passend. Wenn ich z.B. ein Normbauteil (beim 2024er Inventor Standard Bauteil) in ein Blech konvertiere, wählt der Inventor wenn die Blechstärke erkannt wurde die falsche Blechregel aus (Filter springt in den Blechstandards auf alle Normen) und wenn die Blechstärke beim ins Blech konvertieren NICHT erkannt wurde, nimmt er den aktiven Blechstandard. Der Filter muss pro Session auf aktiver Blechstandard gestellt werden, dann gehts. Die Nachkommastellen sind aber immer noch da. Die Speichererinnerung fliegt auch immer wieder raus. Ich stelle das komplett aus. Naja Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 07. Aug. 2024 22:05 <-- editieren / zitieren --> Unities abgeben: Nur für RP4711
Moin Inventor benutzt für die Importe die Standard.ipt/iam (Standardpfad C:\Users\Public\Documents\Autodesk\Inventor 2024\Templates\de-DE) so sie vorhanden ist. Fehlt diese, wird meines Wissens eine hart codierte Vorlage benutzt. Öffne mal die Standard.ipt (Sicherungskopie vorher nicht vergessen), konvertiere sie in ein Blechteil und kontrollieren a) den eingestellten Blechstandard und b) den Export des fx-Parameters "Stärke". Konvertiere zurück in ein Bauteil und speichere die Vorlage. Damit sollten diese Voreinstellungen beim Erstellen eines Bauteiles während des Importes bereits korrekt sein. Zitat: In der normalen Vorlage habe ich eine Nachkommastelle eingestellt.
Was ist die "normale" Vorlage? Da gehört sicherheitshalber der Pfad mit dazu. Wo hast du die Nachkommastelle eingestellt? Ein Screenshot würde echt helfen. Zitat: Daher wäre dieses iLogic Schnippsel für mich passend.
Sorry, null Plan was der Schnipsel tun soll. Zitat: falsche Blechregel aus (Filter springt in den Blechstandards auf alle Normen)
Im Dialog "Blechstandards" gibt es keinen Filter und auch keine Option "alle Normen" Vielleicht mal ein Screenshot der zeigt wo du das siehst? Zitat: Der Filter muss pro Session auf aktiver Blechstandard gestellt werden, dann gehts.
Welcher Filter? Wo? Auch hier würde ein Screenshot wirklich helfen. Zitat: Die Nachkommastellen sind aber immer noch da.
Nachkommastellen im iProp oder wo? Denk bitte mal daran, dass außer dir keiner deinen Bildschirm sehen kann. Zitat: Die Speichererinnerung fliegt auch immer wieder raus.
Was hat das jetzt mit dem Rest zu tun? Wenn die Anwendungsoptionen nicht gespeichert werden, hat es vielleicht ja damit zu tun --> clickIch will nicht unhöflich sein, aber wenn du dir selbst mal deine Frage durchliest und schaust in welchem Ausgangsthema du die gestellt hast, würdest du auf Anhieb auf das kommen was auch immer du vor hast? ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |