OpenCASCADE 6.9.0 を Debian でビルド

先月の12日にリリースされた Open CASCADE の 6.9.0 をビルドしました。公式のロードマップでは 6.x 系列は 6.8 が最後で、次は 7.0 になるとの話だったはずですが、何だかんだで 6.9 がリリースされた模様

v6.9 のリリースノートを読んではいましたが、ここのところ忙しくて対応ができなかったので出遅れてしまいました。

ここ数バージョンは、ビルドの仕方マニュアルがいろいろと整備されてきて、時代に合わせてなのか、ビルド環境ごとの Markdown なドキュメントも付属しています。このブログで改めて紹介する必要性もあまりなくなってきました。詳しい内容は公式ドキュメントに任せるとして、要点だけかい摘まんで紹介したいと思います。

公式ドキュメンテーション

v6.9.0 の内容は次のドキュメントで網羅されています。

v6.9.0 のリファレンスマニュアルは、ソースコード tar ボールや Windows インストーラー内に同梱されています。最も最新バージョン(開発版)のリファレンスマニュアルであればこちらで参照できます。

v6.9.0 リリースの要点

モデリング・アルゴリズム

ファジー ブール演算

これまでのバージョンでは、ソリッドモデル等で行うブール演算時に対象と対象がちょうど同一の位置にある面や線を共有して存在していた場合、意図した演算結果にならない事が多くありました。意図した結果にならない場合はまだ良かったんですが、いつまで経っても計算が帰ってこない、または例外を吐いてお亡くなりになるケースもありました。この点が改善されているようです。

複数の引数を取るブール演算

これまでのブール演算では TopoDS_Shape を二つ用いて、Fuse, Common, Cut 等の演算を実行していました。あんまり詳しく見てませんが、同時に複数の TopoDS_Shape を演算させることができるようになるようです。これまで数回の処理で書いていたものが一度にできるわけですが、複数のソリッド群の一つに reverse させたソリッドを混ぜて Common に投げて、結果的にその部分だけは Cut させる動作にするなど、より「ブーリアン」っぽい演算としてコーディングできるようになりそうです。

ビジュアライゼーション

選択処理を再設計して、より良いパフォーマンスに

OCCT のビジュアライゼーションは長いことほったらかしになっていた様子で、ちょっと貧弱でした。これは、あくまでも OCCT は三次元幾何演算とトポロジックな形状の演算がメインであり、代替ライブラリーを用いて解決できるビジュアライゼーションは二の次でも大丈夫!という背景もあります。 実際、OCCT を採用している有名なオープンソース三次元 CAD ソフトの FreeCAD は、OCCT 提供のビジュアライゼーションを使用せずに別のライブラリで三次元ビューを提供しています。 ただ、ここ数バージョンでは、前述の幾何を扱うことろがだいぶ安定してきたのか、二の次だったビジュライゼーションが次々と強化されており、パフォーマンスも改善しています。まだ実験的な印象ではあるものの、レイトレーシングレンダリングの採用、GLSLシェーダが読み込めるようになっていることなど、単なる計算ライブラリから本当に「CAD」として必要な機能の強化が見てとれます。 後述する VTK の採用も注目すべき点です。

OpenGL ES 2.0 互換

ビジュアライゼーションの改良の特記すべきもう一つの点は、iOS, Android などのモバイル端末への対応です。OpenGL ES はモバイル端末向けの OpenGL のサブセットです。OCCT の幾何ライブラリの部分は、早い段階から Android にも移植されて動作していましたが、ビジュアライゼーションはそのままではビルドできませんでした。ES 互換となることにより、これらの環境へもシームレスな移植が可能となりそうです。

シェイプを表示する際の三角形メッシュ化の制御

コンテキストにシェイプを追加する際、これまでは必要に応じて自動的にシェイプの描画データである三角形メッシュを内部で生成していました。これを外側から無効にするオプションが導入されたようです。 形状の変形はなく、大量のシェイプを回転させるだけでも再三角形メッシュ化が走って表示速度が落ちていましたが、それらを動的に制御することができそうです。(※回転も行列演算している意味では変形(トランスフォーメーション)ですが、自由曲面の式まで遡って、形状の三角形メッシュを再構築する必要すらない場合も往々にあります)

その他

Intel TBB ライブラリを使わない並列処理のサポート

こちらも詳しく追っていませんが、自前で並列処理を行う環境が整いつつあるようです。

サンプルに AndroidQt, JniViewer for Android が追加

Android 環境のサンプルも充実してきました。

JniViewer

JniViewer for Android

AndroidQt

GUI は QML を使って書いてあるみたいです。本当に WPF/.NET Framework なんて使ってる場合じゃないです。

AndroidQt

その他のサンプルに、Qtデスクトップ版、MFC、C# があります。C# では WPF ベースのものと System.Windows.Forms 版があり、今のご時世でいうと半ばどうでもいいですが、Direct3D デモも追加されています。

v6.9.0 の全体的な感想

幾何演算部分の改良は喜ばしい限りで、ビジュアライゼーションの強化も頑張ってほしいところです。ようやくモバイル端末のサポートも視野に入れてきているようですが、個人的にはいっそのこと三次元ビューアは WebGL 環境へシフトしていくのもアリなんじゃないかなぁと考えています。OCCT をサーバ上で並列処理させて、クライアントの WWW ブラウザ上で表現する…素晴しいじゃないですか。最近は NW.js (Node.js + Webkit)のようなツールキットも存在しますので、ライトウェイトなビューアーからワークステーションで動かす CAD まで環境に依存しないビジュアライゼーション機能になっていけばいいな、と思っています。え?お前が Context や Viewer, View を JavaScript で再実装しろって?それが仕事になればいいんだけどなぁ…;)

v.6.9.0 のビルド

ビルド方法は次のドキュメントに詳しく書いてあります。

なお、このドキュメントはソースコード tar ボールを解凍して生成されるdoxディレクトリ以下に markdown ファイルとして収録されています。(逆に言うと、上記の HTML はそれらのファイルを doxygen にかけたものと思います。)

ビルド環境

OCCT のビルド環境もかなり充実してきており、以前のようにチューニングしながらあれやこれやする必要もほとんどなくなりました。公式サポートしているのは次の環境です。

  • Automake
  • CMake
  • CMake + ADT (Android SDK)
  • Code::Blocks (Mac OSX)
  • Xcode (Mac OSX)
  • Microsoft Visual C++ (Windows)

また、パフォーマンスチューニングレポートでは Linux 版の Clang/LLVM でも検証されているようです。

今回は一番馴染みがある Automake でいきたいと思います。

ビルド手順

作業ディレクトリに入り、tar ボールを落としてきます。ソースコードは前バージョンまではユーザー登録&ログインしないとアクセスできなかった気がしますが、今回から下記の URL で落とせるようです。なお、git での clone は登録が必須です。

cd /tmp
wget http://files.opencascade.com/OCCT/OCC_6.9.0_release/opencascade-6.9.0.tgz

解凍してディレクトリにはいります。

tar zxvf opencascade-6.9.0.tgz
cd opencascade-6.9.0/

configue をビルドして configure します。オプションについては後述します。

./build_configure
./configure -prefix=/opt/occ690 \
-with-vtk-include=/usr/include/vtk-6.1 \
-with-vtk-library=/usr/lib/i386-linux-gnu/

make して install します。

sudo make -j2 install

とりあえずこれだけです。便利。

貧弱な自宅サーバ(Debian GNU/Linux、32bit環境、Intel Atom)では、make で

real    183m57.121s
user    336m24.168s
sys     16m36.896s

となりました。

configue オプション

-prefix=

最終的にビルドしたファイルをインストールする場所です。自分は /opt/occ690 に指定しています。

-with--include=, -with--library=

ヘッダのインクルードパスとライブラリパスを追記しています。VTK が見えてなかったようなので、明示的に指定しました。

その他のオプションはこちらを参考にしてください。

ビルド時のテクニック

configure では、ビルドする環境にインストールされているライブラリの有無によって OCCT のモジュールとよばれるライブラリ群の Makefile を生成します。

モジュール > ツールキット > パッケージ > クラスや列挙型など

OCCT は上記のように階層構造を持ったライブラリです。ツールキットの部分が共有ライブラリファイル(.so)に当たります。Windows ではダイナミックリンクライブラリ(.dll)になります。モジュールはそれらをまとめて用途別にグループにしたものだと思ってください。

モジュールには次のものがあります。

  • FoundationClasses … 共通関数などを提供
  • ModelingData … 幾何形状をデータとして表現する機能
  • ModelingAlgorithms … 幾何形状を構築する機能
  • Visualization … 幾何形状を画面に描画する機能
  • ApplicationFramework … OCCT を使ったアプリのための有用な機能
  • DataExchange … 幾何データファイルのサポート(IGES,STEP,STLなど)
  • Draw … テスト環境

