Makro - Fräskreis ausblenden (Bohrhilfe)

Hallo

Ich habe ein Makroprojekt, um die Fräskreise auf unseren MEPs auszublenden (nur auf dem 1. Blatt und der 1. Ansicht)

Wissend, dass es nicht immer welche gibt.

1- Ist es Ihrer Meinung nach machbar?

2-Eine kleine Idee zu den Funktionen zum Starten? (insbesondere, wie man erkennt, ob es sich bei dem Kreis um einen Kreis einer Fräsung handelt)

 

Nachfolgend finden Sie ein Beispiel für die 2 Arten von Senkungen, die auftreten (normaler oder Kopfabstand + zusätzliche Kammer):

Jeder Hinweis, der mir den Einstieg erleichtern kann, ist willkommen.

Ich habe das gefunden, um die Kreise rot zu setzen, aber wie wählt man nur die Fräskreise aus?

Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swView = swDraw.ActiveDrawingView
swModel.ClearSelection2 True
vComps = swView.GetVisibleComponents
'Diameter = InputBox("Entrer le diamètre en mm")
For Each vComp In vComps
    Set Comp = vComp
    vEdges = swView.GetVisibleEntities(Comp, swViewEntityType_e.swViewEntityType_Edge)
    For Each vEdge In vEdges
        Set swEdge = vEdge
        Set swCurve = swEdge.GetCurve
        If swCurve.IsCircle Then
            swCurve.GetEndParams Empty, Empty, IsClosed, Empty
            If IsClosed Then
                CurveParam = swCurve.CircleParams
                'If Abs(Diameter - CurveParam(6) * 2 * 1000) < 0.0001 Then
                    Set swEntity = swEdge
                    swEntity.Select4 True, Nothing
                'End If
            End If
        End If
    Next
Next
swModel.SetLineColor 255
swModel.ClearSelection2 True
End Sub

Vielen Dank.

1 „Gefällt mir“

Versuchen Sie Folgendes:

Option Explicit
Sub main()
Dim swapp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim vComps As Variant
Dim vComp As Variant
Dim Comp As SldWorks.Component2
Dim vEdges As Variant
Dim vEdge As Variant
Dim swEdge As SldWorks.edge
Dim swCurve As SldWorks.Curve
Dim IsClosed As Boolean
Dim pos As String
Dim CurveParam As Variant
Dim Cercle As Class1
Dim monCercle As Class1
Dim Cercles As Collection
Set swapp = Application.SldWorks
Set swModel = swapp.ActiveDoc
Set swDraw = swModel
Set swView = swDraw.ActiveDrawingView
If swView Is Nothing Then
    MsgBox "Selectionner une vue"
    Exit Sub
End If
Set Cercles = New Collection
vComps = swView.GetVisibleComponents
For Each vComp In vComps
    Set Comp = vComp
    vEdges = swView.GetVisibleEntities(Comp, swViewEntityType_e.swViewEntityType_Edge)
    For Each vEdge In vEdges
        Set swEdge = vEdge
        Set swCurve = swEdge.GetCurve
        If swCurve.IsCircle Then
            swCurve.GetEndParams Empty, Empty, IsClosed, Empty
            If IsClosed Then
                CurveParam = swCurve.CircleParams
                pos = ""
                If Round(CurveParam(3), 3) = 0 Then pos = pos & Round(CurveParam(0), 3) & "-"
                If Round(CurveParam(4), 3) = 0 Then pos = pos & Round(CurveParam(1), 3) & "-"
                If Round(CurveParam(5), 3) = 0 Then pos = pos & Round(CurveParam(2), 3) & "-"
                Debug.Print pos
                Set Cercle = New Class1
                Cercle.pos = pos
                Cercle.dia = Round(CurveParam(6), 3)
                Set Cercle.edge = swEdge
                Cercles.Add Cercle
            End If
        End If
    Next
Next
swModel.ClearSelection2 True
For Each monCercle In Cercles
    For Each Cercle In Cercles
        If Cercle.pos = monCercle.pos And Cercle.dia < monCercle.dia Then
          monCercle.edge.Select4 True, Nothing
        End If
    Next
Next
swDraw.HideEdge
swModel.ForceRebuild3 False
'swModel.SetLineColor 255'
swModel.ClearSelection2 True
End Sub

Fügen Sie > Klassenmodul > Namen ein: Class1

'Class1:'
Public edge As SldWorks.Entity
Public pos As String
Public dia As Single

 

3 „Gefällt mir“

Wieder einmal perfekt funktionsfähig. Nochmals vielen Dank, JeromeP .

Auf der anderen Seite bin ich mir nicht sicher, ob ich alles verstehe, wie sehen Sie, dass es sich um ein Fräsen handelt?

Im Grunde verstehe ich nicht alles in diesem Teil:

