Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Kampf mit Array!

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Kampf mit Array! (807 mal gelesen)
Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 16. Aug. 2021 14:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

ich bin als VBA-Programmierneuling dabei mir ein VBA-Programm zu schreiben, dass die Anzahl an unterschiedlichen Gewinden und die Gesamtanzahl an Gewinden in eine Excel-Tabelle schreiben soll.

Die Gewindeeigenschaften hole ich mir aus der ComponentDefinition und das Exportieren nach Excel funktioniert auch bereits sehr gut. Allerdings hapert es momentan an der Weiterverarbeitung der Daten aus den ComponentDefinitions. Hier arbeite ich mit einem Array, in das in die Spalte 1 der Gewindedurchmesser und in Spalte 2 die Gewindesteigung eingetragen werden. Im nächsten Schritt sollen nun alle Werte an Durchmessern und Steigungen miteinander verglichen werden und hier komme ich partout nicht weiter. Bisher vergleiche ich immer eine Zeile mit der nächsten und ein Zähler wird bei ungleichen Inhalten um 1 erhöht. Allerdings ist dieses Vorgehen bei einer immer wieder unterschiedlichen Anzahl an Einträgen schwer zu beschreiben.

Ich habe bereits stundenlang erfolglos gegoogelt und ausprobiert, aber nichts passendes gefunden oder aber falsch gesucht.... auf jeden Fall komme ich nicht weiter und bin für jeden Hinweiß dankbar.

Hier der Codeausschnitt:
j = 0
k = 0
o = 1

For Each Item In oCompDef.Features.HoleFeatures
    If Item.Tapped = True Then                  ' Tapped beschreibt ob ein Gewinde in der Bohrung ist
   
    Gewinde(1, j) = Item.TapInfo.NominalSize    ' Gewindedurchmesser
    Gewinde(2, j) = Item.TapInfo.Pitch          ' Gewindesteigung
   
   
    j = j + 1                                    ' j steigt mit jeder Gewindebohrung um 1 (es kann sein, dass die Funktion Gewindeborhung mehrere Gewinde erzeugt!
    k = k + Item.SideFaces.Count                ' Anzahl der Gewindebohrungen insg. | Angabe SideFaces stimmt "zufällig" mit Anzahl der Bohrungen überein...

    End If
 
Next

p = 1
           
For p = 1 To 100                                       
    If Gewinde(1, p) <> Gewinde(1, p + 1) Then          ' Wenn Gewindedurchmesser zweier Zeilen unterscheidlich ist dann o um 1 erhöhen
        o = o + 1                                                                             
   
    End If
   
    If Gewinde(1, p) = Gewinde(1, p + 1) Then
        If Gewinde(2, p) <> Gewinde(2, p + 1) Then      ' Wenn Gewindedurchmesser zweier Zeilen gleich, jedoch die Gewindesteigung unterschiedlich ist, dann auch o um 1 erhöhen
            o = o + 1                                 
        End If
    End If
   
    p = p + 1

Next

Vielen Dank im Voraus 
Viele Grüße
Chris
 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 17. Aug. 2021 10:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

Unten mein Vorschlag. Ich habe das Array "Gewinde" etwas verändert. Es enthält die Gewindebezeichnung (ggf. inkl. Steigung, abhängig von der Gewindetabelle) und die zugehörige Anzahl Flächen (die der Anzahl Bohrungen entsprechen sollte). Bei jedem HoleFeature wird geprüft, ob das Gewinde bereits im Array enthalten ist. Entweder der Zähler erhöht oder ein neuer Eintrag hinzugefügt.

Ganz allgemein wäre mein Tipp:
Option Explicit    ' ganz oben ins Modul
Damit wird die Deklaration der Variablen erzwungen. Tippfehler bei Namen von Variablen fallen dann gleich auf.

Code:
Sub Count_Threads_Test()

    '--- KraBBy
    Dim oCompDef As ComponentDefinition
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
   
    Dim item As HoleFeature
   
   
    Dim Gewinde()
    ReDim Gewinde(1 To 2, 0)
    ' Array Gewinde (1 , x ) : Gewinde (String) z.B. "M4x0,7"
    '              (2 , x ) : Anzahl Flächen (Long)
    ' (könnte erweitert werden, falls z.b. NominalSize noch nötig wäre)
   
    Dim oThreadInfo As ThreadInfo
    Dim sGewName As String
   
    '----