ざっくりと説明すると上に行くほど依存関係が少なくてすみます。詳細な依存関係はリファレンスマニュアルの図のとおりです。

occt modules

さらに、個々のモジュール内のツールキットの中で依存関係があります。なお、IGES などのデータファイルをサポートするには、GUI が必要がない場合でもビジュアライゼーションやアプリケーションフレームワークの各ツールキットを全て背負い込まなければならないかというと、実はそうではありません。具体的にはモジュール同士の依存関係の奥にはツールキット同士の依存関係があり、それを満たしていればこの図の限りではありません。今のところ、モジュールを越えた関係図はないので、リファレンスマニュアルを見て何が必要なのかを調べる必要があります。

さて、ビジュアライゼーション以下のモジュールは、さらに多くの別の人(サードパーティ)が開発しているグラフィック系のライブラリに依存しています。

そのため、グラフィック系のライブラリがない環境で configue すると、ビジュアライゼーション以下のモジュールが無効になった Makefile が生成されます。

configure の出力に各モジュール名と Yes/No といった表示が出力されるので、それでモジュールが有効になっているか無効になっているか、無効の場合はどのライブラリが足りていないのかを表示してくれます。以下に私の環境の configure 出力を示します。

3rdparty mandatory products       
---------------------------------
freetype      : yes 
tcltk         : yes 

3rdparty optional products       
---------------------------------
gl2ps         : no (--with-gl2ps=DIR option was not defined)
freeimage     : no (--with-freeimage=DIR option was not defined)
tbb includes  : no (--with-tbb-include=DIR option was not defined)
tbb libraries : no (--with-tbb-library=DIR option was not defined)
opencl        : no 
qt            : no (--with-qt=DIR option was not defined)
vtk           : yes 

Component                   Build
--------------------------  -----
FoundationClasses           yes 
ModelingData                yes 
ModelingAlgorithms          yes 
Visualization               yes 
ApplicationFramework        yes 
DataExchange                yes 
Draw                        yes 

「3rdparty mandatory products」は必須ライブラリ、「optional」は指定があったら使うライブラリです。必要なライブラリとそのバージョンは、以下にまとめてあります。

Open CASCADE Technology: Overview

Debian GNU/Linux jessie 32bit 版では、すべてのサードパーティ・ライブラリを標準リポジトリからインストールすることができました。(ソースコードの取得とビルドは不要)

また、テスト環境である Draw や Qt のサンプルプロジェクトをビルドする必要がなければ、 Tcl/Tk や Qt のインストールは必要ありません。 上記の「mondatory products」に Tcl/Tk が入っているのは、すべてのモジュールをビルドする際に必須、という意味だと思います。

siren をビルド

OCCT を使った siren というソフトを作ってます。OCCT が提供する三次元幾何演算機能を Ruby で簡単に記述することができ、ちょっとした演算なら手軽にすることができます。

上記でビルドした OCCT 6.9.0 を使って siren の最新リビジョン(OCCT6.8.0ベースで記述)をビルドし直してみると、あっけなくビルドが通りました。クラス名が変更されたり、siren で使っている機能が変更されることがなかったようです。

ひとまず安心しました。


ufwを使ったファイアウォール設定

ufw コマンドは、複雑な設定を要する iptables を直接操作することなく、簡単な操作だけでファイアウォールの設定を行うことができる便利なコマンドです。 以下、簡単な操作のはずなのに、設定するたびに忘れる私のダメな脳味噌のための備忘録です。

  • ポートを許可する、制限する

    ufw allow 1234
    ufw allow 1234/TCP
    ufw denny 1234
    
  • ファイアウォールを有効、無効にする

    ufw enable
    ufw disable
    
  • 現在の設定状況を調べる

    ufw status
    

※ ちなみに、設定方法から設定例まで man ページに丁寧に書いてあります。

1979年のOS『Version 7 UNIX』を使う

Version 7 UNIXとは、DECのPDP-11で動いていたUNIXです。AT&Tベル研究所製の初期のUNIXシリーズの直系のバージョンで、1979年にリリースされました。

V7は現在、フリーソフトウェアとして公開されており、こちらからブートイメージを入手することができます。また、x86への移植活動もあり、VM用のディスクイメージが公開されていたりします。

古いUNIXを触ってみたくなったので、古いハードウェアをシミュレートしてくれるエミュレータ simh を導入して遊んでみることにしました。

下準備

まずは必要なものを揃えます。simh は、dpkg系のパッケージ管理システムを採用しているディストリビューション上で次のようにしてインストールします。

[bash]$ sudo aptitude install simh[/bash]

次に、V7のイメージをダウンロードし、解凍しておきます。

[bash]
$ mkdir /tmp/v7
$ cd /tmp/v7
$ wget http://ftp.fibranet.cat/UnixArchive/PDP-11/Boot_Images/v7_rl02_1145.gz
$ gunzip v7_r102_1145.gz
$ ls
v7_rl02_1145
$
[/bash]

設定

V7用の設定ファイルを書きます。

[bash]
$ cat > uv7
set cpu 11/45
set rl0 RL02
att rl0 v7_rl02_1145
set rl1 RL02
att rl1 rl1.dsk
att tm0 tm0.tap
boot rl0
$
[/bash]

4行目の最後のカラムに書いている「v7_r102_1145」は、ダウンロードして解凍したV7のディスクイメージです。

実行

さっそく実行してみます。ホスト側とゲスト側を区別する為、ホスト側には「host$」プロンプトを用います。

[bash]
host$ pdp11 uv7

PDP-11 simulator V3.8-1
Disabling XQ
Overwrite last track? [N]
@
[/bash]

最後のトラックを上書きするか?と聞かれましたが、とりあえず標準の「N」と答えておきました。この「@」プロンプトの場面はきっとPDP-11の組込みブートローダなんでしょう。ブートします。

[bash]
@boot
New Boot, known devices are hp ht rk rl rp tm vt
:
[/bash]

ブートデバイスを聞いてきますので、次のように入力します。

[bash]
rl(0,0)rl2unix
mem = 177856
#
[/bash]

プロンプトが「#」に変更され、シングルユーザモードでV7が使えるようになりました。ここで、C-dをタイプしてマルチユーザモードに移行します。

[bash]
Restricted rights: Use, duplication, or disclosure
is subject to restrictions stated in your contract with
Western Electric Company, Inc.
Thu Sep 22 05:50:55 EDT 1988

login:
[/bash]

見慣れたログイン画面が登場しました。とりあえずrootでログインします。パスワードは「root」です。

[bash]
login: root
Password:
You have mail.
#
[/bash]

無事、ログインすることができました。

シェルの使い方

[bash]

stty

speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
[/bash]

sttyコマンドを実行してみると、古いUNIX入門の本にあるように、訂正は「#」記号、破棄は「@」記号にバインドされているようです。
バックスペースなどはかなり基本的な画面制御文字だと思うんですが、テレタイプ端末も現役で動いていた当時の事情を考えると、ビデオ表示端末のような書き換え可能な表示媒体をもつデバイスにしかできない「バックスペース」ではなく、より多くのデバイスに可能な「#」による訂正の方が都合が良かったんでしょう。
実際にタイプした文字を訂正するには、以下のようにします。

[bash]
la#s
[/bash]

これは「ls」を間違って「la」とタイプしてしまったので、「#」で直前の1文字を訂正して、正しい「s」をタイプしたところです。「la#s」でシェルには「ls」と解釈されます。また、

[bash]
pqd##wd
[/bash]

「pwd」を「pqd」とタイポした場合、「##」で2文字訂正して、正しい「wd」をタイプすることにより、「pwd」と解釈されています。

現在の入力を全て破棄するには、

[bash]asdf@[/bash]

のように、「@」記号を用いれば破棄されて新しいプロンプトに移ります。

終了

haltもshutdownコマンドも入っていない為、simh側から終了させます。ファイルシステムに変更を加えた場合、デバイスとの同期をとるためにsyncコマンドを打ちます。

[bash]# sync;sync;sync[bash]

次に、C-eをタイプしてsimhのコンソールに移行します。

[bash]
Simulation stopped, PC: 002306 (MOV (SP)+,177776)
sim> exit
Goodbye
host$
[/bash]

ここで、「exit」とタイプすると終了することができます。

man pageを見れるようにする

初期状態では/tmpが存在しない為、manページを表示しようとすると次のように怒られます。

[bash]

man sh

Cannot create temp file.
[/bash]

そこで、/tmpを作成しておきましょう。

[bash]

mkdir /tmp

chmod 777 /tmp

man sh

[/bash]

これでmanページが見れるようになりますが、ページャが入っていません。やはりビデオ表示端末向けのツールは、まだ充実していないようですね。

ユーザの追加

初期状態では、ユーザ情報は次のとおりになっています。

[bash]

cat /etc/passwd

root:VwL97VCAx1Qhs:0:1::/:
daemon:x:1:1::/:
sys::2:2::/usr/sys:
bin::3:3::/bin:
uucp::4:4::/usr/lib/uucp:/usr/lib/uucico
dmr::7:3::/usr/dmr:
[/bash]

シャドウ・パスワードが登場する前なので、/etc/passwdに素直に(ハッシュ化された)パスワードが記載されていますね。7行目の「dmr」というユーザ名は、先日逝去されたUNIXの開発者デニス・リッチー博士の愛称です。実際に運用されていた頃からデフォルトで入っていたのかもしれませんが、そうでなくとも、フリーソフトとして公開される際に、彼に敬意を称して追加されたのかもしれません。

[bash]

echo dyama::8:3::/usr/dyama: >> /etc/passwd

[/bash]

畏れ大くも、dmr博士の次にアカウントを追加してみました。さらにホームディレクトリも設定します。

[bash]

cd /usr

mkdir dyama

chown dyama dyama

ls -l

total 11
drwxrwxr-x 3 bin 128 Sep 22 05:45 dict
drwxrwxr-x 2 dyama 32 Sep 22 06:18 dyama
drwxrwxr-x 5 bin 416 Sep 22 05:46 games
drwxrwxr-x 3 sys 496 Sep 22 05:42 include
drwxrwxr-x10 bin 528 Sep 22 05:43 lib
drwxrwxr-x11 bin 176 Sep 22 05:45 man
drwxrwxr-x 3 bin 208 Sep 22 05:46 mdec
drwxrwxr-x 2 bin 80 Sep 22 05:46 pub
drwxrwxr-x 6 root 96 Sep 22 05:45 spool
drwxrwxr-x13 root 208 Sep 22 05:42 src
#
[/bash]

当時のファイルシステム階層では、ユーザのホームディレクトリは/homeではなく、名前のとおり/usrに格納されていたと古い本で読みました。慣例に習って設置しました。

一度、C-dをタイプしてログアウトします。

[bash]
#
login: dyama
$
[/bash]

「login:」と出てきたので、先ほど追加したユーザ名「dyama」をタイプします。パスワードを設定していない為、聞かれることなく一般ユーザプロンプト「$」が表示されました。
エミュレータ上のアカウントなのでこのままでもいいんですが、とりあえずパスワードを設定します。

[bash]
$ passwd
Changing password for dyama
New password:
Retype new password:
[/bash]

これでパスワードが変更されたはずです。試しに「hogehoge」と入力しています。

[bash]
$ su
Password:

cat /etc/passwd | grep dyama

dyama:7N.C0KCSdg3aI:8:3::/usr/dyama:
#
[/bash]

パスワードカラムに、ハッシュ化されたパスワード文字列が追加されたことが分かります。

Cプログラムを書いてみる

ccが入っていますので、C言語でプログラムを組むこともできます。ビジュアル・エディターが入っていない為、catコマンドで標準入力からダイレクトにファイルを書いていきたいと思います。

先に述べましたとおり「#」記号が訂正にバインドされているので、まずは#を正しく入力できるように設定を変更してあげます。

[bash]
$ stty erase ?
$ stty
speed 300 baud
erase = ‘?’; kill = ‘@’
even odd -nl echo -tabs
$
[/bash]

sttyコマンドで訂正を「#」から「?」に変更しました。続いてコーディングです。

[bash]
$ cat > test.c

include <stdio.h>

int main()
{
printf("hello, world\n");
return 0;
}
$ cat test.c

include <stdio.h>

int main()
{
printf("hello, world\n");
return 0;
}
[/bash]

コーディングができたら、catで確認してみてください。訂正が「?」になっていれば、プリプロセッサの「#include」は正しく入力できているはずです。

[bash]
$ stty erase #
$ stty
speed 300 baud
erase = ‘#’; kill = ‘@’
even odd -nl echo -tabs
[/bash]

忘れないうちに訂正を「#」に戻しておきます。
あとは、ccコマンドでコンパイルを行なって出力されたファイルを実行します。

[bash]
$ cc test.c
$ ls
a.out
test.c
$ ./a.out
hello, world
$
[/bash]

上記のように「hello, world」が表示されたら成功です。