Hide Table of Contents

Get Polylines Information Example (VBA)

This example shows how to use IView::GetPolyLines5 and IView::GetSketch. It also illustrates the differences between projected model geometry and sketched geometry.

 

'-------------------------------------------------

'

' Preconditions: Drawing document is open and contains:

'                * Views of a model comprised of arcs, circles,

'                  ellipses, splines, and straight lines

'                * User-sketched arcs, circles, ellipses, splines,

'                  and straight lines on the drawing

'

' Postconditions: None.

'

' NOTE: Click Tools, Options, Document Properties, Image Quality and change

' Wireframe and high quality HLR/HLV resolution, then redraw to see

' the effect on the number of line segments used to approximate projected

' model geometry.

'

' -------------------------------------------------

Option Explicit

Dim swApp As Object

 

Sub main()

 

    Dim swModel               As SldWorks.ModelDoc2

    Dim swDrawing             As SldWorks.DrawingDoc

    Dim swView                As SldWorks.View

    Dim swSheetView           As SldWorks.View

    Dim swSketch              As SldWorks.Sketch

    

    

    ' Get SolidWorks application

    Set swApp = Application.SldWorks

    ' Get active document

    Set swModel = swApp.ActiveDoc

    

    

    ' Downcast model to a drawing

    Set swDrawing = swModel

    ' The first view is the drawing sheet

    Set swSheetView = swDrawing.GetFirstView

    

    

    ' Print its contents

    PrintView swSheetView

    

    

    ' Get the sketch for the drawing sheet view

    Set swSketch = swSheetView.GetSketch

    ' Print its contents

    PrintSketch swSketch

    '

    ' Traverse all "real" views on the sheet

    '

    ' First view on the sheet.

    Set swView = swSheetView.GetNextView

    

    Do While Not swView Is Nothing

    

        PrintView swView

        

        Set swSketch = swView.GetSketch

            

        PrintSketch swSketch

    

        ' Go to next view on the sheet

        Set swView = swView.GetNextView

    

    Loop

End Sub

