Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Selection.Count2

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Selection.Count2 (657 mal gelesen)
Basti1379
Mitglied



Sehen Sie sich das Profil von Basti1379 an!   Senden Sie eine Private Message an Basti1379  Schreiben Sie einen Gästebucheintrag für Basti1379

Beiträge: 18
Registriert: 24.01.2019

CATIA V5

erstellt am: 08. Mai. 2019 22:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Leute,

der Code macht leider nicht zu 100% das was ich gerne möchte.

Code:
Private Function Curve_Delete()


oSelection.Clear
oSelection.Add oHybridBody2
oSelection.Search "Type=Curve,sel"

   

    MsgBox (oSelection.Count2 & " Curve's are found ")
    If oSelection.Count2 > 0 Then

        For n = 1 To oSelection.Count2 Step 1

        Set Curve = oSelection.Item(n).Value
         
        MsgBox (oSelection.Item(n).Value.Name)
         
        oSelection.Add Curve
        oSelection.Delete
        oSelection.Clear

        Next
    End If
   
End Function



Die MsgBox sagt 2 Kurven sind gefunden.
Es löscht dann auch die 2 Kurven,aber dann gibt es ein Fehler bei

Code:
Set Curve = oSelection.Item(n).Value
.

Per Hand kann ich die beiden Kurven einzeln löschen.

Bei der Zeile

Code:
MsgBox (oSelection.Item(n).Value.Name)
wird mir jedoch nur 1 Name angezeigt und der zweite verschluckt.


Mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 08. Mai. 2019 22:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Basti1379 10 Unities + Antwort hilfreich

Servus

Warum verwendest du überhaupt die Schleife? Es müsste doch beide Elemente gelöscht werden da Delete alle selektierten Elemente löscht.
Zudem ist durch Delete und Clear die Selection leer, somit gibt es kein n-tes Element mehr.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Basti1379
Mitglied



Sehen Sie sich das Profil von Basti1379 an!   Senden Sie eine Private Message an Basti1379  Schreiben Sie einen Gästebucheintrag für Basti1379

Beiträge: 18
Registriert: 24.01.2019

CATIA V5

erstellt am: 17. Mai. 2019 15:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von bgrittmann:
Servus

Warum verwendest du überhaupt die Schleife? Es müsste doch beide Elemente gelöscht werden da Delete alle selektierten Elemente löscht.
Zudem ist durch Delete und Clear die Selection leer, somit gibt es kein n-tes Element mehr.

Gruß
Bernd


Genau das war es.War wohl zu spät

Ich benutze mal den hier, da ich leider wieder festhänge.

Das Makro läuft immer durch jedoch sind bei einigen Flächen nicht die gewünschte Anzahl an Extrema erstellt worden.

Ich kann zusehen wie am Ende keine Intersects mehr zur Verfügung stehen und die Extrema erstellt worden sind doch am Ende löscht es wieder Extrema.

Gruß,

Basti

Code:
'erstellt alle Kombinationsmöglichkeiten 3^3 Extrema außer 0/0/0 = error

    For X = -1 To 1 Step 1
    For Y = -1 To 1 Step 1
    For Z = -1 To 1 Step 1

        If Not (X = 0 And Y = 0 And Z = 0) Then

            Set ohybridShapeD1 = oHybridShapeFactory.AddNewDirectionByCoord(X, Y, Z)
            Set ohybridShapeExtremum1 = oHybridShapeFactory.AddNewExtremum(oreferenceFace, ohybridShapeD1, 1)
            oHybridBody2.AppendHybridShape ohybridShapeExtremum1
   
            ohybridShapeExtremum1.Name = "Extrema." & CStr(X) & CStr(Y) & CStr(Z)
           
            opart.Update
           
            Set oreference1 = ohybridShapeExtremum1
            'Set oreference1 = oHybridBody2.HybridShapes.Item("Extrema." & CStr(X) & CStr(Y) & CStr(Z))
           
            Vorauswahl 'sieht nach ob ein Intersect im Hybridbody1 ist wenn nicht dann werden keine Extrema mehr benötigt
           
           
        End If
           
Next
Next
Next


Code:
Private Function Vorauswahl()
'oreference1 ist das aktuelle Extrema

        oSelection.Clear
        oSelection.Add oHybridBody1 'Helping Points = Intersects
        oSelection.Search "Type=Point,sel"
       
       
        If oSelection.Count2 > 0 Then
       
        Prüfen_und_Löschen (MinimumDistance)
       
        Else
       
        oSelection.Clear
        oSelection.Add oreference1 ' lösche den Extrempunkt, da es zu keiner Übereinstimmung mit einem Intersect gekommen ist
        oSelection.Delete
       
        End If
       
End Function


Code:
Private Function Prüfen_und_Löschen(MinimumDistance As Double) As Double

For k = oSelection.Count2 To 0 Step -1
       
    If k = 0 Then
        oSelection.Clear
        oSelection.Add oreference1 ' lösche den Extrempunkt, da es zu keiner Übereinstimmung mit einem Intersect gekommen ist
        oSelection.Delete
        Exit For
       
    Else
       
        Set oreference2 = oHybridBody1.HybridShapes.Item(k)
       
        Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench")
        Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oreference1)

        MinimumDistance = TheMeasurable.GetMinimumDistance(oreference2)
