Macro - Verberg freescirkel (Hulp bij boren)

Hallo

Ik heb een macroproject om de freescirkels op onze Europarlementariërs te verbergen (alleen op het 1e blad en de 1e weergave)

Wetende dat die er niet altijd zijn.

1- Is het naar uw mening haalbaar?

2-Een klein idee over de functies om te beginnen? (in het bijzonder hoe te identificeren of de cirkel een cirkel van een frees is)

 

Hieronder vindt u een voorbeeld van de 2 soorten verzinkingen die u tegenkomt (normale of kopspeling + toegevoegde kamers):

Elke lead die me op weg kan helpen, is welkom.

Ik vond dit om de cirkels in het rood te zetten, maar hoe kies ik alleen de freescirkels?

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

Bedankt.

1 like

Probeer het volgende:

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

Voeg > Class Module in > naam: Class1

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

 

3 likes

Wederom perfect functioneel. Nogmaals bedankt JeromeP .

Aan de andere kant weet ik niet zeker of ik alles begrijp, hoe zie je dat het een frezen is?

Kortom, ik begrijp niet alles in dit deel:

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 like

In dit deel noteer ik de positie (pos) en de diameter (CurveParam(6)) van elke cirkel + de cirkel zelf (swEdge).

Aangezien de positie in xyz is, elimineer ik de hoogtecomponent met behulp van de richting van de as van de cirkel (CurveParam(3), CurveParam(4), CurveParam(5))

Dit stelt me dan in staat om de cirkels van dezelfde positie te vinden, de grootste cirkel te vinden en deze te verbergen.

 

2 likes

Ik had het goed begrepen voor de grootste cirkel, maar ik begreep niet hoe je 2 cirkels met dezelfde functie-> identificeerde aan de positie.

Helemaal niet dom!

In ieder geval bedankt, ik hoef deze code niet aan de mijne toe te voegen om mijn persoonlijke macro van automatische planopschoning te perfectioneren.

1 like

Na een paar tests op de macro, merkte ik net dat het op dit type munt cirkel 1 voor mij verbergt in plaats van alleen cirkel 2 te verbergen.

Voor nu omzeilt dat het probleem door toe te voegen:

Als Circle.pos = myCircle.pos En Circle.dia < myCircle.dia En myCircle.dia * 1000 < 38 Dan

Omdat 37 mm de Ø is van de M20 verzonken schroef die het grootst wordt gebruikt. Zou er een andere oplossing zijn om dit probleem te vermijden, door geen rekening te houden met de cirkel als deze deel uitmaakt van de buitencontour of in relatie tot de naam... (Houd er rekening mee dat de kamers niet vaak rond zijn.)

1 like

U kunt de diameter vergelijken met de afmetingen van het begrenzingsvak dat is verkregen met:

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 like

Als ik mijn functie GetPreciseBoundingBox in de vorige macro wil aanroepen, moet ik dan beginnen met het onderdeel en niet met de tekening?

 

1 like

Ja, u moet de functie op het onderdeel toepassen

1 like

Hallo

De code functioneert perfect vanuit mijn macro, aan de andere kant kan ik de waarden niet in mijn macro krijgen of ik roep de functie aan.

Ik stel me voor dat de gegevens in een array zijn vastgelegd, maar hoe herinner ik me de waarden van mijn macro?

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