2016/08/11
PHPでSTL形式のデータから体積を算出する方法
今回はPHPでSTL形式のデータから体積を算出するにはどうすればいいかを解説したいと思います。
あくまで私が色々調べてたどり着いた手段なので、もしかしたら他にもっといい方法があるかもしれません。
その点はご了承いただきたいと思います。
STL形式とは
米国3D Systems社によって開発された三次元CADソフト用のファイルフォーマットです。
プレーンテキストで記述されたアスキーSTL形式と、バイナリSTL形式があります。
どちらのファイル形式でも保持する情報は同じですが、アスキーSTL形式の方が可読性が高い分、データ量が多くなってしまうという特徴があります。
STLファイルビューワでサンプルデータの体積を確認
STLファイルの体積計算を行うにあたりサンプルデータを使用します。
今回はサンプルデータがどのような形の3Dデータで体積はいくらかを確認するのにSTLファイルビューワというフリーソフトを使用しました。
下記からダウンロードできます。
http://www.hiramine.com/software/hirastlviewer/
ダウンロードして回答したフォルダの中にsampleというフォルダがあると思います。
その中のcube-ascii.stlというファイルを使用しました。
HiraStlViewer.exeをダブルクリックして起動します。
するとアプリが立ち上がりますので「ファイル⇒インポート」でcube-ascii.stlを読み込みます。
そして「解析⇒体積計算」で体積が確認できます。
体積は1000.0000となっています。
PHPからサンプルデータの体積を算出する
さていよいよ本題に入ります。
PHPには標準関数が沢山用意されていますが、STL形式のファイルを解析するようなものは存在しないようです。
無料のPHPライブラリも探してみましたが見付ける事が出来ませんでした。
ならばPHPでなくても何かコマンドラインから扱えるプログラムはないかなと探していたところADMeshというプログラムを見付けました。
http://www.varlog.com/admesh-htm
これを使ってPHPからexecコマンドで呼ぶ形で実装していきます。
まずはプログラムをダウンロードし、Linux上に配置します。
そして解凍します。
tar -xvzf admesh-0.95.tar.gz
解凍して出来たフォルダの中に移動します。
cd admesh-0.95
コンパイルします。
./configure make
出来たプログラムからサンプルデータを読み込んで解析します。
admesh-0.95/admesh cube-ascii.stl
すると以下のような出力がありました。
ADMesh version 0.95, Copyright (C) 1995, 1996 Anthony D. Martin ADMesh comes with NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. Opening cube-ascii.stl Checking exact... All facets connected. No nearby check necessary. No unconnected need to be removed. No holes need to be filled. Checking normal directions... Checking normal values... Calculating volume... Verifying neighbors... ================= Results produced by ADMesh version 0.95 ================ Input file : cube-ascii.stl File type : ASCII STL file Header : solid cube-ascii ============== Size ============== Min X = 40.000000, Max X = 50.000000 Min Y = 40.000000, Max Y = 50.000000 Min Z = 40.000000, Max Z = 50.000000 ========= Facet Status ========== Original ============ Final ==== Number of facets : 12 12 Facets with 1 disconnected edge : 0 0 Facets with 2 disconnected edges : 0 0 Facets with 3 disconnected edges : 0 0 Total disconnected facets : 0 0 === Processing Statistics === ===== Other Statistics ===== Number of parts : 1 Volume : 1000.000061 Degenerate facets : 0 Edges fixed : 0 Facets removed : 0 Facets added : 0 Facets reversed : 0 Backwards edges : 0 Normals fixed : 0
28行目にOther Statisticsとありますね。
つまり29行目のVolumeの値が体積の計算結果を表しています。
それではPHPからプログラムを実行し結果を抽出してみます。
<?php exec("admesh-0.95/admesh cube-ascii.stl",$output); if(preg_match("/\s(\d+\.\d+)$/",$output[28],$matches)){ echo ($matches[1]); } ?>
PHPのexecコマンドで実行すると$outputという変数のインデックス番号28に先ほどの29行目の文字列が入ってきます。
そこで小数の部分を抽出した値が以下になります。
1000.000061
小数点5桁目以降も表示されていますが、今回はそこまでの精度は求めていないのでこれで良しとしました。
PHPでSTL形式のデータから体積を算出する方法についてはWEB上に殆ど情報がないので参考になれば幸いです。
それではまた。
コーディング業務のご依頼、ご相談の詳細についてはこちらから
最後までお読みいただき、ありがとうございました。
よろしければシェアしていただければ幸いです。
次の記事へ | 前の記事へ |
WEB業界ならqam!qam(カム)はWEB業界で働く人や興味がある人に役立つ情報サイトです。
マーケティングやデザイン、マークアップ(コーディング)、プログラム、トレンドなどの情報をqamライター陣が執筆。噛めば噛むほど(読めば読むほど)制作・開発や運営・運用、業界知識やノウハウを学ぶことができます。