MsgBox (MinimumDistance) 'debugger

            Select Case MinimumDistance
       
            Case 0
                     
            oSelection.Clear
            oSelection.Add oreference2  'löscht den Intersect,da er ein Extrema representiert und keine doppelten Extrema
            oSelection.Delete          'erzeugen werden sollen
       
            Exit Function
       
            End Select
    End If
   
Next
End Function


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 18. Mai. 2019 10:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Basti1379 10 Unities + Antwort hilfreich

Servus

Dein Code hab ich nicht ganz verstanden.
Was mir aufgefallen ist:

  • warum nutzt die Function wenn du keinen Rückgabewert hast
  • Warum greifst du auf das Intersect über HybridShapes.Item(k) zu und nicht über die Selection? (was ist wenn noch andere Elemente im GeoSet sind)
  • Die ausgiebige Nutzung von globalen Variablen/Objekten finde ich unübersichtlich
  • ggf bei der Auswertung des MinimumDistance noch runden (nummerische Ungenauigkeit)
  • Dimensionierst du deine Variablen nicht? (Option Explicit)
  • Warum löschst du an zwei Stellen die Extrema? Wann sollen diese erhalten belieben?
Beschreibe bitte mal was der Zweck des Codes ist.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Basti1379
Mitglied



Sehen Sie sich das Profil von Basti1379 an!   Senden Sie eine Private Message an Basti1379  Schreiben Sie einen Gästebucheintrag für Basti1379

Beiträge: 18
Registriert: 24.01.2019

CATIA V5

erstellt am: 18. Mai. 2019 14:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Bernd,

anbei sende ich mal den kompletten Code.

Für weitere Tips bin ich sehr dankbar.

Mfg Basti

Zitat:
Beschreibe bitte mal was der Zweck des Codes ist.

1.Es werden 3 Geosets erstellt
2.Der User wird aufgefordert eine Fläche zu selektieren
3.Wenn er abbricht werden die Geosets wieder gelöscht
3a. sonst wird eine Boundary erstellt
4.Über Topology.CGMEdge werden die Kanten gefunden
4a. Wenn es 4 Kanten sind wird ein Extract erstellt
5. erstellt zwischen den Kanten  1/2 ; 2/3 ;3/4 ... 4/1 usw. jeweils einen Intersect
6.erstellt alle Kombinationsmöglichkeiten für Extrema außer 0/0/0
7.Während der Erstellug soll der GeoTyp überprüft werden
7a.Wenn es sich um ein Punkt handelt geht das Makro weiter
7.b Wenn es sich um eine Kurve oder Linie handelt (erstmal Abbruch)
8. Das "Punkt" Extrema wird auf Dinstance zu einem Intersect geprüft
8a. Wenn es 0mm Aufweist dann behalte es und lösche den Intersect
8.b Wenn es keine 0mm aufweist dann lösche den Extrempunkt
8.c Wieder zu 6 und nächstes Extrema

Zitat:

warum nutzt die Function wenn du keinen Rückgabewert hast


Manchmal klappt es noch nicht so ganz z.B.: aktuell bei Private Function get_geo_Typ(oreference1 As Reference) As Integer

get_geo_Typ = oHybridShapeFactory.GetGeometricalFeatureType(oreference1)
       
End Function

Ich würde der Function gerne das aktuelle Extrema übergeben als Reference und die Function soll den Geotyp bestimmen und den Rückgabewert als Zahl geben.

Zitat:

Warum greifst du auf das Intersect über HybridShapes.Item(k) zu und nicht über die Selection? (was ist wenn noch andere Elemente im GeoSet sind)

Danke für den Hinweis mit HybridShapes.Item(k) .
Da das Geoset neu erstellt wird befindet sich nichts weiteres in ihm.

Zitat:
Die ausgiebige Nutzung von globalen Variablen/Objekten finde ich unübersichtlich

Ok bin da für Tips immer dankbar.

Zitat:
ggf bei der Auswertung des MinimumDistance noch runden (nummerische Ungenauigkeit)

wäre das Fix ?

Zitat:
Dimensionierst du deine Variablen nicht? (Option Explicit)

Es werden alle am Anfang Dimensioniert
Zitat:
Warum löschst du an zwei Stellen die Extrema? Wann sollen diese erhalten belieben?

Hab den Ablauf geändert.

Code:
Option Explicit

'****Globale Variablen*****
Dim opartDocument As PartDocument
Dim opart As Part

Dim oShapeFactory As ShapeFactory
Dim oHybridShapeFactory As HybridShapeFactory

Dim oHybridBodies As HybridBodies

Dim oHybridBody1 As HybridBody  'Helping_Points
Dim oHybridBody2 As HybridBody  'Extrema
Dim oHybridBody3 As HybridBody  'Helping_Line


Dim oSelection As Selection    'Selection
Dim oSelection2 As Object      'Selection für Option Explicit

Dim sStatus As String

Dim TheSPAWorkbench            'Workbench zum Messen
Dim TheMeasurable              'Workbench zum Messen

Dim Point As Variant
Dim Point2 As Variant