Function PrintView(swView As SldWorks.View) As Boolean

    Dim vPolyLinesBuffer       As Variant

    Dim vLines                 As Variant

    Dim lNumGeomData           As Long

    Dim i                      As Integer

    Dim iGeomIndex             As Integer

    Dim lNumLines              As Long

    Dim lItemType              As Long

    Dim lBufferSize            As Long

    Dim lBufferIdx             As Long

    Dim lGeomDataSize          As Long

    Dim dGeomData(11)          As Double

    Dim lLineData(3)           As Long

    Dim lLayerData(1)          As Long

    Dim lNumPoints             As Long

    Dim dPoint(2)              As Double

    Dim lGeomDataIdx           As Long

    Dim lLineDataIdx           As Long

    Dim lLayerDataIdx          As Long

    Dim lStartIdx              As Long

    Dim lEndIdx                As Long

    Dim lLineDataSize          As Long

    Dim lLayerDataSize         As Long

    Dim lNumProjectedElements  As Long

    Dim lNumSketchedElements   As Long

    

    

    If swView Is Nothing Then

        Exit Function

    End If

    

    

    Debug.Print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

    Debug.Print "View = " + swView.GetName2

    

        

    '

    ' Report projected model geometry

    '

    

    

    ' Initialize the number of projected elements for data is contained in the buffer

    lNumProjectedElements = 0

 

 

    ' Get all the polyline data into a buffer

    ' - no cross-hatch lines.

    vPolyLinesBuffer = swView.GetPolylines5(0)

    

    

    ' Any polyline data present ?

    If Not IsEmpty(vPolyLinesBuffer) Then

        

    

        ' Entries for line data and layer data have a fixed size

        lLineDataSize = 4

        lLayerDataSize = 2

        

       

    

        ' Get the total buffer size

        lBufferSize = UBound(vPolyLinesBuffer) - LBound(vPolyLinesBuffer) + 1

    

    

        ' Start to traverse the buffer at index 0

        lBufferIdx = 0

    

    

        ' Traverse the buffer, consuming data elements

        Do While lBufferIdx < lBufferSize

        

            ' Determine type

            lItemType = vPolyLinesBuffer(lBufferIdx)

            lBufferIdx = lBufferIdx + 1

        

        

            ' Found another projected element

            lNumProjectedElements = lNumProjectedElements + 1

        

        

            ' Handle type specific data

            If lItemType = 0 Then

        

                ' HERE: polyline

        

        

                Debug.Print "    polyline"

                

                ' Get GeomDataSize:

                ' - should be zero, but consume it anyway

                lGeomDataSize = vPolyLinesBuffer(lBufferIdx)

                lBufferIdx = lBufferIdx + 1

        

                ' Ignore GeomData

                    

            Else

        

                ' HERE: arc:

                ' - next to the piecewise linear approximation of the projected model geometry,

                '   the buffer also contains the arc defining the model geometry projection

        

                Debug.Print "    arc"

                

                

                ' Get GeomDataSize:

                ' - should be 12.

                lGeomDataSize = vPolyLinesBuffer(lBufferIdx)

                lBufferIdx = lBufferIdx + 1

                

                

                ' Get GeomData

                lGeomDataIdx = 0

                lStartIdx = lBufferIdx

                lEndIdx = lStartIdx + (lGeomDataSize - 1)

                For lBufferIdx = lStartIdx To lEndIdx

                

                    dGeomData(lGeomDataIdx) = vPolyLinesBuffer(lBufferIdx)

                

                    lGeomDataIdx = lGeomDataIdx + 1

                    

                Next lBufferIdx

                

                Debug.Print "      center pt = (" & dGeomData(0) * 1000# & ", " & dGeomData(1) * 1000# & ", " & dGeomData(2) * 1000# & ") mm"

                Debug.Print "      start  pt = (" & dGeomData(3) * 1000# & ", " & dGeomData(4) * 1000# & ", " & dGeomData(5) * 1000# & ") mm"

                Debug.Print "      end    pt = (" & dGeomData(6) * 1000# & ", " & dGeomData(7) * 1000# & ", " & dGeomData(8) * 1000# & ") mm"

                Debug.Print "      normal    = (" & dGeomData(9) & ", " & dGeomData(10) & ", " & dGeomData(11) & ")"

                                

            End If

            

            

            ' Get line data

            lLineDataIdx = 0

            lStartIdx = lBufferIdx

            lEndIdx = lStartIdx + (lLineDataSize - 1)

                

            For lBufferIdx = lStartIdx To lEndIdx

                

                lLineData(lLineDataIdx) = vPolyLinesBuffer(lBufferIdx)

                

                lLineDataIdx = lLineDataIdx + 1

                    

            Next lBufferIdx

                

                

             ' Get layer data

            lLayerDataIdx = 0

            lStartIdx = lBufferIdx

            lEndIdx = lStartIdx + (lLayerDataSize - 1)

            

            For lBufferIdx = lStartIdx To lEndIdx

                

                lLayerData(lLayerDataIdx) = vPolyLinesBuffer(lBufferIdx)

                

                lLayerDataIdx = lLayerDataIdx + 1

                    

            Next lBufferIdx

        

        

            ' Get point data

            lNumPoints = vPolyLinesBuffer(lBufferIdx)

            

            Debug.Print "      #points = " & CStr(lNumPoints)

            

            lBufferIdx = lBufferIdx + 1

            lStartIdx = lBufferIdx

            lEndIdx = lStartIdx + lNumPoints * 3 - 1

            

            For lBufferIdx = lStartIdx To lEndIdx Step 3

            

                dPoint(0) = vPolyLinesBuffer(lBufferIdx)

                dPoint(1) = vPolyLinesBuffer(lBufferIdx + 1)

                dPoint(2) = vPolyLinesBuffer(lBufferIdx + 2)

            

            Next lBufferIdx

        

        Loop

    End If

    

    ' Report the number of projected elements we found

    Debug.Print "  #projected elements = " & CStr(lNumProjectedElements)

    '

    ' Report sketched geometry:

    ' - only show lines

    '

    

    ' Initialize to zero

    lNumSketchedElements = 0

    

    

    lNumLines = swView.GetLineCount2(1)

    If lNumLines <> 0 Then

        vLines = swView.GetLines4(1)

    

        If Not IsEmpty(vLines) Then

    

            For i = 0 To lNumLines - 1

    

                Debug.Print "    line[" & i & "]"

    

                Debug.Print "      start pt = (" & vLines(i * 12 + 6) * 1000# & ", " & vLines(i * 12 + 7) * 1000# & ", " & vLines(i * 12 + 8) * 1000# & ") mm"

                Debug.Print "      end   pt = (" & vLines(i * 12 + 9) * 1000# & ", " & vLines(i * 12 + 10) * 1000# & ", " & vLines(i * 12 + 11) * 1000# & ") mm"

            

            Next i

            

        End If

    End If

    lNumSketchedElements = lNumSketchedElements + lNumLines

    lNumSketchedElements = lNumSketchedElements + swView.GetArcCount

    lNumSketchedElements = lNumSketchedElements + swView.GetEllipseCount

    lNumSketchedElements = lNumSketchedElements + swView.GetParabolaCount

    

    ' Report the number of sketched elements found

    Debug.Print "  #sketched elements = " & CStr(lNumSketchedElements)

End Function

Function PrintSketch(swSketch As SldWorks.Sketch) As Boolean

    Dim vSegments              As Variant

    Dim lNumSegments           As Long

        

    

    If swSketch Is Nothing Then

        Debug.Print "No sketch"

    End If

    

    

    ' Get the sketch segments

    vSegments = swSketch.GetSketchSegments

    

    

    ' Determine number of segments

    If Not IsEmpty(vSegments) Then

        lNumSegments = UBound(vSegments) - LBound(vSegments) + 1

    Else

        lNumSegments = 0

    End If

    

    

    Debug.Print "Sketch = "

    Debug.Print "  #points   = " & CStr(swSketch.GetUserPointsCount())

    Debug.Print "  #segments = " & CStr(lNumSegments)

    

    ' Get count of specific sketch segments

    If lNumSegments > 0 Then

        

        Debug.Print "    #arcs      = " & CStr(swSketch.GetArcCount())

        Debug.Print "    #lines     = " & CStr(swSketch.GetLineCount2(1))

        Debug.Print "    #ellipses  = " & CStr(swSketch.GetEllipseCount())

        Debug.Print "    #parabolas = " & CStr(swSketch.GetParabolaCount())

    

    End If

    

End Function



Provide feedback on this topic

SOLIDWORKS welcomes your feedback concerning the presentation, accuracy, and thoroughness of the documentation. Use the form below to send your comments and suggestions about this topic directly to our documentation team. The documentation team cannot answer technical support questions. Click here for information about technical support.

* Required

 
*Email:  
Subject:   Feedback on Help Topics
Page:   Get Polylines Information Example (VBA)
*Comment:  
*   I acknowledge I have read and I hereby accept the privacy policy under which my Personal Data will be used by Dassault Systèmes

Print Topic

Select the scope of content to print:

x

We have detected you are using a browser version older than Internet Explorer 7. For optimized display, we suggest upgrading your browser to Internet Explorer 7 or newer.

 Never show this message again
x

Web Help Content Version: API Help (English only) 2012 SP05

To disable Web help from within SOLIDWORKS and use local help instead, click Help > Use SOLIDWORKS Web Help.

To report problems encountered with the Web help interface and search, contact your local support representative. To provide feedback on individual help topics, use the “Feedback on this topic” link on the individual topic page.