Solidworks API — Чтение данных из текстового файла

Я новичок в Solidworks API и VBA. Я создал текстовый файл, который содержит координаты вершин многих (например, 200) многоугольников, и я хочу рисовать простые 3D-объекты из этих данных. Я записал этот макрос в Solidworks для пятиугольника и попытался поставить в него цикл for, чтобы нарисовать свой 200-й пятиугольник в ряд. Я знаю, что мне нужно прочитать столбец вершин из моего текстового файла и использовать его в командах Part.SketchManager.CreateLine(x1, y1, z1, x2, y2, z2). но это не работает. Возникает много ошибок, что означает, что есть много вещей, которые я не знаю, чтобы запустить этот код, как я ожидаю.

если вы считаете, что я должен рассказать больше деталей, пожалуйста, скажите мне, чтобы ответить на вопрос!!!

' ******************************************************************************
' C:\Users\Abbas\AppData\Local\Temp\swx7040\Macro1.swb - macro recorded on 02/11/20 by Abbas
' ******************************************************************************
Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = _
Application.SldWorks

Set Part = swApp.NewDocument("C:\ProgramData\SolidWorks\SOLIDWORKS 2016\templates\Part.prtdot", 0, 0, 0)
swApp.ActivateDoc2 "Part4", False, longstatus
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Part.Extension.SelectByID2("Top Plane", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.ClearSelection2 True
Dim skSegment As Object
Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.043745, 0#, 0#)
Set skSegment = Part.SketchManager.CreateLine(0.043745, 0#, 0#, 0.06038, 0.030036, 0#)
Set skSegment = Part.SketchManager.CreateLine(0.06038, 0.030036, 0#, 0.031422, 0.064231, 0#)
Set skSegment = Part.SketchManager.CreateLine(0.031422, 0.064231, 0#, -0.016327, 0.049752, 0#)
Set skSegment = Part.SketchManager.CreateLine(-0.016327, 0.049752, 0#, 0#, 0#, 0#)
Part.ShowNamedView2 "*Trimetric", 8
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line5", "SKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
Dim myFeature As Object
Set myFeature = Part.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, 0.001, 0.001, False, False, False, False, 1.74532925199433E-02, 1.74532925199433E-02, False, False, False, False, True, True, True, 0, 0, False)
Part.SelectionManager.EnableContourSelection = False
longstatus = Part.SaveAs3("C:\Users\Abbas\Desktop\Part4.SLDPRT", 0, 2)
Part.ClearSelection2 True
Set Part = Nothing
swApp.CloseDoc "Part4.SLDPRT"
End Sub

Мне нужно создать что-то подобное в SolidWorks...


person 2012User    schedule 11.02.2020    source источник


Ответы (1)


Во-первых, вы не всегда можете напрямую использовать записанный макрос. Приходится подчищать и исправлять в некоторых моментах. Средство записи макросов не может точно записывать каждую функцию, которую вы используете в SolidWorks.

Это очищенная версия вашего записанного макроса:

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

    Set swApp = Application.SldWorks

    Dim Part As ModelDoc2
    Set Part = swApp.NewPart ' open new part document (with standard template file defined in system-options)
    Set Part = swApp.ActiveDoc

    ' select front plane
    boolstatus = Part.Extension.SelectByID2("Ebene vorne", "PLANE", 0, 0, 0, False, 0, Nothing, 0)

    ' create new sketch on front plane
    Part.SketchManager.InsertSketch (True)

    Dim swActiveSketch As Sketch
    Set swActiveSketch = Part.SketchManager.ActiveSketch

    Dim skSegment As Object
    Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, 0.043745, 0#, 0#)
    Set skSegment = Part.SketchManager.CreateLine(0.043745, 0#, 0#, 0.06038, 0.030036, 0#)
    Set skSegment = Part.SketchManager.CreateLine(0.06038, 0.030036, 0#, 0.031422, 0.064231, 0#)
    Set skSegment = Part.SketchManager.CreateLine(0.031422, 0.064231, 0#, -0.016327, 0.049752, 0#)
    Set skSegment = Part.SketchManager.CreateLine(-0.016327, 0.049752, 0#, 0#, 0#, 0#)

    ' close active sketch
    Part.SketchManager.InsertSketch (True)

    Part.ShowNamedView2 "*Trimetric", 8
    Part.ClearSelection2 True

    boolstatus = swActiveSketch.Select2(False, 0)

    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, 0.001, 0.001, False, False, False, False, 1.74532925199433E-02, 1.74532925199433E-02, False, False, False, False, True, True, True, 0, 0, False)

    longstatus = Part.SaveAs3("C:\Users\Abbas\Desktop\Part4.SLDPRT", 0, 2)
    Part.ClearSelection2 True

    swApp.CloseDoc Part.GetTitle

    Set Part = Nothing

End Sub

Если вы хотите автоматически создавать линии с 200 точками, вы должны заменить некоторые линии более логичными. В следующем примере используются точки из вашего примера, который предназначен только для демонстрации. Вы должны заполнить переменную vPoints 200 точками xyz из текстового файла или аналогичного файла.

    Dim p0(2) As Variant
    Dim p1(2) As Variant
    Dim p2(2) As Variant
    Dim p3(2) As Variant
    Dim p4(2) As Variant

    p0(0) = 0#
    p0(1) = 0#
    p0(2) = 0#

    p1(0) = 0.043745
    p1(1) = 0#
    p1(2) = 0#

    p2(0) = 0.06038
    p2(1) = 0.030036
    p2(2) = 0#

    p3(0) = 0.031422
    p3(1) = 0.064231
    p3(2) = 0#

    p4(0) = -0.016327
    p4(1) = 0.049752
    p4(2) = 0#

    Dim vPoints(4) As Variant
    vPoints(0) = p0
    vPoints(1) = p1
    vPoints(2) = p2
    vPoints(3) = p3
    vPoints(4) = p4

    'vPoints = FillVariantWithPointsFromTextFile() ' or a collection or what else you want to use

    Dim i As Integer
    For i = 0 To UBound(vPoints)
        Dim vPoint As Variant
        vPoint = vPoints(i)

        If (i + 1 <= UBound(vPoints)) Then

            Dim vNextPoint As Variant
            vNextPoint = vPoints(i + 1)

            ' draw a line between current point and next point
            Set skSegment = Part.SketchManager.CreateLine(vPoint(0), vPoint(1), vPoint(2), vNextPoint(0), vNextPoint(1), vNextPoint(2))

        Else

            Dim vFirstPoint As Variant
            vFirstPoint = vPoints(0)

            ' draw a line between current point and first point to close contour
            Set skSegment = Part.SketchManager.CreateLine(vPoint(0), vPoint(1), vPoint(2), vFirstPoint(0), vFirstPoint(1), vFirstPoint(2))

        End If

    Next i
person Sinue    schedule 11.02.2020
comment
Спасибо. Это замечательно. У меня есть 200 полигонов. Второй код, это функция (подпрограмма)? где я должен поместить это в свой код? извините, что задаю этот ламерский вопрос! - person 2012User; 11.02.2020
comment
О, извините, что я не упомянул об этом. Я использовал второй код вместо 6 строк с Part.Sketchmanager.CreateLine. Так что просто удалите их и вставьте второй код. Чтобы использовать свои собственные данные из текстового файла, просто прочитайте их и заполните переменную vPoints своими данными xyz. Вы также можете использовать коллекцию или что-то подобное, если вам это проще. - person Sinue; 12.02.2020
comment
извините, я пытался, но у меня не получилось. Я не могу использовать команду FileOpen() для чтения данных координат из текстового файла! И я не очень разбираюсь в коллекциях. Можешь мне помочь? - person 2012User; 15.02.2020
comment
Для меня самый простой способ прочитать текстовый файл — использовать FileSystemObject. Вы можете найти пример в этом сообщении: stackoverflow.com/a/11529980/12414707 - person Sinue; 18.02.2020