Dim k As Long

Dim Summe As Integer            'Zählerschleife

Dim j As Integer
Dim n As Integer
Dim m As Integer                'selection.count2 for edges
Dim t As Integer
Dim X As Integer
Dim Y As Integer
Dim Z As Integer

Dim MinimumDistance As Double

Dim oreferenceFace As Reference 'Selected Surface
Dim oBoundary As Reference      'Created Boundary
Dim oreferenceLine As Reference 'Edges of Boundary
Dim oreference1 As Reference    '
Dim oreference2 As Reference    '

Dim ohybridShapeExtract As HybridShapeExtract
Dim ohybridShapeBoundary As HybridShapeBoundary
Dim oHybridShapeIntersection As HybridShapeIntersection
Dim ohybridShapeExtremum1 As HybridShapeExtremum
Dim ohybridShapeD1 As HybridShapeDirection

Sub CATMain()

    Set opartDocument = CATIA.ActiveDocument
   
    If (InStr(opartDocument.Name, ".CATPart")) <> 0 Then    'Prüfen ob es sich um ein CATPart handelt
        Set opart = opartDocument.Part
        Set oSelection = opartDocument.Selection            'Initiliserung der Selection
        opart.Update

    End If


'*****Funktionen zum erstellen von benötigten Geosets

        Search_Geoset_Helping_Points    'search for Geoset Helping_Point
        Search_Geoset_Helping_Line      'search for Geoset Helping_Line
        Search_Geoset_Extrema          'search for Geoset PreEx
       


'Der Benutzer wird aufgefordert eine Fläche von einer der vorgegebener Kategorie auszuwählen

        Set oHybridShapeFactory = opart.HybridShapeFactory
        Set oSelection2 = oSelection
        ReDim sFilter(0)
       
        MsgBox ("Select a" & vbCrLf & Chr(13) & "Multi-Section-Surface" & vbCrLf & Chr(13) & "Offset" & vbCrLf & Chr(13) & "Blend" & vbCrLf & Chr(13) & "Sweep ")
        sFilter(0) = "HybridShapeSurfaceExplicit"
        sStatus = oSelection2.SelectElement2(sFilter, "select a face", False)
       
    If (sStatus = "Cancel") Then
   
        Delete_all_Created_Geosets      'löscht die bisherigen erstellten Geosets bei Abbruch
        Exit Sub
       
        Else
       
        Create_Boundary                'Create Boundary on selected Surface
    End If

'******Count Edges of Boundary and Create Extract******

        oSelection.Clear
        oSelection.Add ohybridShapeBoundary
        oSelection.Search "Topology.CGMEdge,sel"        'sucht und zählt die Kanten der erstellten Boundary
       
        'MsgBox oSelection.Count2 & " Edges are found from the selected face"


'**************************************************************************
'*********Hier kann eine Erweiterung auf m-Kanten erfolgen!!!!***************
    If (oSelection.Count2 > 4) Or (oSelection.Count2 < 4) Then

        MsgBox (" More or less than four Edges where found" & vbCrLf & Chr(13) & " Macro will Stop")
       
        Delete_all_Created_Geosets      'löscht die bisherigen erstellten Geosets bei count <> 4
        Exit Sub

        Else
       
        m = oSelection.Count2          'm can be used for more than 4 Edges
        Create_Extracts (m)            'Function Create_four_Extracts

    End If
   
'erstellt zwischen den Kanten  1/2 ; 2/3 ;3/4 ... 4/1 usw. jeweils einen Intersect
Create_Intersects (m)


'erstellt alle Kombinationsmöglichkeiten 3^3 Extrema außer 0/0/0 = error


    For X = -1 To 1 Step 1
    For Y = -1 To 1 Step 1
    For Z = -1 To 1 Step 1

        If Not (X = 0 And Y = 0 And Z = 0) Then

            Set ohybridShapeD1 = oHybridShapeFactory.AddNewDirectionByCoord(X, Y, Z)
            Set ohybridShapeExtremum1 = oHybridShapeFactory.AddNewExtremum(oreferenceFace, ohybridShapeD1, 1)
            oHybridBody2.AppendHybridShape ohybridShapeExtremum1
   
            ohybridShapeExtremum1.Name = "Extrema." & CStr(X) & CStr(Y) & CStr(Z)
           
            opart.Update
           
           
            'Set oreference1 = oHybridBody2.HybridShapes.Item("Extrema." & CStr(X) & CStr(Y) & CStr(Z))
            Set oreference1 = opart.CreateReferenceFromObject(ohybridShapeExtremum1)
         
            get_geo_Typ (oreference1) 'Prüft_den_Geotyp
           
            Select Case get_geo_Typ(oreference1)
                       
            Case 0  'Unknown
            MsgBox ("Unknown")
            oSelection.Clear
            oSelection.Add oreference1 ' lösche den Extrempunkt, da es sich nicht um einen Punkt handelt
            oSelection.Delete
                       
            Case 1  'Point
            MsgBox ("Point")
            Prüfen_und_Löschen          'Prüft ob es eine Übereinstimmung mit einem Intersect gibt
           
            Case 2  'Curve
            MsgBox ("Curve")
            oSelection.Clear
            oSelection.Add oreference1 ' lösche den Extrempunkt, da er eine Kurve ist
            oSelection.Delete
           
           
            Case 3  'Line
            MsgBox ("Line")
            oSelection.Clear
            oSelection.Add oreference1 ' lösche den Extrempunkt, da er eine Linie ist
            oSelection.Delete
                     
            Case Else
            Delete_all_Created_Geosets  'löscht alle Geosets
           
            End Select
         
       
           
           
        End If
           