If swCurve.IsCircle Then
            swCurve.GetEndParams Empty, Empty, IsClosed, Empty
            If IsClosed Then
                CurveParam = swCurve.CircleParams
                pos = ""
                If Round(CurveParam(3), 3) = 0 Then pos = pos & Round(CurveParam(0), 3) & "-"
                If Round(CurveParam(4), 3) = 0 Then pos = pos & Round(CurveParam(1), 3) & "-"
                If Round(CurveParam(5), 3) = 0 Then pos = pos & Round(CurveParam(2), 3) & "-"
                Debug.Print pos
                Set Cercle = New Class1
                Cercle.pos = pos
                Cercle.dia = Round(CurveParam(6), 3)
                Set Cercle.edge = swEdge
                Cercles.Add Cercle

 

1 „Gefällt mir“

In diesem Teil zeichne ich die Position (pos) und den Durchmesser (CurveParam(6)) jedes Kreises + den Kreis selbst (swEdge) auf.

Da die Position in xyz ist, eliminiere ich die Höhenkomponente anhand der Richtung der Achse des Kreises (CurveParam(3), CurveParam(4), CurveParam(5))

Dies ermöglicht es mir dann, die Kreise der gleichen Position zu finden, den größten Kreis zu finden und ihn auszublenden.

 

2 „Gefällt mir“

Ich hatte gut für den größten Kreis verstanden, aber ich verstand nicht, wie Sie 2 Kreise mit der gleichen Funktion - > durch die Position identifiziert haben.

Gar nicht dumm!

Auf jeden Fall danke, ich muss diesen Code nicht zu meinem hinzufügen, um mein persönliches Makro der automatischen Planreinigung zu perfektionieren.

1 „Gefällt mir“

Nach ein paar Tests mit dem Makro ist mir gerade aufgefallen, dass bei dieser Art von Münze Kreis 1 vor mir versteckt wird, anstatt nur Kreis 2 zu verstecken.

Für den Moment umgeht das das Problem, indem es hinzufügt:

Wenn Circle.pos = myCircle.pos und Circle.dia < myCircle.dia und myCircle.dia * 1000 < 38 dann

Denn 37mm ist der Ø der M20 Senkschraube, die am größten verwendet wird. Gäbe es eine andere Lösung, um dieses Problem zu vermeiden, den Kreis nicht zu berücksichtigen, wenn er Teil der Außenkontur ist oder in Bezug auf den Namen... (Wenn man bedenkt, dass die Räume nicht oft kreisförmig sind.)

1 „Gefällt mir“

Sie können den Durchmesser mit den Abmessungen des Begrenzungsrahmens vergleichen, den Sie erhalten mit:

Function GetPreciseBoundingBox(part As SldWorks.PartDoc) As Variant
    Dim dBox(5) As Double
    Dim vBodies As Variant
    vBodies = part.GetBodies2(swBodyType_e.swSolidBody, True)
    Dim minX As Double
    Dim minY As Double
    Dim minZ As Double
    Dim maxX As Double
    Dim maxY As Double
    Dim maxZ As Double
    If Not IsEmpty(vBodies) Then
        Dim i As Integer
        For i = 0 To UBound(vBodies)
            Dim swBody As SldWorks.Body2
            Set swBody = vBodies(i)
            Dim x As Double
            Dim y As Double
            Dim z As Double
            swBody.GetExtremePoint 1, 0, 0, x, y, z
            If i = 0 Or x > maxX Then maxX = x

            swBody.GetExtremePoint -1, 0, 0, x, y, z
            If i = 0 Or x < minX Then minX = x

            swBody.GetExtremePoint 0, 1, 0, x, y, z
            If i = 0 Or y > maxY Then maxY = y

            swBody.GetExtremePoint 0, -1, 0, x, y, z
            If i = 0 Or y < minY Then minY = y

            swBody.GetExtremePoint 0, 0, 1, x, y, z
            If i = 0 Or z > maxZ Then maxZ = z
            
            swBody.GetExtremePoint 0, 0, -1, x, y, z
            If i = 0 Or z < minZ Then minZ = z
        Next
    End If
    dBox(0) = minX: dBox(1) = minY: dBox(2) = minZ
    dBox(3) = maxX: dBox(4) = maxY: dBox(5) = maxZ
    GetPreciseBoundingBox = dBox
End Function

 

1 „Gefällt mir“

Muss ich zum Aufrufen der GetPreciseBoundingBox-Funktion im vorherigen Makro mit dem Teil und nicht mit der Zeichnung beginnen?

 

1 „Gefällt mir“

Ja, Sie müssen die Funktion auf das Teil anwenden

1 „Gefällt mir“

Hallo

Der Code funktioniert perfekt aus meinem Makro, andererseits kann ich die Werte in meinem Makro nicht abrufen oder ich rufe die Funktion auf.

Ich stelle mir vor, dass die Daten in einem Array aufgezeichnet werden, aber wie kann ich die Werte aus meinem Makro abrufen?

Option Explicit
Sub main()
Dim swapp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim vComps As Variant
Dim vComp As Variant
Dim Comp As SldWorks.Component2
Dim vEdges As Variant
Dim vEdge As Variant
Dim swEdge As SldWorks.edge
Dim swCurve As SldWorks.Curve
Dim IsClosed As Boolean
Dim pos As String
Dim CurveParam As Variant
Dim Cercle As Class1
Dim monCercle As Class1
Dim Cercles As Collection
Set swapp = Application.SldWorks
Set swModel = swapp.ActiveDoc
Set swDraw = swModel
Set swView = swDraw.ActiveDrawingView
If swView Is Nothing Then
    MsgBox "Selectionner une vue"
    Exit Sub
End If

'Ajout SD pour récuperer les valeures de la Bounding Box
Dim swPartModel As SldWorks.ModelDoc2
Set swPartModel = swView.ReferencedDocument
GetPreciseBoundingBox swPartModel
' Fin de l'ajout


Set Cercles = New Collection
vComps = swView.GetVisibleComponents
For Each vComp In vComps
    Set Comp = vComp
    vEdges = swView.GetVisibleEntities(Comp, swViewEntityType_e.swViewEntityType_Edge)
    For Each vEdge In vEdges
        Set swEdge = vEdge
        Set swCurve = swEdge.GetCurve
        If swCurve.IsCircle Then
            swCurve.GetEndParams Empty, Empty, IsClosed, Empty
            If IsClosed Then
                CurveParam = swCurve.CircleParams
                pos = ""
                If Round(CurveParam(3), 3) = 0 Then pos = pos & Round(CurveParam(0), 3) & "-"
                If Round(CurveParam(4), 3) = 0 Then pos = pos & Round(CurveParam(1), 3) & "-"
                If Round(CurveParam(5), 3) = 0 Then pos = pos & Round(CurveParam(2), 3) & "-"
                Debug.Print pos
                Set Cercle = New Class1
                Cercle.pos = pos
                Cercle.dia = Round(CurveParam(6), 3)
                Set Cercle.edge = swEdge
                Cercles.Add Cercle
            End If
        End If
    Next
Next
swModel.ClearSelection2 True
For Each monCercle In Cercles
    For Each Cercle In Cercles
    
        Debug.Print Cercle.dia * 1000
        If Cercle.pos = monCercle.pos And Cercle.dia < monCercle.dia And monCercle.dia * 1000 < 38 Then
          monCercle.edge.Select4 True, Nothing
        End If
    Next
Next
'Modif SD - on ne cache plus temporairement
'swDraw.HideEdge
swModel.ForceRebuild3 False
'swModel.SetLineColor 255 '
swModel.ClearSelection2 True
End Sub

Function GetPreciseBoundingBox(part As SldWorks.PartDoc) As Variant
    Dim dBox(5) As Double
    Dim vBodies As Variant
    vBodies = part.GetBodies2(swBodyType_e.swSolidBody, True)
    Dim minX As Double
    Dim minY As Double
    Dim minZ As Double
    Dim maxX As Double
    Dim maxY As Double
    Dim maxZ As Double
    If Not IsEmpty(vBodies) Then
        Dim i As Integer
        For i = 0 To UBound(vBodies)
            Dim swBody As SldWorks.Body2
            Set swBody = vBodies(i)
            Dim x As Double
            Dim y As Double
            Dim z As Double
            swBody.GetExtremePoint 1, 0, 0, x, y, z
            If i = 0 Or x > maxX Then maxX = x

            swBody.GetExtremePoint -1, 0, 0, x, y, z
            If i = 0 Or x < minX Then minX = x

            swBody.GetExtremePoint 0, 1, 0, x, y, z
            If i = 0 Or y > maxY Then maxY = y

            swBody.GetExtremePoint 0, -1, 0, x, y, z
            If i = 0 Or y < minY Then minY = y

            swBody.GetExtremePoint 0, 0, 1, x, y, z
            If i = 0 Or z > maxZ Then maxZ = z
            
            swBody.GetExtremePoint 0, 0, -1, x, y, z
            If i = 0 Or z < minZ Then minZ = z
        Next
    End If
    dBox(0) = minX: dBox(1) = minY: dBox(2) = minZ
    dBox(3) = maxX: dBox(4) = maxY: dBox(5) = maxZ
        Debug.Print "minX" & minX
    
    
    Debug.Print "minY" & minY
    Debug.Print "minZ" & minZ
    Debug.Print "maxX" & maxX
    Debug.Print "maxY" & maxY
    Debug.Print "maxZ" & maxZ

    
    GetPreciseBoundingBox = dBox
    
    Debug.Print "essai" & dBox(0)
End Function