Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  ANSYS
  /TLABEL in *DO-Loop ohne Aktualisierung

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 02. Mrz. 2010 14:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


tlabel-test.jpg

 
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


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

Beiträge: 773
Registriert: 13.12.2008

erstellt am: 02. Mrz. 2010 16:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Harko 10 Unities + Antwort hilfreich

Geht das?
Code:
*do, k, 1, 5, 1
  tmp = chrval(k)
  /com, XXX: tmp
  /tlabel, xBase, yBase + yStep*k, tmp
*enddo

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

ubi
Mitglied
Berechnungsingenieur und Ansysaufbohrer

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

Beiträge: 9
Registriert: 12.01.2009

Ansys13+14, Win7-64

erstellt am: 02. Mrz. 2010 16:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Harko 10 Unities + Antwort hilfreich

Falls obiges nicht geht kann man versuchen, die Variable in einen Stringcharacter umzuwandeln:

/tlabel, xBase, yBase + yStep*k, chrval(tmp)

_______
ubiwan

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

Harko
Mitglied



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 03. Mrz. 2010 07:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!

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



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 03. Mrz. 2010 07:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Korrektur: Beim Testcase steht "5".

Harko

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

ChristophN
Mitglied
Berechnungsingenieur


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

Beiträge: 773
Registriert: 13.12.2008

erstellt am: 03. Mrz. 2010 12:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Harko 10 Unities + Antwort hilfreich

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



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 03. Mrz. 2010 13:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


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

Beiträge: 773
Registriert: 13.12.2008

erstellt am: 03. Mrz. 2010 17:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Harko 10 Unities + Antwort hilfreich

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



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 04. Mrz. 2010 08:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


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

Beiträge: 773
Registriert: 13.12.2008

erstellt am: 04. Mrz. 2010 11:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Harko 10 Unities + Antwort hilfreich

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



Duales Studium Bachelor of Engineering in Maschinenbau ? Konstruktion und Fertigung WI 2024/4

Der Klimawandel stellt die Welt vor große Herausforderungen. Am Helmholtz-Zentrum Berlin erforschen wir Materialien für eine klimaneutrale Zukunft. 1200 Mitarbeitende aus aller Welt arbeiten am HZB gemeinsam an diesem Ziel. Komm zu uns und unterstütze uns dabei! Mehr auf unserer Webseite. Folg uns auch auf unseren Social-Media-Kanälen oder besuch unseren YouTube-Kanal.

Duales ...

Anzeige ansehenMaschinenbau
Harko
Mitglied



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

Beiträge: 17
Registriert: 17.12.2009

erstellt am: 05. Mrz. 2010 09:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz