| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX | | |  | NX große Baugruppen WAVE-Links, ein Seminar am 22.09.2025
|
Autor
|
Thema: Knowledge Fusion (2378 mal gelesen)
|
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 29. Okt. 2004 11:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich starte mit Konwledge Fusion (KF / KBE). Habe teilweise noch Probleme mit dem doch gewöhnungsbedürftigen Syntax. Die Aufgabenstellung ist folgende: Der Benutzer kann einen String eingeben, dieser soll dann in der Zeichnung dargestellt werden. Dafür wäre die Klase "ug_note" geeignet. Aber die Funktioniert leider nur im Modelling, im Drafting wird der String nicht dargestellt. Der Workaround sieht jetzt so aus, dass ich die Buchstaben mit einer Geomterie darstelle, also mit Kurven (ug_curve) und Linien (ug_line). Jeder Buchstabe ist dann eine eigene Klasse. Alle Charakter des Strings werden durchlaufen, der ASCII Code bestimmt, und dann abhängig von diesem die entsprechende Klasse aufgerufen. Und hier habe ich das Problem. Das bestimmen des ASCII Codes funktioniert (in einem Loop), ich weiss aber nicht, wie ich die CASE oder if() elseif() elseif() Struktur innerhalb eines Loops definieren kann. Untenstehend die Funktion, dieser wird der String übergeben: ################################################ # # Name: ri_lod_ascii_to_geo # # Die Funktion liest in einem String jeden einzelnen # Charakter und erzeugt entsprechend dem ASCII Wert # des Charakters ein Geometrieobjekt (Kurven+Linien) # als Child Objekt der entspr. Klasse # # Input: Liste mit einem String # Output: Geometrieobjekte der Charakter # Return: true # ################################################ Defun: ri_lod_ascii_to_geo (List $String_List, Point $Position) @{ #DEBUG Info ug_printMessage ({"In Funktion: ri_lod_ascii_to_geo"}); #Die Listenlaenge ist immer 1 $list_length << Length($String_List); #Den zusammengestzten String aus der Liste holen, weil Listenlaenge #immer 1 ist, kann die Funktion first verwendet werden $string << first($String_List); #Stringlaenge setzen $string_length << Length($string); #den gesamten String durchlaufen loop { #Iterator for $i from 1 to $string_length; #Schlaufeniterator Wert ausgeben do ug_printValue ($i); #String trimmen, jeweils den ersten Char entfernen for $trimm_string is subString($string; $i; $string_length); do ug_printValue ($trimm_string); #ASCII ID des ersten Char ermitteln for $ascii_id is ASCII ($trimm_string); do ug_printValue ($ascii_id); => wie kann ich hier die CASE Struktur für die 256 ASCI Zeichen abbilden?????? #Abahengig von ASCII ID eine Instanz des entsprechenden Zeichens erzeugen if ($ascii_id = 73) then do ug_createInstance({class, ug_cylinder,diameter, 10,origin, point(0,0,$i)}); #if ($ascii_id = 73) append ug_createInstance({class, ug_cylinder,diameter, 10,origin, point(0,0,$i)}); #for $ascii_id is 73 then ug_createInstance({class, big_A}); return is {}; }; $return << true; } Boolean ;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 29. Okt. 2004 13:28 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
Endlich mal jemand, der KF macht! Wie wäre es im letzten loop mit: loop { #Iterator for $i from 1 to $string_length; #Schlaufeniterator Wert ausgeben do ug_printValue ($i); #String trimmen, jeweils den ersten Char entfernen for $trimm_string is subString($string; $i; $string_length); do ug_printValue ($trimm_string); for $ascii_class is makename("big_" + $trimm_string); collect ug_createInstance({class, $ascii_class}); }; Ist ungetestet und für die Zeile "#for $ascii_id is 73 then ug_createInstance({class, big_A});" zugeschnitten, da ich annehme (siehe Text), daß diese Funktion gemeint ist. Der Befehl "collect" sammelt alles ein, Ergebnis ist eine list. Ist erst mal nur für Großbuchstaben, doch das Prinzip ist damit klar: den Klassennamen erzeugen, nicht aussuchen! Ich hoffe, Dich damit richtig verstanden zu haben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 29. Okt. 2004 15:46 <-- editieren / zitieren --> Unities abgeben:         
Hallo älg, cooler Name! Danke für den schnellen und guten Tipp, hat mir echt weitergeholfen. Jetzt bin ich ein Schritt weitergekommen. Die "ug_createInstance" Funktion macht mir noch Probleme. Wenn ich darin eine Original UG Klasse instanziere funktioniert es, die Geometrien werden erzeugt. Wenn ich aber eine eigene Klasse aufrufe, sehe ich diese zwar in der Liste im KF Navigator, die Geometrien werden aber nicht erzeugt. Es reicht schon, wenn ich die Original UG Klasse in einer eigenen Klasse als Child aufrufe (Klasse gekapselt), schon dann geht es nicht mehr. Defun: ri_lod_ascii_to_geo (List $String_List, Point $Position) @{ #DEBUG Info ug_printMessage ({"In Funktion: ri_lod_ascii_to_geo"}); #Die Listenlaenge ist immer 1 $list_length << Length($String_List); #Den zusammengestzten String aus der Liste holen, weil Listenlaenge #immer 1 ist, kann die Funktion first verwendet werden $string << first($String_List); #Stringlaenge setzen $string_length << Length($string); #den gesamten String durchlaufen $list_ascii_id << loop { #Iterator for $i from 1 to $string_length; #Schlaufeniterator Wert ausgeben do ug_printValue ($i); #String trimmen, jeweils den ersten Char entfernen for $trimm_string is subString($string; $i; $string_length); do ug_printValue ($trimm_string); #ASCII ID des ersten Char ermitteln for $ascii_id is ASCII ($trimm_string); do ug_printValue ($ascii_id); #Typenumwandlung von Integer in String for $ascii_id_as_string is stringValue($ascii_id); do ug_printValue ($ascii_id_as_string); #Klassenname zusammenstellen und instanzieren for $ascii_class is makename("ascii_class_"+$ascii_id_as_string); do ug_printValue ($ascii_class); #mit der Original UG Klasse klappt es collect ug_createInstance({class, ug_block}); #mit meiner eigenen Klasse geht es nicht #collect ug_createInstance({class, $ascii_class, givenName, "myblock"}); }; } List ; Ist das für dich logisch, kann das nicht nachvollziehen?
Zudem schreibt UG in Manual, dass "ug_createInstance" nicht innerhalb einer anderen Funktion aufgerufen werden soll. Weisst du, ob ich das Ernst nehmen muss? UG Manual: Description This function creates/edits an instance. Note : Do not call this function from within another function. This is an illegal side effect. Danke und Gruss!!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 29. Okt. 2004 16:29 <-- editieren / zitieren --> Unities abgeben:         
Hallo nochmals, ich verwende jetzt die Childlist anstatt ug_createInstance, funktioniert prima. Das Verhalten von createInstance ist aber trotzdem komisch, ist bei UGS in Abklärung, informiere weiter... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Joerg.A Mitglied

 Beiträge: 86 Registriert: 12.12.2001
|
erstellt am: 29. Okt. 2004 19:40 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
Zitat: Original erstellt von DinnerForOne:UG Manual: Description This function creates/edits an instance. Note : Do not call this function from within another function. This is an illegal side effect. Danke und Gruss!![/B]
Hallo, diesen Hinweis würde ich schon ernst nehmen. Bei uns hatten wir nämlich genau das selbe Problem. Ein Kollege von mir hat genau das gleiche gemacht wie Du und auch er klagte über nicht korrekte Updates der Geometrie. Nach Anfrage bei UG kam genau diese Info zurück. Wenn Dein Programm stabil laufen soll würde ich die Finger von diesem Weg lassen (so kannst Du viel Zeit sparen). Machst Du aus dieser Funktion eine Klasse sollte es besser laufen, aber dann kannst Du ja auch Childlist benutzten, was denke ich auch etwas übersichtlicher ist. Schöne Grüße Joerg.A Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 01. Nov. 2004 10:59 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, habe jetzt ein anderes Problem. Das Erzeugen der Instanzen mit der ChildList funktioniert jetzt prima. Jetzt möchte ich noch die Position der Instanzen steuern. Die Position habe ich in einer zweiten Liste abgespeichert, die erste Liste beihaltet jeweils den zu instanzierenden Klassennamen. Die Listen werden also parallel geführt. Das Problem ist, dass ich in der Klasse die instanziert wird(ascii_class_101.dfa) nich an das Attribut "my_center" komme, bzw das Attribut wird nicht aus der Liste genommen, es hat immer den Standardwert. Die Hauptklasse: ******************************************************************** #! UG/KF 19.0 DefClass: main_test (ug_base_part); #Liste mit Positionen (List) position: {point(0,0,0),point(100,0,0),point(200,0,0)}; #Liste mit Klassennamen (List) dummy: {ascii_class_101, ascii_class_101, ascii_class_101}; #Childlist (Child List) ascii_char: { #hier hole ich den Klassenamen aus der ersten Liste "dummy" Class, nth(child:index:, dummy:); quantity, length(dummy:); #hier hole ich die Position aus der Liste "position" my_center, nth(child:index:, position:); }; ******************************************************************** und die Unterklasse, welche instanziert wird: ******************************************************************** #! UG/KF 19.0 DefClass: ascii_class_101 (ug_base_part); #hier würde ich gerne auf den Wert waährend der instanzierung zugreiffen (Point Modifiable Lookup) my_center: point(0,0,0); (Child) C1: { Class, ug_arc; radius, 1.66667; #hier würde der Wert dann verwendet werden, nimmt aber immer den Wert 0,0,0 Center, Point(localX(my_center:),localY(my_center:),localZ(my_center:)); }; ********************************************************************* Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Joerg.A Mitglied

 Beiträge: 86 Registriert: 12.12.2001
|
erstellt am: 01. Nov. 2004 11:33 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
Hallo DinnerForOne, ich habe es jetzt zwar nicht ausprobiert, aber probiere es mal mit folgenden Änderungen für die Unterklasse: ******************************************************************** #! UG/KF 19.0 DefClass: ascii_class_101 (ug_base_part); #hier würde ich gerne auf den Wert waährend der instanzierung zugreiffen (Point Modifiable Parameter) my_center: point(0,0,0); (Child) C1: { Class, ug_arc; radius, 1.66667; #hier würde der Wert dann verwendet werden, nimmt aber immer den Wert 0,0,0 Center, my_center:; }; ********************************************************************* Schöne Grüße Joerg.A
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 01. Nov. 2004 12:27 <-- editieren / zitieren --> Unities abgeben:         
|
Joerg.A Mitglied

 Beiträge: 86 Registriert: 12.12.2001
|
erstellt am: 01. Nov. 2004 12:53 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
Hallo DinnerForOne, ich habe mal die zwei Dateien, mit denen ich es ausprobiert habe angehängt. Mit diesen bekomme ich drei Kreise mit einem Abstand von 100mm auf den Bildschirm. Kannst es ja mit diesen nochmal bei Dir ausprobieren. Schöne Grüße Joerg.A Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 01. Nov. 2004 12:56 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
|
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 01. Nov. 2004 13:30 <-- editieren / zitieren --> Unities abgeben:         
|
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 01. Nov. 2004 14:29 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
|
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 02. Nov. 2004 08:12 <-- editieren / zitieren --> Unities abgeben:         
Haloo KF Hackers, täglich grüsst das Murmeltier... Ich habe mit der for-Schlaufe so meine Mühe. In einer ersten Liste habe ich die Klassennamen der Buchstaben die ich erzeugen will. Diese Liste ist gegeben. In einer zweiten Liste habe ich die Positionen dieser Buchstaben, jeweils X, Y und Z Position. Wobei die Y und Z Position bei allen Buchstaben dieselbe ist. Diese Liste wird in der Funktion erzeugt, zurück kommt eine Liste mit Positionen (Point). Die X Position ist dynamisch, abhängig von der ersten Position, der jeweiligen Breite der bereits erzeugten Buchstaben(s) und jeweils noch ein Space dazwischen. Ich muss also innerhalb der For-Schlaufe abhängig vom Buchstaben die Breite berechnen. Wie bringe ich eine if () else if () else if () Struktur in eine for-Schleife??? Code: #! UG/KF 19.0 DefClass: test_size (ug_base_part); #Liste mit Objekten (List Modifiable Parameter) note_list: {char_a, char_b, char_c};
#Liste mit Positionen der Objekte (List Modifiable Parameter) note_pos: evaluate_size(note_list:, origin_x:, pos_y:, pos_z:); #X-Ursprungsposition, die X Position ist für die folgenden Objekte unterschiedlich (Number Modifiable Parameter) origin_x: 50;
#Y-Position, bei allen Zeichen dieselbe (Number Modifiable Parameter) pos_y: 100; #Z-Position, bei allen Zeichen dieselbe (Number Modifiable Parameter) pos_Z: 200; #Funktion zum Positionen der Objekte definieren Defun: evaluate_size (List $note_pos, Number $origin_x, Number $pos_y, Number $pos_z) @{ #Zwischen den Objekten ist jeweils ein Space $size_space << 1; #Die Objekte haben eine unterschiedliche Breite in X Richtung $size_char_a << 5; $size_char_b << 10; $size_char_c << 20; #den gesamten String durchlaufen $list_char_pos << loop { #Iterator for $i from 1 to Length($note_pos); #X-Breite des aktuellen Objektes #*****so geht es, bringt mir aber nix, weil die Breite statisch ist... for $current_size is 10; #+ *****so möchte ich es sinnesgemäass, geht ja aber in der for Schlaufe nicht if (nth($i, $note_pos)) = "char_a") then $current_size << $size_char_a else if (nth($i, $note_pos)) = "char_b") then $current_size << $size_char_b else if (nth($i, $note_pos)) = "char_c") then $current_size << $size_char_c else then $current_size << 0; ***** #- #Positionierungszeiger, speichert die Zwsichenposition ab, bei erstem durchgang auf Origin stellen, #ab den folgenden Durchgängen jeweilige Objektbreite und Space dazuzählen for $next_X_pos is ($origin_x) then ($next_X_pos+$current_size+$size_space); #Alle Position definieren for $pos is point($next_X_pos, $pos_y, $pos_z); append {$pos}; }; } List ;
Bin ich euch dankbar, dass ihr mir auf die Sprünge helft. Ich komme aus der UG Open "Welt", der KF Syntax bringt mich fast ins Grab. In C++ währe die Geschichte Peenuts.
Gruss! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Joerg.A Mitglied

 Beiträge: 86 Registriert: 12.12.2001
|
erstellt am: 02. Nov. 2004 09:00 <-- editieren / zitieren --> Unities abgeben:          Nur für DinnerForOne
Hallo DinnerForOne, Dein Ansatz war schon einmal nicht schlecht, Du kannst die If Then Else Bedingungen einfach hinter eine Variable schreiben. for $current_size is if (nth($i, $note_pos)) = "char_a") then $size_char_a else if (nth($i, $note_pos)) = "char_b") then $size_char_b else if (nth($i, $note_pos)) = "char_c") then $size_char_c else then 0; Ich hatte mit den loops am Anfang auch so meine Probleme, aber nach einer Weile gings dann. Schöne Grüße Joerg.A
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DinnerForOne Mitglied

 Beiträge: 62 Registriert: 29.10.2004 UG NX3
|
erstellt am: 02. Nov. 2004 09:33 <-- editieren / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |