Autor
|
Thema: Makro bei Add sehr langsam (3239 mal gelesen)
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 12. Jan. 2015 11:52 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen. Folgende Aufgabe hab ich gelöst. Ich habe einen Hauptköper, dem ich etliche Körper hinzufügen möchte (ADD)(es sind je nach Aufgabe zwischen 3000 - und 9000). Das Makro funktioniert auch, d.h. es macht was es soll. Allerdings dauert es bei 3000 Stück ca. 12 h und bei 9000 Stück stürtz Catia irgendwann ab. Hat irgendjemand eine Idee warum das so ist und wie man das schneller bzw. so machen kann das das Makro durchläuft. Vielen Dank Hier das Makro: Set partDocument1 = CATIA.ActiveDocument
Set part1 = partDocument1.Part 'Prüfen ob Makro von einem Part aus gestartet wird If Not (TypeName(CATIA.ActiveDocument) = "PartDocument") Then Dim Box Box = MsgBox("Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", 48, "Hinweis") End End If
Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("StarDustBody") Dim anzahl As Integer anzahl = 0 part1.InWorkObject = body1 On Error Resume Next For I = Start To Ende Err.Clear Set body2 = bodies1.Item(NameBody & I) Set shapeFactory1 = part1.ShapeFactory Set add1 = shapeFactory1.AddNewAdd(body2) part1.Update If Err.Number <> 0 Then part1.InWorkObject = body2 Dim hybridShapeFactory1 As HybridShapeFactory Set hybridShapeFactory1 = part1.HybridShapeFactory Dim hybridShapeDirection1 As HybridShapeDirection Set hybridShapeDirection1 = hybridShapeFactory1.AddNewDirectionByCoord(0#, 0#, 1#) Dim translate1 As Translate Set translate1 = shapeFactory1.AddNewTranslate2(-0.2) Dim hybridShapeTranslate1 As HybridShapeTranslate Set hybridShapeTranslate1 = translate1.HybridShape hybridShapeTranslate1.VectorType = 0 hybridShapeTranslate1.Direction = hybridShapeDirection1 part1.InWorkObject = hybridShapeTranslate1 part1.Update anzahl = anzahl + 1 part1.InWorkObject = body1 End If Next I Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 12. Jan. 2015 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 12. Jan. 2015 14:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, Danke für die Antwort. Ohne die Updates funktioniert die Fehlerabfrage nicht. Wenn ein fehler auftritt muss das makro anderst reagieren. Was ich nicht verstehe warum die ersten 1000 ganz schnell gehen und es danach so langsam läuft. Wenn ich das Makro zuerst im 1000 durchlaufen lasse und dann beende und das Makro nochmal laufen lasse mit den nächsten 1000 ist es um einiges langsamer als beim ersten durchlauf?!? Zur Aufgabe. Ich habe eine Grundfläche (Vorgabe) und die Einzelnen Körper die dem Hauptkörper zugefühgt werden sollen sind kleine Bausteine. Beides erhalte ich von unserem Kunden. Um das Teil herstellen zu können, benötige ich aber einen einzelen Solid. Verstehst Du was ich meine? lg steffi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 12. Jan. 2015 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, ich les aus dem ganzen eine Anleitung heraus zum Thema: Wie blockiere ich meinen Rechner für 12 h? Das kann's nicht sein. Soweit ich das sehe, fährst Du nur in -Z. Reicht's nicht, zuerst nur den Wert zu ermitteln und anschliessend - in einem Rutsch - die Höhe zu ändern? Kannst Du ein Bild posten? Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 12. Jan. 2015 14:42 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, hmmm vielleicht hast Du recht. Ich fang nochmal an. Ich hab den Hauptkörper und nehm den ersten Körper und Add ihn zum Hauptkörper. Falls es funktioniert alles gut und er nimmt den nächsten. Falls nicht verschiebt er den Körper und versucht es nochmal usw. Ohne die Schleife mit der Fehlerabfrage kann ich nicht feststellen ob ich ihn hinzufügen kann oder nicht?!? Am besten wäre es ich würde alle Hinzufügen die Funktionieren und alle Anderen am Ende um die 0,2 mm verschieben und dann erneut zum Hauptkörper zu Adden. Aber das würde genauso lange dauern weil ich ja erst mal komplet einmal durchlaufen muss. Oder gibt es da eine andere möglichkeit. Wenn ich diese Aktion per Hand mache bekomm ich bei jedem Körper eine Fehlermeldung bei welcher ich auf edit oder delete klicken muss und das dauert meherere Stunden. Mit meiner Lösung läuft der PC übernacht und am nächsten Morgen ist der Körper fertig. So der Plan. Funktioniert leider nur bei einer Anzahl von 3000 Stück. Ich bin über jede andere Idee sehr dankbar. Ist mein erster versuch bei der Catia programmierung. lg steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 12. Jan. 2015 15:12 <-- editieren / zitieren --> Unities abgeben:
Hab das grad es grad ohne update ausprobiert. Das Makro läuft ganz schnell durch. Allerdings hab ich dann wieder das problem das ich beim anschließenden update die einzelnen Körper per hand verschieben muss. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rainer Schulze Ehrenmitglied V.I.P. h.c. Dipl.-Ing. im Ruhestand
Beiträge: 4419 Registriert: 24.09.2012
|
erstellt am: 12. Jan. 2015 15:50 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
>>Allerdings hab ich dann wieder das problem das ich beim anschließenden update die einzelnen Körper per hand verschieben muss. Ich bin nicht geübt in dieser Art der Programmierung. Aber ich würde darüber nachdenken, ob es nicht eine einfache Randbedingung für das Gelingen des Addierens gibt. Dann würde ich zuerst diese Prüfung und eventuelle Verschiebung durchführen. ------------------ Rainer Schulze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Ehrenmitglied V.I.P. h.c. Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 NX 10 Win 7
|
erstellt am: 12. Jan. 2015 18:01 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Da du beim verboolen einen Ausgleich von 0,2mm bei einigen Teilen einbaust damit der Zusammenbau klappt.Wäre es da nicht sinnvoll das Element in StarDustBody um 0,2mm aufzudicken - alle restlichen Bodys dahinein verboolen und - zum Schluss eine Aufdickung um -0,2mm um wieder die Original Dicke zu haben müsste dann auch Händisch gehen alle xxxx Elemente. Ich dachte der einzelne Body müsste nur um 0,2 verschoben werden, aber das kann ja je nach Fall mehrmals passieren, die Verschiebung...
Bliebe noch übrig, alle xxxx Bodys in einem ZB_Body zu verbauen, auf alle Stirnflächen eine Aufdickung von xx mm zu machen. Vom Körper Stardust eine Seite Ableiten, diese Ableitung verwenden um den ZB_Body zu beschneiden. den Körper Stardust dazuaddieren. Ist wohl auch nicht richtig, da die Einzelnen Elemente ja in Richtung Stardust verlängert werden... BTW kann der Kunde nicht gleich die Einzelbodys lagerichtig abliefern?
[Diese Nachricht wurde von Thomas Harmening am 13. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jan. 2015 00:00 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, ich komm noch mal auf meine Ausgangsfrage zurück. Wozu ist das gut? Soll es eine Einbau-/Zusammenbau-Untersuchung sein, wie der Tom meint? Wie entscheidest Du, ob gut oder schlecht? Innerhalb welcher Umgebung programmierst Du (VBA/Makro-Editor/VB-Compiler)? Für welches Release? Bitte ein Bild! Zum Code: - Wo definierst Du die Werte für 'Start' und 'Ende' ? - Woher kommt body2? Wo definierst Du den String für 'NameBody'? Solange 'NameBody' undefiniert ist, ist Body2 = Nothing. Somit kommt immer ein Fehler. So wie's hier steht, funktioniert das Makro nicht. - Wenn ich Deine Beschreibung richtig verstehe, 'ADDierst Du zwischen 3000 und 9000 Bodies auf den vorhandenen 'StarDustBody', und zwar packst Du 0.2mm-weise Material dazu (oder ziehst es ab). Um die Laufzeit zu verkürzen musst meines Erachtens von den fixen 0.2mm abgehen. Konkret: Max. Differenz = 9000 x 0.2mm = ca. 2000mm. Das erste Intervall hat 1024mm; Abfrage, ob gut oder schlecht(drunter oder drüber) das nächste Intervall hat 512mm, dann 256, 128, 64, 32, 16, 8, 4, 2, 1, ... Nach ca. 13 Iterationen und ein wenig rechnen, müsste der richtige Wert gefunden sein. - MsgBox gibt einen Wert zurück der anzeigt, welchen Button der Anwender gedrückt hat. Wenn Du den aber nicht verwertest, dann brauchst auch den Rückgabewert nicht zu definieren. 'Dim Box' kann dann entfallen. Statt:
Code:
Dim Box Box = MsgBox("Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", 48, "Hinweis")
geht dann auch: Code:
MsgBox "Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", 48, "Hinweis"
Aber nochmal: Wozu ist das gut? Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 07:54 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, es geht hauptsächlich draum aus vielen einzelnen Körpern einen ganzen großen zu machen. Vom Kunden (Automotiv) kommen viele gleine Körper, wir simulieren den Körper (was auch ohne zusammengefügen funktioniert)und stellen anschließend das Teil her. Die Maschine erwartet einen einzelnen dummen Solid. Der Kunde ist König! (dem ist das zusammenfügen zu aufwenig und überlässt es uns). Meine Entscheidung: Ich füge einen Körper hinzu und frage dann nach einem Fehler. Ohne Fehler kommt der nächste Körper dran mit Fehler wird der einzelne Körper um 0,2 mm verschoben. (dann geht das hinzufügen.) Release 19. Hier noch ein Teil von dem Makro, welcher die übrigen definitionen festlegt.:
Private Sub CB_Start_Click() NameSureface = TextBox_Grundflaeche.Text BodyStart = TextBox_BodyStart.Text BodyEnd = TextBox_BodyEnd.Text 'Körpernamen splitten Dim SuchZeichen, Pos1, Pos2 SuchZeichen = "." Pos1 = InStr(1, BodyStart, SuchZeichen, 1) Pos2 = InStr(1, BodyEnd, SuchZeichen, 1) NameBody = Left(BodyStart, Pos1) Start = CInt(Right(BodyStart, Len(BodyStart) - Pos1)) Ende = CInt(Right(BodyEnd, Len(BodyEnd) - Pos2)) Call StarDust Unload UserForm_StarDust End Sub Deine Erklärung um die Laufzeit zu verkürzen versteh ich leider nicht. Es ist mein erstes Makro. Ich kann mich auch total blöd anstellen grüße steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 07:55 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 13. Jan. 2015 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Servus Was ich nicht ganz verstehe? Durch das Verschieben der Körper änderst du doch die Geometrie. Macht das kein Problem? Um die mehrfache Iteration für die Verschiebung zu vermeiden, könntest du vor dem Add den Abstand messen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 10:04 <-- editieren / zitieren --> Unities abgeben:
hallo Bernd. ich verschiebe Körper die ca. 1.5 X 1.5 mm X 2 mm groß sind um 0,2mm. Das ist kein Problem. Was es bringen soll wenn ich den Abstand vorher messe weis ich nciht. ich hab auch noch nicht verstanden war um ich eine Iteration für die Verschiebung machen soll. lg steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jan. 2015 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Zitat:
es geht hauptsächlich draum aus vielen einzelnen Körpern einen ganzen großen zu machen. Vom Kunden (Automotiv) kommen viele gleine Körper, wir simulieren den Körper (was auch ohne zusammengefügen funktioniert)und stellen anschließend das Teil her. Die Maschine erwartet einen einzelnen dummen Solid. Der Kunde ist König! (dem ist das zusammenfügen zu aufwenig und überlässt es uns).
Klingt nach Cubing? Zitat:
Meine Entscheidung: Ich füge einen Körper hinzu und frage dann nach einem Fehler. Ohne Fehler kommt der nächste Körper dran mit Fehler wird der einzelne Körper um 0,2 mm verschoben. (dann geht das hinzufügen.)
Hier schliesse ich mich dem Bernd an. Bist Du sicher, dass das Auto um 2mm niedriger werden darf? Ausserdem: Handelt sich's bei den Körpern um 'dumme', quaderförmige Bodies? Zitat:
Deine Erklärung um die Laufzeit zu verkürzen versteh ich leider nicht. Es ist mein erstes Makro. Ich kann mich auch total blöd anstellen
Das passt ja auch nicht. Ich bin von anderen Annahmen ausgegangen. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 10:18 <-- editieren / zitieren --> Unities abgeben:
ist ist nur ein Teil von einem Auto. Ein Designelement das gut aussehen muss. aber ob der Körper 0,2mm weiter oben stehen ist nicht relewant. Und ich bezweifle auch das es irgendjemand auffällt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jan. 2015 10:24 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 10:48 <-- editieren / zitieren --> Unities abgeben:
Die Teile sind alle auf dem Hauptkörper verteil. Die Einzelnen Körper schneiden sich. Und verschoben werden nur die Körper bei denen eine Addition nicht möglich ist, also eine Fehlermeldung hervorruft. Im aktuellen Beispiel werden nur ca. 50 verschoben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jan. 2015 11:37 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 13:30 <-- editieren / zitieren --> Unities abgeben:
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 13. Jan. 2015 13:39 <-- editieren / zitieren --> Unities abgeben:
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jan. 2015 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Das sieht aus, als hätte ein Besoffener versucht ein Puzzle zusammen zu setzen. Die Teile liegen schon an der richtigen Stelle, oder? Ihr stellt das Teil her? Wie? Lasersintern? Trotzdem: Ein Add sollte eigentlich immer gehen, auch wenn sich die Bodies nicht berühren. Das müsstest auch händisch nachvollziehen können. Wenn sie sich unbedingt berühren müsssen(zusammen hängender Solid), dann mach doch die Grundplatte dicker/höher. Dann kannst Dir wenigstens die Verschiebeschleife mit InWork und Update sparen. Und den Update hinter die For-Next-Schleife setzen. Das Programm sähe dann so aus:
Code:
Sub DoTest() Dim oAD As Document Dim oADP As Part Dim oBds As Bodies Dim oBd1 As Body Dim oBd2 As Body Dim iAnzahl As Integer Dim i As Integer Dim iStart As Integer Dim iEnde As Integer Dim strNameBody As String Dim oSF As ShapeFactory Dim oAddOp As Object 'CATIAAdd Dim oHSF As HybridShapeFactory Dim oHSD As HybridShapeDirection Dim oTrans1 As Translate Dim oHSTrans1 As HybridShapeTranslate Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part 'Prüfen ob Makro von einem Part aus gestartet wird If Not (TypeName(CATIA.ActiveDocument) = "PartDocument") Then MsgBox "Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", vbExclamation, "Hinweis" End End If Set oBds = oADP.Bodies Set oBd1 = oBds.Item("StarDustBody") iAnzahl = 0 oADP.InWorkObject = oBd1 On Error Resume Next iStart = 2 'von mir eingefügt iEnde = 10 ' strNameBody = "Body." ' For i = iStart To iEnde Err.Clear Set oBd2 = oBds.Item(strNameBody & i) Set oSF = oADP.ShapeFactory Set oAddOp = oSF.AddNewAdd(oBd2) ' oADP.Update ' If Err.Number <> 0 Then ' oADP.InWorkObject = oBd2 ' ' Set oHSF = oADP.HybridShapeFactory ' Set oHSD = oHSF.AddNewDirectionByCoord(0#, 0#, 1#) ' Set oTrans1 = oSF.AddNewTranslate2(-0.2) ' Set oHSTrans1 = oTrans1.HybridShape ' ' oHSTrans1.VectorType = 0 ' oHSTrans1.Direction = oHSD ' ' oADP.InWorkObject = oHSTrans1 ' oADP.Update ' ' iAnzahl = iAnzahl + 1 ' oADP.InWorkObject = oBd1 ' End If Next oADP.UpdateEnd Sub
Ich programmier in VB6. Nachdem ich Deine Programmierumgebung immer noch nicht kenne, lass ich die Deklarationen jetzt mal so stehen. Die Routine ist auf mein Modell abgestimmt(zum Testen!). Probier's mal aus. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Ehrenmitglied V.I.P. h.c. Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 NX 10 Win 7
|
erstellt am: 13. Jan. 2015 18:58 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Zitat: Original erstellt von joehz: Wenn sie sich unbedingt berühren müsssen(zusammen hängender Solid), dann mach doch die Grundplatte dicker/höher.
meine durchgestrichene Rede ;-) Mit besonderen Design-Formen im teilweise <mm Bereich , gemustert und dann auf einer gewölbten Fläche---- die reinste Systemkiller. Einfach mal bei verschieden Autohersteller die Abdeckung der Lautsprecher anschauen - was für ein Profil die haben - die billig Variante ist ein einfaches Drahtnetz ;-) Aber mal ehrlich, wer von 100 Personen bemerkt diese besondere Hingabe der Oberfläche der Abdeckung, wenn sie sich im Dunkeln des Fussraums befindet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 14. Jan. 2015 09:53 <-- editieren / zitieren --> Unities abgeben:
Kein Mensch merkt das.... Ich programmier das Makro mit vba. Die Grundplatte dicker machen ist leider auch nicht ziehlführend ich bekomm trotzdem die Fehlermeldung. Ist es möglich ein update durchzuführen und bei einer fehlermeldung die einzelnen Körper die nicht funktionieren per Makro zu löschen. Ich hab das Makro jetzt ohne update durchlaufen lassen (geht sehr schnell) und anschließend mach ich den update. Das problem. Ich muss wieder per hand jeden einzelne fehlermeldung bearbeiten. wenn das automatisch ginge wär mein problem gelöst. grüße steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 14. Jan. 2015 11:09 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, ich hab gestern noch 'n Bisschen gespielt mit dem Problem. Dazu hab ich meinem demo-Part noch eine Grundplatte spendiert. Catia ist es bei einem 'Add' gleich, ob sich die zwei Bodies berühren. Dem Makro ist auch egal, ob die Bodies fortlaufend nummeriert sind. Deshalb zwei Fragen: - Wie lautet die Fehlermeldung? - Kannst Du bei den fraglichen Bodies den 'Add' händisch ausführen? (Oder kommt da die gleiche Fehlermeldung?) Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 14. Jan. 2015 11:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, ob ich die Körper per Hand oder mit dem Makro zusammenfüge ist egel. Es passiert immer das gleiche. Das Problem ist auch nicht das sich zwei Körper Berühren sonder eher so blöd überschneiden, dass ein Add nicht möglich ist. Die fehlermeldung Häng ich dir mal an und ein Beispiel bekommst Du auch von mir. Danke!! lg steffi [Diese Nachricht wurde von woodpeeker am 14. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Jan. 2015 12:08 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 14. Jan. 2015 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, ich hab mal die Reihenfolge umgedreht - geht. Zwar auch mit einer Fehlermeldung, aber immerhin. Komplett ohne Fehlermeldung geht, wenn zuerst alle Klötzchen ge-Added werden, und zuletzt mit der Platte. Vielleicht ist das der günstigste Weg: - Multiselect aller(erstmal einiger) Bodies, ausser dem ersten - Add auf den ersten Body - Add auf Platte Falls Du das Makro nochmal laufen lassen willst, füge noch ein 'DoEvents' in die For-Next-Schleife ein. Sonst ist der komplette Rechner für die Dauer der Routine blockiert. Tschau, Joe - 3 Anhänge [Diese Nachricht wurde von joehz am 14. Jan. 2015 editiert.] [Diese Nachricht wurde von joehz am 14. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 14. Jan. 2015 12:39 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 14. Jan. 2015 16:02 <-- editieren / zitieren --> Unities abgeben:
ich hab jetzt mal ausprobiert zuerst alle kleinen Bodys zusammenzufühgen, da bekomm ich die gleiche Fehlermeldung. Es sind wie gesagt 3000-9000 stück, da gibts so viele fälle... kann ich die Fehlermeldung mit dem Makro steuern? von mir aus kann es die Bodys alle löschen und ich verschieb die dann alle und fühg sie erneut hinzu. das mit dem doevents ist toll. Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Ehrenmitglied V.I.P. h.c. Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 NX 10 Win 7
|
erstellt am: 14. Jan. 2015 19:12 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
3 varianten meinerseits 1) Das entsprechende Feature der nicht funktionierenden boolschen Operation - aufdicken - weiter mit Part update - usw. 2) Die Variante zuerst die Basisträgerfläche aufdicken, alle Elemente dazuaddieren, wieder negativ aufdicken 3) einen unter ZB erstellen 3a) wie 3 - 0,1mm Offset der Oberfläche Stardust, ZB beschneiden und um 0,2mm audicken - mit dem Körper Stardust vereinen und warum meckert Catia und lässt manche boolsche operation nicht zu - das liegt daran das die Flächen zueinander "tangential schmieren" bzw. Sigularitäten / Kante auf Fläche etc. erzeugen eine Überlappung/ schnittmenge wäre deutlich besser. Fahre einfach mal mit einer Schnittanalyse durch den Zusammenbau... ich wäre immer noch bei Variante 2 [Diese Nachricht wurde von Thomas Harmening am 14. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Ehrenmitglied V.I.P. h.c. Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 NX 10 Win 7
|
erstellt am: 14. Jan. 2015 19:19 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Zitat: Original erstellt von woodpeeker: ich hab jetzt mal ausprobiert zuerst alle kleinen Bodys zusammenzufühgen, da bekomm ich die gleiche Fehlermeldung. Es sind wie gesagt 3000-9000 stück, da gibts so viele fälle...
Du kannst auch die mit dem Ausrufezeichen versehenen boolschen Operationen lsöchen ( nicht den Body) (, der Boy taucht , dann ja normal wieder im Baum auf.) bis dein ZB duchläuft. Dann nochmals versuchen, die nicht funktonierenden Bodys dazuzuaddiern, manchmal existiert dann die Problemstelle nicht mehr, da ein anerer dazu addierter Körper das Problem löst. Ansonsten die entspechenden Flächen Aufdicken, das die Verschmelzung mathematisch eindeutig wird. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 14. Jan. 2015 20:59 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
|
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 15. Jan. 2015 09:48 <-- editieren / zitieren --> Unities abgeben:
Hallo. Danke für Eure Anregungen. Ich habe jetzt versucht den Grundkörper aufzudicken einmal mit 3 mm Alle körper hinzuzufühgen (funktioniert) und anschließend das aufdicken wieder rückgängig zu machen (funktioniret nicht). Auf ein aufdicken der Grundfläche um 0.01mm bringt bei mir immernoch ganz viele fehlermeldungen. Die fehlermeldungen sind auch gar nicht schlimm. ich weiß ja was dann zu tun ist. ich bräuchte nur eine idee wie ich per makro auf die fehlermeldung reagieren kann. lg steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jan. 2015 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, lt. Bernd läuft Dein Beispiel-Part unter R20 ohne Fehler durch. Unter R21 läuft's auch (mit Warnung). Beim Re-Import nach R19 über IGES habe ich aber kein Solid erzeugen können. Die Analyse der Flächen ergab, dass die Unterseiten der Kötzchen nicht mit der Fügefläche des Grundkörpers übereinstimmen. Im Falle der Beispieldatei, weniger als 0.01mm Abstand. Daher meine Idee mit dem Aufdicken der Grundfläche. Was meinst Du mit Reagieren auf die Fehlermeldung? Wie die Meldung wegdrücken/bestätigen, oder was? Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 15. Jan. 2015 15:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, ich hab meine Datei mal mit R24 gestartet. Geht auch nicht. ich bekomm mehr wahrnungen aber auch Fehlermeldungen. Meine Idee: ich lass die Schleife ohne update durchlaufen und mach das update hinterher. Jetzt lauf ich aber wieder in die Fehlermeldungen hinein auf die ich par hand reagieren muss. Wenn ich per makro sagen könnte Lösch den Add der nicht funktioniret. Wäre mein Problem gelöst. lg steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jan. 2015 15:53 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Den nichtfunktionierenden Add müsstest auch anschliessend löschen können. Willst Du die Unterbrechungen durch die Fehlermeldungen unterdrücken, damit das Makro ohne Aktion deinerseits durchläuft? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jan. 2015 21:11 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Nur vor dem Update kommt kein Fehler. Um die zu identifizieren musst den Update direkt nach dem 'Add' lostreten.... In diesem Sinne: Code:
'--------------------------------------------------------------------------------------- ' Procedure : DoTest ' Author : jherzog ' Date : 15.01.2015 ' Time : 19:26 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Add bodies to main part ' Parms : - ' Ret. Value: - ' ' Syntax : DoTest ' ' Prereqs : Open Catpart containing multiple bodies ' Remarks : Invalid Adds are deleted '--------------------------------------------------------------------------------------- ' Sub DoTest() Dim oAD As Document 'active doc Dim oADP As Part 'active part Dim oBd1 As Body 'main body Dim oBd2 As Body 'body to add Dim i As Integer Dim tmStart As Date Dim tmEnd As Date Dim iStart As Integer Dim iEnde As Integer Dim strNameBody As String 'body name Dim oSF As ShapeFactory Dim oAddOp As Object 'CATIAAdd 'add operation Dim oSel As Selection Dim iNumDeleted As Integer 'add error counter On Error GoTo DoTest_Error Set oAD = CATIA.ActiveDocument Set oADP = oAD.Part 'Prüfen ob Makro von einem Part aus gestartet wird If Not (TypeName(CATIA.ActiveDocument) = "PartDocument") Then MsgBox "Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", _ vbExclamation, "Hinweis" End End If Set oBd1 = oADP.Bodies.Item("StarDustBody") ' Set oSel = oAD.Selection 'init selection oSel.Clear 'clear selection oADP.InWorkObject = oBd1 'set starbody in work iStart = 16 'lower coundary iEnde = 18 'upper boundary strNameBody = "Body." 'common string tmStart = Time$ 'start time keeping For i = iStart To iEnde Err.Clear Set oBd2 = oADP.Bodies.Item(strNameBody & i) 'set body to add Set oSF = oADP.ShapeFactory Set oAddOp = oSF.AddNewAdd(oBd2) 'add body oADP.Update 'if this causes an error, add op is deleted DoEvents 'give other progs some cpu time Next oADP.Update ' tmEnd = Time$ MsgBox "Start: " & tmStart & vbCrLf _ & "Ende: " & tmEnd & vbCrLf _ & iEnde - iStart + 1 & " Bodies handled." & vbCrLf _ & iNumDeleted & " Add-Ops were deleted.", _ vbOKOnly, "AddBodyTest" Exit Sub '--------------------------------------------------------------------------------------- DoTest_Error: Dim errMsg As String Dim errRet As VbMsgBoxResult Select Case Err.Number ' Case 438 Case -2147467259 'automation error recognized during update oSel.Add oAddOp 'add op to selection(select 'Add') oSel.Delete 'delete add operation iNumDeleted = iNumDeleted + 1 'increment counter Resume Next 'return to loop Case Else 'all unhandled errors handled here errMsg = Err.Number & ": " & Err.Description & " in procedure DoTest" errRet = MyMsgBox(errMsg, vbOKOnly, "DoTest") End Select 'Resume Next 'fall thru to quit sub '--------------------------------------------------------------------------------------- End Sub
Have fun. Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 15. Jan. 2015 21:18 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
hab was übersehen ... Nach dem Löschen muss die Selection wieder geleert werden. Ändere die fehlerroutine ab in: Code:
Case -2147467259 'automation error recognized during update oSel.Add oAddOp 'add op to selection(select 'Add') oSel.Delete 'delete add operation iNumDeleted = iNumDeleted + 1 'increment counter oSel.Clear 'clear selection Resume Next 'return to loop
Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 16. Jan. 2015 09:33 <-- editieren / zitieren --> Unities abgeben:
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 17. Jan. 2015 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
und noch ein Fix ... Wenn die Bodies nicht fortlaufend nummeriert sind, werden in der For-Next-Schleife nicht-existierende Bodies angesprochen. Um den Fehler abzufangen, sind noch folgende Ergänzungen notwendig: In der Fehlerbehandlung:
Code:
Select Case Err.Number Case 438 'bei nicht vorhandenem Body(nicht fortlaufend Resume GetNextBody 'nummeriert);
In der Schleife: Code:
oADP.Update 'if this causes an error, add op is deleted DoEvents 'give other progs some cpu time GetNextBody: ' Next
Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 19. Jan. 2015 20:24 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, mit den Laufzeiten der letzten Routine war ich nicht zufrieden. Deswegen hab ich noch 'n Bißchen rumgespielt. Die Philosophie geht auf eine V4-Regel zurück, wonach die History für gute Update-Zeiten in die Breite gehen sollte. Ich bilde per Add zunächst Pärchen, dann doppelte, quadruple, etc., je nachdem wie viele Bodies verknüpft werden sollen. Gegenwärtig maximal 2^15(integer Bereich, also 32767). Bei 9000 Bodies würden 16384 Bodies untersucht. Deswegen gibt's erstmal ca. 7400x Leerlauf(ca. 15 min.) Bei mir hat der Durchlauf ca. 4h gedauert. Der letzte Add verknüpft die Bodies mit der Grundplatte. Lief mit Deiner Beispiel-Datei ohne Fehler durch (1000 Bodies in 4 min.). Tschau, Joe
Code:
'--------------------------------------------------------------------------------------- ' Procedure : DoTest2 ' Author : jherzog ' Date : 15.01.2015 ' Time : 19:26 ' Languages : VB6 Pro SP6 ' V5-Release: V5R19/21 ' Purpose : Add bodies to main part ' Parms : - ' Ret. Value: - ' ' Syntax : DoTest2 ' ' Prereqs : Open Catpart containing multiple bodies ' Remarks : Invalid Adds are deleted '--------------------------------------------------------------------------------------- ' Sub DoTest2() Dim oAD As Document 'active doc Dim oADP As Part 'active part Dim oBd1 As Body 'main body Dim oBd2 As Body 'body to add Dim i As Integer Dim tmStart As Date Dim tmEnd As Date Dim iStart As Integer Dim iEnde As Integer Dim strNameBody As String 'body name Dim oSF As ShapeFactory Dim oAddOp As Object 'CATIAAdd 'add operation Dim oSel As Selection Dim iNumDeleted As Integer 'add error counter Dim iNumBodies As Integer 'no more than 32767 bodies allowed Dim n As Integer On Error GoTo DoTest2_Error If CATIA.Documents.Count > 0 Then 'is a doc loaded Set oAD = CATIA.ActiveDocument Else 'if not, quit MsgBox "No part loaded. Exiting ...", vbOKOnly Or vbCritical, _ "DoTest2 - No part loaded" Exit Sub End If 'Prüfen ob Makro von einem Part aus gestartet wird If Not (TypeName(CATIA.ActiveDocument) = "PartDocument") Then MsgBox "Makro muss von einem CatPart aus gestartet werden. Makro wird beendet.", _ vbExclamation, "Hinweis" End End If Set oADP = oAD.Part Set oSel = oAD.Selection 'init selection oSel.Clear 'clear selection CATIA.RefreshDisplay = False 'doesn't seem to help any ' calculate region with powers of 2 iStart = 16 'lower boundary iEnde = 1039 'upper boundary ' iNumBodies = iEnde - iStart + 1 For n = 1 To 15 'max integer is 2^15 ' If iNumBodies < 2 ^ n Then Exit For If iEnde < 2 ^ n Then Exit For Next strNameBody = "Body." 'common string tmStart = Time$ 'start time keeping Do Until n = 0 For i = 1 To 2 ^ (n - 1) ' 'four cases here: ' - oBd1 and oBd2 both exist ' - just add ' - oBd1 exists, but not oBd2 ' - no add needed(or possible) ' - oBd2 exists, but not oBd1 ' - no add needed, but rename oBd2 to oBd1 ' - neither exist ' - do nothing 'first we need to determine, if oBd1/2 are indeed bodies; 'then act accordingly Err.Clear If BodyExists(oADP, strNameBody & i) = True And _ BodyExists(oADP, strNameBody & 2 ^ n - i + 1) = True Then Set oBd1 = oADP.Bodies.Item(strNameBody & i) ' oADP.InWorkObject = oBd1 'set in work Set oBd2 = oADP.Bodies.Item(strNameBody & 2 ^ n - i + 1) 'set body to add Set oSF = oADP.ShapeFactory Set oAddOp = oSF.AddNewAdd(oBd2) 'add body oADP.Update 'if this causes an error, add op is deleted ElseIf BodyExists(oADP, strNameBody & i) = True And _ BodyExists(oADP, strNameBody & 2 ^ n - i + 1) = False Then ElseIf BodyExists(oADP, strNameBody & i) = False And _ BodyExists(oADP, strNameBody & 2 ^ n - i + 1) = True Then oADP.Bodies.Item(strNameBody & 2 ^ n - i + 1).Name = strNameBody & i Else 'dont do anything End If DoEvents 'give other progs some cpu time GetNextBody: ' Next n = n - 1 Loop Set oBd2 = oADP.Bodies.Item("StarDustBody") ' oADP.InWorkObject = oBd2 'set starbody in work Set oSF = oADP.ShapeFactory Set oAddOp = oSF.AddNewAdd(oBd1) 'add body oADP.Update ' CATIA.RefreshDisplay = True 'doesn't seem to help any tmEnd = Time$ MsgBox "Start: " & tmStart & vbCrLf _ & "Ende: " & tmEnd & vbCrLf _ & iEnde - iStart + 1 & " Bodies handled." & vbCrLf _ & iNumDeleted & " Add-Ops were deleted.", _ vbOKOnly Or vbInformation, "AddBodyTest" Exit Sub '--------------------------------------------------------------------------------------- DoTest2_Error: Dim errMsg As String Dim errRet As VbMsgBoxResult Select Case Err.Number Case 438 'bei nicht vorhandenem Body(nicht fortlaufend Resume GetNextBody 'nummeriert); Case -2147467259 'automation error recognized during update oSel.Add oAddOp 'add op to selection(select 'Add') oSel.Delete 'delete add operation oSel.Clear 'clear selection iNumDeleted = iNumDeleted + 1 'increment counter Resume Next 'return to loop Case Else 'all unhandled errors handled here errMsg = Err.Number & ": " & Err.Description & " in procedure DoTest2" errRet = MyMsgBox(errMsg, vbOKOnly, "DoTest2") End Select 'Resume Next 'fall thru to quit sub '--------------------------------------------------------------------------------------- End Sub Function BodyExists(oParent As Part, strBody As String) Dim oBd As Body On Error GoTo BodyExists_Error BodyExists = False Set oBd = oParent.Bodies.Item(strBody) BodyExists = True BodyExists_Error: End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woodpeeker Mitglied
Beiträge: 18 Registriert: 12.01.2015
|
erstellt am: 21. Jan. 2015 14:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Joe, vielen vielen Dank für deine Mühe. Ich habs versuch und es funktioniert. Beim letzten Add zur Grundfläche bekomm ich immer noch ne fehlermeldung aber das ist nciht schlimm, das geht per hand auch schnell. Ich hab den Algorithmus noch nicht ganz verstanden, aber es hilft mir sehr weiter. Danke. steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 21. Jan. 2015 16:59 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, Zitat:
Ich habs versuch und es funktioniert. Beim letzten Add zur Grundfläche bekomm ich immer noch ne fehlermeldung aber das ist nciht schlimm, das geht per hand auch schnell.
der hat sich irgendwie eingeschlichen. Ich bilde mir ein, dass es auch schon ohne die Fehlermeldung lief. Zitat:
Ich hab den Algorithmus noch nicht ganz verstanden
Bisher: Eine sehr lange Kette von aufeinander folgenden Add-Operationen. Der Update läuft immer durch alle Stationen. Jetzt: Viele kurze Ketten mit 1, 2, 4, 8, ... Adds (klapp den Baum auf!)(siehe Bild) Ich vermute, dass der Update immer nur den direkten Weg nach oben nimmt. Tschau, Joe [Diese Nachricht wurde von joehz am 21. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 23. Jan. 2015 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hallo Steffi, zum Schluss noch 'nen kleinen Bugfix und 'ne Optimierung: Ergänze die Deklarationen um zwei Werte:
Code:
Dim bE1 As Boolean Dim bE2 As Boolean
und ersetze die If-Abfrage in der For-Schleife mit: Code:
bE1 = bBodyExists(oADP, strNameBody & i) bE2 = bBodyExists(oADP, strNameBody & 2 ^ n - i + 1) If bE1 = True And bE2 = True Then Set oBd1 = oADP.Bodies.Item(strNameBody & i) ' oADP.InWorkObject = oBd1 'set in work Set oBd2 = oADP.Bodies.Item(strNameBody & 2 ^ n - i + 1) 'set body to add Set oSF = oADP.ShapeFactory Set oAddOp = oSF.AddNewAdd(oBd2) 'add body oADP.Update 'if this causes an error, add op is deleted ElseIf bE1 = True And bE2 = False Then 'dont do anything ElseIf bE1 = False And bE2 = True Then 'rename body1 oADP.Bodies.Item(strNameBody & 2 ^ n - i + 1).Name = strNameBody & i Else 'dont do anything End If
Grund: Damit wird vermieden, dass das Makro 4x statt 2x in die BodyExists-Funktion läuft, falls nicht oBd1 und oBd2 existieren. Macht bei 9000 Bodies ca. 14000 Aufrufe aus = ca. 15 Minuten. Ausserdem hab ich den Type bei der Funktion BodyExist verschlampt. Statt:
Code:
Function bBodyExists(oParent As Part, strBody As String)
muss es Code:
Function bBodyExists(oParent As Part, strBody As String) as Boolean
heißen. Bei der Gelegenheit hab ich auch die Funktion umbenannt. Von BodyExists zu bBodyExists. Die zwei Zeilen mit dem Rückgabewert müssten auch entsprechend geändert werden. Das war's. Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jan. 2015 15:08 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Servus Joe Warum greifst du nicht einfach auf die Body-Collection zu, und arbeitest die mit einer Schleife ab. Ist mit sicher einfacher als den Namen zusammenzustellen und prüfen ob des den Body gibt. Falls die Bodies sortiert sein müssen: Bodies in Collection packen, nicht passende rauswerfen, sortieren Gruß Bernd PS: Ich stelle so blöde Fragen um noch was zu lernen. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 23. Jan. 2015 17:45 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hi Bernd, Collection abarbeiten: Einfach n-mal auf den Hauptkörper aufzu'Adden' hat sich als seeehr langsam herausgestellt. Bei 9000 Bodies dauert's ewig, im Wortsinn. Ich hab den Test nach 10 Stunden abgebrochen. In einer ruhigen Minute bin ich auf die Idee gekommen, die Bodies pärchenweise zu adden. Erst zwei, dann vier, etc. Das führt beim Update, dem eigentlichen Zeitfresser, zu wesentlich kürzeren Ketten. Um das zu erreichen, brauch ich aber 2er-Potenzen. Das führt dazu, dass ich viele Schein-Bodies bekomme. Bei 9000 Bodies - nächstgrössere 2er-Potenz = 10^14 = 16384 - hab ich ca. 7300 davon. Die filtere ich dann nach und nach über die If-Abfrage in der Schleife raus. Sortieren reicht nicht, weil ich nicht weiss, ob nicht durchlaufend nummeriert wurde. Ich weiss auch nicht, ob's bei Body.1 anfängt. Ich hab keinen Zugriff auf das Ausgangsmodell. So wie ich's jetzt habe, gibt's prinzipiell 4 Möglichkeiten: - oBd1 und oBd2 existieren: -> Add ausführen; Ergebnis: bei Body.1 mit Body.199 bleibt Body.1 übrig - oBd1 existiert, oBd2 nicht: -> Nix machen; Ergebnis: bei Body.1 mit Body.n bleibt Body.1 übrig - oBd1 existiert nicht, aber oBd2 schon: -> oBd2 nach oBd1 umbenennen; Ergebnis: bei Body.1 mit Body.n bleibt Body.1 übrig - oBd1 und oBd2 existieren nicht: -> Nix machen. Auf die Art erhalte ich - eventuell erst nach mehreren Schleifen - zwangsläufig einen durchgehend nummerierten Block. Zwar nicht das Ziel der Übung, aber ein Nebeneffekt. Beispiel: Bodies: min.Index: 3 max. Index: 11 Index 7 fehlt Zugewiesenes 2er-Feld: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Vorhandene Bodies: -- -- XX XX XX XX -- XX XX XX XX -- -- -- -- -- Nach erstem Durchlauf: -- -- 03 04 05 06/11 07/war10 08/09 oder -- -- 03 04 05 06 07 08 Nach zweitem Durchlauf: 01/war08 02/war07 03/06 04/05 oder 01 02 03 04 dann 01/04 02/03 und endlich 01/02 01 Geschwindigkeit: Behauptung: Es werden stets alle Elemente einer Kette upge-dated Lange Ketten brauchen beim Update länger. Upzudatende Bodies bei sequenziellem Add: Beispiel 16 Bodies: Add1: 2 Add2: 3 Add3: 4 Add4: 5 Add5: 6 Add6: 7 Add7: 8 Add8: 9 Add9: 10 Add10: 11 Add11: 12 Add12: 13 Add13: 14 Add14: 15 Add15: 16 Summe: 7x18+9 = 135 Upzudatende Bodies bei parallem Add: Add1: 8 x 2 = 16 Add1: 4 x 4 = 16 Add1: 2 x 8 = 16 Add1: 1 x 16 = 16 Summe: 64 (= n * 2 ^ n oder 4 * 2^4 und Feldgrösse = 2^4) Beispiel: 8 Bodies: Sequenziell: 35 Parallel: 3 * 2^3 = 24 4 Bodies: Sequenziell: 9 Parallel: 2 * 2^2 = 8 2 Bodies: ;-) Struktur nach Add mit 16 vorhandenen Bodies: Sequenziell: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Parallel: 1. Schleife (Pärchen) 01/16 02/15 03/14 04/13 05/12 06/11 07/10 08/09 2. Schleife (Quartette) 01/16//08/09 02/15//07/10 03/14//06/11 04/13//05/12 3. Schleife (Oktette) 01/16//08/09///04/13//05/12 02/15//07/10///03/14//06/11 4. Schleife (??)(Hextette??) 01/16//08/09///04/13//05/12////02/15//07/10///03/14//06/11 Abschliessend sei erwähnt: Mit meiner Methode sind 9000 Adds nach knapp 5h ausgeführt. Mag sein, dass es noch eleganter geht. Für den Moment bin ich ganz zufrieden. An der Parallelstruktur führt bei derart vielen Updates kein Weg vorbei. (Die Updates wurden notwendig, um fehlerhafte Adds aufzuspüren. Die treten aber seitdem ich die Bodies untereinander ver-Adde praktisch nicht mehr auf. Kann sein, dass es jetzt auch ohne sofortiges Update geht. Das soll aber jemand anderes testen!) Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jan. 2015 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Servus Ich meine nicht die Aufteilung wie die Adds erstellt werden (Gruppen bilden), sondern wie du auf die Körper zugreifst (also nicht über den Namen sondern über den Zähler) Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 23. Jan. 2015 18:56 <-- editieren / zitieren --> Unities abgeben: Nur für woodpeeker
Hi Bernd, ja, weil... - VB-Syntax ist mir vertrauter wie die CAA-Logik. - Temperamentssache. - An Collection hab ich nie gedacht. Sortiert müssen die Bodies nicht sein, halt ohne MainBody und die Grundplatte(StarDust..). Wenn ich Dich recht verstehe, denkst Du an: ---Pseudocode----- Do Until ... For i = 1 to Count step 2 Set InWork Body.Item(i) Add Body.Item(i+1) next Loop Bei ungeradzahligen Count-Werten, muss da noch eine Behandlung des letzten Elementes rein. Z.B. vorgeschaltet: If Bodies.Count MOD 2 = 1 then Count= Bodies.Count - 1 Ignoriert den überschüssigen Body. Spätestens bei der letzten Schleife muss er mit. Frage: Die Anzahl der vorhandenen Bodies ändert sich ja nicht mit den Adds. Wie und wo setzt Du den InBooleanOperation ein? Vorschlag: Innerhalb der Do-Loop, vor der Add-Schleife, die Collection filtern. Also: ----Pseudocode----- Dim CollToAdd For Each Body in Bodies If Body.InBooleanOp = False then CollToAdd.Add Body End If next Mag sein, dass das auch geht. Die BodyExists-Aufrufe kosten mich bei 9000 Bodies geschätzte 15 Minuten. Das Kraut machen die Updates fett. Meine Zeit steht bei 4h45'. :-) (Für 9231 Bodies + Grundplatte) Tschau, Joe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |