表形式データ対応のランチャーを作りたい
- 表形式データから二次元平面上で形状作成したり、境界条件を設定するケースが多々あって、wxPython にもtableを取り扱えるライブラリがあるので、これを使ってプログラミング・・・ということを考えてもいるのですが、表形式といえばエクセル。エクセルではVBAが使えて、これを使えば簡単に出来る・・・と思うのは、自分だけではないであろう。
ランチャーカスタマイズは簡単?
- また、ランチャーを簡単にカスタマイズできるといって、これを、python や、wxPythonの世界のお話からせにゃならないので、初心者にとってのハードルは依然高い。しかし、これがエクセルVBAで・・・となれば、ハードルもかなり下がるんでないだろうか。
- はっきり言って、CAEはマイナーというかオタクに近い世界だが、エクセルVBAくらいから入れるとなると、CAEそのものの世界を拡げることになるかも。
OpenOffice VS MicroSoftOffice
- とはいうものの、エクセルはあくまでマイクロソフトの商品なので、ここはオープンソースのOpenOfficeのマクロを使ってやれるかどうかです。OpenOfficeとMicroSoftOffice の互換性については色々問題があり(たとえば⇒http://oooug.jp/compati/3.0/introduction+index.content_id+8.htm)、自分でも実感しているところです。このマクロについても、似て非なるところ(たとえば[[マクロの記録問題>http://openoffice3.web.fc2.com/OOoBasic_DespatchHelper.html)があって、いきなり躓きましたが、プログラミングという観点ではあくまでBasicであり、基本的な文法などは同じだと思って良さそう。簡単、お手軽なプログラミングは出来そうだという感触を得ることはできました。 そもそもエクセルVBAで作ったDEXCSランチャーそのものが存在しないので、新規につくるしかなく、この際互換性の問題は棚上げできる。
Shell関数(python VS basic)
- そこで、この1週間ばかり、あれこれ調べてきました。
- pythonベースで作ってきたDEXCSの各種コンポーネントをどう使っていくかというのがポイントで、Shell関数を使えば、OpenFOAMを直接起動したり出来ることが判ってきました。たとえば、
- DEXCS(python)では、
os.chdir(self.mesh1Dir) title = "RunBlockMesh" msg = "blockMesh を実行します" cmd = self.setEnvDefault + ";blockMesh" self.runCommand(msg, title, cmd) (途中省略) cmd1 = self.cmd os.system(cmd1)
とやっていたところ、
cmdFile = "/home/dexcs/Desktop/DEXCS_SPJ/applications/blockMesh.sh" FileNo = Freefile ' ファイルハンドル作成 Open cmdFile For Output As #FileNo ' ファイルを書き込みモードで開く print #FileNo,"#!/bin/bash" print #FileNo,". /home/dexcs/OpenFOAM/OpenFOAM-1.5.x/etc/bashrc" print #FileNo,"cd " + work_case print #FileNo,"blockMesh" Close #FileNo ' ファイルを閉じる cmd1 = "+x " + cmdFile Shell ("chmod", 2,cmd1,True) Shell( cmdFile , 2, , True)
公開情報は比較的豊富
- また調べるに際して、マクロに関する情報は少なかったとはいえ、wxPythonに比べれば、日本語情報として日本語の解説書籍もあるほどで、はるかに充実している(たとえば、Macroの杜「はにゃ?」さんホームページ)のも嬉しかった。
最後の難関
- 最後に一点、インターネット上ではとうとう探しだせなかったんだが、どうしても押さえておきたいポイントがあった。ようやく試行錯誤の末解決できたので、ここに取り纏めておくこととした。
Shell関数の不思議
- 先に、Shell関数が使えることを記したんだが、実はこの挙動が必ずしも正常に機能しない場合があった。それはOpenOfficeのCalcシートから呼び出す際に、そのCalcシートを直接開いた(GUI選択してダブルクリックなどの)場合の事。つまりその際には、Shell関数を実行して、その出力をどこにも表示させる方法がないみたい(ここは調べ方が下手ということかもしれないのだが・・・)で、その場合、Shell関数の実行が正しく行われたどうか調べることもできなければ、往々にして実行できていないということになる。
- ちなみに、Shell関数の第2引数の数字でプログラム起動時のウインドウのスタイルを指定できるということになっているらしいが、Linux版(というかubuntu10.04)固有の問題かもしれないが、これが全然無反応であったので、このあたりが原因ということも考えられる。
- 一方、Calcシートを直接開くのではなく、端末を出して、コマンドラインで
soffice hoge.ods
など入力してCalcシートを開いてやると、この場合はShell関数の実行結果が端末上に適宜出力されるので、ちゃんと実行できていることもわかるし、コマンド間違いによるエラー対応も判断できることになる。
- なので、DEXCSランチャーとしては、後者の方法で起動したい訳で、それは丁度現在のDEXCSランチャーで、GUIパネルと端末が同時に出てくるのと同じ使用方法イメージということになる。ならば、同じようなデスクトップアイコンを作って起動してやれば良い・・・ということになるのだが、ここからが問題であった。
DEXCSランチャーの起動方法
- ちなみに、現在のDEXCSランチャーの起動アイコンに割りつけてあるコマンドは、
gnome-terminal -e /home/et/Desktop/DEXCS/launcherOpen/dexcs.py --title=stdout/stderr --geometry=120x10-0-0 --zoom=0.8
- 端末(gnome-terminal)を開いて、コマンド(/home/et/Desktop/DEXCS/launcherOpen/dexcs.py)を実行(-e)しなさい。端末のスペックは(-title=stdout/stderr –geometry=120×10-0-0 –zoom=0.8) という意味であった。
- ならば、これと同じように、
gnome-terminal -e "soffice hoge.ods" --title=stdout/stderr --geometry=120x10-0-0 --zoom=0.8
でいいはずじゃないか・・・と言いたくなる。しかしやってみると・・・Calcシートは開いたんだが、開くと同時に端末画面が消失してしまう。結果、マクロから起動するShell関数が機能しない・・・ということになってしまった。
ここを乗り越えてくれないことには・・・
- で、あれこれ探してみたんだが、解決策を公開情報から探し出すことは出来なかった。
soffice -help
で、以下のオプション説明も得られたんだが、これといって該当しそうなものもない。
Usage: soffice [options] [documents...] Options: -minimized keep startup bitmap minimized. -invisible no startup screen, no default document and no UI. -norestore suppress restart/restore after fatal errors. -quickstart starts the quickstart service (only available on windows and OS/2 platform) -nologo don't show startup screen. -nolockcheck don't check for remote instances using the installation -nodefault don't start with an empty document -headless like invisible but no userinteraction at all. -help/-h/-? show this message and exit. -writer create new text document. -calc create new spreadsheet document. -draw create new drawing. -impress create new presentation. -base create new database. -math create new formula. -global create new global document. -web create new HTML document. -o open documents regardless whether they are templates or not. -n always open documents as new files (use as template). -display <display> Specify X-Display to use in Unix/X11 versions. -p <documents ...> print the specified documents on the default printer. -pt <printer> <documents ...> print the specified documents on the specified printer. -view </documents><documents ...> open the specified documents in viewer-(readonly-)mode. -show <presentation> open the specified presentation and start it immediately -accept=<accept -string> Specify an UNO connect-string to create an UNO acceptor through which other programs can connect to access the API -unaccept=</accept><accept -string> Close an acceptor that was created with -accept=</accept><accept -string> Use -unnaccept=all to close all open acceptors Remaining arguments will be treated as filenames or URLs of documents to open.
最後は、駄目元で起動オプションを総あたり・・・
gnome-terminal -e "soffice hoge.ods -nolog" --title=stdout/stderr --geometry=120x10-0-0 --zoom=0.8
にて解決できたという、何と言ったら良いのやら・・・
何はともあれ
その他判った事
- OpenOfficeのドキュメントの起動時の状態(マクロのセキュリティ設定やら、表示メニュー、ウィンドウサイズなど)はホームディレクトリ下、.openoffice.org という隠しフォルダに設定ファイルが作られるようなので、配布用のisoイメージ作成の際には、/etc/skelの下にそのまんまコピーを収納しておけばよい。
- ファイルを選択するのにコモンダイヤログ(com.sun.star.ui.dialogs.FilePicker)を使えることが出来る・・・というのはかなり簡単に探し出すことができたのだが)、フォルダを選択する方法は見つけ出せず、最終的に、解説書籍でようやく使用例を見つけました。⇒ファンクションの名前(com.sun.star.ui.dialogs.FolderPicker)さえ判れば、ググルのは簡単でした。
公開版(いつになるかわかりませんが・・・)に向けて
- Calcシート上に配置したボタンでマクロを起動するのでなく、ダイヤログウィンドウ(GUIパネル)にボタンを配置させる方法も判って、公開版ではなんとか実現したいと思っているんだが、バー表示やメニュー表示させることは簡単ではないらしく、タブ表示はそもそも出来ないかもしれない。これをやろうとすると、ダイヤログ表示でなくフォームコントロールを使うことになるんだろうが、こちらが今ひとつ判っていない。
- 起動時にCalcシートを表示させるのでなく、ダイヤログウィンドウを表示させる方法?もあるみたいだが、調べきれていない。
- やっつけで作成したbasicマクロなので、共通部分をすっきりファンクション、モジュール化しなくては・・・