Sortierung / Vergleich

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Goof.

    Sortierung / Vergleich

    Hallo zusammen,

    ich suche nach einer Möglichkeit alle Kreise, die einen gemeinsamen Mittelpunkt haben zu ermitteln. Das Problem ist, dass wir 2D Zeichnungen haben. Diese haben z.B. Zylindersenkungen. Mit dem folgenden Programm kann ich die Kreise in Bohrungen umwandeln.
    Wenn jedoch 2 Kreise mit unterschiedlichem Durchmesser am gleichen Punkt sind werden dann natürlich 2 Bohrungen erzeugt, was ich gerne vermeiden würde. Wie kann ich die gemeinsamen Kreise bzw. den inneren ermitteln?

    Quellcode

    1. Dim m_inventorApp As Inventor.Application = Nothing
    2. m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application")
    3. Dim oDoc As PartDocument
    4. oDoc = m_inventorApp.ActiveDocument
    5. Dim oSK As PlanarSketch
    6. oSK = oDoc.ComponentDefinition.Sketches(1)
    7. Dim objCol As ObjectCollection
    8. objCol = m_inventorApp.TransientObjects.CreateObjectCollection
    9. Dim oskarc As SketchArc
    10. For Each oskarc In oSK.SketchArcs
    11. objCol.Add(oskarc)
    12. Next
    13. Dim oskline As SketchLine
    14. For Each oskline In oSK.SketchLines
    15. objCol.Add(oskline)
    16. Next
    17. Dim oRadiusList As ArrayList = New ArrayList
    18. Dim oCircle As SketchCircle
    19. For Each oCircle In oSK.SketchCircles
    20. If oRadiusList.Contains(Math.Round(oCircle.Radius, 3)) = False Then
    21. oRadiusList.Add(Math.Round(oCircle.Radius, 3))
    22. End If
    23. Next
    24. Dim oCircleCol(oRadiusList.Count) As ObjectCollection
    25. Dim i As Integer
    26. For i = 0 To oRadiusList.Count
    27. oCircleCol(i) = m_inventorApp.TransientObjects.CreateObjectCollection
    28. Next
    29. Dim j As Integer
    30. For j = 0 To oRadiusList.Count - 1
    31. For Each oCircle In oSK.SketchCircles
    32. If Math.Round(oCircle.Radius, 3).ToString = oRadiusList.Item(j).ToString Then
    33. oCircleCol(j).Add(oCircle)
    34. End If
    35. Next
    36. Next
    37. Dim oP1 As Profile
    38. oP1 = oSK.Profiles.AddForSolid(False, objCol)
    39. Dim oD1 As ExtrudeDefinition
    40. oD1 = oDoc.ComponentDefinition.Features.ExtrudeFeatures.CreateExtrudeDefinition(oP1, PartFeatureOperationEnum.kNewBodyOperation)
    41. oD1.SetDistanceExtent("6 mm", PartFeatureExtentDirectionEnum.kNegativeExtentDirection)
    42. Dim oF2 As ExtrudeFeature
    43. oF2 = oDoc.ComponentDefinition.Features.ExtrudeFeatures.Add(oD1)
    44. 'Create hole feature for the rest center point of the circles
    45. Dim oTempCol As ObjectCollection
    46. oTempCol = m_inventorApp.TransientObjects.CreateObjectCollection
    47. Dim oPD As HolePlacementDefinition
    48. For i = 0 To oRadiusList.Count - 1
    49. oTempCol.Clear()
    50. Dim dDiameter As Double
    51. For Each oCircle In oCircleCol(i)
    52. oTempCol.Add(oCircle.CenterSketchPoint)
    53. Next
    54. dDiameter = oCircleCol(i).Item(1).Radius * 2
    55. oPD = oDoc.ComponentDefinition.Features.HoleFeatures.CreateSketchPlacementDefinition(oTempCol)
    56. Dim oHole As HoleFeature
    57. oHole = oDoc.ComponentDefinition.Features.HoleFeatures.AddDrilledByThroughAllExtent(oPD, dDiameter, PartFeatureExtentDirectionEnum.kPositiveExtentDirection)
    58. dDiameter = dDiameter * 10
    59. Next


    Vielen Dank für Eure Hilfe

    Goof

    Goof schrieb:

    Wie kann ich die gemeinsamen Kreise bzw. den inneren ermitteln?
    Was hat Dein Code damit zu tun?
    Der steht so allein ohne Input, da habe ich keine Lust, ihn mir anzusehen.
    Und
    Was ist "Inventor.Application"?
    ====
    Welchen Datentyp haben die Koordinaten?
    Bei Double musst Du testen, ob sie mit einer gewissen Toleranz gleich sind!
    Von wie vielen Bohrungen/Löchern und Koordinaten/Positionen reden wir hier?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Goof OK.
    Müssen auch z.B. Bohrungen mit verschiedenen Koordinaten aber gemeinsamer Hüllfläche (x=10, y=10, R=5 | x=9, y=9, R=2) behandelt werden?
    Was willst Du nun tuen?
    Alle Bohrungen gleicher Koordinaten zählen oder nur die Koordinaten auflisten?
    Aus den beiden Koordinatenwerten erstellst Du eine Point-Instanz, die packst Du in eine List(Of Point) oder ein Dictionary(Of Point, Integer).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht mir um Bohrungen wie z.B. X=10, Y20, R5 und R15. Wenn die Koordinaten unterschiedlich sind werden diese nicht behandelt. Dann wird eine Bohrung mit dem Durchmesser an der Stelle gesetzt.
    Mir sind die Koordinaten und der Radius wichtig

    X= 5, Y=10 |R5 ; R10
    X= 10, Y=200 |R2 ; R20

    Dann kann ich mit diesen Werten wieder Zylindersenkungen nach DIN setzen. esss.de/LBP_Werkstatt-Computer…Zylinderkopfschrauben.pdf
    Es wird dann der innere und der äußere Kreis mit der Tabelle verglichen und die Zylindersenkung gesetzt.

    Goof schrieb:

    Mir sind die Koordinaten und der Radius wichtig
    Dann mach Dir eine Klasse, die diese Werte als Property hält.
    Die Instanzen davon kannst Du in Listen packen, soetieren, usw., wenn Du es implenmentierst.
    Was hat das Problem mit dieser DIN zu tun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich wollte Dir nur zeigen, für was das ganze ist. Die DIN brauche ich um die entsprechenden Bohrungen zu ermitteln. D1 und Dh geben den äußeren und inneren Kreis an.

    Kannst Du mir bitte mit einem Beispiel helfen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Goof“ ()

    @Goof Und nun formuliere mal eine vernünftige Aufgabenstellung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    1. Es sollen alle Radien mit entsprechenden Koordinaten sortiert werden
      X= 5, Y=10 | R1,7
      X= 5, Y=10 | R3,2
      X= 10, Y=200 |R20
      X= 10, Y=200 |R20
    2. Alle Radien mit identischem X,Y Wert sollen ausgefiltert werden (sind immer 2 Radien / Durchmesser pro X,Y Wert)
      X= 5, Y=10 | R1,7 (Radius)
      X= 5, Y=10 | R3,2
    3. Diese 2 Radien / Durchmesser Werte sollen mit der DIN-Tabelle verglichen werden
      d = 3; dh = 3,4; t= 3,4; d1 = 6,5 (Durchmesser)
    4. und zum Schluss die richtige Zylindersenkung gesetzt werden.
    Hallo Goof,

    hast du denn schon die positionen der Kreise ermittelt? Wenn dann in welchem array hast du diese abgelegt?
    Finde nirgend etwas, was darauf hinweisen könnte.

    Gruß

    Edit:

    glaube habe es gefunden:

    in Zeile 69. Ist das korrekt?


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Goof schrieb:

    Es sollen alle Radien mit entsprechenden Koordinaten sortiert werden
    Nach x- oder y-Koordinate oder nach Radius?
    Bitte alles etwas präziser.
    Wer setzt die Senkung?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok,

    du musst vor zeile 69 einen neuen array mit den circlespoints erstellen.

    dim circlepoint as double(gehe mal davon aus das Inventor dir doubles ausgibt).
    circlepoint = oCircle.CenterSketchPoint
    for i1 = 0 to circlepoit.length
    debug.print cstr(circlepoint(i1))
    next

    dann schau dir mal an wie die doubles aussehen, in solidworks muss du die werte nochmal umrechnen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Der gezeigte Code ist mir zu undurchsichtig - lang, aber ohne Anfang und Ende. Egal. Also wenn mein Vorredner das Problem nicht gelöst hat, könnte ich einsteigen mit der Frage: Welchen Datentyp hat, was du als "Kreis" bezeichnest?
    Wenn es da noch nichts gibt, musste was erschaffen.
    Gibt es erstmal einen Datentyp für "Kreis", sollte es ein leichtes sein, alle Kreise einzulesen und nach Mittelpunkt zu gruppieren - wenn ich recht verstanden habe, ist das dein Anliegen..

    ErfinderDesRades schrieb:

    Welchen Datentyp hat, was du als "Kreis" bezeichnest?
    Siehe Post #2 ff. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So wird er auch vorgehen müssen @ErfinderDesRades.
    Alle koordinaten in ein array einlesen. Doppelte auswerfen. dann das koordinaten array zum erstellen der bohrungen nutzen und mit dem kreis array(oCircle) vergleichen(also die koordinaten). und wenn mehr als 2 kreise auf eine koordinate verweisen, diese mit der Normtabelle vergleichen und daraufhin die Bohrung erstellen.
    Bis jetzt habe ich das:

    Quellcode

    1. Dim dtb_ZylSenkung As New System.Data.DataTable
    2. dtb_ZylSenkung.Columns.Add("dh")
    3. dtb_ZylSenkung.Columns.Add("t")
    4. dtb_ZylSenkung.Columns.Add("d1")
    5. dtb_ZylSenkung.Rows.Add(3.4, 3.4, 6.5) '1
    6. dtb_ZylSenkung.Rows.Add(4.5, 4.4, 8) '2
    7. dtb_ZylSenkung.Rows.Add(5.5, 5.4, 10) '3
    8. dtb_ZylSenkung.Rows.Add(6.6, 6.4, 11) '4
    9. dtb_ZylSenkung.Rows.Add(9, 8.6, 15) '5
    10. dtb_ZylSenkung.Rows.Add(11, 10.6, 18) '6
    11. dtb_ZylSenkung.Rows.Add(13.5, 12.6, 20) '7
    12. Dim dvw_ZylSenkung As DataView = dtb_ZylSenkung.DefaultView
    13. Dim dtbSorted_ZylSenkung As DataTable = dvw_ZylSenkung.ToTable()
    14. DataGridView3.DataSource = dtbSorted_ZylSenkung
    15. Dim dtb As New System.Data.DataTable
    16. dtb.Columns.Add("X-Value")
    17. dtb.Columns.Add("Y-Value")
    18. dtb.Columns.Add("Radius")
    19. dtb.Rows.Add(0, 2, 4)
    20. dtb.Rows.Add(4, 11, 19)
    21. dtb.Rows.Add(8, 25, 15)
    22. dtb.Rows.Add(0, 30, 12)
    23. dtb.Rows.Add(0, 2, 2.25)
    24. dtb.Rows.Add(12, 35, 5.5)
    25. dtb.Rows.Add(12, 35, 3.3)
    26. dtb.Rows.Add(15, 89, 9)
    27. dtb.Rows.Add(2, 2, 12)
    28. Dim dvw As DataView = dtb.DefaultView
    29. dvw.Sort = "X-Value ASC, Y-Value ASC"
    30. Dim dtbSorted As DataTable = dvw.ToTable()
    31. DataGridView1.DataSource = dtbSorted
    32. Dim distinctTable As System.Data.DataTable = dtb.DefaultView.ToTable(True, "X-Value", "Y-Value")
    33. DataGridView2.DataSource = distinctTable


    Wie bekomme ich aber den Vergleich mit der 1. Tabelle hin?
    @Goof Welchen Typ haben die Einträge in den Spalten "dh", "t", "d1" bzw. "X-Value", "Y-Value", "Radius" :?:

    Gugst Du docs.microsoft.com/de-de/dotne…ng-columns-to-a-datatable
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Quellcode

    1. Dim dtb_ZylSenkung As New System.Data.DataTable
    2. dtb_ZylSenkung.Columns.Add("dh", Type.GetType("System.Double"))
    3. dtb_ZylSenkung.Columns.Add("t", Type.GetType("System.Double"))
    4. dtb_ZylSenkung.Columns.Add("d1", Type.GetType("System.Double"))
    5. dtb_ZylSenkung.Rows.Add(3.4, 3.4, 6.5) '1
    6. dtb_ZylSenkung.Rows.Add(4.5, 4.4, 8) '2
    7. dtb_ZylSenkung.Rows.Add(5.5, 5.4, 10) '3
    8. dtb_ZylSenkung.Rows.Add(6.6, 6.4, 11) '4
    9. dtb_ZylSenkung.Rows.Add(9, 8.6, 15) '5
    10. dtb_ZylSenkung.Rows.Add(11, 10.6, 18) '6
    11. dtb_ZylSenkung.Rows.Add(13.5, 12.6, 20) '7
    12. Dim dvw_ZylSenkung As DataView = dtb_ZylSenkung.DefaultView
    13. Dim dtbSorted_ZylSenkung As DataTable = dvw_ZylSenkung.ToTable()
    14. DataGridView3.DataSource = dtbSorted_ZylSenkung
    15. Dim dtb As New System.Data.DataTable
    16. dtb.Columns.Add("X-Value", Type.GetType("System.Double")) 'Int32
    17. dtb.Columns.Add("Y-Value", Type.GetType("System.Double"))
    18. dtb.Columns.Add("Radius", Type.GetType("System.Double"))
    19. dtb.Rows.Add(0, 2.29, 4)
    20. dtb.Rows.Add(4, 11, 19)
    21. dtb.Rows.Add(8, 25, 15)
    22. dtb.Rows.Add(0, 30, 12)
    23. dtb.Rows.Add(0, 2.29, 2.25)
    24. dtb.Rows.Add(12, 35, 5.5)
    25. dtb.Rows.Add(12, 35, 3.3)
    26. dtb.Rows.Add(15, 89, 9)
    27. dtb.Rows.Add(2, 2, 12)
    28. Dim dvw As DataView = dtb.DefaultView
    29. dvw.Sort = "X-Value ASC, Y-Value ASC"
    30. Dim dtbSorted As DataTable = dvw.ToTable()
    31. DataGridView1.DataSource = dtbSorted
    32. Dim distinctTable As System.Data.DataTable = dtb.DefaultView.ToTable(True, "X-Value", "Y-Value")
    33. DataGridView2.DataSource = distinctTable
    34. Dim cmpString As String = ""
    35. For Each row As DataRowView In dtb.DefaultView
    36. If row("Y-Value").ToString & row("X-Value").ToString = cmpString Then
    37. MessageBox.Show(row("X-Value").ToString & " " & row("Y-Value").ToString)
    38. End If
    39. cmpString = row("Y-Value").ToString & row("X-Value").ToString
    40. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Goof“ ()

    Goof schrieb:

    VB.NET-Quellcode

    1. Type.GetType("System.Double")
    machst Du besser

    VB.NET-Quellcode

    1. GetType(Double)
    .
    Wo liegt das Problem?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!