Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Code übersichtlicher mit Unterroutinen

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:  Code übersichtlicher mit Unterroutinen (710 mal gelesen)
Zwenne12
Mitglied
Werkzeugkonstrukteur


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

Beiträge: 26
Registriert: 23.08.2004

erstellt am: 07. Apr. 2010 14: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

Hallo,

ich habe ein Makro geschrieben, welches aus einer Baugruppe heraus selektierte Parts und Products in eine neu erstellte Baugruppe kopiert. Parts werden dabei über die Methode Paste eingefügt und Products über PasteSpecial "CATSpecBreakLink".
Das ganze funktioniert auch wunderbar, jedoch würde ich das Makro gerne übersichtlicher gestalten und mit Unterroutinen versehen. Z.B. könnte man den Code unter '---Filter in einer Unterroutine zusammenfassen, ich weiß jedoch nicht wie man das Ganze dann deklariert bzw. welche Parameter bei der Unterroutine übergeben werden müssen.
Bin für jede Verbesserung dankbar .

Code:
Sub CATMain()

' Selektierte Elemente
Dim oSel
Set oSel = CATIA.ActiveDocument.Selection

' ---Produkt erzeugen
Set oProduct1 = CATIA.Documents.Add ("Product")
Set oProduct2 = oProduct1.Product

' ---Array deklarieren
Dim aArray ()
ReDim aArray (0)

If oSel.Count  > 0 Then

' ---Selektion Auslesen
For i = 1 to oSel.Count

' ---Wert dem Arrayfeld zuordnen
Set aArray(UBound(aArray)) = oSel.Item(i).Value
' ---Arraydimension um 1 Feld erweitern
ReDim Preserve aArray(UBound(aArray)+1)

Next

' ---Selektion löschen
oSel.Clear

' ---Arrayobjekte der Selektion hinzufügen
For j = 0 to UBound(aArray)-1

' ---Filter
Set oUserSel = aArray(j)
Set oSelElem = oUserSel.ReferenceProduct.Parent
ObjectType = Typename (oSelElem)

' ---Filter anwenden für Parts
If Objecttype = ("PartDocument") Then

oSel.Add(aArray(j))

End If

Next

If oSel.Count <> 0 Then

oSel.Copy
oSel.clear
oSel.Add oProduct2

oSel.Paste

End If

oSel.Clear


' ---Arrayobjekte der Selektion hinzufügen
For j = 0 to UBound(aArray)-1

' ---Filter
Set oUserSel = aArray(j)
Set oSelElem = oUserSel.ReferenceProduct.Parent
ObjectType = Typename (oSelElem)

' ---Filter anwenden für Products
If Objecttype = ("ProductDocument") Then

oSel.Add(aArray(j))

End If

Next

If oSel.Count <> 0 Then

oSel.Copy
oSel.Clear
oSel.Add oProduct2

oSel.PasteSpecial "CATSpecBreakLink"

End If

oSel.Clear

Else

MsgBox ("Kein Dokument Selektiert")

End If


End Sub


Guß Zwenne

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

DanielFr.
Moderator
Manager


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

Beiträge: 2506
Registriert: 10.08.2005

HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3

erstellt am: 07. Apr. 2010 15:48    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 Zwenne12 10 Unities + Antwort hilfreich

Hallo  ,

anbei mal mein Code. Die Änderungen habe ich gleich im Code reingeschrieben. Bei Fragen kannst du dich einfach melden. Die Filteroutine ist jetzt eine Funktion. Das Array ist global deklariert da die Sub und die Funktion darauf zugreifen müssen.

Schönheitsfehler (Einrücken, Schleifeende, etc.) habe ich auch verbessert. ICh denke so lässt sich der Code schon ein wenig besser lesen. Des weiteren ist er ein wenig performanter geworden 

Code:
'Option Explicit

'***DAS ARRAY WIRD GLOBAL DEFINIERT SO KANN DIE FUNKTION AUCH DARAUF ZUGREIFEN
Private aArray() As Object

Sub CATMain()

' Selektierte Elemente
    Dim oSel
    Set oSel = CATIA.ActiveDocument.Selection
   
    '***HIER DIE SCHLEIFE GLEICH ZU MACHEN!!!
    '***WENN DU LÄNGERE CODES HAST WIRD ES SONST UNÜBERSICHTLICH DU DA NICHT MEHR SIEHST WO GENAU DIE SCHLEIFEN ZUGEHEN
    '***DER ABSATZ KOMMT NOCH VOR DEM NEUEN PRODUKT. SONST HAST DU SCHON EIN NEUES PRODUKT OFFEN UND DAS MAKRO BRICHT AB
    '***ANDERE LÖSUNG: WENN NOCH NICHTS SELEKTIERT IST DANN KANN DER ANWENDER EIN PRODUKT/PART SELEKTIEREN!!!
    If oSel.Count = 0 Then
        MsgBox ("Kein Dokument Selektiert")
        Exit Sub
    End If
   
    ' ---Produkt erzeugen
    Set oProduct1 = CATIA.Documents.Add("Product")
    Set oProduct2 = oProduct1.Product
       
    ' ---Selektion Auslesen
    '***REDIM PRESERVE LEGT JEDES MAL EINE KOPIE VON SICH SELBER IM ARBEITSSPEICHER AN!!!
    '***DAS IST AUF DIE DAUER (IN SCHLEIFEN) NICHT PERFORMANT
    ReDim Preserve aArray(oSel.Count - 1)
    For i = 1 To oSel.Count
        ' ---Wert dem Arrayfeld zuordnen
        Set aArray(i - 1) = oSel.Item(i).Value
    Next

    ' ---Selektion löschen
    oSel.Clear

    ' ---Arrayobjekte der Selektion hinzufügen
    For j = 0 To UBound(aArray)
        '***WIRD GEBRAUCHT FALLS DAS OBJEKT LEER IST UND NICHTS ZUR SELEKTION HINZUGEFÜGT WIRD!!!
        On Error Resume Next
        oSel.Add FilterFunc(j, "PartDocument")
        On Error GoTo 0
    Next

    '***Kopieren und Einfügen
    If oSel.Count <> 0 Then
        oSel.Copy
        oSel.Clear
        oSel.Add oProduct2
        oSel.Paste
    End If

    oSel.Clear


    ' ---Arrayobjekte der Selektion hinzufügen
    For j = 0 To UBound(aArray)
        '***WIRD GEBRAUCHT FALLS DAS OBJEKT LEER IST UND NICHTS ZUR SELEKTION HINZUGEFÜGT WIRD!!!
        On Error Resume Next
        oSel.Add FilterFunc(j, "ProductDocument")
        On Error GoTo 0
    Next

    '***Kopieren und Einfügen
    If oSel.Count <> 0 Then
        oSel.Copy
        oSel.Clear
        oSel.Add oProduct2
        oSel.PasteSpecial "CATSpecBreakLink"
    End If

    oSel.Clear


End Sub

Private Function FilterFunc(ByVal uebArrayCounterInt As Integer, ByVal uebObjTypeStr As String) As Object
'***DEKLARATIONEN
    Dim oUserSel
    Dim oSelElem
    Dim Objecttype As String
   
    ' ---Filter
    Set oUserSel = aArray(j)
    Set oSelElem = oUserSel.ReferenceProduct.Parent
    Objecttype = TypeName(oSelElem)
   
    ' ---Filter anwenden für Parts
    If Objecttype = (uebObjTypeStr) Then
        Set FilterFunc = aArray(uebArrayCounterInt)
    End If

End Function


------------------
MFG Daniel

Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...)

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



Konstrukteur / Anwendungstechniker für Sonnen- und Regenschutzsysteme (m/w/d)

Wir sind ein führendes Unternehmen im Bereich textiler Sonnen- und Regenschutzlösungen für den Outdoorliving-Bereich und entwickeln, produzieren und vertreiben hochwertige Markisensysteme und Terrassendächer national wie international. Mit unseren Produkten verwandeln wir Terrassen in Wohlfühloasen und ermöglichen Gastronomen eine längere Saison im Freien und damit mehr Umsatz. Wir tragen dazu bei, ...

Anzeige ansehenKonstruktion, Visualisierung
Zwenne12
Mitglied
Werkzeugkonstrukteur


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

Beiträge: 26
Registriert: 23.08.2004

erstellt am: 08. Apr. 2010 14:02    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 Daniel,

erstmal besten Dank für die Mühe. Die Verbesserung hat super funktioniert , ich musste allerdings
die Variablendeklaration noch ändern, weil mir nur CATvbs zur Verfügung steht.
Ich habe dann für die '***Kopieren und Einfügen Sektion noch eine Unterroutine erstellt (Müsste doch eigentlich Sinn machen).

Code:
Private aArray()
Private oSel
Private oProduct2

Sub CATMain()

' ---Selektierte Elemente
      Set oSel = CATIA.ActiveDocument.Selection
 
    If oSel.Count = 0 Then
        MsgBox ("Kein Dokument Selektiert")
        Exit Sub
    End If
   
    ' ---Produkt erzeugen
    Set oProduct1 = CATIA.Documents.Add("Product")
    Set oProduct2 = oProduct1.Product
       
    ' ---Selektion Auslesen
    ReDim Preserve aArray(oSel.Count - 1)
    For i = 1 To oSel.Count
        ' ---Wert dem Arrayfeld zuordnen
        Set aArray(i - 1) = oSel.Item(i).Value
    Next

    ' ---Selektion löschen
    oSel.Clear

    ' ---Arrayobjekte der Selektion hinzufügen
    For j = 0 To UBound(aArray)
        On Error Resume Next
        oSel.Add FilterFunc(j, "PartDocument")
        On Error GoTo 0
    Next

    ' ---Kopieren und Einfügen
    CopyPaste ("CATProdCont")

    oSel.Clear

    ' ---Arrayobjekte der Selektion hinzufügen
    For j = 0 To UBound(aArray)
        On Error Resume Next
        oSel.Add FilterFunc(j, "ProductDocument")
        On Error GoTo 0
    Next

    ' ---Kopieren und Einfügen
    CopyPaste ("CATSpecBreakLink")

    oSel.Clear

End Sub

Private Function FilterFunc(Zaehler, Objekttyp)

    Dim oUserSel
    Dim oSelElem
    Dim Objecttype
   
    ' ---Filter
    Set oUserSel = aArray(Zaehler)
    Set oSelElem = oUserSel.ReferenceProduct.Parent
    Objecttype = TypeName(oSelElem)
   
    ' ---Filter anwenden für Parts
    If Objecttype = (Objekttyp) Then
        Set FilterFunc = aArray(Zaehler)
    End If

End Function

Private Sub CopyPaste (Einfuegen)

If oSel.Count <> 0 Then
oSel.Copy
oSel.Clear
oSel.Add oProduct2
oSel.PasteSpecial (Einfuegen)
End If


Werde mich jetzt noch mit SelectElement beschäftigen, wenn beim Start des Makros noch nichts selektiert ist.
Besten Dank nochmal

Gruß
Sven

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