Next
Next
Next
   
'***********

   
'****
Delete_Geosets

End Sub

'****Delete Geometrical sets at the End of the Macro******
Private Function Delete_Geosets()

        oSelection.Clear

        oSelection.Add oHybridBody1 'Helping_Points
        oSelection.Add oHybridBody3 'Helping_Line
       

        oSelection.Delete
        opart.Update

End Function

'******Search Geoset Helping_Points and Count*****
Private Function Search_Geoset_Helping_Points()


        oSelection.Clear
        oSelection.Search ("CATGmoSearch.OpenBodyFeature.Name=Helping_Points,all")  'Geoset suche

    If oSelection.Count < 1 Then
        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody1 = opart.HybridBodies.Add              'Erstellen eines Geosets
        oHybridBody1.Name = "Helping_Points"
       
        Else
       
        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody1 = oHybridBodies.Item("Helping_Points") 'Geoset
    End If

End Function
'******Search Geoset Extrema and Count*****
Private Function Search_Geoset_Extrema()

               
        oSelection.Clear
        oSelection.Search ("CATGmoSearch.OpenBodyFeature.Name=Extrema,all") 'Geoset suche Extrema

    If oSelection.Count < 1 Then
   
        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody2 = opart.HybridBodies.Add      'Erstellen eines Geosets
        oHybridBody2.Name = "Extrema"
       
        Else
   
        j = oSelection.Count + 1                        'könnte als Rückgabewert für spätere Zwecke verwendet werden
        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody2 = opart.HybridBodies.Add
        oHybridBody2.Name = "Extrema" & CStr(j)
       
    End If
End Function


'******Search Geoset Helping_Line and Count*****
Private Function Search_Geoset_Helping_Line()

        oSelection.Clear
        oSelection.Search ("CATGmoSearch.OpenBodyFeature.Name=Helping_Line,all")    'Geoset suche

    If oSelection.Count < 1 Then

        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody3 = opart.HybridBodies.Add      'Erstellen eines Geosets
        oHybridBody3.Name = "Helping_Line"
       
        Else

        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody3 = oHybridBodies.Item("Helping_Line")
       
    End If
End Function

'****Delete all Geometrical sets on Error or on cancel Face selection******
Private Function Delete_all_Created_Geosets()

        oSelection.Clear

        oSelection.Add oHybridBody1 'Helping_Points
        oSelection.Add oHybridBody2 'Extrema
        oSelection.Add oHybridBody3 'Helping_Line
       

        oSelection.Delete
        opart.Update

End Function

'*********Create Boundary on selected Surface*****
Private Function Create_Boundary()


        Set oreferenceFace = opart.CreateReferenceFromObject(oSelection.Item(1).Value)    'Create Reference From Face for Later
        Set ohybridShapeBoundary = oHybridShapeFactory.AddNewBoundaryOfSurface(oreferenceFace)
   
        oHybridBody3.AppendHybridShape ohybridShapeBoundary
        opart.Update
   
       
   
End Function

'****** Create Extracts from Boundary Edges ******
Private Function Create_Extracts(m As Integer)
 
    For n = 1 To m
        'Set mysel = oSelection.Item(n)
        Set oreferenceLine = oSelection.Item(n).Value
        Set ohybridShapeExtract = oHybridShapeFactory.AddNewExtract(oreferenceLine)
   
        ohybridShapeExtract.PropagationType = 3                'keine tangenten- oder kurvenstetige Ableitung
        ohybridShapeExtract.ComplementaryExtract = False        '
        ohybridShapeExtract.IsFederated = False                '
   
        oHybridBody3.AppendHybridShape ohybridShapeExtract
        ohybridShapeExtract.Name = "Ableitung." & CStr(n)      'rename
 
        opart.Update
    Next
   
End Function


Private Function Create_Intersects(m As Integer)

    For n = 1 To m

        If n < m Then
            t = 1
            Set oreference1 = oHybridBody3.HybridShapes.Item("Ableitung." & CStr(n))
            Set oreference2 = oHybridBody3.HybridShapes.Item("Ableitung." & CStr(n + t))

            Set oHybridShapeIntersection = oHybridShapeFactory.AddNewIntersection(oreference1, oreference2)
            oHybridBody1.AppendHybridShape oHybridShapeIntersection
            oHybridShapeIntersection.Name = "Int." & CStr(n)
            opart.Update
   
        Else
   
            t = m - 1  'Intersect Between Extract m and 1
            Set oreference1 = oHybridBody3.HybridShapes.Item("Ableitung." & CStr(n))
            Set oreference2 = oHybridBody3.HybridShapes.Item("Ableitung." & CStr(n - t))

            Set oHybridShapeIntersection = oHybridShapeFactory.AddNewIntersection(oreference1, oreference2)
            oHybridBody1.AppendHybridShape oHybridShapeIntersection
            oHybridShapeIntersection.Name = "Int." & CStr(n)
            opart.Update
   
        End If
    Next
