Solidworks API - чтение данных из текстового файла - PullRequest
1 голос
/ 11 февраля 2020

Я новичок в Solidworks API и VBA. Я создал текстовый файл, который содержит координаты вершин многих (например, 200) многоугольников, и я хочу нарисовать простые трехмерные объекты из этих данных. Я записал этот макрос в Solidworks для пятиугольника и попытался вставить в него форму -l oop, чтобы нарисовать мой 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 ...

1 Ответ

3 голосов
/ 11 февраля 2020

Во-первых, вы не всегда можете напрямую использовать записанный макрос. Это должно быть очищено и исправлено в некоторых пунктах. Устройство записи макросов не может записывать каждую точную функцию, которую вы используете в 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 Точки, которые вы должны заменить некоторые строки с большим количеством логики c. Следующий пример использует точки из вашего примера, который только для демонстрации. Вы должны заполнить переменную 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
...