Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Bodies abhängig von Parameter erzeugen

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:  Bodies abhängig von Parameter erzeugen (1404 mal gelesen)
Sinalco
Mitglied
Konstrukteur

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

Beiträge: 3
Registriert: 24.03.2009

erstellt am: 24. Mrz. 2009 02:04    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


Forum01.jpg

 
Hallo V5 Spezialisten,

habe dieses Forum jetzt sehr lang erfolglos durchsucht,
und brauche jetzt Eure Hilfe um folgendes Problem zu lösen:

Mit einem VB Scripts innerhalb eines Parts sollen Bodies erzeugt werden.
Name und Anzahl wird aus dem Part (Parameter im Part) ausgelesen.

Dieser Code funktioniert soweit:
Sprache: VB Script (kein Macro!!!)


'###################################################################### 
Dim oActiveDoc As Document
Dim bodies1 As Bodies
Dim body1 As Body
Dim parameters1 As Parameters
Set oActiveDoc = CATIA.ActiveDocument
Set oActivePart = oActiveDoc.Part
Set bodies1 = oActiveDoc.Part.Bodies
Set parameters1 = oActivePart.Parameters
Set selection1 = oActiveDoc.Selection

Set intParam1 = oActiveDoc.GetItem("").Parameters.Item("Anzahl")
Anzahl = intParam1.Value
Set strParam1 = oActiveDoc.GetItem("").Parameters.Item("Namen")
Bez = strParam1.Value

selection1.Search "Name="&Bez&"*,all"
anzbodies = selection1.count2
If anzbodies > 0 Then
MsgBox "Es sind schon "&anzbodies&" Bodies mit diesem Namen vorhanden"
'selection1.Clear
End if

MsgBox "Es werden "&Anzahl&"  Bodies erzeugt!"
For intParamStartwert = 1 To Anzahl
Set body1 = bodies1.Add()
body1.Name = Bez &(intParamStartwert+anzbodies)
next
CATIA.ActiveDocument.Part.Update
End Sub
'######################################################################

Jetzt die Problematik:

Ich möchte unbedingt verhindern, dass Bodies mit gleichem Namen erzeugt
werden.
Falls also nach dem Erzeugen einer Ladung Bodies (z.B 10 Stück)
die ersten 3 gelöscht werden, und das VB Script erneut
(mit dem gleichen Namen) ausgeführt wird, werden natürlich nur 7 Bodies
gefunden und mit 8 weiter nummeriert.
Dabei entstehen dann Bodies mit gleichem Namen.

Die Anforderung wäre also:
keine Bodies mit gleichem Namen.
Beginnend bei 1, "nicht belegte Nummern auffüllen".
"Lücken" auffüllen.
Höchste Nummer finden und weiternummeriern.

Ich denke ich brauche dazu eine Verschachtelung von mehreren Schleifen,
da hier sehr viele Unbekannte im Spiel sind, und da hackt es.
Habe es auch schon mit ner "Zwischenspeicherung" der Suche in nem Array
versucht, ohne Erfog.
Das Ganze kann aber nicht unlösbar sein.
Auf MS Explorerebene funktioniert das ja auch automatisch.

Basics in V5 Automatisierung sind vorhanden.

Danke im Voraus für Eure Unterstützung.

Werde euch dieses universelle Tool nach Fertigstellung
natürlich zur Verfügung stellen!

mfg

Sinalco


Nur ein toter Link ist ein guter link!

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

MICHLICK
Mitglied
CAD Methodik Entwickler (CATIA; NX)


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

Beiträge: 454
Registriert: 20.06.2001

Der Aufwand bei Änderungen ist groß, wenn die Finger schneller klicken als das Gehirn denkt.

erstellt am: 24. Mrz. 2009 07:53    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 Sinalco 10 Unities + Antwort hilfreich

Hallo Sinalco,

ich würde das so lösen:

Nachdem Du den Body erzeugt hast bekommt das Kind ja seinen Namen. An dieser Stelle würde ich eine Scheife einbauen, die bei 1 beginnt und hochzählt.
Ich würde an dieser Stelle eine "Do While" Schleife verwenden in der die temporären Namen mit fortlaufender Nummer generiert werden.
Innerhalb dieser dann eine "For Next" Schleife, die den aktuellen Namen mit den vorhandenen Body-Namen vergleicht. Wenn der Name frei ist BINGO und raus aus den Schleifen.

Das ist so mein erster Gedanke und der ist meist nicht so schlecht.

------------------
Gruß Michael B.

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

Sinalco
Mitglied
Konstrukteur

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

Beiträge: 3
Registriert: 24.03.2009

erstellt am: 26. Mrz. 2009 02:06    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 Michael,

erstmal Danke für deinen Denkanstoss.
Habe mitlerweile einige Verschachtelungen getestet (incl. Endlosschleifen *Grr)

Bin jetzt sehr verwirrt:

Habe deinen Vorschlag mal versucht, ohne Erfold:

Bin unsicher wann ich den Body benennen soll. Denn:

Ich möchte "Anzahl" Bodies erzeugen: Anzah ist fix: Äusserste Schleife ist Nor..next
Ich weiss nicht wo ich mit der Nummerierung anfangen soll bzw. wo die "Lücken" sind: also: 1. innere Schleife ist Do Loop (1 Durchlauf mit Endung "1" garantiert.
ich weiss nicht wie viele Bodies vorhanden sind, bzw. wenn ich versuche das mit For next zu lösen bleib ich ja am letzten Element der Selektion hängen.  Also auch eher Do Loop!

Habe diesen Ansatz mal versucht (mit Syntaxproblem):
'########################################################
found = 0
i = 1
k = 1
MsgBox "Es werden "&Anzahl&"  Bodies erzeugt!"

For intParamStartwert = 1 To Anzahl
Set body1 = bodies1.Add()
Do 
body1.Name = Bez&i
i = i + 1
If found = 1 Then Exit Do
If i > 50 Then Exit Do 'Notausgang
Do while k < anzbodies+1
k = k + 1
'MsgBox(selection1.Item(k).Value.Name)
If body1.Name = (selection1.Item(k).Value.Name) Then
found = 1
Exit Do
If k > 20 Then Exit Do 'Notausgang
If k = anzbodies Then Exit Do
Loop
Loop until found = 1
found = 0
k = 1
next
CATIA.ActiveDocument.Part.Update
End Sub
'########################################################

Kannst du mich nochmal auf die richtige Spur lenken?

Gruß
Sinalco

Ignorieren, Isolieren, weiter konstruieren


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

makebeth
Mitglied



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

Beiträge: 12
Registriert: 21.03.2009

Dell Precision T3400; Vista x64; CATIA V5 R16 32Bit;

erstellt am: 28. Mrz. 2009 06:18    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 Sinalco 10 Unities + Antwort hilfreich

hallo,

rein vom verständnis her...
reicht da nicht eine schleife? entschuldige die fehlerhafte syntax, geht nur ums prinzip.

Code:

count = part.bodies.count

for i as integer to anzahl
  bodyname = bez+i
  if part.findobjectbyname(bodyname) = nothing then  '### prüfen ob bereit vorhanden
    set tempbody = part.bodies.add()
    tempbody.name = bodyname
  else
  '### nix, element schon da
  end if
next

i = anzahl

'### überflüssiges löschen
if i < part.bodies.count then
  for i to part.bodies.count
    set tempbody = part.findobjectbyname(bez+i)
    '### tempbody löschen
  next
end if


im grunde würde ich nur die anzahl mit einer for schleife durchlaufen und prüfen ob das element bereits vorhanden ist. wenn ja passiert nix, wenn nein wird es erstellt. zum schluss können noch die übrigen elemnte, die zuviel sind gelöscht werden.

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

Sinalco
Mitglied
Konstrukteur

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

Beiträge: 3
Registriert: 24.03.2009

erstellt am: 30. Mrz. 2009 00: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,

@ makebeth:
Danke für deinen Beitrag. Obwohl der mich jetzt schon ein bisschen demotiviert hat.
(Wenns denn wirklich so einfach geht)
Habe deinen Code nicht getestet weil ich mitlerweile die Variante mit 3 Schleifen hinbekommen habe.
Was passiert bei deiner Version wenn du 10 Bodies erzeugen willst und 2 sind schon verhanden? Dann werden doch nur 8 erzeugt, oder irre ich mich da?!?

Viele Wege führen nach Rom, hier die Schleifenvariant:

'##########################################################
Dim oActiveDoc As Document '#
Dim bodies1 As Bodies
Dim body1 As Body
Dim parameters1 As Parameters
Dim anzbodies, found, i, k As Integer
Set oActiveDoc = CATIA.ActiveDocument
Set oActivePart = oActiveDoc.Part
Set bodies1 = oActiveDoc.Part.Bodies
Set parameters1 = oActivePart.Parameters
Set selection1 = oActiveDoc.Selection

Set intParam1 = oActiveDoc.GetItem("").Parameters.Item("Anzahl")
Anzahl = intParam1.Value
Set strParam1 = oActiveDoc.GetItem("").Parameters.Item("Namen")
Bez = strParam1.Value

selection1.Search "Name="&Bez&"*,all"
anzbodies = selection1.count2

found = 0
i = 0
k = 0

For intParamStartwert = 1 To Anzahl
  Set body1 = bodies1.Add()
  Do
      i = i + 1
      body1.Name = Bez&i
        Do while k < anzbodies+Anzahl+1
          on error resume next
          K = k + 1
          If body1.Name = (selection1.Item(k).Value.Name) Then
          found = 1
          Exit Do
          End if

          If k = anzbodies Then
          found = 0
          Exit Do
          End if
        Loop
      k = 0
      If anzbodies = 0 Then Exit Do
      If i > anzbodies+Anzahl Then Exit Do
  Loop until found = 0
  found = 0
  k = 0
next
CATIA.ActiveDocument.Part.Update
End Sub
'################################################################

Das Script läuft bis 50 vorhandene Bodies flott genug.(Normaler Anwendungsfall)
Bei mehr als 400 Bodies wirds dann aufgrund der Schleifen ein bisschen zäh. Falls jemand noch Verbesserungsideen hat, gerne posten.

Grüße

Sinalco

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