dictionaryで文字列を連結する方法

92 views
Skip to first unread message

田中真央

unread,
Sep 23, 2022, 1:10:49 AM9/23/22
to open...@googlegroups.com

お世話になります、田中と申します。
OpenFOAMのdictionaryの記法についての質問です。

OpenFOAMのディクショナリにおいて文字列の連結を行いたいと思っています。具体的には、ファイルのタイトルと拡張子を別々にエントリとして記述し、それを連結してファイル名としたいです。
参考ページをもとに以下のように試しに書いてみましたが、やはりエントリが数値でないのでエラーとなるようでした。

--------------------------------
title       "foobar";
extension   ".stl";
fileName    #eval{$title + $extension}; // this expression doesn't work.
// fileName    "foobar.stl"; // this is what I want.
--------------------------------

私が書いた、ディクショナリとそれをプリントするスクリプトを下記に示します:
https://gitlab.com/openfoamscripts/fundamentals/cylindricaldiffuser/-/tree/main/test

実際のところ、このような文字列の連結を実現する方法はあるのでしょうか?
何かご存知のことがあれば、ご教示いただきたいです。よろしくお願いいたします。

参考ページ:
https://doc.cfd.direct/openfoam/user-guide-v10/basic-file-format


nakagawa

unread,
Sep 23, 2022, 2:25:28 AM9/23/22
to OpenFOAM
田中さん

なかがわです。

文字列なので演算させなくても並べるだけでも良いのではないでしょうか。

シンプルに #calc で対応できます。
```
    fileName    #calc " \"$title\" \"$extension\" ";
```

さらにゴニョゴニョしたい時は,#codeStream がよいかもしれません。
```
    fileName    #codeStream
    {
        code
        #{
            os << "$title" << "$extension";
        #};
    };
```

ご確認いただけないでしょうか。

リポジトリ拝見しました。たいへん興味深いですね。さらなる発展を楽しみにしております。
情報公開,ありがとうございます。

なかがわ

2022年9月23日金曜日 14:10:49 UTC+9 M.TANAKA:

M.TANAKA

unread,
Sep 24, 2022, 2:10:57 AM9/24/22
to OpenFOAM
なかがわさん

アドバイスありがとうございます。早速試したところ下記のように、#evalではできませんでしたが#calcを使うと文字列の連結ができることを確認しました(リポジトリも更新しました)。また、こうして作成したfileNameをfoamDictionaryで読み込むと引用符 ” が外れた値になるようでした(どのみち文字列として利用するときに ” は消すので問題はないですが)。
#calcではC++をコンパイルしているそう(すると#evalはbashのbcコマンド等を使っているのでしょうか)なので、その辺りの機能差が表れているのかな?という印象です。

```cpp
    title       "foobar";
    extension   ".stl";
    //fileName    #eval{$title + $extension}; // (A). this expression doesn't work.
    //fileName    #eval{"$title$extension"}; // (B). this expression still doesn't work.
    fileName    #calc"\"$title$extension\""; // (C). this expression does work. but the entry has no " mark.
    /* // (D). this also works as well as (C), without " marks.

    fileName    #codeStream
    {
        code
        #{
            os << "$title" << "$extension";
        #};
    };
    */
    //fileName    "foobar.stl"; // this is what I want.
```

どうもありがとうございました。

P.S.
最初の投稿で示したgitlabリポジトリでは、パラメータスタディの自動化を念頭に置いて、FreeCADによるCAD生成~ParaView等による後処理までをAllrun一つで実行しようとしています。まだ途中ですが、形になったら改めて共有して皆さんのご意見を募りたいと思います。

2022年9月23日金曜日 15:25:28 UTC+9 nakagawa:
Reply all
Reply to author
Forward
0 new messages