End Function
   
Private Function get_geo_Typ(oreference1 As Reference) As Integer

get_geo_Typ = oHybridShapeFactory.GetGeometricalFeatureType(oreference1)


       
End Function

Private Function Prüfen_und_Löschen()

        oSelection.Clear
        oSelection.Add oHybridBody1 'Helping Points = Intersects
        oSelection.Search "Type=Point,sel"
       
For k = oSelection.Count2 To 0 Step -1
       
    If k = 0 Then
        oSelection.Clear
        oSelection.Add oreference1 ' lösche den Extrempunkt, da es zu keiner Übereinstimmung mit einem Intersect gekommen ist
        oSelection.Delete
        Exit For
       
    Else
       
        Set oreference2 = oSelection.Item(k).Value
       
        Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench")
        Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oreference1)

        MinimumDistance = TheMeasurable.GetMinimumDistance(oreference2)
       

            Select Case MinimumDistance
       
            Case 0
                     
            oSelection.Clear
            oSelection.Add oreference2  'löscht den Intersect,da er ein Extrema representiert und keine doppelten Extrema
            oSelection.Delete          'erzeugen werden sollen
       
            Exit Function
       
            End Select
    End If
   
Next
End Function


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 18. Mai. 2019 16:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Basti1379 10 Unities + Antwort hilfreich

Servus

Dein Code ist sehr unübersichtlich. (und liefert in einem Kurztest einige Fehler)
Was für einen Zweck haben die Extrema? (ggf ein Bild einer Beispielfläche)
Meine Anmerkungen dazu:

  • Umlaute in Variablen- und Funktionsnamen: schlechte Idee
  • beschränke dich bei globale Variablen nur auf das nötigste (ggf nur die GeoSets und Selection, den Rest an Unterroutine und Funktion übergeben)
  • sprechende Variablennamen verwenden (das ist oreference1 nun?)
  • geht das löschen eines Elements über dessen Reference? Oder muss das Element gelöscht werden?
  • einige Select Case sind unnötig (einfache If then würden reichen)
  • ich würde erst die Fläche selektieren lassen und dann erst die GeoSets anlegen/suchen (spart das eventuelle Löschen beim Abbruch)
  • statt der drei Function Search_Geoset einen Parameter mit dem Namen übergeben (weniger gleichen Code, ggf mal wiederverwendbar)
  • Create_Extracts könnte dir zB einen Array mit den Extract zurück liefern, dann müsstest du nicht später per Namen auf diese zugreifen
Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Basti1379
Mitglied



Sehen Sie sich das Profil von Basti1379 an!   Senden Sie eine Private Message an Basti1379  Schreiben Sie einen Gästebucheintrag für Basti1379

Beiträge: 18
Registriert: 24.01.2019

CATIA V5

erstellt am: 19. Mai. 2019 12:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von bgrittmann:
Servus

Dein Code ist sehr unübersichtlich. (und liefert in einem Kurztest einige Fehler)
Was für einen Zweck haben die Extrema? (ggf ein Bild einer Beispielfläche)
Meine Anmerkungen dazu:

  • Umlaute in Variablen- und Funktionsnamen: schlechte Idee
  • beschränke dich bei globale Variablen nur auf das nötigste (ggf nur die GeoSets und Selection, den Rest an Unterroutine und Funktion übergeben)
  • sprechende Variablennamen verwenden (das ist oreference1 nun?)
  • geht das löschen eines Elements über dessen Reference? Oder muss das Element gelöscht werden?
  • einige Select Case sind unnötig (einfache If then würden reichen)
  • ich würde erst die Fläche selektieren lassen und dann erst die GeoSets anlegen/suchen (spart das eventuelle Löschen beim Abbruch)
  • statt der drei Function Search_Geoset einen Parameter mit dem Namen übergeben (weniger gleichen Code, ggf mal wiederverwendbar)
  • Create_Extracts könnte dir zB einen Array mit den Extract zurück liefern, dann müsstest du nicht später per Namen auf diese zugreifen
Gruß
Bernd


Hi danke für dein Feedback.
Ein paar Sachen die du angesprochen hast hab ich bereits umgesetzt jedoch ist mir eine Sache noch nicht so klar.

Wenn ich das Makro mal erweitern möchte, also weg von 4 Kanten bräuchte ich ein Dynamisches Array. Könntest du ein wenig Hilfestellung geben, da mir noch nicht ganz klar wie es ablaufen könnte.

Code:
'****** Create Extracts from Boundary Edges *************************************************
'********************************************************************************************
Private Function Create_Extracts(m As Integer)

