| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Stückliste in Baugruppe sortieren und in csv- oder Excel-Datei exportieren (4867 mal gelesen)
|
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 12. Jul. 2018 15:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, mein Ziel ist folgendes: Ich will die Stückliste in der Baugruppe (iam-Datei) im Reiter "Strukturiert" sortieren (Fertigungsteile zuerst, danach Kaufteile und zuletzt Normteile aus der Inventor-Bibliothek). Damit VBA das sortieren und zuordnen kann, gibt es einen entsprechenden Hinweis in der Spalte "Bestandsnummer". Anschließend soll dies als csv- oder Excel Datei exportiert werden. Mit ein bisschen Recherche habe ich diesen Code gefunden (von hier), um erstmal eine Basis zu haben mit der ich arbeiten kann:
Code:
Option Explicit Dim PMarke As String Dim PMarkeH As String Dim AXArray(5000, 20) As String Dim iZeile As IntegerPublic Sub Btn_Stuecklistenerstellung_Click() Dim oAsmDoc As AssemblyDocument Set oAsmDoc = ThisApplication.ActiveDocument Dim oBOM As BOM Set oBOM = oAsmDoc.ComponentDefinition.BOM oBOM.StructuredViewFirstLevelOnly = False oBOM.StructuredViewEnabled = True Dim oStructuredBOMView As BOMView Set oStructuredBOMView = oBOM.BOMViews.Item("Strukturiert") Dim byWert As Byte Dim oPfad As String Dim uFolder, FileName, oFolderAXS As String 'ExportPfad zuweisen oFolderAXS = "C:\ExportAX\" 'Hinweisfenster ob der Stücklistenexport gestartet werden soll byWert = MsgBox("Soll die Stückliste exportiert werden?", vbOKCancel, "Stücklistenexport") If byWert = 2 Then Exit Sub Erase AXArray 'AXArray wird gelöscht iZeile = 2 'Zeile 0 und 1 werden separat erzeugt 'die Teileliste aus der .iam wird angepasst und in das AXArray geschrieben addRow "", oStructuredBOMView.BOMRows, True 'Ordner und Datei für das Exportfile wird erstellt uFolder = Mid(AXArray(2, 2), 3, 3) oPfad = oFolderAXS & uFolder Call CreateFolder.CreateFolder(oPfad) FileName = oPfad & "\" & Mid(AXArray(2, 2), 3, Len(AXArray(2, 2)) - 2) & " Rev" & AXArray(2, 9) & ".txt" 'AXArray wird in eine .txt Datei exportiert Open FileName For Output As #1 Dim i As Integer For i = 1 To iZeile '1= mit Spaltenüberschriften, 2= ohne Spaltenüberschriften Print #1, AXArray(i, 1) & "|" & AXArray(i, 2) & "|" & AXArray(i, 3) & "|" & AXArray(i, 4) & "|" & AXArray(i, 5) _ & "|" & AXArray(i, 6) & "|" & AXArray(i, 7) & "|" & AXArray(i, 8) & "|" & AXArray(i, 9) _ & "|" & AXArray(i, 10) & "|" & AXArray(i, 11) & "|" & AXArray(i, 12) & "|" & AXArray(i, 13) _ & "|" & AXArray(i, 14) & "|" & AXArray(i, 15) & "|" & AXArray(i, 16) & "|" & AXArray(i, 17) _ & "|" & AXArray(i, 18) & "|" & AXArray(i, 19) & "|" & AXArray(i, 20) Next i Close #1 'Export-Datei schließen 'Hinweisfenster oder Notepad zum Ende des Exports anzeigen 'MsgBox "Stücklistenexport war erfolgreich!", vbOKOnly, "Stücklistenexport" Shell ("notepad.exe " + FileName) End Sub Private Function addRow(Parent As String, oBomRows As BOMRowsEnumerator, Optional header As Boolean = False) Dim oPart As Document Set oPart = ThisApplication.ActiveDocument Dim oBomRow As BOMRow Dim TName As String Dim oFileNameIDW As String Dim oTextBSZ, Temp As String Dim HauptBG, UnterBG, TNummer As String Dim NameEng, NameFra, oRevNum As String On Error Resume Next 'Header wird erstellt (nur beim 1. drchlauf) If header = True Then 'Zeile 1 = Spaltenüberschriften AXArray(1, 1) = "Pos" AXArray(1, 2) = "HauptBG" AXArray(1, 3) = "Anz" AXArray(1, 4) = "Teilenummer" AXArray(1, 5) = "Benennung" AXArray(1, 6) = "Englisch" AXArray(1, 7) = "Französisch" AXArray(1, 8) = "Unterbenennung" AXArray(1, 9) = "Rev" AXArray(1, 10) = "Erstelldatum" AXArray(1, 11) = "Material/Norm" AXArray(1, 12) = "MatNummer" AXArray(1, 13) = "Länge" AXArray(1, 14) = "Breite" AXArray(1, 15) = "Werkstoff" AXArray(1, 16) = "Rohteilgewicht" AXArray(1, 17) = "Bauteilgewicht" AXArray(1, 18) = "Artikelstatus" AXArray(1, 19) = "Zusatztext" AXArray(1, 20) = "Speicherort" 'Zeile 2 = Die oberste Hauptbaugruppe wird erstellt Temp = BulTools.Translate(oPart.PropertySets(1).Item("Title").Value, NameEng, NameFra) PMarkeH = oPart.PropertySets(4).Item("Produktmarke").Value HauptBG = oPart.PropertySets(3).Item("Part Number").Value AXArray(2, 1) = "0" AXArray(2, 2) = PMarkeH & HauptBG AXArray(2, 3) = "1" AXArray(2, 4) = PMarkeH & HauptBG AXArray(2, 5) = oPart.PropertySets(1).Item("Title").Value AXArray(2, 6) = NameEng AXArray(2, 7) = NameFra AXArray(2, 8) = oPart.PropertySets(1).Item("Subject").Value AXArray(2, 9) = oPart.PropertySets(1).Item("Revision Number").Value AXArray(2, 10) = Left(oPart.PropertySets(3).Item("Creation Time").Value, 10) AXArray(2, 11) = "" AXArray(2, 12) = "" AXArray(2, 13) = "" AXArray(2, 14) = "" AXArray(2, 15) = "" AXArray(2, 16) = "" AXArray(2, 17) = Round(oPart.PropertySets(3).Item("Mass").Value / 1000, 1) AXArray(2, 18) = oPart.PropertySets(4).Item("Artikelstatus").Value AXArray(2, 19) = "" AXArray(2, 20) = oPart.ComponentDefinitions(1).Document.FullDocumentName End If 'Prüft ob die Unterbaugruppe schon in der Stückliste ist, wenn ja wird sie kein 2. Mal ins Array geschrieben Dim i As Integer Dim InPartList As Boolean InPartList = False PMarke = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Produktmarke").Value For i = 2 To iZeile If AXArray(i, 2) = PMarke & Parent And Not AXArray(i, 2) = "" Then InPartList = True End If Next i 'geamte Teileliste durchlaufen For Each oBomRow In oBomRows 'Prüfen ob das Teil von der AX-Stückliste ausgeschlossen ist If oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("NoAXBom").Value = False Then 'prüfen ob das Teiln schon in der Stückliste enthalten ist If InPartList = False Then 'Variablen werden zurückgesetzt iZeile = iZeile + 1 NameEng = "" NameFra = "" PMarke = "" TNummer = "" TName = "" 'prüfen ob es ein "Parent" gibt, wenn nicht ist die Hauptbaugruppe der "Parent" UnterBG = Parent If UnterBG = "" Then UnterBG = HauptBG ' Stückliste wird zusammengestellt in in das Array geschrieben TNummer = oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Part Number").Value TName = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Title").Value oRevNum = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Revision Number").Value PMarke = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Produktmarke").Value If PMarke = "" Then PMarke = BulTools.ProduktMa(TNummer) Temp = BulTools.Translate(TName, NameEng, NameFra) 'Zusatztext für Brennschnitte aus der .idw auslesen oFileNameIDW = Left(oBomRow.ComponentDefinitions(1).Document.FullDocumentName, Len(oBomRow.ComponentDefinitions(1).Document.FullDocumentName) - 3) & "idw" oTextBSZ = BulTools.iPropTextBSZ(oFileNameIDW) 'AXArray wird mit Daten gefüllt AXArray(iZeile, 1) = oBomRow.ItemNumber AXArray(iZeile, 2) = PMarkeH & UnterBG AXArray(iZeile, 3) = oBomRow.ItemQuantity AXArray(iZeile, 4) = PMarke & TNummer AXArray(iZeile, 5) = TName AXArray(iZeile, 6) = NameEng AXArray(iZeile, 7) = NameFra AXArray(iZeile, 8) = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Subject").Value AXArray(iZeile, 9) = oRevNum AXArray(iZeile, 10) = Left(oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Creation Time").Value, 10) AXArray(iZeile, 11) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Material/Norm").Value AXArray(iZeile, 12) = "" AXArray(iZeile, 13) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Länge").Value AXArray(iZeile, 14) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Breite").Value AXArray(iZeile, 15) = oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Material").Value AXArray(iZeile, 16) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Gewicht").Value AXArray(iZeile, 17) = Round(oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Mass").Value / 1000, 1) AXArray(iZeile, 18) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Artikelstatus").Value AXArray(iZeile, 19) = oTextBSZ AXArray(iZeile, 20) = oBomRow.ComponentDefinitions(1).Document.FullDocumentName 'Materialnummer aus ExcelTabelle auslesen (Material/Norm und Material) AXArray(iZeile, 12) = BulTools.RMNummer(AXArray(iZeile, 11), AXArray(iZeile, 15)) End If 'Baugruppen mit der Kennung "NoAxBomDissolve = True" werden nicht aufgelöst If oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("NoAxBomDissolve").Value = False Then If Not oBomRow.ChildRows Is Nothing Then addRow TNummer, oBomRow.ChildRows, False End If End If ForNext: Next End Function
Nun will dieser Code aber nicht und meldet mir in der Zeile "Call CreateFolder.CreateFolder(oPfad)" -im Code fett und unterstrichen markiert- "Compile error: Variable not defined". Wenn ich aber "Dim CreateFolder As String" definiere, dann erhalte ich die Meldung "Compile error: Invalid qualifier" Wie muss ich CreateFolder jetzt korrekt deklarieren? ------------------
Du bist die Aufgabe - Franz Kafka [Diese Nachricht wurde von Honigbär am 12. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tacker Mitglied TZ, Tech. MB, Softwareentwickler
Beiträge: 175 Registriert: 23.09.2010 IV 2017 Pro i7-7700K 4x4.2GHz 32GB DDR4-2400 GTX 1060 6GB DDR5
|
erstellt am: 12. Jul. 2018 16:55 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Moin , Also... gut ist die Vorlage nicht, aber man kann das ja verbessern. Bezüglich CreateFolder ist folgendes zu sagen: Das geht über das Filesystem des Zielsystems (der lokale Rechner) und da sollte einiges mehr beachtet werden als nur die Funktion aufzurufen. Zuerst brauchst du die Referenz zum Microsoft Scripting Runtime. Findest im VBA Browser unter Extras→Verweise. Anschließend zuerst ein Beispiel: Code:
Sub CreateFolder() Dim rootDirectory As String Dim folderToBeCreated As String Dim path As String ' Set the root directory path ' where you want to create ' your folder rootDirectory = "C:\ProgramData" ' give a valid name for your folder folderToBeCreated = "\MyFolder1" ' Path for MkDir VBA function ' would be the concatination ' of above two path = rootDirectory & folderToBeCreated ' Check the root directory and folder path ' before creating it directly If Len(Dir(rootDirectory, vbDirectory)) = 0 Then 'check if RootDirectory Exists? If Len(Dir(path, vbDirectory)) = 0 Then ' full path should not exist already VBA.MkDir (path) ' or VBA.MkDir ("C:\Vishwa\MyFolders\MyFolder1") MsgBox "Folder is created successfully" Else MsgBox "Folder is already existing in the root directory" End If Else MsgBox "Root directory does not exist" End If End Sub
So sollte das aussehen. Gefunden hier http://learnexcelmacro.com/wp/2016/11/how-to-create-folders-in-windows-via-excel-vba/ Wurde aber abgeändert. Das ganze kannst in eine Funktion abändern. Code:
Private Function CreateFolder(Byval rootDirectory as string,byval folderToBeCreated as string) as Boolean 'Dim rootDirectory As String 'Dim folderToBeCreated As String Dim path As String ' Set the root directory path ' where you want to create ' your folder 'rootDirectory = "C:\ProgramData" ' give a valid name for your folder 'folderToBeCreated = "\MyFolder1" ' Path for MkDir VBA function ' would be the concatination ' of above two path = rootDirectory & folderToBeCreated ' Check the root directory and folder path ' before creating it directly If Len(Dir(rootDirectory, vbDirectory)) = 0 Then 'check if RootDirectory Exists? If Len(Dir(path, vbDirectory)) = 0 Then ' full path should not exist already VBA.MkDir (path) ' or VBA.MkDir ("C:\Vishwa\MyFolders\MyFolder1") Return True MsgBox "Folder is created successfully" Else Return True MsgBox "Folder is already existing in the root directory" End If Else Return False MsgBox "Root directory does not exist" End If End Sub
Das ist jetzt noch nicht perfekt, aber tut seinen Dienst. Fehlerbehandlung fehlt beispielsweise noch. Aufrufen kannst das (Private Function CreateFolder....) in deinem Code dann so: Code:
if CreateFolder("C:\ProgramData","\MyFolder1") = False then 'Erstellung schlug fehl, beenden Exit sub end if
oder auch so
Code:
Dim rootDirectory as String Dim folderToBeCreated as String rootDirectory = "C:\ProgramData" folderToBeCreated = "\MyFolder1" If CreateFolder(rootDirectory,folderToBeCreated) = False then 'Erstellung schlug fehl, beenden Exit sub end if
Zu deinem Versuch CreateFolder als String zu Deklarieren, vielleicht wäre sogar die Anleitung hilfreich, richtet sich an VBA und Inventor API Neulinge. http://download.autodesk.com/us/community/mfg/Part_1.pdf Ich weis, objektorientiertes Programmieren ist nicht selbsterklärend, hatte damit auch so meine Probleme, aber da muss man halt durch. Klingt blöd, aber wenn man das Grundprinzip verstanden hat ist es logisch. Ein String ist eine Variable die nur Text enthält. Ein String wird nie die Funktion bereithalten einen Ordner zu erstellen. Hierzu ein Tutorial über die grundlegenden Datentypen: https://www.vba-tutorial.de/variablen/datentypen.htm Ich hoffe ich konnte ein bisschen helfen Gruß
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 13. Jul. 2018 11:41 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Hilfe und die Links. Ich bekomme jetzt in derselben Zeile (Call CreateFolder.CreateFolder(oPfad)) die Meldung "Compile error: Argument not optional" und "Return True" bzw. "Return False" wird im Code rot markiert. Dann habe ich im Netz gelesen, dass es "set Return True" heißen muss, aber da bekomme ich dann die Meldung "Compile error: Expected: identifier". Bin ganz durcheinander. Wie löse ich das Problem jetzt am besten? ------------------
Du bist die Aufgabe - Franz Kafka [Diese Nachricht wurde von Honigbär am 13. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tacker Mitglied TZ, Tech. MB, Softwareentwickler
Beiträge: 175 Registriert: 23.09.2010 IV 2017 Pro i7-7700K 4x4.2GHz 32GB DDR4-2400 GTX 1060 6GB DDR5
|
erstellt am: 13. Jul. 2018 17:15 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Moin da ist mir ein Fehler unterlaufen, entschuldige. "Return" gibt es in VBA nicht, ich arbeite meist mit VB.NET, da gibt es das. Ich würde vorschlagen wir vergessen das bisherige Beispiel und bauen etwas neues auf. Ich hab aus der API mal ein Beispiel geholt: Code:
Public Sub BOMQuery() ' Set a reference to the assembly document. ' This assumes an assembly document is active. Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Dim FirstLevelOnly As Boolean If MsgBox("First level only?", vbYesNo) = vbYes Then FirstLevelOnly = True Else FirstLevelOnly = False End If ' Set a reference to the BOM Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM ' Set whether first level only or all levels. If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else oBOM.StructuredViewFirstLevelOnly = False End If ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Strukturiert") Debug.Print "Item"; Tab(15); "Quantity"; Tab(30); "Part Number"; Tab(70); "Description" Debug.Print "----------------------------------------------------------------------------------" 'Initialize the tab for ItemNumber Dim ItemTab As Long ItemTab = -3 Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab) End Sub Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long) ItemTab = ItemTab + 3 ' Iterate through the contents of the BOM Rows. Dim i As Long For i = 1 To oBOMRows.Count ' Get the current row. Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) 'Set a reference to the primary ComponentDefinition of the row Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) Dim oPartNumProperty As Property Dim oDescripProperty As Property If TypeOf oCompDef Is VirtualComponentDefinition Then 'Get the file property that contains the "Part Number" 'The file property is obtained from the virtual component definition Set oPartNumProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value Else 'Get the file property that contains the "Part Number" 'The file property is obtained from the parent 'document of the associated ComponentDefinition. Set oPartNumProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call QueryBOMRowProperties(oRow.ChildRows, ItemTab) End If End If Next ItemTab = ItemTab - 3 End Sub
Den Sub (BOMQuery) starten. Das Fenster "Direktbereich" aktivieren. Dort siehst du dann die Ausgabe. Das funktioniert über den Befehl Debug.Print() Wenn das soweit bei dir funktioniert kümmern wir uns darum die Spalte "Bestandsnummer" auszulesen um anschließend zu sortieren. Die Ergebnisse müssen wir nur noch als .csv exportieren, dafür hab ich bereits etwas Fertiges rumliegen. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 16. Jul. 2018 09:14 <-- editieren / zitieren --> Unities abgeben:
Willkommen in der neuen Woche Habe mir den Code kopiert und leicht angepasst. Eine Fehlermeldung erhalte ich in der Zeile
Code:
If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else
mit der Meldung "Run-time error '5': Invalid procedure call or argument" Eine Frage dazu. oBOM wird als BOM deklariert. Was ist BOM für ein Datentyp? ------------------
Du bist die Aufgabe - Franz Kafka Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tacker Mitglied TZ, Tech. MB, Softwareentwickler
Beiträge: 175 Registriert: 23.09.2010 IV 2017 Pro i7-7700K 4x4.2GHz 32GB DDR4-2400 GTX 1060 6GB DDR5
|
erstellt am: 16. Jul. 2018 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Moin wie hast du den Code modifiziert? Konnte nicht nachstellen wie in der Zeile ein Fehler auftritt. Ist eine Baugruppe geöffnet? Die API definiert BOM so: "Description The BOM object represents the Bill Of Materials (BOM) data of a document." Zu Deutsch: BOM = Stückliste oBOM ist ein Objekt des Typs BOM /EDIT: Um das noch klarer zu machen: "oBOM" ist einfach nur ein Variablenname, das könnte auch "Stückliste","Teileliste", "A" oder auch "umpalumpa" sein. Bei der Initialisierung einer Variable definieren wir den Typ: "Dim umpalumpa as BOM" dass die Variable namens "umpalumpa" eine BOM/Stückliste ist. Der Variablenname ist Variabel, jedoch sollte es eindeutig und zuordenbar sein. Bei oBOM weis jeder, der sich mit Inventor & VBA auskennt, dass diese Variable die Stückliste ist, würde die Variable jetzt nur "A" heißen, wäre das nicht so einfach zuordenbar und der Code wird schwer lesbar. Edit/ Die Programmierer von Inventor haben diesen Typ erzeugt, der Typ BOM kommt nicht von VBA. Durch die Schnittstelle erhält der VBA Editor Zugriff auf dieses Objekt. Wenn du in dem VBA Editor den Objektkatalog aufrufst und dort nach BOM suchst, wirst du die Klasse BOM finden. Verzeichnet unter der Bibliothek von Inventor. Wenn du die Klasse BOM markierst siehst du unter Elemente von 'BOM' die enthaltenen Objekte (Subs, Funktionen, Klassen, Events, elementare Datentypen) Falls du dich wunderst woher VBA hier überhaupt Zugriff auf Inventor hat: Da es der VBA Editor von Inventor ist, wurde es so voreingestellt. Unter Extras→Verweise findest du "Autodesk Inventor Object Library". Unter Excel wurde der VBA Editor so eingestellt, dass man direkt Zugriff auf Excel hat, bei Outlook für Outlook usw. Gruß [Diese Nachricht wurde von Tacker am 16. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 20. Jul. 2018 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Hier mein Versuch, das Problem etwas weiter in Richtung einer Lösung zu bringen. Es ist enthalten: "Bestandsnummer" auslesen BOM-Zeilen in ein Array zu schreiben das Array zu sortieren den Inhalt in ein CSV-File zu schreiben In den Subs BOMQuery und QueryBOMRowProperties habe ich versucht, eingefügte Codeblöcke mit '-> einzuleiten, das meiste sollte unverändert sein. Code:
Option Explicit ' '-> Variablen Private gaStr_CSV() As String 'g: global a: Array Str: String ' ' Benötigte API-Deklaration ' für Sub QuickSort_s Private Declare PtrSafe Sub CopyMemoryPtr Lib "kernel32" _ Alias "RtlMoveMemory" ( _ ByVal DestPtr As LongPtr, _ ByVal SourcePtr As LongPtr, _ ByVal Bytes As Long) ' KraBBy: PtrSafe hinzu, DestPtr und SourcePtr umdeklariert von Long zu LongPtr 'Public Sub BOMQuery() ' Set a reference to the assembly document. ' This assumes an assembly document is active. Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Dim FirstLevelOnly As Boolean If MsgBox("First level only?", vbYesNo) = vbYes Then FirstLevelOnly = True Else FirstLevelOnly = False End If ' Set a reference to the BOM Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM ' Set whether first level only or all levels. If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else oBOM.StructuredViewFirstLevelOnly = False End If ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Strukturiert") Debug.Print "Item"; Tab(15); "Quantity"; Tab(30); "Part Number"; Tab(70); "Description" Debug.Print "----------------------------------------------------------------------------------" '-> initialize Array für Header (Kopfzeile) Dim sHeaderCSV(1) As String sHeaderCSV(0) = "Stock Number; Part Number; Item; Quantity; Description" sHeaderCSV(1) = "----------------------------------------------------------------------------------" '-> init Array mit Listeneinträgen ReDim gaStr_CSV(0) 'Initialize the tab for ItemNumber Dim ItemTab As Long ItemTab = -3 'Elemente der BOM durcharbeiten, rekursiv Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab) '-> Array mit den BOM-Einträgen sortieren 'Call QuickSort_s(gaStr_CSV) Call QuickSort(gaStr_CSV) 'gibt es Unterschiede im Ergebnis der beiden Algorithmen? '-> Datei schreiben Dim str_CSVdatei As String str_CSVdatei = "C:\temp\Test.csv" Call Write2File(str_CSVdatei, gaStr_CSV, sHeaderCSV) '-> Datei öffnen Dim ws As Object Set ws = CreateObject("WScript.Shell") 'Umweg, weil ich es mit dem integrierten Shell-Befehl nicht geschafft hab ws.Run Chr(34) & str_CSVdatei & Chr(34) 'öffnet die geschriebene Datei mit der in Windows zugeordneten Anwendung Set ws = Nothing 'Aufräumen End Sub Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long) ItemTab = ItemTab + 3 ' Iterate through the contents of the BOM Rows. Dim i As Long For i = 1 To oBOMRows.Count ' Get the current row. Dim oRow As BOMRow Set oRow = oBOMRows.Item(i)
'Set a reference to the primary ComponentDefinition of the row Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) Dim oPartNumProperty As Property Dim oDescripProperty As Property '-> hinzu Property "Bestandsnummer" Dim oStockNoProp As Property If TypeOf oCompDef Is VirtualComponentDefinition Then 'Get the file property that contains the "Part Number" 'The file property is obtained from the virtual component definition Set oPartNumProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value ' -> hinzu Set oStockNoProp = oCompDef.PropertySets.Item("Design Tracking Properties").Item("Stock Number") Call writeLine2Array(oStockNoProp.Value & ";" & oPartNumProperty.Value & ";" & oRow.ItemNumber & ";" _ & oRow.ItemQuantity & ";" & oDescripProperty.Value) Else 'Get the file property that contains the "Part Number" 'The file property is obtained from the parent 'document of the associated ComponentDefinition. Set oPartNumProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value '-> hinzu Set oStockNoProp = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Stock Number") Call writeLine2Array(oStockNoProp.Value & ";" & oPartNumProperty.Value & ";" & oRow.ItemNumber & ";" _ & oRow.ItemQuantity & ";" & oDescripProperty.Value) 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call QueryBOMRowProperties(oRow.ChildRows, ItemTab) End If End If Next ItemTab = ItemTab - 3 End Sub Private Sub Write2File(strFile As String, ByRef strData() As String, ByRef strHeader() As String) 'Schreibt den Inhalt eines Strings in eine neue Datei Dim i As Long 'Zähler für Schleife Dim ret As VbMsgBoxResult 'Existiert die Datei bereits? If "" = Dir(strFile) Then 'alles gut, unten gehts weiter Else ret = MsgBox(strFile & vbCrLf & "Datei existiert bereits." _ & String(2, vbCrLf) & "Überschreiben?", vbYesNo + vbQuestion, "Sub Write2File") If vbYes = ret Then Kill strFile 'Datei löschen Else MsgBox "Keine Datei erstellt.", vbOKOnly, "Abgebrochen" Exit Sub End If End If ' Datei erstellen und befüllen Dim F F = FreeFile 'liefert nächsten freien Index On Error GoTo ErrHandler Open strFile For Output As #F On Error GoTo 0 'Schleife durch String-Arrays - Header For i = LBound(strHeader) To UBound(strHeader) Print #F, strHeader(i) 'Alternativ Write Next 'i 'Inhalt For i = LBound(strData) To UBound(strData) Print #F, strData(i) Next 'i Close #F 'Datei schließen On Error GoTo 0 Exit Sub 'Fehlerbehandlung ErrHandler: MsgBox Err.Description, vbCritical, Err.Number End Sub Private Sub writeLine2Array(strElement As String) ' fügt dem bestehenden Array ein weiteres Element hinzu ' wird am Ende angehängt ' gaStr_CSV globale Variable (Modulebene) Dim idx As Long On Error Resume Next idx = UBound(gaStr_CSV) 'derzeit höchster Index ' liefert einen Fehler, falls Array noch nicht initialisiert ist If Not 0 = Err.Number Then 'Array ist noch leer Err.Clear ReDim gaStr_CSV(0) idx = 0 ElseIf 0 = idx And "" = gaStr_CSV(0) Then 'Array ist initialisiert, aber noch leer idx = 0 '-> erster Index wird benutzt/gefüllt Else 'Standardfall, Array hat schon Inhalte idx = idx + 1 'künftig höchster Index ReDim Preserve gaStr_CSV(idx) 'Array um 1 vergrößern End If On Error GoTo 0 gaStr_CSV(idx) = strElement 'höchsten Index befüllen End Sub ' Sortieralgorithmus QuickSort_s speziell für Strings ' https://www.vbarchiv.net/tipps/details.php?id=959 ' 'hierzu gehört auch die Deklaration CopyMemoryPtr im Modul ganz oben ' Public Sub QuickSort_s(ByRef vSort() As String, _ Optional ByVal lngStart As Variant, _ Optional ByVal lngEnd As Variant) ' Wird die Bereichsgrenze nicht angegeben, ' so wird das gesamte Array sortiert If IsMissing(lngStart) Then lngStart = LBound(vSort) If IsMissing(lngEnd) Then lngEnd = UBound(vSort) Dim i As Long Dim j As Long Dim X As String Dim n As Long Dim nPtr As LongPtr 'KraBBy: war Long On Error Resume Next i = lngStart: j = lngEnd n = ((lngStart + lngEnd) \ 2) X = vSort(n) ' Array aufteilen Do Do While (StrComp(vSort(i), X, vbTextCompare) = -1): i = i + 1: Loop Do While (StrComp(vSort(j), X, vbTextCompare) = 1): j = j - 1: Loop If (i <= j) Then ' Wertepaare miteinander tauschen nPtr = StrPtr(vSort(i)) CopyMemoryPtr VarPtr(vSort(i)), VarPtr(vSort(j)), Len(nPtr) CopyMemoryPtr VarPtr(vSort(j)), VarPtr(nPtr), Len(nPtr) i = i + 1: j = j - 1 End If Loop Until (i > j) ' Rekursion (Funktion ruft sich selbst auf) If (lngStart < j) Then QuickSort_s vSort, lngStart, j If (i < lngEnd) Then QuickSort_s vSort, i, lngEnd On Error GoTo 0 End Sub ' QuickSort-Algorithmus, allgemein: DatenTyp Variant ' https://www.vbarchiv.net/tipps/details.php?id=372 ' ' vSort() : zu sortierendes Array ' lngStart, lngEnd: zu sortierender Bereich ' ========================================== Public Sub QuickSort(vSort As Variant, _ Optional ByVal lngStart As Variant, _ Optional ByVal lngEnd As Variant) ' Wird die Bereichsgrenze nicht angegeben, ' so wird das gesamte Array sortiert If IsMissing(lngStart) Then lngStart = LBound(vSort) If IsMissing(lngEnd) Then lngEnd = UBound(vSort) Dim i As Long Dim j As Long Dim h As Variant Dim X As Variant i = lngStart: j = lngEnd X = vSort((lngStart + lngEnd) / 2) ' Array aufteilen Do While (vSort(i) < X): i = i + 1: Wend While (vSort(j) > X): j = j - 1: Wend If (i <= j) Then ' Wertepaare miteinander tauschen h = vSort(i) vSort(i) = vSort(j) vSort(j) = h i = i + 1: j = j - 1 End If Loop Until (i > j) ' Rekursion (Funktion ruft sich selbst auf) If (lngStart < j) Then QuickSort vSort, lngStart, j If (i < lngEnd) Then QuickSort vSort, i, lngEnd End Sub
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 25. Jul. 2018 15:35 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Tacker: wie hast du den Code modifiziert? Konnte nicht nachstellen wie in der Zeile ein Fehler auftritt. Ist eine Baugruppe geöffnet?
Ich hatte die erste Zeile "Public Sub BOMQuery()" in "Public Sub Btn_Stuecklistenerstellung_Click()" umbenannt. Sonst nichts weiter. Eine Baugruppe ist natürlich stets geöffnet. Danke für die ausführlichen Erläuterungen. habe jetzt mal den Code von KraBBy verwendet. Danke dafür. Ich habe es gestern auch gleich ausprobiert und es hat funktioniert , aber heute kam dann die Ernüchterung :-( . Es wollte einfach nicht mehr funktionieren, trotz dass ich keine Änderungen vorgenommen habe. Code:
' Set whether first level only or all levels. If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else oBOM.StructuredViewFirstLevelOnly = False End If
In diesen Zeilen bekomme ich den Fehler. Je nachdem ob ich in dem erscheinenden Auswahlfenster ja oder nein klicke. In der Fehlermeldung sagt er mir nur "Run-time error '5':Invalid procedure call or argument". Den Fehler hatte ich auch schon beim Code von Tacker. ------------------
Du bist die Aufgabe - Franz Kafka
[Diese Nachricht wurde von Honigbär am 25. Jul. 2018 editiert.] [Diese Nachricht wurde von Honigbär am 25. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 26. Jul. 2018 08:56 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Den einen Tag funktioniert es, den nächsten nicht? Auf dem selben Rechner? Bei der selben Baugruppe geöffnet? Das ist schwer nachzuvollziehen. Setz mal bitte einen Haltepunkt in die Zeile "If FirstLevelOnly Then" (Cursor in die Zeile setzen und F9 drücken, Zeile wird dann rot markiert). Wenn der Code das nächste mal gestartet wird, läuft er nur bis zum Haltepunkt und wird dort angehalten. Dann kannst du die Variable oBom markieren und im Kontextmenü "Add Watch" aufrufen. Spätesten dann sollte ein Fenster "Watches" erscheinen, da kann man 'in die Variablen schauen'. Vielleicht hilft uns das irgendwie weiter. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 26. Jul. 2018 09:59 <-- editieren / zitieren --> Unities abgeben:
Moin, Zitat: Original erstellt von KraBBy: Den einen Tag funktioniert es, den nächsten nicht? Auf dem selben Rechner? Bei der selben Baugruppe geöffnet?Das ist schwer nachzuvollziehen.
So ist es. Von heute auf morgen kam der Fehler. Ja auf demselben Rechner. Ob es dieselbe Baugruppe war bin ich mir nicht mehr so sicher. Es soll am Ende ja bei jeder Baugruppe funktionieren. Deswegen habe ich diesen Punkt nicht berücksichtigt. Ich habe das mit dem Watches jetzt gemacht, aber ich kann da nichts erkenntnisreiches rauslesen. Wo muss ich da jetzt genau hinschauen, um einen möglichen Fehler zu finden? ------------------ Du bist die Aufgabe - Franz Kafka [Diese Nachricht wurde von Honigbär am 26. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 26. Jul. 2018 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Klar soll es am Ende für alle Bgr. funktionieren, aber zur Eingrenzung des Problems solltest Du bitte darauf achten wo es funktioniert und wo nicht. Das Bild sagt mir, dass die Variable oBom auf ein Objekt verweist (weil die untergeordneten Elemente vorhanden sind). Dort sieht man auch die Eigenschaft .StructuredViewFirstLevelOnly die wir schalten wollen (wobei dann aber der Fehler auftritt). Sieht i.O. aus. Kanns mir damit leider nicht erklären. Versuch bitte mal den Code laufen zu lassen, wenn die beiden Zeilen mit oBom.StructuredViewFirstLevelOnly auskommentiert sind. Dann sehen wir, ob der Rest durchläuft. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 27. Jul. 2018 11:02 <-- editieren / zitieren --> Unities abgeben:
Okay, ich achte jetzt darauf immer dieselbe Baugruppe zu verwenden. Ich habe die Zeilen jetzt auskommentiert und erhalte leider ein paar Zeilen später dieselbe Fehlermeldung wieder
Code: Set oBOMView = oBOM.BOMViews.Item("Strukturiert")
Nützt es was wenn ich die ivb-Datei hochlade? ------------------ Du bist die Aufgabe - Franz Kafka [Diese Nachricht wurde von Honigbär am 27. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 27. Jul. 2018 11:07 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Ist evtl. eine Detailgenauigkeit in der BGR aktiv? Oder ist eine andere BGR oder idw geöfnet, die in der eine Detailgenauigkeit aktiv ist? Das führt zuweilen zu Merkwürdigkeiten u.a. im Zusammenhang mit der Stücklistenausgabe... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 27. Jul. 2018 11:48 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Zitat: Original erstellt von Honigbär: Nützt es was wenn ich die ivb-Datei hochlade?
Aus meiner Sicht eher nein. Ich gehe davon aus, dass das kopieren und einfügen geklappt hat Mehr würde mich eine Baugruppe interessieren, bei der es nicht funktioniert. Ggf. auch im Hinblick auf den post von bkrüger. Ist die SysInfo noch korrekt? IV2014? evtl. liegt ein Thema mit den Versionen vor (ich kann nur IV2016 testen)
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Honigbär Mitglied Angestellter
Beiträge: 158 Registriert: 22.10.2006 CATIA V5 R24 Solid Edge Version 17 Pro-E Wildfire 4.0 Autodesk Inventor Professional 2014 MathCAD 13 Intel Centrino 2 (Pentium III Xeon) 2,53 GHz 6GB RAM Win 7 Ultimate (64 Bit) ATI Mobility Radeon HD 4650 SSD von Samsung (Festplatte)
|
erstellt am: 27. Jul. 2018 12:57 <-- editieren / zitieren --> Unities abgeben:
Irgendwie ist doch aber immer eine Detailgenauigkeit aktiv oder nicht? Ich wüsste nicht wie ich den Haken bei Detailgenauigkeit loswerden sollte. Genauso wie es mit Ansicht (zwei Zeilen darüber) der Fall ist. Eine Ansicht ist immer aktiv. Ich habe mal von "Detailgenauigkeit1" auf die Detailgenauigkeit "Hauptansicht" umgeschaltet und den Code nochmal ausgeführt. Und siehe da, es funktioniert. Seltsam. Die Detailgenauigkeit1 muss aber sein, weil ich einige Unterbaugruppen unterdrückt habe (die dienen als Hilfskomponenten im Gesamtmodell). Den Zustand von Detailgenauigkeit1 als Stückliste zu exportieren ist wohl nicht möglich? Falls nein, wie schalte ich dann per VBA Befehl in "Hauptansicht" um und in die zuletzt aktive Detailansicht wieder zurück? Ich habe Inventor 2017 und 2018. An der Version wird es nicht liegen. ------------------
Du bist die Aufgabe - Franz Kafka Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 27. Jul. 2018 14:55 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Auf die Schnelle.... Nur soviel: Ich hab schon Schreibtischkanten zerbissen wegen den sch. LODs (level of detail). Ich hatte dann aufegegben, indem ich vor der Ausgabe der Stückliste auf Hauptansicht umschalte. Hauptansicht einschalten:
Code:
Call ThisApplication.ActiveDocument.ComponentDefinition.RepresentationsManager.LevelOfDetailRepresentations.Item(1).Activate
Wenn man wieder zurück will, muss man vorher die aktive LOD (deren Index oder Name) ermitteln, die speichern und dann wieder aktvieren. Der Name der aktiven LOD:
Code:
'aktive LOD: ThisApplication.ActiveDocument.ComponentDefinition.RepresentationsManager.ActiveLevelOfDetailRepresentation.name
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bkrüger Mitglied Konstrukteur
Beiträge: 51 Registriert: 14.09.2014 Win10 IV2018 Vault2018-WG
|
erstellt am: 27. Jul. 2018 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Nochmal wg. Bauteile/Baugruppen unterdrücken: Mittels LOD geht das doch eigentlich nicht? Ich sehe jedenfalls die unterdrückten BT/BGR sehr wohl in der Stückliste... Zuweilen weigert sich die DIVA überhaupt die Stückliste einer iam auszugeben, wenn ein LOD aktiviert ist (da kommen fadenscheinige Ausreden wie "Baugruppe muss erst gespeichert werden" - was aber nichts bringt....) Wir verwenden zum Unterdrücken diverser Hilfselemente das Stücklistenattribut "Phantom". Das wiederum hat (u.a. weil es eine Dateieigenschaft ist) andere Nachteile. Wie die Zeit vergeht: Ich habe schon geraume Zeit den IV2018 (muss mal mein Profil anpassen) - aber beim 17er waren genannte Umstände grundsätzlich auch nicht anders. Wo sich der 18er vom 17er bzgl. BOM-Ausgabe unterscheidet: beim 18er geht das Laden von XML-Stücklistenvorlagen (was vom 17er noch kommentarlos ignoriert wurde). Die Spalten werden - glaube ich - aber immer noch nicht in korrekter Reihenfolge (sondern in der alphabetischen der engl. Spalten-Originalbezeichnungen) ausgegeben...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 27. Jul. 2018 22:26 <-- editieren / zitieren --> Unities abgeben: Nur für Honigbär
Auch ich bin der Meinung, dass mit LoD sich die Stückliste nicht beeinflussen lässt. Wenn man sich die Hilfe ansieht, ist es primär dafür gedacht, Baugruppen einfach zu halten (Stichwort Ersatzdarstellung). Ansichten machen der Hinsicht (Hilfskonstruktionen ausblenden) mindestens weniger (oder keine?) Probleme. Um die Stückliste passend zu halten, lässt sich auch 'Referenz' verwenden. Das ist dann auch nicht zwingend eine Bauteil-Eigenschaft sondern kann auch am Exemplar hängen. Außerdem lässt sich die Teileliste auf der Zeichnung z.b. auch nach Sichtbarkeit filtern (auch nicht perfekt, mitunter gefährlich, ich weiß) Natürlich lässt sich euer Vorgehen nicht besonders gut aus der Ferne beurteilen. Aber vielleicht ist es einen Versuch wert, es mal ohne LoD zu versuchen. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|