| | | 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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 16. Aug. 2021 14:41 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 17. Aug. 2021 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 17. Aug. 2021 15:09 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 17. Aug. 2021 17:10 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 18. Aug. 2021 13:30 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 18. Aug. 2021 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 19. Aug. 2021 07:03 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 19. Aug. 2021 08:31 <-- editieren / zitieren --> Unities abgeben:
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 + dLNaechstes: 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
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 19. Aug. 2021 09:03 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 20. Aug. 2021 07:55 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 31. Aug. 2021 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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
Beiträge: 22 Registriert: 16.08.2021 Inventor 2019 Inventor 2020
|
erstellt am: 01. Sep. 2021 09:56 <-- editieren / zitieren --> Unities abgeben:
|
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 01. Sep. 2021 13:49 <-- editieren / zitieren --> Unities abgeben: Nur für Chris0804
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 >>)
|