2005年12月19日

SolidWorks API「実行速度の比較」

SolidWorks2006がリリースされて数ヶ月が経過しました。
皆さん新機能使いこなせるようになりましたか?

新機能も重要なのですが既存機能の処理能力を確認するために
SolidWorks2004、SolidWorks2005、SolidWorks2006
での実行速度を比較してみることにしました。

今回は以下の処理を行うマクロを作成しました。
1.Partsファイル新規作成
2.正方形スケッチを作成
3.押し出し
4.2~3を100回繰り返し

サンプルマクロはこちらから...

このサンプルでは出来るだけ描画に影響されないように作成しました。
具体的には
・スケッチ描画を行わない
・ビュー更新時の動画を行わない
が設定されています。

また、マクロ実行時にはSolidWorks上にファイル(図面・部品・アセンブリ)が開かれていない状態で行いました。
動作環境は以下の通りです。

【実行環境】
OSWindowsXP Pro SP2
CPUPentium4 2.4GHz
Memory1GByte

【SolidWorksのバージョン】
SolidWorks2004SP5.0
SolidWorks2005SP5.0
SolidWorks2006SP2.0


計測結果は以下のようになりました。

【100個の押し出し作成時間(秒)】

SolidWorks2004SolidWorks2005SolidWorks2006
1回目12.96913.67211.828
2回目 4.984 6.563 6.859
3回目 5.172 6.656 6.828
4回目 4.859 6.531 6.797
5回目 4.859 6.656 6.938
平均4.96856.60156.8555
注)1回目と2回目以降で作成時間がだいぶ異なりますので平均値は2回目以降で求めています。

SolidWorks2004との互換性で上記計測結果は
SelectByID および FeatureExtrusion を使用しましたが
SolidWorks2005とSolidWorks2006では
SelectByID2 および FeatureExtrusion2 が提供されています。

こちらを使用した計測結果は以下のようになりました。

【100個の押し出し作成時間(秒)】

SolidWorks2005SolidWorks2006
1回目13.34412.250
2回目 6.438 6.922
3回目 6.500 6.984
4回目 6.469 7.031
5回目 6.547 7.000
平均6.48856.98425

皆さんの環境ではどのようになりましたでしょうか?
マクロ実行前の予想では
SolidWorks2006>SolidWorks2005>SolidWorks2004
速い<------------------------------------------------> 遅い
と想定していましたが正反対の結果となりました。

また、SolidWorks2006でSelectByID2 および FeatureExtrusion2を使用した結果が
SelectByID および FeatureExtrusionを使用した結果より若干遅くなっているのも以外でした。
(計測誤差の範囲ですが・・・)

投稿者 Tsuda : 21:00 | コメント (0) | トラックバック

2005年08月11日

SolidWorks API「視点の切り替え」

今回は視点の切り替えについて考えてみましょう

SolidWorksは標準で「正面」「平面」「右側面」の3平面を持っています。
各平面と座標系との関係は
正面:XY座標
平面:XZ座標
右側面:YZ座標
となっています。

ここまで読んで「あれっ、ちょっとおかしいな」と思った方はいますでしょうか?

自分の目線で形状を考えた場合、正面とは形状を前から見るのでXZ座標に、平面(上面)は形状を上から見るのでXY座標になるのではないかと考えました。

そう考えるとSolidWorksの正面と平面は逆になりますので、今回は正面と上面の表示を行うためのマクロを作成してみましょう。
まずサンプルマクロを取得/実行してください。こちらから...

処理は至って単純で
正面ボタンを押したときはXXXを使用して平面ビューを
上面ボタンを押したときはXXXを使用して正面ビューを
呼び出しているだけです。

これだけではおもしろくないので別の方法で画面切替を行ってみましょう。

以下のコードを UserForm1 に追加してください

Private Sub View_Change()
Dim Xform As SldWorks.MathTransform
Dim data As Variant
Set Xform = swModel.ActiveView().Orientation3
data = Xform.ArrayData
data(0) = 1#
data(1) = 0#
data(2) = 0#
data(3) = 0#
data(4) = 1#
data(5) = 0#
data(6) = 0#
data(7) = 0#
data(8) = 1#
Xform.ArrayData = data
swModel.ActiveView().Orientation3 = Xform
swModel.ViewZoomtofit2
End Sub

次に上面ボタンの処理を変更してみましょう。
CommandButton1_Click内の処理を上記関数呼び出しに変更します。


Private Sub CommandButton1_Click()
View_Change
' swModel.ShowNamedView2 "*正面", 1
End Sub

