Home > Archives > 2009-07
2009-07
猫ウィンドウクラスを作る(1)
- 2009-07-26 (日)
- 技術
●猫ウィンドウクラスを作る
前回までで,猫型ウィンドウを表示することができました.書き散らかしたコードによる機能をまとめると,
- ウィンドウ背景(猫以外の領域)を透過
- なんとなく徘徊
- タイマでアニメーション
といった感じです.
今回は,これらのコード(のうちのいくらか)を再利用できるように猫ウィンドウクラスを作成することにします.
さすがに業務アプリのウィンドウを黒猫にしたら怒られそうですが(←本当はやりたい),今後,猫アプリを作る際には,「猫がアニメーションする」という基本機能がクラス化されていると便利でしょう.
※「猫アプリなんてつくんねーよw」という雰囲気の職場ですが,さびしくなんてありません.
※それ以前に職場で猫ソフトを作っているという状況が(略
●猫ウィンドウクラスの機能
とりあえず機能を何でもかんでも詰め込んでしまうのも考えものなので,以下のような機能を有するものを目標とします.
- ウィンドウの生成と破棄
- ウィンドウは背景透過する(レイヤードウィンドウ)
- アニメーションの登録
- 表示するアニメーションの選択
- 選択中のアニメーションがタイマで勝手に表示される
- GUIとして右クリック時にポップアップメニューが出る
- 機能拡張用の仕組み
くらいで.
「徘徊」は猫アプリ次第で必要か否かが変わる要素でしょうから,このクラスには直接には含めないことにしました.
また,前回,マウスドラッグで猫を動かせるようにしていましたが,これも同様の理由で含めません.
(ポップアップメニューだって余計な要素に見えるかもしれませんが,「猫ウィンドウを閉じるのに最も自然な手段な気がする→自分が使うときは多分例外なく必ず使う→猫ウィンドウクラスは多分自分しか使わない」という推論から,猫ウィンドウがサポートすべき最低限の機能として採用.)
クラスの基本的な使い方としては,
- インスタンス作る
- アニメーションを必要な個数分だけ登録する
- ウィンドウ生成,表示
- 随時必要に応じて,登録しておいた中から,現在表示させるアニメーションを選択する
- ウィンドウ閉じる
といった感じになります.
- Comments (Close): 0
- Trackbacks (Close): 0
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ファイルなるものを作成してみた。
かぶってる面とか完全無視で記述したので、無駄なデータがかなりあるが、一応一般のビューア等で表示できる。
- Comments (Close): 0
- Trackbacks (Close): 0
Home > Archives > 2009-07