アイエスエス株式会社 "Innovative System Solutions"
SolidWorks APIに関する検討 その2
- 2009-07-26 (日)
- 技術
■Solid Works API その2 3次元データの取得
・3次元データの取得
せっかくモデルを作成したのだから、何かに使えないかと思ったのだが、
Solid Worksが保存できるファイル形式はどれも再利用が難しい。
で、いっそ3次元データを自分で取得、ファイル保存すればよいではないか、と。
そこで、再びマクロを使用することになった。
—VBA-Macro———————————————————————————————————
まずお約束の
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
色情報も保存するので
Dim vbaseColor As Variant
vbaseColor = swModel.MaterialPropertyValues
モデルの色情報を取得。
今回はソリッドボディ毎にデータを扱う。
ソリッドボディのデータはBodyFolderオブジェクトにあるらしい。
Dim swBodyFolder As BodyFolder
でBodyFolderオブジェクトを定義。
Dim nFeatNum As Long
nFeatNum = swModel.GetFeatureCount
Dim feat As Feature
Set feat = swModel.FirstFeature
フィーチャーの数、最初のフィーチャーを取得。
For i = 0 To nFeatNum – 1 Step 1
If feat.GetTypeName = “SolidBodyFolder” Then
Set swBodyFolder = feat.GetSpecificFeature2
IsBodyFolder = True
End If
Set feat = feat.GetNextFeature
Next i
フィーチャーを走査しながらタイプネームが”SolidBodyFolder”のものを探す。
で、GetSpecificFeature2でBodyFolderが取得できるらしい。
Dim nBodyCount As Long
Dim vBodies As Variant
nBodyCount = swBodyFolder.GetBodyCount
vBodies = swBodyFolder.GetBodies
BodyFolderからソリッドボディの数とボディデータをごっそり取得。
Dim fileNo As Integer
fileNo = FreeFile
Open “SaveFile” & “.i3d” For Output As #fileNo
次に保存用ファイルの準備。独自形式”.i3d”拡張子でファイルをオープンする。
Dim vBody As Variant
Dim swBody As Body2
Body2オブジェクトを定義。
For Each vBody In vBodies
Set swBody = vBody
Dim nFaceCount As Long
nFaceCount = swBody.GetFaceCount
Dim swFace As Face2
Set swFace = swBody.GetFirstFace
全ボディを走査しつつ、各ボディのフェイスを取得。
Dim faceColor As Variant
For i = 0 To nFaceCount – 1 Step 1
faceColor = swFace.MaterialPropertyValues
フェイスの色情報を取得。この後色情報を持っていたかをチェックして、
なかったらフェイスが属するフィーチャーの色、それもなかったらボディの色、
さらになかったら冒頭で取得した、モデルの色を使用する処理を行う。が、省略。
Print #fileNo, “MATERIAL “;
For j = 0 To 8 Step 1
Print #fileNo, faceColor(j);
If j <> 8 Then
Print #fileNo, “,”;
End If
Next
Print #fileNo, “”
色情報をファイルに書きこみ。
Dim vTri As Variant
vTri = swFace.GetTessTriangles(False)
Dim vNorm As Variant
vNorm = swFace.GetTessNorms
GetTessTrianglesで各面の頂点座標を、GetTessNormsで法線を取得できる。
上記色情報同様これらもファイルに書きこむ。
Set swFace = swFace.GetNextFace
次のフェイスを取得してループ先頭へ。
こんな調子で全フェイス分の色情報、頂点座標、法線データを取得、
ファイル書き込みを行い、モデルデータの独自形式ファイルを作成する。
Close #fileNo
最後にファイルを閉じる。
あとはどうとでも再利用できる。
以上。
上図のSolidWorksモデルが、
こうなった。
ちなみにビューアは弊社の猫好きなプログラマが
作成した。
おまけ
上記と同じ手順で、世間でわりと使われているobjファイルなるものを作成してみた。
かぶってる面とか完全無視で記述したので、無駄なデータがかなりあるが、一応一般のビューア等で表示できる。
ming+python+OpenCVで遊ぶ
まず手始めに,mingでランダムな絵を描いてみよう
#------------------------------------------------------------------------------- # Name: Test1 # Purpose: Testing ming with OpenCV&Python on Windows Vista SP2 # Author: T.Kamata # Created: 23/07/2009 # Copyright: (c) Innovative System Solutions 2009 # Licence: GPL #------------------------------------------------------------------------------- #!/usr/bin/env python from ming import * from opencv.cv import * from opencv.highgui import * from random import random def draw_noise(image_filename, width, height, N = 100): im = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3) cvZero(im) for i in range(N): x,y,r = map(lambda x: int(x*random())+1, [width-2, height-2,2]) color = CV_RGB(int(random()*255),int(random()*255),int(random()*255)) cvCircle(im, cvPoint(x,y), r, color, CV_FILLED) cvSaveImage(image_filename, im) del im def main(): import os WIDTH, HEIGHT = 400, 300 m = SWFMovie() m.setDimension(WIDTH, HEIGHT) m.setBackground(0, 0, 0) m.setRate(30.0) for i in range(10): jpg_file = "tmp%d.jpg" % i draw_noise(jpg_file, WIDTH, HEIGHT) b = SWFBitmap(jpg_file) m.add(b) m.nextFrame() m.save("test1.swf") if __name__ == '__main__': main()お絵描きするのに慣れているOpenCVを使って,1フレームの画像をjpegに保存し
SWFMovieにaddしてみた.
できたFlashムービー(SWF)は,こちら.
OpenCVの画像処理の模様をSWFにするにも,便利かもしれない.
次はインタラクティブなFlashにチャレンジしてみようか