修正したら実行してみましょう。
どうでした?修正前と同じように動作しましたか?

正面ボタンの処理も修正します。
CommandButton1_Click内の処理を上記関数呼び出しに変更します


Private Sub CommandButton2_Click()
View_Change
swModel.ViewRotXPlusNinety
' swModel.ShowNamedView2 "*底面", 6
' swModel.ViewZoomtofit2
End Sub

View_Changeの処理は必ずXY平面を画面に表示するため
ViewRotXPlusNinetyでX軸を回転させてXZ平面を画面に表示させます。

ではまた!

投稿者 Tsuda : 18:18 | コメント (0) | トラックバック

2005年07月21日

SW API「指定点と自由曲面との交点を求める その2」

前回の「指定点と自由曲面との交点を求める」の続きを今回も行います。

前回のサンプルで使用した部品ファイル(surface.sldprt)を開き、3Dスケッチの座標値をX:-50,Y:-55,Z:50mmに変更してください。
変更できない方はこちらから修正した部品ファイルをダウンロードしてください。

この形状を元に前回作成したマクロを実行してみましょう。
実行前に3Dスケッチとサーフェスを選択状態にしてください。
なお、マクロ実行時にUserForm1のダイアログまたはプログラムをカレントにしてから実行してください。

どうですか?
XY平面(正面)から見ると3Dスケッチはサーフェスの外側にあるのに交点が求められたのが確認できたでしょうか。

今回は自由曲面との交点を求めるのが目的ですので実際にはサーフェスが存在しない場所の交点を求めてしまうと困ってしまいます。
そこで、前回のマクロに処理を追加してみましょう。

1.求めた交点と選択曲面との距離を求める
  API:Face::GetClosestPointOn

上記処理を追加したマクロのダウンロードはこちらから

実際の処理は以下のようになります


vCrossPointArray = swFace.GetClosestPointOn(vPointArray(i+0),vPointArray(i+1),vPointArray(i+2))
XLen = vCrossPointArray(0) - vPointArray(i + 0)
YLen = vCrossPointArray(1) - vPointArray(i + 1)
ZLen = vCrossPointArray(2) - vPointArray(i + 2)
GetLength = Sqr((XLen * XLen) + (YLen * YLen) + (ZLen * ZLen))

If GetLength < 0.00000001 Then
Set swSketchPt = swModel.CreatePoint2(vPointArray(i+0),vPointArray(i+1),vPointArray(i+2))
End If

現状ではGetLengthの値が1.0e-8未満の時は求めた点が曲面上であるとの判定を行っていますが、必要な精度に応じて値を変更してみればよいでしょう。

投稿者 Tsuda : 16:19 | コメント (0) | トラックバック

2005年05月26日

SW API「指定点と自由曲面との交点を求める」

SolidWorksの標準機能にはないんだけどAPIを使用したら出来ないかな?
と思うような機能を作っていきます。
特に断りがない場合SolidWorks2005上で動作することとします。

今回のお題目は
「指定点と自由曲面との交点を求める」

SolidWorksの「測定」で「点」と「自由曲面」を与えると自由曲面との最短点との距離を求めることが出来ます。
でも、点をある方向に投影させて自由曲面との交点を求める事は出来ないの?
と考えたのが今回の「お題目」のきっかけでした。

イメージ 1

測定を実行したときの結果


今回は交点の求め方がメインなので投影する方向はZ方向に固定して考えています。
ではどのような手順で実現することが出来るか考えてみましょう。

1.選択点を通る直線を作成する。
  必ず曲面との交点を求めるために直線の始点Zを-1m、終点Zを+1mとします。
  API:Modeler::CreateLine
2.直線のB-Splineデータを取得
  API:Curve::ConvertLineToBCurve
3.B-SplineデータからB-Spline Curveを作成
  API:Modeler::CreateBsplineCurve
4.B-Spline Curveと選択曲面から交点を取得
  API:Surface::IntersectCurve

曲面との交点を求めるために1から3の手順でB-Spline Curveを作成します。
(他に簡単な手順で作成する方法があるかもしれません・・・)

サンプルマクロでは上記処理を実行するために
フォーム上にボタン一つの単純なダイアログを用意しました。
サンプルのダウンロードはこちらから

ボタン押下で処理が実行します。
ボタン押下前に必ず点と曲面を選択状態にしてください。

イメージ 1

実行結果

ちなみにSolid Bodyに対しては RayIntersections で求める事が出来ます。


次回も点と曲面の交点を求める方法について考えてみます

投稿者 Tsuda : 18:26 | コメント (0) | トラックバック