Dim n As Integer
Dim oreferenceLine As Reference
Dim ohybridShapeExtract As HybridShapeExtract

 
Dim ArrExtract()
ReDim ArrExtract(m)  ' Anzahl Felder bestimmen

    For n = 1 To m
       
        Set oreferenceLine = oSelection.Item(n).Value
        Set ohybridShapeExtract = oHybridShapeFactory.AddNewExtract(oreferenceLine)
   
        ohybridShapeExtract.PropagationType = 3                'keine tangenten- oder kurvenstetige Ableitung
        ohybridShapeExtract.ComplementaryExtract = False        '
        ohybridShapeExtract.IsFederated = False
       
        Set oHybridBody1 = oHybridBodies.Item("Helping_Line")
        oHybridBody1.AppendHybridShape ohybridShapeExtract
        ohybridShapeExtract.Name = "Ableitung." & CStr(n)      'rename
       
        Set ArrExtract(n) = ohybridShapeExtract
        'MsgBox ArrExtract(n).Name                              'test
       
        opart.Update
    Next
   
End Function



Code:
Option Explicit

'****Globale Variablen*****
Dim opartDocument As PartDocument
Dim opart As Part

Dim oShapeFactory As ShapeFactory
Dim oHybridShapeFactory As HybridShapeFactory

Dim oHybridBodies As HybridBodies

Dim oHybridBody1 As HybridBody

Dim oSelection As Selection     'Selection
Dim oSelection2 As Object       'Selection für Option Explicit

Dim TheSPAWorkbench
Dim TheMeasurable

Dim orefExtrema As Reference
Dim oreferenceFace As Reference
Dim oHybridShapeBoundary As HybridShapeBoundary

'*******************************************************************************************
'This Macro will create m-Extrema on a selected Surface and split the Boundary with them****
'********************************************************************************************

Sub CATMain()

    Set opartDocument = CATIA.ActiveDocument
   
    If (InStr(opartDocument.Name, ".CATPart")) <> 0 Then    'Prüfen ob es sich um ein CATPart handelt
        Set opart = opartDocument.Part
        Set oSelection = opartDocument.Selection            'Initiliserung der Selection
        opart.Update

    End If
   
'*********************************************************************************************
'Der Benutzer wird aufgefordert eine Fläche von einer der vorgegebener Kategorie auszuwählen
'*********************************************************************************************

Dim sStatus As String


        Set oHybridShapeFactory = opart.HybridShapeFactory
        Set oSelection2 = oSelection
        ReDim sFilter(0)
       
        MsgBox ("Select a" & vbCrLf & Chr(13) & "Multi-Section-Surface" & vbCrLf & Chr(13) & "Offset" & vbCrLf & Chr(13) & "Blend" & vbCrLf & Chr(13) & "Sweep ")
        sFilter(0) = "HybridShapeSurfaceExplicit"
        sStatus = oSelection2.SelectElement2(sFilter, "select a face", False)
       
       
       
If (sStatus = "Cancel") Then
   
        MsgBox (" Macro will Stop") 'Wenn die Selektion nicht ausgeführt wird oder abgebrochen wird
        Exit Sub                    'stopt das Makro
       
        Else
       
'*********************************************************************************************
'Create Boundary on selected Surface
'Create Geosets (Helping_Line;Helping_Point and Extrema)
'*********************************************************************************************
Dim ABC As String

        Set oreferenceFace = opart.CreateReferenceFromObject(oSelection.Item(1).Value)
        Set oHybridShapeBoundary = oHybridShapeFactory.AddNewBoundaryOfSurface(oreferenceFace)
       
        ABC = "Helping_Line"
        Create_Geoset (ABC)
               
        ABC = "Extrema"
        Create_Geoset (ABC)
       
        ABC = "Helping_Point"
        Create_Geoset (ABC)
       
        Set oHybridBody1 = oHybridBodies.Item("Helping_Line")
        oHybridBody1.AppendHybridShape oHybridShapeBoundary
        opart.Update
  
End If

'*********************************************************************************************
'******Count Edges of Boundary and Create Extract*********************************************
'*********************************************************************************************
        oSelection.Clear
        oSelection.Add oHybridShapeBoundary
        oSelection.Search "Topology.CGMEdge,sel"        'sucht die Kanten der erstellten Boundary
       
        'MsgBox oSelection.Count2 & " Edges are found from the selected face"
       
'*********************************************************************************************
'*********Hier kann eine Erweiterung auf m-Kanten erfolgen!!!!***************
'*********************************************************************************************
Dim m As Integer

If oSelection.Count2 = 4 Then           'Zähler der Kanten (Flächenkriterium = 4 Kanten)

        m = oSelection.Count2           'm can be used for more than 4 Edges
        Create_Extracts (m)             'Function Create_four_Extracts
       
        Else
        'löscht die bisherigen erstellten Geosets bei count != 4
        MsgBox (" More or less than four Edges where found" & vbCrLf & Chr(13) & " Macro will Stop")
       
        ABC = "Helping_Line"
        Delete_Created_Geosets (ABC)
               
        ABC = "Extrema"
        Delete_Created_Geosets (ABC)
       
        ABC = "Helping_Point"
        Delete_Created_Geosets (ABC)
              
          
        Exit Sub

End If
'*********************************************************************************************
'erstellt zwischen den Kanten  1/2 ; 2/3 ;3/4 ... 4/1 usw. jeweils einen Intersect
'*********************************************************************************************
Create_Intersects (m)

'*********************************************************************************************
'erstellt alle Kombinationsmöglichkeiten von Extrema [3^3] ,außer 0/0/0 = error
'*********************************************************************************************
Dim oHybridShapeExtremum1 As HybridShapeExtremum
Dim ohybridShapeD1 As HybridShapeDirection
Dim X, Y, Z As Integer
Dim GeomType As Integer

    For X = -1 To 1 Step 1
    For Y = -1 To 1 Step 1
    For Z = -1 To 1 Step 1

        If Not (X = 0 And Y = 0 And Z = 0) Then

            Set ohybridShapeD1 = oHybridShapeFactory.AddNewDirectionByCoord(X, Y, Z)
            Set oHybridShapeExtremum1 = oHybridShapeFactory.AddNewExtremum(oreferenceFace, ohybridShapeD1, 1)
           
            Set oHybridBody1 = oHybridBodies.Item("Extrema")
            oHybridBody1.AppendHybridShape oHybridShapeExtremum1
            oHybridShapeExtremum1.Name = "Extrema." & CStr(X) & CStr(Y) & CStr(Z)
           
            opart.Update
           
            'Check the geometrical type of the shape
            Set orefExtrema = opart.CreateReferenceFromObject(oHybridShapeExtremum1)
            GeomType = oHybridShapeFactory.GetGeometricalFeatureType(orefExtrema)   '=> Integer
           
            'Check the integer geom type value and decide
            Select Case GeomType
                       
            Case 0  'Unknown
            oSelection.Clear
            Set orefExtrema = oHybridShapeExtremum1
            oSelection.Add orefExtrema ' lösche den Extrempunkt, da es sich nicht um einen Punkt handelt
            oSelection.Delete
                       
            Case 1  'Point
            Set orefExtrema = oHybridShapeExtremum1
            Check_Point_Extrema        'Prüft ob es eine Übereinstimmung mit einem Intersect gibt
           
            Case 2  'Curve
            oSelection.Clear
            Set orefExtrema = oHybridShapeExtremum1
            oSelection.Add orefExtrema ' lösche den Extrempunkt, da er eine Kurve ist
            oSelection.Delete
           
           
            Case 3  'Line
            oSelection.Clear
            Set orefExtrema = oHybridShapeExtremum1
            oSelection.Add orefExtrema ' lösche den Extrempunkt, da er eine Linie ist
            oSelection.Delete
                     
            Case Else 'löscht alle Geosets
            ABC = "Helping_Line"
            Delete_Created_Geosets (ABC)
               
            ABC = "Extrema"
            Delete_Created_Geosets (ABC)
       
            ABC = "Helping_Point"
            Delete_Created_Geosets (ABC)
           
           
            End Select
            
        End If
           
    Next
    Next
    Next
   
'*********************************************************************************************
'****************Delete the Geosets ( Helping_Line and Helping_Point)*************************
'*********************************************************************************************

        ABC = "Helping_Line"
        Delete_Created_Geosets (ABC)
               
             
        ABC = "Helping_Point"
        Delete_Created_Geosets (ABC)
       
'*********************************************************************************************
'****************Create a Geosets ( Boundary )***********************************************
'*********************************************************************************************

        'ABC = "Boundary"
        'Create_Geoset (ABC)
        Create_sections_of_Boundary (m)
   
End Sub

'*********************************************************************************************
'****Sucht und erstellt ein Geoset mit einem Variablen Namen***
'****************************************************************
Sub Create_Geoset(ABC As String)

Dim Name As String

        oSelection.Clear
        Name = "CATGmoSearch.OpenBodyFeature.Name=" & CStr(ABC) & ",all"
        oSelection.Search (Name)    'Variable Geoset suche

    If oSelection.Count < 1 Then

        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody1 = opart.HybridBodies.Add           'Erstellen eines Geosets
        oHybridBody1.Name = CStr(ABC)
       
        Else

        Set oHybridBodies = opart.HybridBodies
        Set oHybridBody1 = oHybridBodies.Item(CStr(ABC))
       
    End If

End Sub

'*********************************************************************************************
'****Delete all Geometricalsets on cancel ****************************************************
'*********************************************************************************************
Sub Delete_Created_Geosets(ABC As String)

Dim Name2 As String

        Name2 = CStr(ABC)
        oSelection.Clear
        Set oHybridBody1 = oHybridBodies.Item(Name2)
        oSelection.Add oHybridBody1
        oSelection.Delete
       
        opart.Update

End Sub

'*********************************************************************************************
'****** Create Extracts from Boundary Edges *************************************************
'********************************************************************************************
Private Function Create_Extracts(m As Integer)

Dim n As Integer
Dim oreferenceLine As Reference
Dim ohybridShapeExtract As HybridShapeExtract

Dim ArrExtract() As String


    For n = 1 To m
       
        Set oreferenceLine = oSelection.Item(n).Value
        Set ohybridShapeExtract = oHybridShapeFactory.AddNewExtract(oreferenceLine)
   
        ohybridShapeExtract.PropagationType = 3                 'keine tangenten- oder kurvenstetige Ableitung
        ohybridShapeExtract.ComplementaryExtract = False        '
        ohybridShapeExtract.IsFederated = False
       
        Set oHybridBody1 = oHybridBodies.Item("Helping_Line")
        oHybridBody1.AppendHybridShape ohybridShapeExtract
        ohybridShapeExtract.Name = "Ableitung." & CStr(n)       'rename
  
        opart.Update
    Next
   
