Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Flächen aus geometrischen Sets auslesen und Referenz erstellen

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:  Flächen aus geometrischen Sets auslesen und Referenz erstellen (2873 mal gelesen)
Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 08. Feb. 2018 11:03    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 folgende geometrische Sets, in denen Flächen sind:

GeoSet.1:
-FlächeA.1
-FlächeB.1
-FlächeC.1
-FlächeD.1
-FlächeE.1
usw

GeoSet.2
-FlächeA.2
-FlächeC.2
-FlächeD.2
-FlächeE.2
usw

GeoSet.3
-FlächeC.3
-FlächeE.3
usw

GeoSet4
-Fläche...

GeoSet5
-Fläche...

usw...

In jedem neuen GeoSet fallen (möglicherweise) Flächen heraus, das ganze setzt sich beliebig weit fort.
Nun möchte ich eine Referenz jeweils auf die Fläche mit der höchsten Nummer haben.
Im Beispiel also auf:
-FlächeA.2
-FlächeB.1
-FlächeC.3
-FlächeD.2
-FlächeE.3

Bisher habe ich immer mit dem Makrorekorder gearbeitet und den Rest dann drumherum gebaut, das ist hier leider nicht möglich.
Leider habe ich hier keinen Ansatz, wie ich das ganze angehe, kann mir dabei jemand behilflich sein?

Lukas

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. Feb. 2018 11:10    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Eine Möglichkeit wäre:
- per Selection nach den Flächen suchen (nach Typ und Name (zB Name='FlächeA.*'))
- Ergebnis mit zB Bubblesort sortieren
- gewünschte Fläche bestimmen
- nächste Suche

Gruß
Bernd

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

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

KADv5
Mitglied
Ingenieur


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

Beiträge: 13
Registriert: 22.01.2018

Intel Xeon E5-2643 3,4Ghz
12,0 GB Ram
Win 7 Enterprise 64-bit
Catia V5R26 SP3 HF21

erstellt am: 08. Feb. 2018 11:41    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 Luhukas 10 Unities + Antwort hilfreich


Unbenannt.jpg

 
Sind die Namen der Flächen und der Geo-Sets denn immer gleich?
Also heißen die Flächen auch in Catia "FlächeA.2" usw.?
Heißen die Geo-Sets auch in Catia "GeoSet.2" usw.?

Dann könntest du mit einer Schleife durch die Namen der Features "suchen".

Folgendes Makro sucht zum Beispiel im "Geometrical Set.1" nach Flächen mit dem namen "Fill.1" ,2,3...99 usw. und blendet die höchste Zählernummer aus:

Code:

Sub CATMain()

Dim Ref1 As Reference

For i = 1 To 99
On Error Resume Next
Set Ref1 = CATIA.ActiveDocument.Part.CreateReferenceFromObject(CATIA.ActiveDocument.Part.HybridBodies.Item("Geometrical Set.1").HybridShapes.Item("Fill." & i))
Next

Set Factory = CATIA.ActiveDocument.Part.HybridShapeFactory
Factory.GSMVisibility Ref1, 0

End Sub



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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 08. Feb. 2018 12: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

Ja genau, die Namen der Flächen und der gemeometrischen Sets unterscheiden sich nur durch die Nummerierung.

Vielen Dank für die schnellen Antworten, ich werde das jetzt mal versuchen 

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 21. Feb. 2018 16: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,

das hat, so wie KADv5 gesagt hat, soweit einigermaßen geklappt, allerdings habe ich noch ein paar Fragen:
Wenn ich nun nach allen Flächen aus den Geosets suche:

Code:
selection1.Add GeoSet1,2,3

selection1.Search "(((CATStFreeStyleSearch.Surface + CATPrtSearch.Surface) + CATGmoSearch.Surface) + CATSpdSearch.Surface), sel"


alle Flächen relevanten Flächen werden gefunden (da korrekt hervorgehoben)

und dann diese Zeile verwende:

Code:
Set Ref1 = CATIA.ActiveDocument.Part.CreateReferenceFromObject(CATIA.ActiveDocument.Part.HybridBodies.Item("Geometrical Set.1").HybridShapes.Item("Fill." & i))

und Sie so umschreibe:

Code:
Set Ref1 = part1.CreateReferenceFromObject(selection1.Item("FlächeA." & i))

Funktioniert das leider nicht, obwohl keine Fehlermeldung erscheint.

Außerdem möchte ich den Code noch etwas erweitern:
Wenn jetzt im zweiten GeoSet beispielsweise noch eine Fläche hinzukommt, die nicht der vorgeschriebenen Namensgebung entspricht, (z.B. NeueFläche.1), kann ich diese dann mit einer If-Schleife herausfiltern, in etwa so:

if selection1 (ungleich) FlächeA,B,C,D,E...
then set Ref auf NeueFläche.1

Ich hoffe ihr versteht was ich meine 

Viele Grüße
Lukas

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: 21. Feb. 2018 17:26    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 Luhukas 10 Unities + Antwort hilfreich

Servus Lukas

Du könntest die Suche einschränken dass nur Flächen mit einem bestimmten Namensmuster gefunden werden. zB

Code:
selection1.Search "+ CATGmoSearch.Surface + Name='Fläche*',sel"
Leider kann mna nicht per Name auf Elemente der Selektion zugreifen. Beispiel zur Erzeugung der Referenz:
Code:
Set Ref1 = part1.CreateReferenceFromObject(selection1.Item2(1).value) 'bzw statt 1 einen Laufvariable nutzen
'oder
Set Ref1 = selection1.Item2(1).Reference
Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 27. Feb. 2018 11:14    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,

ist es möglich ein Element innerhalb einer Selection zu kopieren?
mit:

Code:
selection1.Item2(3).Value.Copy

funktioniert das leider nicht, allerdings kann der Name angezeigt werden:

Code:
MsgBox selection1.Item2(3).Value.Name

Ist es dann möglich den Namen unter einer Variablen zu speichern und dann über eine neue Suche per Selection nach dem Namen (der dann über die Variable aufgerufen wird) zu suchen?

Gibt es außerdem eine Möglichkeit für ein Makro, das die Flächen in  Geometrische Sets vergleicht, also ob der Name der Fläche in allen Geometrischen Sets vorkommt, auch wenn der Name der Fläche unbekannnt ist.

Vieln Dank nochmal für eure Hilfe!

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: 27. Feb. 2018 16:38    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Nein, du kannst immer nur die ganze Selektion kopieren.
Ja klar:

Code:
strFaceName = selection1.Item2(3).Value.Name

per Namen auf Element zugreifen ohne sicher zu sein ob es existiert (ungetestet):
Code:

On Error Resume Next 'Fehlerbehandlung ausschalten
Set myFace = oHybridbody.HybridShapes.Item("NameDerFläche.1")
if myFace is Nothing then
  MsgBox "Fläche nicht gefunden"
  exit Sub
end if
On Error GotTo 0 'Fehlerbehandlung wieder einschalten WICHTIG
Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 28. Feb. 2018 12:58    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

Super, vielen Dank.

Könnte man dann so nach dem gespeicherten Namen suchen?

Code:
selection2.Search "Name = 'strFaceName', sel"

Oder ist das nicht möglich?

Viele Grüße
Lukas

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: 28. Feb. 2018 13:12    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Wenn dann eher so:

Code:
selection2.Search "Name = " & strFaceName & ", sel"

Aber warum nochmal suchen wenn du auch das Objekt (die Fläche) zwischenspeichern könntest:
Code:
Set MyFace = selection1.Item2(3).Value
Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 28. Feb. 2018 13: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

Da ich die neue Fläche kopieren will, in dem Fall kopiere ich die neue Selection.

oder wäre es hier auch möglich

Code:
Set MyFace = selection1.Item2(3).Value

MyFace einfach zu kopieren?

Zu dem anderen Thema:

Ich suche nach einer Möglichkeit, dass ein Makro in verschiedenen Geometrischen Sets erkennt, ob zwei Flächen den gleichen Namen haben, ohne dass ich diesen Namen davor definiert habe:

GeoSet1
x.1
y.1
z.1

GeoSet2:
x.2
z.2
a.1
b.1


in diesem Fall würde er mir ausgeben, dass x und z zwei mal vorhanden sind, die anderen jeweils nur einmal
Ich möchte nur die Namen der GeoSets im Vorhinein angeben, die Namen der Flächen sollen frei wählbar sein, es soll nur gesucht werden, ob ein Name in beiden oder nur in einem GeoSet vorkommt.

Viele Grüße
Lukas

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: 28. Feb. 2018 13:54    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Nein du kannst nur den gesamten Inhalt der Selektion kopieren.
Also zB Element dass du kopieren willst zwischenspeichern, Selektion leeren, gespeichertes Element selektieren und dann kopieren.

Das erkennen von Elementen mit doppelten (Teil)Namen wird wohl recht komplex und umständlich.
Kennst du nun die Basisnamen und Namen der GeoSets?
Ist der Zähler im Namen des GeoSet und im Flächenname immer gleich? Wenn ja könntest du dies über verschachtelte Schleifen und ansprechen der Elemente per Name bewerkstelligen (so ähnlich wie es KADv5 skizziert hat)
Wie würdest du manuell vorgehen die Flächen "zu sammeln"? ggf könntest du das auf den Ablauf eines Makros anwenden.

Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 28. Feb. 2018 14:16    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

Deswegen war meine Idee in einer zweiten Suche nach dem dritten Ergebnis der ersten Suche zu suchen:

Code:
strFaceName = selection1.Item2(3).Value.Name
selection2.Search "Name = " & strFaceName & ", sel"

und dann selection2 zu kopieren. Das ist zwar umständlich, sollte aber funktionieren.


Das Problem ist, ich kenne nur die Namen der Flächen aus dem ersten GeoSet. Wenn die Flächen nur geändert werden (x.1 zu x.2), die Namen aus den weiteren GeoSets also gleich sind, funktioniert es so wie KADv5  es beschrieben hat. Kommen neue Flächen hinzu (a.1 und die Neue Fläche steht hinter den alten, hat also eine höhere Value in der Selection), hatte ich die Idee über eine Schleife, da mir die Anzahl der Flächen in GeoSet1 bekannt sind (If GeoSet2.Count > GeoSet1.Count Then das mit der Suche nach z.B. der dritten Fläche in GeoSet2 (vorausgesetzt GeoSet1 beinhaltet 2 Flächen)

Wenn nun aber, wie in meinem Beispiel, auch Flächen herausfallen (y.1) weiß ich nicht wie ich das managen kann.

Manuell würde ich alles GeoSets durchsuchen und immer die Fläche mit mit der höchsten Nummer kopieren und in ein Neues GeoSet einfügen.

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: 28. Feb. 2018 14:30    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Kleiner Hinweis: es gibt nur eine Selektion. Also wenn du zB suchst sind die Elemente die zuvor selektiert wurden wieder weg (ggf Inhalt der Selektion vorher zwischenspeichern)

Wie wäre es mit folgender Vorgehensweise:
- Array oder Collection für die Flächen anlegen
- GeoSets von hinten nach vorne per Schleife durcharbeiten
- Hybridshapes per Schleife durcharbeiten (ggf noch Typ auswerten und ggf Element überspringen)
- falls der Name (beim Vergleich Punkt mit Index abschneiden) der Fläche noch nicht im Array/Collection vorkommt diese hinzufügen sonst zur nächsten Fläche gehen
- nach Beendigung der verschachtelten Schleifen solltest du einen Array/Collection mit den "höchsten" Flächen haben. Dies kannst du dann zB selektieren und kopieren.

(vergleiche auch ähnliche Vorgehensweise hier)

Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 28. Feb. 2018 14:57    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

Super, vielen Dank für deine Hilfe!

damit werde ich mich jetzt die nächsten Tage beschäftigen 

Viele Grüße
Lukas

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 07. Mrz. 2018 13:49    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 schon wieder 

Also ich habe nun einen Array "Flächen" erstellt, alle Flächen aus dem höchsten GeoSet per Selection ausgewählt und dem Array hinzugefügt. Danach habe ich die Flächen aus dem nächsten GeoSet ausgewählt (selection1) und versuche nun nur die Flächen, welche noch nicht in dem Array sind, hinzuzufügen.
In dem Post, den du verlinkt hast wird hierauf verwiesen: http://www.vbarchiv.net/tipps/tipp_1650-isinarray-element-in-array-vorhanden.html. Das löst eigentlich  genau mein Problem.  Allerdings stehe ich gerade total auf dem Schlauch und weiß nicht, wie ich diesen Code auf mein Problem übertragen kann. Ich habe bis jetzt versucht, einfach nur die Variablen zu ändern, allerdings ohne Erfolg. Es wird gar keine Fläche hinzugefügt, dabei habe ich noch nicht einmal versucht die Nummerierung abzuschneiden:

Code:
Public Function IsInArray(ByRef Flächen() As String, _
  ByVal sItem As String, _
  Optional ByVal nStart As Variant, _
  Optional ByVal nEnd As Variant) As Long

  ' Prüfen, ob das Element "sItem" im Array "sArray" enthalten ist
  ' Rückgabewert: Index des Elements bzw. -1, wenn nicht vorhanden
  Dim i As Long
  Dim nIndex As Long
  Dim nLen As Long

  On Error GoTo ErrHandler
  nIndex = -1

  If IsMissing(nStart) Then nStart = LBound(Flächen)
  If IsMissing(nEnd) Then nEnd = UBound(Flächen)

  nLen = Len(sItem)
  For i = nStart To nEnd
    If Len(Flächen(i)) = nLen Then
      If Flächen(i) = sItem Then
        nIndex = i: Exit For
      End If
    End If
  Next i
  On Error GoTo 0

ErrHandler:
  IsInArray = nIndex
End Function

Code:
For i = 1 to selection1.Count
    sItem = selection1.Item2(i).Value
Dim sData() As String
Dim sElement As String


ReDim sData(0)


If IsInArray(sData(), sElement) < 0 Then
  ReDim Preserve sData(UBound(sData) + 1)
  sData(UBound(sData)) = sElement
End If

Next


Ich habe schon vermutet, dass es nicht so einfach sein wird, allerdings weiß ich gerade gar nicht mehr weiter und wäre über jede Hilfe dankbar!

Viele Grüße
Lukas

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: 07. Mrz. 2018 14:29    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Einige Hinweise dazu:
- Umlaute in Variablennamen? sehr schlechte Idee
- Typen der Variablen beachten (ist dein Array nun vom Typ String oder eher HybridShapeSurface)
- warum dimensionierst du deinen Array innerhalb der Schleife neu? Nur das ReDim darf innerhalb der Schleife stehen
Du hast aber noch viel Arbeit vor dir.

Gruß
Bernd

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

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: 07. Mrz. 2018 17:58    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 Luhukas 10 Unities + Antwort hilfreich

Servus Lukas

Ich hab da mal was zusammengebastelt. Der Lösungsansatz unterscheidet sich dabei etwas von deinem.

Code:
Sub CATMain()

Dim oSel as Selection
Dim oPartDocument as PartDocument
dim oHybridFaceArray() as Variant
dim i as Integer

Set oPartDocument = Catia.ActiveDocument
Set oSel = oPartDocument.Selection

'nach Flächen suchen
osel.Search "(((CATStFreeStyleSearch.Surface + CATPrtSearch.Surface) + CATGmoSearch.Surface) + CATSpdSearch.Surface), all"

if osel.count2 = 0 then
    MsgBox "Keine Flächen gefunden"
    exit Sub
end if

'Elemente die nicht Flächen sind aus der Selektion entfernen
for i = osel.count2 to 1 Step -1
    if InStr(TypeName(osel.item2(i).Value), "HybridShapeSurface") = 0 then
        osel.Remove i
    end if
next

'Suche in Array speichern
ReDim oHybridFaceArray(osel.count2 - 1)

for i = 1 to osel.count2
    Set oHybridFaceArray(i - 1) = osel.item2(i).Value
next

osel.clear

'Sortierung aufrufen
BubbleSortByName oHybridFaceArray

'Flächen mit höchstem Index selektieren
osel.clear
for i = Lbound(oHybridFaceArray) to (UBound(oHybridFaceArray) - 1)
    'falls der Name beim nächsten Element anders ist, handelt es sich um den höchsten Index -> Element selektieren
    if Left(oHybridFaceArray(i).Name, InStr(oHybridFaceArray(i).Name,".")) <> Left(oHybridFaceArray(i +1).Name, InStr(oHybridFaceArray(i +1 ).Name,".")) then
        osel.add oHybridFaceArray(i)
    end if
next
'letztes Element aus dem Array auch selektieren
osel.add oHybridFaceArray(UBound(oHybridFaceArray))

End Sub


'modifizierter BubbleSort: Sortiert intern nach .Name
'aus https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Bubble_sort#Visual_Basic entstanden

Sub BubbleSortByName(ArrayIn() As Variant) as Variant
    Dim i  As Integer
    Dim j  As Integer
    For i = UBound(ArrayIn) To 0 Step -1
        For j = 0 To i - 1
            If ArrayIn(j).Name > ArrayIn(j + 1).Name Then
                swap ArrayIn(j), ArrayIn(j + 1)
            End If
        Next
    Next
End Sub

Sub swap(ByRef data1 As Variant, ByRef data2 As Variant)
    Dim temp As Variant
    Set temp = data1
    Set data1 = data2
    Set data2 = temp
End Sub


Viel Spaß beim Analysieren, Verstehen und Verbessern.

Gruß
Bernd

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

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 08. Mrz. 2018 14:56    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

Servus Bernd,

Vielen vielen Dank! Das hilft mir enorm! 

Viele Grüße
Lukas

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

Luhukas
Mitglied



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

Beiträge: 13
Registriert: 24.01.2018

CATIA V5 R20

erstellt am: 16. Mrz. 2018 14:09    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

Servus,

dein Lösungsansatz hat wunderbar funktioniert, vielen Dank nochmals.

Ich habe noch eine Frage, um meinen Code ein bisschen schöner zu gestalten: Ist es möglich, Parts und GeoSets mit Hilfe einer For Schleife zu deklarieren.
Mein Ansatz bisher lautet:

Code:
Dim oTeil As String
oTeil = InputBox("Bitte Namen des Teils eingeben", oTeil)

For i = 2 To 10

Dim partDocument(i) As partDocument                     
Set partDocument(i) = documents1.Item(oTeil & i & ".CATPart")

Dim part(i) As part                                     
Set part(i) = partDocument(i).part

Dim hybridBodies(i) As hybridBodies                     
Set hybridBodies(i) = part(i).hybridBodies

Dim hybridBody(i) As hybridBody                         
Set hybridBody(i) = hybridBodies(i).Item("GeoSet." & i)

Next


Im Grunde genommen habe ich in verschiedenen Parts immer ein GeoSet mit dem gleichen Namen und möchte mit Hilfe des Makros alle deklarieren.

Die Fehlermeldung gibt aus, dass ein konstanter Ausdruck verlangt wird. Gibt es eine andere Möglichkeit die GeoSets zu deklarieren?

Viele Grüße
Lukas

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: 16. Mrz. 2018 18:22    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 Luhukas 10 Unities + Antwort hilfreich

Servus

Warum willst du denn für jedes GeoSet eine neue Variable erzeugen/anlegen?
Willst du auserhalb der Schleife diese nochmal nutzen?
Du könntest die GeoSets bzw PartDocuments in einem Array zwischenspeichern. Ich bezweifle aber das dir das nützt.

Gruß
Bernd

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

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