j = 0
k = 0
o = 1

For Each item In oCompDef.Features.HoleFeatures
    If item.Tapped = True Then                  ' Tapped beschreibt ob ein Gewinde in der Bohrung ist
       
        Set oThreadInfo = item.TapInfo
        sGewName = oThreadInfo.CustomThreadDesignation  'Gewindename, z.B. "M4x0,7"
        'ich habe das verwendet, um später nicht zusätzlich die Steigung vergleichen zu müssen, sondern gleich "alles in einem"
        ' (wobei hier alles andere z.B. RH / LH nicht unterschieden werden)
       
        Call Gewinde_hinzu(Gewinde, sGewName, item.SideFaces.Count)
       
 
    'Gewinde(1, j) = item.TapInfo.NominalSize    ' Gewindedurchmesser
    'Gewinde(2, j) = item.TapInfo.Pitch          ' Gewindesteigung
    '[KraBBy] .Pitch lieferte bei meinem Test ~manchmal einen Fehler. Habe ich nicht verstanden...
   
    j = j + 1                                    ' j steigt mit jeder Gewindebohrung um 1 (es kann sein, dass die Funktion Gewindeborhung mehrere Gewinde erzeugt!
    k = k + item.SideFaces.Count                ' Anzahl der Gewindebohrungen insg. | Angabe SideFaces stimmt "zufällig" mit Anzahl der Bohrungen überein...

    End If

Next

p = 1
         
'For p = 1 To 100
'    If Gewinde(1, p) <> Gewinde(1, p + 1) Then          ' Wenn Gewindedurchmesser zweier Zeilen unterscheidlich ist dann o um 1 erhöhen
'        o = o + 1
'
'    End If
'
'    If Gewinde(1, p) = Gewinde(1, p + 1) Then
'        If Gewinde(2, p) <> Gewinde(2, p + 1) Then      ' Wenn Gewindedurchmesser zweier Zeilen gleich, jedoch die Gewindesteigung unterschiedlich ist, dann auch o um 1 erhöhen
'            o = o + 1
'        End If
'    End If
'
'    p = p + 1
'
'Next


End Sub

Private Sub Gewinde_hinzu(ByRef ArrGewinde(), sGewName As String, lCount As Long)
'prüft ob das gegebene Gewinde bereits im Array vorhanden ist
'  JA      : vorhandener Zähler für Bohrungsanzahl wird erhöht
'  NEIN    : Array wird vergrößert und das Gewinde kommt als  neuer Eintrag hinzu

    Static bInit As Boolean  'beim ersten Aufruf auf True; Static: bleibt über alle Aufrufe des Sub erhalten
   
    Dim i As Integer, bVorh As Boolean
    bVorh = False
    For i = 0 To UBound(ArrGewinde, 2)
        If sGewName = ArrGewinde(1, i) Then
            'Gewinde ist bereits in der Liste
            bVorh = True
            ArrGewinde(2, i) = ArrGewinde(2, i) + lCount 'Zähler erhöhen
            Exit For
        End If
    Next i
   
    Dim iNeu As Integer
    If Not bVorh Then
    ' Gewinde ist noch nicht in der Liste enthalten
       
        iNeu = UBound(ArrGewinde, 2)    'Anzahl vorh. Einträge in der Liste
        If Not bInit Then
            'erster Aufruf
            bInit = True
            'Array muss nicht vergrößert werden (weil oben bereits mit ( , 0) initialisiert, also 1 Zeile vorhanden ist)
        Else
            'wiederholter Aufruf: Array vergrößern
            iNeu = iNeu + 1
            ReDim Preserve ArrGewinde(LBound(ArrGewinde, 1) To UBound(ArrGewinde, 1), iNeu)
            'Array vergrößern, damit für das neue Gewinde "Platz" ist, Preserve behält die vorh. Einträge
            'erste Dimension bleibt unverändert
        End If
       
        'Eintrag hinzu
        ArrGewinde(1, iNeu) = sGewName
        ArrGewinde(2, iNeu) = lCount
       
    Else 'nix zu tun (bzw. oben schon erledigt)
    End If
   
