Home

アイエスエス株式会社 "Innovative System Solutions"

SolidWorks APIに関する検討 その2

■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画面キャプチャ)
ミサイルポッド(SolidWorks画面キャプチャ)
上図のSolidWorksモデルが、
こうなった。

ちなみにビューアは弊社の猫好きなプログラマが
作成した。

おまけ
上記と同じ手順で、世間でわりと使われているobjファイルなるものを作成してみた。
かぶってる面とか完全無視で記述したので、無駄なデータがかなりあるが、一応一般のビューア等で表示できる。

<download>missile
<download>4missile_pod

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にチャレンジしてみようか

Home

Search
Feeds
Authorized
奨学金支援制度
Meta

Return to page top