End Function

'*********************************************************************************************
'Create m-Intersects between the Extracs of the Boundary**************************************
'**********************************************************************************************
Private Function Create_Intersects(m As Integer)

Dim t As Integer
Dim n As Integer
Dim orefIntersect1 As Reference
Dim orefIntersect2 As Reference
Dim oHybridShapeIntersection As HybridShapeIntersection

    For n = 1 To m

        If n < m Then
            t = 1
            Set oHybridBody1 = oHybridBodies.Item("Helping_Line")
            Set orefIntersect1 = oHybridBody1.HybridShapes.Item("Ableitung." & CStr(n))
            Set orefIntersect2 = oHybridBody1.HybridShapes.Item("Ableitung." & CStr(n + t))

            Set oHybridShapeIntersection = oHybridShapeFactory.AddNewIntersection(orefIntersect1, orefIntersect2)
            Set oHybridBody1 = oHybridBodies.Item("Helping_Point")
            oHybridBody1.AppendHybridShape oHybridShapeIntersection
            oHybridShapeIntersection.Name = "Int." & CStr(n)
            opart.Update
   
        Else
   
            t = m - 1  'Intersect Between Extract m and 1
            Set oHybridBody1 = oHybridBodies.Item("Helping_Line")
            Set orefIntersect1 = oHybridBody1.HybridShapes.Item("Ableitung." & CStr(n))
            Set orefIntersect2 = oHybridBody1.HybridShapes.Item("Ableitung." & CStr(n - t))

            Set oHybridShapeIntersection = oHybridShapeFactory.AddNewIntersection(orefIntersect1, orefIntersect2)
            Set oHybridBody1 = oHybridBodies.Item("Helping_Point")
            oHybridBody1.AppendHybridShape oHybridShapeIntersection
            oHybridShapeIntersection.Name = "Int." & CStr(n)
            opart.Update
   
        End If
    Next
End Function

'***************************************************************************************
'*********If the Point Extrema has 0 mm to an Intersect keep it else delete ***********
'***************************************************************************************
Private Function Check_Point_Extrema()

Dim k As Integer
Dim orefIntersect1 As Reference
Dim MinimumDistance As Double   'Distance Between Intersect and Extrema

        oSelection.Clear
        Set oHybridBody1 = oHybridBodies.Item("Helping_Point")
        oSelection.Add oHybridBody1
        oSelection.Search ("Type=Point,sel")
       
        k = oSelection.Count2


For k = oSelection.Count2 To 0 Step -1
       
    If k = 0 Then
        oSelection.Clear
        oSelection.Add orefExtrema ' lösche den Extrempunkt, da es zu keiner Übereinstimmung mit einem Intersect gekommen ist
        oSelection.Delete
        Exit For
       
    Else
       
        Set orefIntersect1 = oSelection.Item(k).Value
       
       
        Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench")
        Set TheMeasurable = TheSPAWorkbench.GetMeasurable(orefExtrema)

        MinimumDistance = TheMeasurable.GetMinimumDistance(orefIntersect1)
      
            Select Case MinimumDistance
       
            Case 0
                      
            oSelection.Clear
            oSelection.Add orefIntersect1   'löscht den Intersect,da er ein Extrema representiert
            oSelection.Delete               'und keine doppelten Extrema erzeugen werden sollen
       
            Exit Function
       
            End Select
    End If
   
Next
End Function

'*********************************************************************************************
'*********Create m-sections from Boundary on selected Surface*********************************
'*********************************************************************************************
Private Function Create_sections_of_Boundary(m As Integer)

Dim n As Integer
Dim t As Integer

oSelection.Clear
Set oHybridBody1 = oHybridBodies.Item("Extrema")
oSelection.Add oHybridBody1
oSelection.Search "Type=Point,sel"

For n = 1 To m Step 1

    If n < m Then
        t = 1
        Set oHybridShapeBoundary = oHybridShapeFactory.AddNewBoundaryOfSurface(oreferenceFace)
   
        oHybridBody1.AppendHybridShape oHybridShapeBoundary
        oHybridShapeBoundary.From = oSelection.Item(n).Value
        oHybridShapeBoundary.FromOrientation = 1
   
   
        oHybridShapeBoundary.To = oSelection.Item(n + t).Value
        oHybridShapeBoundary.ToOrientation = 1
      
        opart.Update
   Else
       
        t = m - 1   'Boundary between first and last
        Set oHybridShapeBoundary = oHybridShapeFactory.AddNewBoundaryOfSurface(oreferenceFace)
   
        oHybridBody1.AppendHybridShape oHybridShapeBoundary
        oHybridShapeBoundary.From = oSelection.Item(n).Value
        oHybridShapeBoundary.FromOrientation = 1
   
   
        oHybridShapeBoundary.To = oSelection.Item(n - t).Value
        oHybridShapeBoundary.ToOrientation = 1
        opart.Update
    End If
Next

End Function



[Diese Nachricht wurde von Basti1379 am 19. Mai. 2019 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz