| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Ansys |
Autor
|
Thema: /TLABEL in *DO-Loop ohne Aktualisierung (1133 mal gelesen)
|
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 02. Mrz. 2010 14:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich "kämpfe" gerade damit, zu Dokumentationszwecken mehrere Annotationen automatisiert per APLD über einen *DO-Loop zu erzeugen. Die Daten ziehe ich mir hierfür aus einem Array, speichere sie als temporäre Variable innerhalb des Loops zwischen und erzeuge anschließend jeweils ein Label. Also so etwas (Testcase, vereinfacht): Code:
*do,k,1,5 tmp = k /COM, XXX: %tmp% /TLABEL, xBase, yBase+yStep*k, %tmp% *enddo
Für diesen Testcase würde ich 5 Labels mit den Zahlen (Ziffern) 1,2,3,4,5 übereinander angeordnet erwarten. Bekommen tue ich, 5 * die Ziffer 5 übereinandern, siehe Attachment. Der Kommentar an der Konsole zeigt im Gegensatz das gewollte. Ursache? Wird die %tmp%-Variable geändert, so werden automatisch die hierauf referenzierenden Labels aktualisiert. So interpretiere ich zumindest die Ansys-Doku: Zitat: Ansys Dokumentation: Defining the parameter after it is used in a command does not "update" the command in most cases. (Exceptions are the commands /TITLE, /STITLE, *ABBR, and /TLABEL. See Forced Substitution for more information.)
Ist das korrekt? Und wie kann man dies lösen? Zur Zeit behelfe ich mir damit, dass ich mittels *vwrite die entsprechenden \tlabel Befehle als Makro auf Platte schreibe und dieses Makro anschließend nach Beendigung des Loops ausführe. Funktioniert, ok. Schön ist was anders. Also: das muss doch besser gehen, oder? Nur wie? Harko
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 02. Mrz. 2010 16:22 <-- editieren / zitieren --> Unities abgeben: Nur für Harko
|
ubi Mitglied Berechnungsingenieur und Ansysaufbohrer
Beiträge: 9 Registriert: 12.01.2009 Ansys13+14, Win7-64
|
erstellt am: 02. Mrz. 2010 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für Harko
|
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 03. Mrz. 2010 07:01 <-- editieren / zitieren --> Unities abgeben:
Hallo! Zitat: Original erstellt von ubi: Falls obiges nicht geht kann man versuchen, die Variable in einen Stringcharacter umzuwandeln:/tlabel, xBase, yBase + yStep*k, chrval(tmp)
Dienst führt dazu, dass anstatt der "5" nun dort "chrval(tmp)" als String gezeigt wird. Zitat: Original erstellt von ChristophN: Geht das?
Code: *do, k, 1, 5, 1 tmp = chrval(k) /tlabel, xBase, yBase + yStep*k, tmp *enddo
Auch nicht. Hier werden ebenfalls alle Labels aktualisiert, so ich tmp verändere. Da k in jedem Lopb inkrementiert und als String in tmp abgelegt wird, steht auch hier am Ende für jedes Label "20". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 03. Mrz. 2010 07:03 <-- editieren / zitieren --> Unities abgeben:
|
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 03. Mrz. 2010 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für Harko
Jetzt verstehe ich vielleicht das Problem... Was ist denn mit Code: anz = 5 *set, text *dim, text, array, anz *do, k, 1, anz, 1 text(k) = k /com, XXX: %text(k)% /tlabel, xBase, yBase + yStep*k, %text(k)% *enddo
funktioniert das?Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 03. Mrz. 2010 13:31 <-- editieren / zitieren --> Unities abgeben:
Yein. Oder - leider nein. Die Anzeige sieht zuerst korrekt aus (1,2,3,4,5) bis zum nächsten Replot. Nach diesem sehe ich für deine Lösung dann das übliche, also (5,5,5,5,5), d.h. jedes Element des text-Vektors wird mit dem aktuellen Wert von k aktualiert. Nach Durchlaufen der Schleife gilt nunmal k = 5. Lösche ich k und führe danach einen Replot aus, so kommt zu Recht die Fehlermeldung "Unknown parameter name k". Frage: Gibt es also eine Möglichkeit, diese Querverweise aufzulösen. So was vergleichbar deepcopy() in Python? Also eine Möglichkeit, die Pointerverkettungen auf die ursprüngliche Variable k aufzulösen und durch den echten Wert zu ersetzen (Call by Value anstatt Call by Reference). Danke! Harko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 03. Mrz. 2010 17:35 <-- editieren / zitieren --> Unities abgeben: Nur für Harko
Oder so? Code: anz = 5 *do, k, 1, anz, 1 text%k% = k /com, XXX: chrval(text%k%) /tlabel, xBase, yBase + yStep*k, chrval(text%k%) *enddo
Vielleicht auch mit doppelter Parameter-Substitution:
Code: anz = 5 *do, k, 1, anz, 1 text%k% = k /com, XXX: %text%k%% /tlabel, xBase, yBase + yStep*k, %text%k%% *enddo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 04. Mrz. 2010 08:24 <-- editieren / zitieren --> Unities abgeben:
Danke für die Mühen. Leider auch nicht. Auch hier wird nach einem Replotfür jedes Label der aktuelle Wert von k angezeigt. Also auch nix. Anbei noch einmal ein allein lauffähiger Testcase als fertiges Macro zum Testen. Code:
xBase=1.50 yBase=-0.97 yStep=0.06 xOffset=0.033/ANNO, DELE /replot anz = 10 *set, text *dim, text, array, anz *do, k, 1, anz, 1 text(k) = k /com, XXX: %text(k)% /tlabel, xBase, yBase + yStep*k, %chrval(text(k))% *enddo ! *DEL, k
Und weiterhin die aktuelle Lösung über *vwrite. Man sieht die "Eleganz" von letzerem. Daher auch meine Motivation, dies zu "optimieren". Code:
xBase=1.50 yBase=-0.97 yStep=0.06 xOffset=0.033/ANNO, DELE /replot anz = 10 *set, text *dim, text, array, anz /sys,del zzzTmp.mac /q output,zzzTmp,mac,, /output,term *do, k, 1, anz, 1 text(k) = k txt%k% = k /com, XXX: %text(k)% /output,zzzTmp,mac,,APPEND *vwrite, k-1,txt%k% ('/TLABEL,xLocation, (yBase + yStep*(', F4.0,')),',F4.0) /out,term *enddo /out,term zzzTmp.mac ! *DEL, k
Harko, der dies gerne als Attachment angehängt hätte, hier aber nur "ungültiges Attachment" bekommt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristophN Mitglied Berechnungsingenieur
Beiträge: 773 Registriert: 13.12.2008
|
erstellt am: 04. Mrz. 2010 11:34 <-- editieren / zitieren --> Unities abgeben: Nur für Harko
Ich habe es jetzt auch einmal in ANSYS ausprobiert, es klappt nicht. Also: elegant oder nicht, deine Variante funktioniert, also lass es doch so!? Mir fällt jetzt auch wirklich nix anderes mehr ein... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
Harko Mitglied
Beiträge: 17 Registriert: 17.12.2009
|
erstellt am: 05. Mrz. 2010 09:42 <-- editieren / zitieren --> Unities abgeben:
Hallo, Zitat: Original erstellt von ChristophN: Ich habe es jetzt auch einmal in ANSYS ausprobiert, es klappt nicht. Also: elegant oder nicht, deine Variante funktioniert, also lass es doch so!? Mir fällt jetzt auch wirklich nix anderes mehr ein...
Gut, dann stehe ich zumindest nicht allein vor dem Problem sondern muss mit dem Workaround leben. Mag ich zwar nicht, da was nach meiner Erfahrungs aus vorhergehenden Programmierarbeiten das, was schlecht aussieht, einem später richtig in die Quere kommt. Aber kann man wohl nicht ändern. Dir dennoch Danke für die Versuche und Anregungen! Harko
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|