WEB業界で働く人や興味がある人に役立つ情報サイト“qam(カム)”

gucchi

2016/08/11

PHPでSTL形式のデータから体積を算出する方法

投稿者: gucchi
カテゴリー: プログラム >PHP

今回は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を読み込みます。

そして「解析⇒体積計算」で体積が確認できます。
Image 3
体積は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ライター陣が執筆。噛めば噛むほど(読めば読むほど)制作・開発や運営・運用、業界知識やノウハウを学ぶことができます。

トップへ