End Sub


------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 17. Aug. 2021 15:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Krabby,

vielen Dank für deine Mühen 

Ein paar Fragen hätte ich allerdings noch, da nun wieder neue Herausforderungen aufgetaucht sind:

Ich versuche gerade mir die Anzahl an unterschiedlichen Gewinden in eine Variable zu schreiben, sodass ich diese dann in Excel übergeben kann. Aber ich schaffe es irgendwie nicht mir die Anzahl aus dem Array zu holen 

Außerdem Frage ich mich, warum du den Code nicht in eine Sub geschrieben hast? Verkompliziert dies die ganze Sache nicht, da man nun die verschiedenen Variablen und Daten erst übergeben muss und man bspw. die Anzahl an unterschiedlichen Gewinden nicht wieder in die vorangegangene Sub bekommt?

Gruß Chris

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 17. Aug. 2021 17:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

Die Anzahl verschiedener Gewinde entspricht der Anzahl Elemente im Array. Also am Ende vom ersten Sub z.B. ergänzen:
Code:
iVerschGewinde = UBound(Gewinde, 2)+1    'Anzahl vorh. Einträge in der Liste (bzw. 2. Dimension vom Array)

+1 weil die das Array bzw. der Index mit 0 startet und UBound den höchsten Index liefert.


Das mit der Aufteilung vom Code in mehrere Subs ist zum Teil Geschmacksache. Hier ist der Vorteil mE die bessere Lesbarkeit: Der Code innerhalb der ersten For-Schleife wäre recht lang. Er enthält selbst eine weitere Schleife, da wird es schnell unübersichtlich.

Ein weiterer Punkt ist das Testen von einzelnen Funktionen/Codestücken (hier wohl weniger zutreffend). Oft lässt sich ein relativ einfacher Test-Aufruf für das Sub schreiben. Damit kann man für verschiedene Input-Daten ausprobieren, ob das gewünschte Ergebnis geliefert wird.

Im Allgemeinen ist auch die Wiederverwendung von Code leichter möglich durch eine entsprechende Aufteilung. Z.B. das Lesen und Schreiben von iProperties habe ich in eigenen Funktionen (zusammen kopiert). Darin werden die verschiedenen Möglichkeiten abgearbeitet (prüfen, ob das iProperty existiert, ggf. erstellen etc.).

An eine neue Idee für ein Makro gehe ich auch meist so heran, mir einen Ablauf aus mehreren Teil-Lösungen zusammen zu stellen. Ein Beispiel hier https://ww3.cad.de/foren/ubb/Forum50/HTML/038791.shtml#000011

------------------
Gruß KraBBy

[Diese Nachricht wurde von KraBBy am 17. Aug. 2021 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 18. Aug. 2021 13:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank! Jetzt klappt es. Tatsächlich habe ich es auch so probiert, allerdings das falsche Array in der falschen Sub genommen   ...

Ggf. kannst du mir auch bei einem anderen Problem helfen, ist vermutlich für erfahrene User nur eine Kleinigkeit. In einem weiteren Schritt möchte ich die Kantenlängen aller Kanten eines Bauteils ermitteln. Ich bekomme in folgendem Code in Zeile "Diff_x = ..." immer den Laufzeitfehler 91, also Objektvariable nicht deklariert und bin am verzweifeln!

Public Sub Length_Edges()

    Dim oCompDef As ComponentDefinition
   
    Dim item As SurfaceBody
    Dim item1 As Edge
    Dim Diff_x As Double
    Dim Diff_y As Double
    Dim Diff_z As Double
    Dim Length As Double
   
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
          
    For Each item In oCompDef.SurfaceBodies
        For Each item1 In item.Edges
           Diff_x = item1.Evaluator.RangeBox.MaxPoint.X - item1.Evaluator.RangeBox.MinPoint.X
           Diff_y = item1.Evaluator.RangeBox.MaxPoint.Y - item1.Evaluator.RangeBox.MinPoint.Y
           Diff_z = item1.Evaluator.RangeBox.MaxPoint.Z - item1.Evaluator.RangeBox.MinPoint.Z
          
           Length = Length + Sqr(Diff_x ^ 2 + Diff_y ^ 2 + Diff_z ^ 2)
        Next
    Next
   
    Debug.Print Length
End Sub

Als Zusatzinfo: Im Lokalfenster sehe ich schon, dass er mir das gewünschte Ergenbis ausspuckt, allerdings bekomme ich den oben beschriebenen Fehler nicht weg.

Vielen Dank wieder einmal
Gruß Chris

[Diese Nachricht wurde von Chris0804 am 18. Aug. 2021 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 18. Aug. 2021 16:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

Deinen Fehler konnte ich nicht reproduzieren. Dein Code lief in meinem Versuch durch. ( keine Ahnung ob es eine Edge gibt, die keine RangeBox besitzt. Oder hast Du in Deinem Versuchsmodell ein Body ohne Edges?)

Was Du aber aufaddierst sind ja nicht die Kantenlängen, sondern die Diagonalen der RangeBox um jede Kante. Abhängig von der Lage im Raum kommt da für die gleiche Kante was unterschiedliches raus. Unten mein Vorschlag.

Wofür wird diese Länge benötigt, wenn man fragen darf?

Code:
Public Sub Length_Edges_Vorschlag()

    Dim oCompDef As ComponentDefinition
 
    Dim oBody As SurfaceBody 'item
    Dim oEdge As Edge  'item1
    Dim Length As Double
    Dim dMinP As Double, dMaxP As Double
    Dim dL As Double
   
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
   
    For Each oBody In oCompDef.SurfaceBodies
        For Each oEdge In oBody.Edges
       
          With oEdge.Evaluator
                Call .GetParamExtents(dMinP, dMaxP)
                Call .GetLengthAtParam(dMinP, dMaxP, dL)    'Länge der Kurve wird nach dL geschrieben
          End With
         
          Length = Length + dL
        Next
    Next
 
    Debug.Print Length
   
End Sub


------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 19. Aug. 2021 07:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Das ist merkwürdig. Es kann natürlich sein, dass es entweder eine Edge gibt, die keine RangeBox besitzt oder ein Body ohne Edges... dazu bin ich leider nicht tief genug in der Materie, um das beantworten zu können.

Ich arbeite an einem Projekt in dem ich die Komplexität eines Bauteils automatisiert aus Inventor ermitteln möchte. Hierzu habe ich auch einen allgemeinen Thread gestartet (https://ww3.cad.de/foren/ubb/Forum258/HTML/001980.shtml). Die Idee ist, Fräs- und Drehteile in mehrere Komplexitätsstufen einzuordnen. Deshalb auch die Geschichte mit den Gewinden.

Das mit der Kantenlänge ist eine weitere Option bzw. ein Versuch, ob sich die Komplexität so abschätzen lässt.

Hast du zufällig eine Idee, wie man sich der Komplexität ansonsten nähern könnte?

Deinen Code habe ich getestet und bei manchen Bauteilen läuft er problemlos durch, bei anderen produziert er wieder den Laufzeitfehler 91. Diesen kann ich mittlerweile umgehen indem ich eine OnError GoTo eingefügt habe:

Code:
Public Sub Length_Edges_Vorschlag()
    Dim oCompDef As ComponentDefinition

    Dim oBody As SurfaceBody 'item
    Dim oEdge As Edge  'item1
    Dim Length As Double
    Dim dMinP As Double, dMaxP As Double
    Dim dL As Double
  
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  
    For Each oBody In oCompDef.SurfaceBodies
        On Error GoTo Naechstes
        For Each oEdge In oBody.Edges
                  
          With oEdge.Evaluator
                Call .GetParamExtents(dMinP, dMaxP)
                Call .GetLengthAtParam(dMinP, dMaxP, dL)    'Länge der Kurve wird nach dL geschrieben
          End With
          Length = Length + dL

        Next
Naechstes:
    Next

    Debug.Print Length
  
End Sub


Allerdings passt dann das Ergebnis nicht, da er anscheinend viele Kanten überspringt. Das ist mMn sehr unlogisch, da er ja eigentlich ganze Bodies überspingt und nicht nur einzelne Kanten, bei einem Body müsste er dann doch als Ergebnis 0 liefern oder steh ich da jetzt auf dem Schlauch?

------------------
Gruß
Chris

[Diese Nachricht wurde von Chris0804 am 19. Aug. 2021 editiert.]

[Diese Nachricht wurde von Chris0804 am 19. Aug. 2021 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 19. Aug. 2021 08:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Mittlerweile konnte ich herausfinden, dass der oEdge.Evaluator bei manchen Kanten den Wert Nothing besitzt, ab hier hat er dann das aufsummieren abgebrochen, da er zum nächsten Body springen wollte (der bei nur einem Body nicht vorhanden ist).

Deshalb habe ich die OnError-Behandlung wieder herausgenommen und durch eine If-Schleife ersetzt, die dann zur nächsten Edge springt:

Code:
Public Sub Length_Edges_Vorschlag()
    Dim oCompDef As ComponentDefinition

    Dim oBody As SurfaceBody 'item
    Dim oEdge As Edge  'item1
    Dim Length As Double
    Dim dMinP As Double, dMaxP As Double
    Dim dL As Double
  
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  
    For Each oBody In oCompDef.SurfaceBodies
        For Each oEdge In oBody.Edges
                  
          With oEdge.Evaluator
                If oEdge.Evaluator Is Nothing Then
                GoTo Naechstes
                Else
                Call .GetParamExtents(dMinP, dMaxP)
                Call .GetLengthAtParam(dMinP, dMaxP, dL)    'Länge der Kurve wird nach dL geschrieben
                End If
          End With
          Length = Length + dL

Naechstes:
        Next
    Next
Debug.Print Length
End Sub


Allerdings fehlen hier dann bei einigen Bauteilen bis zur Hälfte der Kanten. Gibt es ggf. noch eine andere Möglichkeit die Gesamtkantenlänge zu bestimmen?


------------------
Gruß
Chris

[Diese Nachricht wurde von Chris0804 am 19. Aug. 2021 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 19. Aug. 2021 09:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Chris0804:
Hast du zufällig eine Idee, wie man sich der Komplexität ansonsten nähern könnte?

Den Post habe ich gesehen. Da bin ich aber überfragt (keine großen Erfahrungen bei spanender Bearbeitung).
Vom Gefühl her eher skeptisch, das das mit vertretbarem Aufwand was werden kann. Du kannst evtl. das Zerspanvolumen abschätzen (solange du das Halbzeug triffst. Wenn Profile oder Rohre bearbeitet werden, stelle ich mir das schon schwierig vor. Auch werden die Bauteile nicht immer richtig im Koordinatensystem liegen...)
Beim Fräsen wird der kleinste Radius an Innengeometrien wichtig sein. Bestimmt gibt es Fälle, bei denen die Fräsergröße nicht durch einen Radius sondern durch Abstand zur Gegenüberliegenden Wand bestimmt wird. Was, wenn das Modell nicht passt, Innengeometrien nicht verrundet sind?
Muss umgespannt werden?
Sind feine Details enthalten, die Aufwand bedeuten?
Ist das Bauteil verzugsanfällig?
Sind Elemente gefordert, die nicht im Modell enthalten sind, z.B. Rändel?
(jetzt habe ich schon zuviel geschrieben, trotz Ahnungslosigkeit)
Kennst Du spanflug.de? (Soll keine Werbung sein. Ich bin dort weder angestellt noch Kunde.) Ich kenne nur die Homepage, aber das sieht für mich beeindruckend aus.
Zitat:

Deinen Code habe ich getestet und bei manchen Bauteilen läuft er problemlos durch, bei anderen produziert er wieder den Laufzeitfehler 91.


Kannst Du ein Beispiel mit Fehler hochladen?

Zitat:

Allerdings passt dann das Ergebnis nicht, da er anscheinend viele Kanten überspringt. Das ist mMn sehr unlogisch, da er ja eigentlich ganze Bodies überspingt und nicht nur einzelne Kanten, bei einem Body müsste er dann doch als Ergebnis 0 liefern oder steh ich da jetzt auf dem Schlauch?


Denke, Du stehst auf dem Schlauch  Du hast nur eine Summe 'Length'. Es wird auch kein Body übersprungen, sondern eher beim ersten Fehler abgebrochen. Die Längen der Kanten davor sind aber gezählt, auch die (funktionierenden) Kanten der ggf nachfolgenden Bodies werden dazu addiert. Da kommt also 'irgendwas' raus.
Vielleicht ist es sinnvoller, die Sprungmarke eine Zeile höher zu schieben. Vor das erste Next. Damit wird nur die eine Kante übergangen.

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 20. Aug. 2021 07:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Vom Gefühl her eher skeptisch, das das mit vertretbarem Aufwand was werden kann.

Es soll auch eher eine gröbere Abschätzung der Komplexität sein, sprich du hast drei (ggf. auch 5 oder noch mehr) Komplexitätsstufen in die die Bauteile eingruppiert werden.

Zitat:
Du kannst evtl. das Zerspanvolumen abschätzen (solange du das Halbzeug triffst. Wenn Profile oder Rohre bearbeitet werden, stelle ich mir das schon schwierig vor. Auch werden die Bauteile nicht immer richtig im Koordinatensystem liegen...)

Das mache ich auch schon, in dem ich die Rohvolumendifferenz bilde. Profile und Rohre werden hier eher weniger bearbeitet, fallen also als Sonderfälle eh raus und meistens liegen die Bauteile richtig im KOS.

Spanflug.de kenne ich, hier geht es um etwas sehr ähnliches 

Besteht die Möglichkeit dir ein Teil per Mail zu schicken? Würde es ungern hier halböffentlich hochladen.

------------------
Gruß
Chris

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 31. Aug. 2021 10:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

Hab Deine Beispiel-Datei erhalten. Die kritischen Kanten werden von den Bohrkegeln der Gewindebohrungen gebildet, vmtl. die Kegelspitze. Wenn man alle Sacklöcher auf "flach" umstellt, gibt es keine ungezählten Kanten. (so bin ich drauf gestoßen: wie viele Edges insgesamt, wie viele haben keinen .Evaluator; von was sind 12 Elemente in dem Beispiel...)

mE kann man also diese Kanten bedenkenlos überspringen, da sie keine Kantenlänge beitragen. (falls es nicht noch weitere Fälle gibt)

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Chris0804
Mitglied
Maschinenbauingenieur


Sehen Sie sich das Profil von Chris0804 an!   Senden Sie eine Private Message an Chris0804  Schreiben Sie einen Gästebucheintrag für Chris0804

Beiträge: 22
Registriert: 16.08.2021

Inventor 2019
Inventor 2020

erstellt am: 01. Sep. 2021 09:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ahh super. Ja, das ergibt Sinn. Gibt es die Möglichkeit diese im Quellcode zu überspringen, sodass ich am Modell nichts ändern muss?

------------------
Gruß
Chris

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 01. Sep. 2021 13:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Chris0804 10 Unities + Antwort hilfreich

hattest Du ja schon (fast). So sollte es gehen:

Code:
Public Sub Length_Edges_Vorschlag()
    Dim oCompDef As ComponentDefinition

    Dim oBody As SurfaceBody 'item
    Dim oEdge As Edge  'item1
    Dim Length As Double
    Dim dMinP As Double, dMaxP As Double
    Dim dL As Double

    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition

    For Each oBody In oCompDef.SurfaceBodies
        For Each oEdge In oBody.Edges

          With oEdge.Evaluator
                If oEdge.Evaluator Is Nothing Then
                    'nix tun (es geht weiter mit nächster Edge)
                Else
                    Call .GetParamExtents(dMinP, dMaxP)
                    Call .GetLengthAtParam(dMinP, dMaxP, dL)    'Länge der Kurve wird nach dL geschrieben
                    Length = Length + dL
                End If
          End With
        Next 'oEdge
    Next 'oBody
Debug.Print Length
End Sub



(Code ist ungetestet, nur im Editor getippt)

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz