Autor
|
Thema: Bodies dumm in neues Startmodell kopieren (5463 mal gelesen)
|
Ho196 Mitglied Dipl.-Ing.Fahrzeugtechnik, Entwickler
Beiträge: 26 Registriert: 23.11.2006
|
erstellt am: 29. Mrz. 2011 15:10 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hab trotz mehrerer Hinweise in diversen Threads leider keinen Artikel gefunden, der mir weiterhelfen konnte. Es geht um Folgendes: Ich möchte in ein Bauraummodell eine Funktion integrieren, um den Kunden per Knopfdruck ein Modell mit "verdummten" Daten zu erstellen. Klingt einfach, gestaltet sich aber schwieriger als gedacht. Ich hatte gehofft, einfach ein Makro aufnehmen zu können und das dann noch geringfügig anpassen zu können. Jedoch klappt das mit dem Aufnehmen insofern nicht, dass die kopierten Daten nicht in dem mit New-From geöffneten Modell landen, sondern im gleichen Modell, dem die Geometrie entstammt. Ich müsste also irgendwie das neue Startmodell aktivieren, bevor die Geometrie eingefügt wird. Auch ein makrobasiertes Speichern dieses Startmodells ist mir nicht gelungen, da ich nicht wusste, wie ich auf unsere DLL Pfade verweisen kann (zB auf /USER/USR.MYNAME/neuesmodell.CATPart, wenn ich von /Startmodelle/startmodell.CATPart komme).
------------------ Make it work! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
em Michael Kirsch Mitglied Teamleiter KBE Methoden & Tools
Beiträge: 222 Registriert: 21.10.2002 CATIA V5 R16 CATIA V5 R18 CATIA V5 R19 NX 5 NX 6 NX 7.5
|
erstellt am: 29. Mrz. 2011 21:38 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Hallo Ho196, Copy und Paste von Modell zu Modell lässt sich nicht gut mit dem Makrorecorder aufzeichnen. Wichtig ist, dass die Inhalte mit der Selection des Quellmodells kopiert und mit der Selection des Zielmodells eingefügt werden. Ansonsten landet die Kopie wieder im Quellmodell. Es gibt auch ein fertiges Tool, das das kann: http://www.em.ag/produkte/ippro/ippro-model2model Esslingen? Haben Sie zufällig mit Abgassystemen zu tun? Viele Grüße, Michael Kirsch ------------------ CATIA, sonst NX ;-)
www.em.ag
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3418 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 30. Mrz. 2011 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
|
em Michael Kirsch Mitglied Teamleiter KBE Methoden & Tools
Beiträge: 222 Registriert: 21.10.2002 CATIA V5 R16 CATIA V5 R18 CATIA V5 R19 NX 5 NX 6 NX 7.5
|
erstellt am: 30. Mrz. 2011 11:31 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Hallo Uwe, wenn ich ho196 richtig verstanden habe, soll das Zielmodell auf einem bestimmten Startmodell (z. B. von einem OEM) basieren. Das geht mit AllCATPart nicht. Viele Grüße, Michael Kirsch ------------------ CATIA, sonst NX ;-)
www.em.ag
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 30. Mrz. 2011 23:53 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Hallo Ho196, beim jetzigen Stand der Diskussion würde ich Dir empfehlen, einfach mal den Code hier einzustellen und dabei zu dokumentieren, was aus Deiner Sicht falsch ist und was Du genau haben möchtest. Ich bin mir sicher, wir können Dir bei der Lösung Deines Problems helfen! mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ho196 Mitglied Dipl.-Ing.Fahrzeugtechnik, Entwickler
Beiträge: 26 Registriert: 23.11.2006
|
erstellt am: 04. Apr. 2011 09:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe es zunächst nochmal mit dem Tipp der Selektion des Fensters probiert, aber leider ohne Erfolg. Der "Paste"-Befehl fehlte komplett in dem aufgenommenen Makro. Und auch, wenn ich ihn händisch eingefügt habe mit selection1.PasteSpecial "CATPrtResult", kam ein Fehler. Aber ich befürchte, ich muss mal ein "Makros für Dummies"-Buch kaufen. Momentan hab ich "CATIA V5 - Makroprogrammierung mit Visual Basic Script" von Dieter R. Ziethen. Und dieser macht sich leider nicht die Mühe, Grundlagen zu erklären, auch wenn er so tut, als ob. Ich hab also nochmal alles auf´s Minimum reduziert und aufgenommen. Hier das (nicht funktionierende) Resultat: Language="VBSCRIPT" Sub CATMain() Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = partDocument1.Selection selection1.Clear Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("Wickel_hi_aufgerollt") selection1.Add body1 selection1.Copy Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument2 As Document Set partDocument2 = documents1.NewFrom("\0_BOS_V5_STARTMODELLE.DE\Startmodell_Solid_BOS_R16_Rev2_020207.CATPart") Dim part2 As Part Set part2 = partDocument2.Part Dim bodies2 As Bodies Set bodies2 = part2.Bodies Dim body2 As Body Set body2 = bodies2.Item("Wickel_hi_aufgerollt") part2.UpdateObject body2 part2.Update End Sub Zusammengefasst: Modell ist offen Man nehme Body "Wickel_hi_aufgerollt" aus offenem Modell und kopiere ihn. Man öffne mit New-From ein Startmodell aus einem Topf und füge den Body verdummt ein und Update das neue Modell. Ziel: Minimales Macro ohne Schnickschnack Das war´s. Klingt einfach... Sorry für die Kinderfragen. Hoffe, ich hole schnell auf. ------------------ Make it work! 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: 04. Apr. 2011 10:11 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Das Problem in deinem Makro ist, dass es für jedes Dokument eine eigene Selection gibt. Zusätzlich muss beim Einfügen das Part Selektiert sein (AFAIK kann man mit Pastespecial einen Körper nicht direkt in einen Körper einfügen). Anbei ein (ungetestetes) Beispiel: Code: Language="VBSCRIPT"Sub CATMain() Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = partDocument1.Selection selection1.Clear Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("Wickel_hi_aufgerollt") selection1.Add body1 selection1.Copy Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument2 As Document Set partDocument2 = documents1.NewFrom("\0_BOS_V5_STARTMODELLE.DE\Startmodell_Solid_BOS_R16_Rev2_020207.CATPart") Dim selection2 As Selection Set selection2 = partDocument2.Selection selection2.Clear Dim part2 As Part Set part2 = partDocument2.Part selection2.add part2 selection2.Pastespecial "CATPrtResult" Dim bodies2 As Bodies Set bodies2 = part2.Bodies Dim body2 As Body Set body2 = bodies2.Item(bodies2.count) body2.name = "Wickel_hi_aufgerollt" part2.UpdateObject body2 part2.Update End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ho196 Mitglied Dipl.-Ing.Fahrzeugtechnik, Entwickler
Beiträge: 26 Registriert: 23.11.2006
|
erstellt am: 04. Apr. 2011 11:09 <-- editieren / zitieren --> Unities abgeben:
|
Ho196 Mitglied Dipl.-Ing.Fahrzeugtechnik, Entwickler
Beiträge: 26 Registriert: 23.11.2006
|
erstellt am: 05. Apr. 2011 15:56 <-- editieren / zitieren --> Unities abgeben:
Im nächsten Schritt möchte ich alle Bodies selektieren und in das Startmodell einfügen. Das hab ich folgendermassen probiert: Selektion per Set selection1 = CATIA.ActiveDocument.Selection selection1.Search "'Part Design'.Body;all" und dann selection1.Copy selection1.PasteSpecial "CATPrtResultWithOutLink" Ein Kollege verriet mir, dass das nicht funktionieren wird, solange auch nur einer der Bodies leer ist. Aber wie gehe ich dann ran? ------------------ Make it work! 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: 05. Apr. 2011 21:43 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Dann könntest du die Selektion mit einer for-next-Schleife von letzen bis zum ersten Element (selection1.item2(x)) durcharbeiten. Für jedes Element das Objekt prüfen (selection1.item2(x).value) ob dieses eine Shape enthält oder "InBooleanOperaton" ist. Wenn ja dieses Element mit "Selection1.Remove(x)" entfernen. Danach kopieren/einfügen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ho196 Mitglied Dipl.-Ing.Fahrzeugtechnik, Entwickler
Beiträge: 26 Registriert: 23.11.2006
|
erstellt am: 06. Apr. 2011 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, >>Für jedes Element das Objekt prüfen (selection1.item2(x).value) ob dieses eine Shape enthält<< Ich habe jetzt 2 Stunden lang probiert, damit zu prüfen, ob Geometrie vorhanden ist. Aber ich komme leider keinen Schritt weiter. Wenn ich das Ergebnis von "selection1.item2(x).value" per msgbox ausgeben will, kommt ein Fehler. Was ist denn das Ergebnis (Wert, String, True, False, 0,1,...)? For x=2 to selection1.count2 if not (selection1.item2(x).value) then ////Hier liegt ein Fehler, aber WELCHER?? msgbox "remove Körper Nr. "&x selection1.Remove(x) x=x-1 end if next Ich hab schon "alles" probiert. Mit "if/if not/false/true/""/0/1" Er nimmt einfach diese If-Bedingung nicht. MfG, Holger Welsch
------------------ Make it work! 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: 06. Apr. 2011 14:51 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus "selection1.item2(x).value" liefert dir das Objekt, in deinem Fall den Körper. Bei diesem musst du prüfen ob ein Shape enthalten ist. zB (Ungetestet): Set oBody = selection1.item2(x).value if oBody.Shapes.count = 0 then ...Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 06. Apr. 2011 21:47 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Anbei ein Beispiel für ein ähnliches Problem Makro (lag noch so bei mir rum). Dabei sollen alle leeren Körper in einem Part gelöscht werden (nicht ausgiebig getestet!). Code:
Sub CATMain()Dim oDoc As PartDocument Dim oPart As Part Dim oBody As Body Dim oSel As Selection '***Abfrage nach geöffneten Dokumenten If CATIA.Windows.Count = 0 Then MsgBox "Es ist kein Dokument geöffnet." + vbNewLine + _ "Das Makro kann nicht ausgeführt werden und wird beendet.", vbCritical + vbOKOnly, "Kein Dokument offen" Exit Sub End If '***Auslesen der Dokumentart Set oDoc = CATIA.ActiveDocument If TypeName(oDoc) <> "PartDocument" Then MsgBox "Dieses Dokument ist kein CATPart." + vbNewLine + _ "Das Makro kann nicht ausgeführt werden und wird beendet.", vbCritical + vbOKOnly, "Falscher Dokumententyp" Exit Sub End If '***Start Set oSel = oDoc.Selection oSel.Clear Set oPart = oDoc.Part '***Körper durchsuchen For i = oPart.Bodies.Count To 1 Step -1 Set oBody = oPart.Bodies.Item(i) '***Hauptkörper ausschliessen If oBody.Name <> oPart.MainBody.Name Then '***Körper leer? If (oBody.HybridBodies.Count = 0 And oBody.Shapes.Count = 0 And oBody.Sketches.Count = 0) Then '***Körper sektieren und löschen oSel.Add oBody oSel.Delete oSel.Clear End If End If Next End Sub
Vielleicht kannst du dieses Makro teilweise verwenden/anpassen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SvenBoehm Mitglied
Beiträge: 19 Registriert: 09.01.2014 Catia V5 R24 SP6 HF0 Windows 10 Enterprise 64bit Intel Xeon CPU E5-1650v3 32,0GB 2x Quadro K2200
|
erstellt am: 09. Jan. 2014 10:27 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Hallo zusammen, zu diesem Thema hätte ich noch eine ergänzende Frage. Ich nutze fast das selbe Makro wie oben beschrieben nur mit dem unterschied, dass ich nicht in ein anderes Part kopieren möchte sondern ins selber. Das funktioniert auch wie gewünscht. Jetzt suche ich schon seit geraumer Zeit nach einer möglichkeit, den Namen des neu eingefügten Bodys mit einem aktuellen Datum zu versehen. Mein Makro: [i]Language="VBSCRIPT" Sub CATMain() Dim partDocument1 As Document Set partDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = partDocument1.Selection selection1.Clear Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body1 As Body Set body1 = bodies1.Item("Hauptkoerper") selection1.Add body1 selection1.Copy Dim documents1 As Documents Set documents1 = CATIA.Documents Dim selection2 As Selection Set selection2 = partDocument1.Selection selection2.Clear Dim part2 As Part Set part2 = partDocument1.Part selection2.add part2 selection2.Pastespecial "CATPrtResultWithOutLink" Dim bodies2 As Bodies Set bodies2 = part2.Bodies Dim body2 As Body Set body2 = bodies2.Item(bodies2.count) body2.name = "Hauptkoerper_alt_XXXX.XX.XX" part2.UpdateObject body2 part2.Update End Sub Bei Hauptkoerper_alt_xxxx.xx.xx möchte ich an stelle der x'e das aktuelle Datum stehen haben. Das einzige was ich dazu finden konnte war Point.Autodatum oder so ähnlich. Weiß aber weder wie ich das einbauen soll, noch ob das überhaupt die richtige Sprache ist. Wäre super wenn mir da einer weiter helfen könnte. MFG Sven 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: 09. Jan. 2014 11:05 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Anbei ein Beispiel. Variante 2 läuft nur in VBA: Code: Sub CATMain()Dim sDate As String sDate = Year(Date) & "." & Month(Date) & "." & Day(Date) msgBox sDate sDate = Format(Date, "YYYY.MM.DD") msgBox sDate End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SvenBoehm Mitglied
Beiträge: 19 Registriert: 09.01.2014 Catia V5 R24 SP6 HF0 Windows 10 Enterprise 64bit Intel Xeon CPU E5-1650v3 32,0GB 2x Quadro K2200
|
erstellt am: 09. Jan. 2014 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Hallo, danke für die schnelle Antwort. Ich hab mich vieleicht nicht genau genug ausgedrückt. Das Datum soll natürlich automatisch eingetragen werden und das im selben Makro. Also wenn ich das Makro zum Kopieren starte soll er mit den neuen Body dann "Hauptkoerper_alt_2014.01.09" nenne. Benutze ich das Makro morgen dann dementsprechend "Hauptkoerper_alt_2014.01.10" etc. 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: 09. Jan. 2014 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Dann baue doch meinen Code in dein Makro ein. zB: Code: body2.name = body1.name & "_alt_"& Year(Date) & "." & Month(Date) & "." & Day(Date)
Gruß Bernd PS: Was machst du wenn der Hauptkörper mal umbenannt wurde? (ggf mal in der Doku nach MainBody schauen) ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 09. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SvenBoehm Mitglied
Beiträge: 19 Registriert: 09.01.2014 Catia V5 R24 SP6 HF0 Windows 10 Enterprise 64bit Intel Xeon CPU E5-1650v3 32,0GB 2x Quadro K2200
|
erstellt am: 09. Jan. 2014 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
funktioniert und du hast recht, benenne ich den Hauptkoerper um funktioniert das makro nichtmehr :-( es würde sich bei dem zu kopierenden Körper aber immer um den PartBody handeln, den kann ich doch gewiss auch abfragen oder? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 17. Apr. 2018 11:03 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus zusammen, ich hätte hierzu auch noch eine Frage. Ich möchte ein Konfigurator erstellen. Der Anwender soll aus einem bestehenden Product, für ihn relevante Teilmodelle auswählen die nach bestätigen des OK-Buttons in ein neues Product geladen werden. Die Teilmodelle sind nicht direkt dem Product untergeordnet. Hierzu ein kleines Beispiel (Product Struktur): 1. Product "A" 1.1 Modell-V5 "Haupt Zusammenbau" 1.2 Modell-V5 "Untergeordneter Zusammenbau" 1.3 Teilmodell-V5 "Die zu kopierende Modelle" Meine ersten Versuche ein Makro zu erstellen sind leider gescheitert. Ich bin folgendermaßen vorgegangen. Mit Hilfe des Recorders habe ich versucht das Kopieren / Neues Product erzeugen / Einfügen über Paste special without link aufzunehmen. Jedoch habe ich festgestellt, dass das ganze nur halb funktioniert. Nun bin ich auf den Befehl ( PasteSpecial “CATPRTResultwithoutlink” ) gestoßen allerdings ist mir nicht ganz klar wie ich damit umzugehen habe. Das Product enthält nur cgr-Daten ("Solids") - das ganze als Modell-V5 auszuchecken ist leider aus zeitlichen Gründen nicht möglich. Meine bisherige Aufzeichnung:
Code:
Private Sub CommandButton1_Click()Sub CATMain() Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = productDocument1.Selection selection1.Clear Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim product2 As Product Set product2 = products1.Item("HBG 000.0.1") Dim products2 As Products Set products2 = product2.Products Dim product3 As Product Set product3 = products2.Item("UBG 000.0.1") Dim products3 As Products Set products3 = product3.Products Dim product4 As Product Set product4 = products3.Item("Modell-V5 Muster0 000.0.1") Dim products4 As Products Set products4 = product4.Products Dim product5 As Product Set product5 = products4.Item("Modell-V5 Muster1 000.0.1") Dim products5 As Products Set products5 = product5.Products Dim product6 As Product Set product6 = products5.Item("Teilmodell-V5 Muster 000.0.1") selection1.Add product6 selection1.Copy Dim documents1 As Documents Set documents1 = CATIA.Documents
Dim productDocument2 As ProductDocument Set productDocument2 = documents1.Add("Product") End Sub
Schonmal vielen Dank für eure Unterstützung und Ratschläge
Grüße Mars
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: 17. Apr. 2018 18:53 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Wie würdest du das manuell machen? Schon mal probiert dies dann im Makro nachzustellen? ggf könntest du auch das entsprechende Product (bzw mehrere) selektieren lassen, und dann diese per AddComponent oder AddComponentsFromFiles in ein neues Product einfügen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 25. Apr. 2018 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus, deine Tipps haben mir schonmal weitergeholfen. Jetzt möchte ich noch folgende Funktion mit einbauen. Wenn der Anwender die CheckBox aktiviert wird das Product selektiert - soweit funktioniert alles prima. Wenn nun der Anwender die Checkbox deaktiviert sollte auch die Selection des Products entfernt werden. Dies umzusetzen ist mir aber bisher nicht gelungen.
Ich dachte ich könnte dies über den Befehl selection1.Remove lösen.
Vielleicht könnt ihr mir weiterhelfen.
[CODE][ Private Sub CB_Test_Click() If CB_Test = True Then Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = productDocument1.Selection Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim product2 As Product Set product2 = products1.Item("ZSB MASTER") Dim products2 As Products Set products2 = product2.Products Dim product3 As Product Set product3 = products2.Item("Modell-V5 MASTER 000.0.1") Dim products3 As Products Set products3 = product3.Products Dim product19 As Product Set product19 = products3.Item("TM TEST 000.0.1") selection1.Add product19 Else Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = productDocument1.Selection 'selection1.Clear Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim product2 As Product Set product2 = products1.Item("ZSB MASTER") Dim products2 As Products Set products2 = product2.Products Dim product3 As Product Set product3 = products2.Item("Modell-V5 MASTER 000.0.1") Dim products3 As Products Set products3 = product3.Products Dim product19 As Product Set product19 = products3.Item("TM Test 000.0.1") selection1.Remove End If End Sub
/CODE] Viele Grüße Marius
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: 25. Apr. 2018 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Marius Du musst auch angeben welches Element aus der Selektion entfernt werden soll. Dazu muss (wie es auch in der Doku steht) der entsprechende Zähler angegeben werden. Wenn dieser nicht bekannt ist, sondern nur der Name des Elements: - Schleife über die Selektion (for i = 1 to osel.count) - Name des Items mit dem gesuchten vergleichen - falls diese übereinstimmen: Element deselektieren (osel.Remove i) und Schleife verlassen - falls es nicht um das gesuchte Element handelt, nächsten Item untersuchen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 25. Apr. 2018 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Bernd, danke für die Antwort. Das Product ist bekannt. Ich muss dich nochmal nerven. Bei deaktivieren der CheckBox erhalte ich nun die Fehlermeldung "Run-time error '91': Object variable or With block variable not set" Die Bedeutung ist der Fehlermeldung ist mir klar - jedoch weis ich nicht wie ich damit umzugehen habe.
In der If Bedingung sind die Variabeln deklariert - wie erhält die else Bedingung Zugriff darauf? Code:
If CB_TEST = True Then Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = productDocument1.Selection 'selection1.Clear Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim product2 As Product Set product2 = products1.Item("ZSB TEST 000.0.1") Dim products2 As Products Set products2 = product2.Products Dim product3 As Product Set product3 = products2.Item("Modell-V5 TEST 000.0.1") Dim products3 As Products Set products3 = product3.Products Dim product19 As Product Set product19 = products3.Item("TEST 000.0.1") selection1.Add product19 'In Selection1 aufnehmen Else selection1.Remove (product19) 'Aus Selection1 entfernen End If
Besten Dank Marius 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: 25. Apr. 2018 16:42 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Woher soll Catia/VBA wissen was product19 ist? Das wird doch in einem Codeabschnitt definiert der nicht ausgeführt wurde. Remove erwartet einen Zähler nicht ein Objekt: Code: selection1.Remove (1) 'erstes Element wird deselektiert
Falls du alle Elemente deselektieren willst geht das über: Code: selection1.clear
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 26. Apr. 2018 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus, könntest du mir vielleicht dies anhand eines kleinen Code Beispiels zeigen. Ich bekomme nun die Deaktivierung der Selektion hin - allerdings wird nicht das richtige Modell bei erneurter Anwahl der CheckBox deselektiert (wie erwartet).
Zitat: Original erstellt von bgrittmann: Servus MariusDu musst auch angeben welches Element aus der Selektion entfernt werden soll. Dazu muss (wie es auch in der Doku steht) der entsprechende Zähler angegeben werden. Wenn dieser nicht bekannt ist, sondern nur der Name des Elements: - Schleife über die Selektion (for i = 1 to osel.count) - Name des Items mit dem gesuchten vergleichen - falls diese übereinstimmen: Element deselektieren (osel.Remove i) und Schleife verlassen - falls es nicht um das gesuchte Element handelt, nächsten Item untersuchen Gruß Bernd
Grüße und besten Dank Marius
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: 26. Apr. 2018 11:09 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus zB so (ungetestet) Code: strNameToRemove = "TEST 000.0.1" if oselection.count <> 0 then 'ist was selektiert? for i = 1 to oselection.count if oselection.item2(i).Value.Name = strNameToRemove then 'ggf auch mit InStr suchen/vergleichen oselection.Remove (i) 'deselektieren exit for 'wieder raus hier end if next end if
Das ganze könnte man nun auch noch in eine eigen Unterroutine verpacken, der man nur den gesuchten Namen übergibt. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 26. Apr. 2018 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus, vielen lieben Dank - funktioniert einwandfrei. Nun möchte ich diese Selektion in ein neus Produkt per PasteSpecial "CATPrtResultWithOutLink" einfügen. Ich habe bisher folgenden Code - ein neues Product wird erzeugt jedoch werden keine Modelle eingefügt.
[CODE]
Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = productDocument1.Selection selection1.Copy Dim documents1 As Documents Set documents1 = CATIA.Documents Dim productDocument2 As ProductDocument Set productDocument2 = documents1.Add("Product") Set productDocument2 = CATIA.ActiveDocument Dim selection2 As Selection Set selection2 = productDocument2.Selection 'selection2.Clear Dim product400 As Product Set product400 = productDocument2.Product selection2.Add product400 selection2.PasteSpecial "CATPrtResultWithOutLink" [CODE]
Viele Grüße Marius 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: 26. Apr. 2018 15:25 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus CATPrtResultWithOutLink gibt es nur im Part. Also entweder "normal" mit Paste einfügen oder bei PasteSpecial eine passende Option verwenden (siehe Doku). Was hast du überhaupt vor mit dem kopieren? Gruß Bernd PS: Selbsterklärende Namen der Variablen währen sinnvoll, sonst verstehst du deinen eigenen Code in zwei Tagen, einer Woche oder einem Jahr nicht wieder ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 29. Apr. 2018 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus, bzgl. den Variabeln hast du vollkommen Recht - bin aktuell noch am herumtüfteln. Habe den Fehler nun gefunden. Es war der falsche Befehl den ich verwendet habe. Code:
selection2.PasteSpecial "CATSpecBreakLink" [CODE]
Zitat: Original erstellt von bgrittmann: ServuszB so (ungetestet)[code]strNameToRemove = "TEST 000.0.1" if oselection.count <> 0 then 'ist was selektiert? for i = 1 to oselection.count if oselection.item2(i).Value.Name = strNameToRemove then 'ggf auch mit InStr suchen/vergleichen oselection.Remove (i) 'deselektieren exit for 'wieder raus hier end if next end if
Das ganze könnte man nun auch noch in eine eigen Unterroutine verpacken, der man nur den gesuchten Namen übergibt. Gruß Bernd
Ich habe noch eine Frage zu deinem Code.
Wie könnte diese Befehlszeile ( strNameToRemove = "TEST 000.0.1" ) abgeändert werden, sodass wenn beispielsweise eine neue Revision des Produkts "Test 000.0.1" erstellt wird und nun "Test 000.0.2" heißt die Revision weiterhin berücksichtigt wird. Ist es möglich nur ein Teil des Namen zu defnieren - z.B. "Test". Viele Grüße und besten Dank Marius
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: 29. Apr. 2018 14:36 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Ja geht wenn du die Namen mit InStr vergleichst (siehe VBA Doku oder Suche im Internet) Ob dies aber der "richtige" Weg für dein Problem ist weiß ich nicht. Ich hab mich schon gewundert, dass alles Instanznamen fest gecoded sind was vermutlich nur bei einem "leeren" Startmodell geht. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 29. Apr. 2018 22:48 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus, danke für deinen Hinweis. Ich habe es nun über die Suchfunktion probiert. Das ganze funktioniert auch bei einer einzelnen Suche. Wenn ich jedoch eine weitere Suche anstoße, geht die erste Selektion verloren und diese soll aber weiterhin aktiviert bleiben. Ich habe versucht die Selektion mit der Funktion Selection1.Add zu speichern, funktioniert aber leider nicht. Vermutlich muss ich einen anderen Weg gehen. [CODE] Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument
Dim selection1 As Selection Set selection1 = productDocument1.Selection selection1.Search "Name=*MUSTER*,all" [CODE] 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: 30. Apr. 2018 06:44 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Marius Bei Selection.Search werden alle zuvor selektierten Elemente deselektiert. Du könntest zB: - nach allen Namen gleichzeitig suchen - die selektierten Element zuvor in einem Array zwischenspeichern, die Suche durchführen und danach die Elemente aus dem Array wieder selektieren - oder wahrscheinlich am einfachsten: Schleife über die Products-Collection, für jedes Element den Namen mit dem Suchstring vergleichen (InStr, Left, ...) - oder am Anfang deines Script die Struktur (bzw die Products die du benötigst) einlesen und in einem Array/Variablen/Listbox/... zwischenspeichern und danach direkt wieder darauf zugreifen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mars001 Mitglied
Beiträge: 17 Registriert: 11.04.2018 Windows 7 Professional SP1 Intel Xeon CPU E5-1650 3,5GHz 32GB Ram Nvidia Quadro M4000 Catia V5 R26
|
erstellt am: 02. Mai. 2018 10:00 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Bernd, vielen Dank für deine Hinweise. Nach langer Recherche in der Catia-Hilfe und im Internet bin ich leider immer noch nicht weitergekommen. Mir ist nicht klar wie ich die Funktion "Instr" so einbinde wenn der gesuchte Name existiert, das Modell dementsprechend selektiert wird. Viele Grüße Marius 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: 02. Mai. 2018 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für Ho196
Servus Beispiel (ungetestet): Code: strNameToSelect = "Test" for i = 1 to oProducts.count if InStr(oProducts.Item(i).Name, strNameToSelect) <> 0 then oSelection.add oProducts.Item(i) exit for next
Oder eben mit Left die ersten Zeichen des Namen des Products auslesen und dann vergleichen. Ich empfehle dir dich besser in die Grundlagen zu VB(A) einzuarbeiten sowie ein Buch zur Programmierung in Catia durch zu arbeiten. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |