Witam Najtrudniejszą częścią jest znalezienie i wybranie elementu , na którym należy umieścić strzałkę. Jest na to kilka metod: GetVisibleEntities2 i SelectByRay (zwykle w celu uniknięcia, ale szybciej w celu zaznaczenia krawędzi sylwetki) Następnie wszystko, co musisz zrobić, to wstawić adnotację za pomocą:
Set myNote = swModel.InsertNote("$PRPMODEL:""NUMERO_PLAN""")
I zmień położenie notatki za pomocą:
Set myAnnotation = myNote.GetAnnotation
boolstatus = myAnnotation.SetPosition(0.13, 0.11, 0)
Dziękujemy za Twoją opinię. Napisałem to makro, ale działa ono w nieskończoność i nie wstawia żądanej nuty.
Czy masz pojęcie o problemie?
Opcja jawna Dim swApp jako SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw jako SldWorks.DrawingDoc Przyciemnij swView jako SldWorks.view Dim Comp As SldWorks.Component2 Dim vComps jako wariant Dim vComp jako wariant Przyciemnij krawędzie pionowe jako wariant Przyciemnij vEdge jako wariant Przyciemnij swEdge jako SldWorks.Edge Przyciemnij moją notatkę jako obiekt Przyciemnij moją adnotację jako obiekt Dim boolstatus As Boolean Dim swEntity jako SldWorks.Entity
Sub main() Ustaw swApp = Application.SldWorks Ustaw swModel = swApp.ActiveDoc Ustaw swDraw = swModel Ustaw swView = swDraw.ActiveDrawingView swModel.ClearSelection2 Prawda vComps = swView.GetVisibleComponents Dla każdej kompozycji vComp W kompozycjach vComp Ustaw kompozycję = vComp vEdges = swView.GetVisibleEntities(Comp, swViewEntityType_e.swViewEntityType_Edge) Dla każdej krawędzi wirtualnej w vEdges Ustaw swEdge = vEdge Ustaw swEntity = swEdge swEntity.Select4 Prawda, Nic Ustaw myNote = swModel.InsertNote("$PRPMODEL:""NUMERO_PLAN""") Ustaw myAnnotation = myNote.GetAnnotation boolstatus = myAnnotation.SetPosition(0.13, 0.11, 0)
Uwaga: Strzałki są umieszczane losowo na największej powierzchni. Aby umieścić je dokładniej, musiałbyś znaleźć współrzędne żądanego punktu w komponencie, następnie przekształcić w układ współrzędnych złożenia (biorąc pod uwagę rozstrzeloną figurę), a następnie przekształcić w układ współrzędnych widoku. Następnie użyj SelectByRay
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swComp As SldWorks.Component2
Dim swEnt As SldWorks.Entity
Dim CompCount As Long
Dim vComps As Variant
Dim vFaces As Variant
Dim swFace As SldWorks.Face2
Dim i As Long
Dim j As Long
Dim boolstatus As Boolean
Dim MaxArea As Double
Dim swNote As SldWorks.Note
Dim swAnn As SldWorks.Annotation
Dim CompNames As Object
Dim vPos As Variant
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDrawing = swModel
Set swView = swDrawing.ActiveDrawingView
Set CompNames = CreateObject("Scripting.Dictionary")
swModel.ClearSelection2 True
Debug.Assert Not swView Is Nothing
CompCount = swView.GetVisibleComponentCount
Debug.Assert CompCount <> 0
Debug.Print "Nombre de composants = " & CompCount
vComps = swView.GetVisibleComponents
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
Debug.Print "Fichier du composant " & i & ": " & swComp.GetPathName
vFaces = swView.GetVisibleEntities2(swComp, swViewEntityType_e.swViewEntityType_Face)
If Not IsEmpty(vFaces) Then
Debug.Print " Ce composant a " & UBound(vFaces) + 1 & " faces visible dans cette vue"
MaxArea = 0
For j = 0 To UBound(vFaces)
Set swFace = vFaces(j)
If swFace.GetArea > MaxArea Then
MaxArea = swFace.GetArea
Set swEnt = swFace
End If
Next j
If Not CompNames.Exists(swComp.GetPathName) Or MaxArea > 0.001 Then
If Not CompNames.Exists(swComp.GetPathName) Then CompNames.Add swComp.GetPathName, 1
boolstatus = swEnt.Select4(False, Nothing)
Set swNote = swModel.InsertNote("$PRPMODEL:""NUMERO_PLAN""")
Set swAnn = swNote.GetAnnotation
vPos = swAnn.GetPosition
boolstatus = swAnn.SetPosition(0.18, vPos(1), 0)
End If
End If
Next
End Sub