仕事のカタマリにようこそ!  [ ログイン | ユーザ登録 ]
フォーラムから検索

機械用3D-CAD SolidWorks非公認のユーザサイトです
 
 
Web katamari.org
仕事のカタマリ
ホーム リンク集 ダウンロード フォーラム(掲示板) FAQ お問い合わせ









フォーラムニュース: 質問、相談カテゴリに「SolidWorks操作方法」に関するフォーラムを追加しました。(2003/11/27)
いらっしゃい、 ゲストさん. まずはこちら→ ログイン または 登録. 2024/04/28 - 12:53:16
ホーム ヘルプ 検索 ログイン 登録

仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: 法線の距離・・・ 前のトピック 次のトピック
ページ: [1] Page Bottom 返信 返信のお知らせ Print 
   著者  トピック: 法線の距離・・・  (閲覧数 3937 回)
psychic
Sr. メンバー
****

オフライン

投稿: 59



I'm a llama!

プロファイルを見る
法線の距離・・・
« 投稿日: 2011/09/25 - 18:33:29 »
引用して返信

こんにちは
いつもお世話になっております
ちょっとアドバイスいただきたいのですが、
アセンブリで二つのパーツの平行な面を二つ選択したとして
右下に法線の距離が平行なときは出ますよね
この数字って取得できないでしょうか?
ご存知の方見えましたらご教授ください
ちなみに2007です
よろしくお願いします
議長に報告する   記録済み
Makoron
カタマリの王様!?
*****

オフライン

投稿: 1277



SW2011SP5.0

プロファイルを見る
Re:法線の距離・・・
« 返信 #1 投稿日: 2011/09/27 - 09:12:11 »
引用して返信


SolidWorks2008のAPIからMeasureというオブジェクトが追加されています。
このオブジェクトを利用すると測定と同じような処理が行えるようです。

2007ではわかりません・・・。
議長に報告する   記録済み
psychic
Sr. メンバー
****

オフライン

投稿: 59



I'm a llama!

プロファイルを見る
Re:法線の距離・・・
« 返信 #2 投稿日: 2011/10/01 - 23:09:23 »
引用して返信

お返事ありがとうございます
2008からですか・・いよいよUPの時かなw
測定して測定値をコピーして、たらずまいをフィーチャで伸ばすだけの話ですが
それすらスピードアップしたいくらい忙しいとき・・
ありますよねw

ども ありがとうございました^^
議長に報告する   記録済み
hisa
カタマリの王様!?
*****

オフライン

投稿: 507



PANDA-Z!!

プロファイルを見る WWW
Re:法線の距離・・・
« 返信 #3 投稿日: 2011/10/06 - 17:50:13 »
引用して返信

Measureを使わないで法線の距離を導く方法を考えてみました

API HELPにあったGet Angle of Hole Not Normal to a Face Example (VB)を参考に、以下の様になりました。

Code:
Option Explicit

Const PI                    As Double = 3.14159265358979

Function Arccos(X As Double) As Double

    If Abs(1# - X) < 0.00000001 Then Arccos = PI / 2#: Exit Function
    Arccos = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

End Function

Sub main()

    Dim swApp                      As SldWorks.SldWorks
    Dim swModel                    As SldWorks.ModelDoc2
    Dim swSelMgr                    As SldWorks.SelectionMgr
    Dim swMathUtil                  As SldWorks.MathUtility
    Dim swNormalVector              As SldWorks.MathVector
    Dim swDistVector                As SldWorks.MathVector
    Dim swFace1                    As SldWorks.Face2
    Dim swFace2                    As SldWorks.Face2
    Dim swSurf1                    As SldWorks.Surface
    Dim swSurf2                    As SldWorks.Surface
    Dim swComp                      As SldWorks.Component2
    Dim vPoint1                    As Variant
    Dim vPoint2                    As Variant
    Dim vNormalPt1                  As Variant
    Dim vNormalPt2                  As Variant
    Dim nDist                      As Double
    Dim DistPt(2)                  As Double
    Dim vVector                    As Variant
    Dim Angle                      As Double
   
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelMgr = swModel.SelectionManager
    Set swMathUtil = swApp.GetMathUtility
   
    Set swFace1 = swSelMgr.GetSelectedObject5(1)
    Set swFace2 = swSelMgr.GetSelectedObject5(2)
    Set swSurf1 = swFace1.GetSurface
    Set swSurf2 = swFace2.GetSurface
   
    ' 2つの面の最短距離を取得
    nDist = swModel.ClosestDistance(swFace1, swFace2, vPoint1, vPoint2)
    ' 最短距離を示すそれぞれの点を結ぶ単位長ベクトルを生成
    DistPt(0) = vPoint1(0) - vPoint2(0)
    DistPt(1) = vPoint1(1) - vPoint2(1)
    DistPt(2) = vPoint1(2) - vPoint2(2)
    vVector = DistPt
    Set swDistVector = swMathUtil.CreateVector(vVector)
    Set swDistVector = swDistVector.Normalise
   
    ' 1つ目の面の法線方向を取得
    If swSurf1.IsPlane Then
        vNormalPt1 = swFace1.Normal
        ' 選択面が構成部品の面であれば、アセンブリ座標のベクトルに変換
        Set swComp = swSelMgr.GetSelectedObjectsComponent2(1)
        If Not (swComp Is Nothing) Then
            Set swNormalVector = swMathUtil.CreateVector(vNormalPt1)
            Set swNormalVector = swNormalVector.MultiplyTransform(swComp.Transform2)
            vNormalPt1 = swNormalVector.ArrayData
        End If
    End If
    ' 2つ目の面の法線方向を取得
    If swSurf2.IsPlane Then
        vNormalPt2 = swFace2.Normal
        ' 選択面が構成部品の面であれば、アセンブリ座標のベクトルに変換
        Set swComp = swSelMgr.GetSelectedObjectsComponent2(2)
        If Not (swComp Is Nothing) Then
            Set swNormalVector = swMathUtil.CreateVector(vNormalPt2)
            Set swNormalVector = swNormalVector.MultiplyTransform(swComp.Transform2)
            vNormalPt2 = swNormalVector.ArrayData
        End If
    End If
   
    ' 2つの面が平行か判断(微妙な誤差で平行にならない場合があったので数値を丸める)
    If Round(Abs(vNormalPt1(0)), 8) = Round(Abs(vNormalPt2(0)), 8) And Round(Abs(vNormalPt1(1)), 8) = Round(Abs(vNormalPt2(1)), 8) And Round(Abs(vNormalPt1(2)), 8) = Round(Abs(vNormalPt2(2)), 8) Then
        ' 1つ目の面の法線方向から単位長ベクトル生成
        Set swNormalVector = swMathUtil.CreateVector(vNormalPt1)
        ' 最短距離を示すベクトルと1つ目の面の法線ベクトルとで角度を計算
        Angle = Arccos(Abs(swDistVector.Dot(swNormalVector)))
        ' 最短距離と法線のベクトルが一致しない場合は、角度から法線方向の距離を算出(一致する場合は、ClosestDistanceの結果が法線の距離)
        If Angle <> PI / 2 Then
            nDist = nDist * Cos(Angle)
        End If
        ' 結果出力
        Debug.Print "法線の距離 : " & nDist * 1000
    End If
   
End Sub


ご参考まで

<追記>
構成部品の面を選択というケースを考慮しておらず、アセンブリの場合に正しく動作していませんでした
上記コードは修正済みのもので、面(Face2)の法線ベクトルを構成部品のトランスフォームで乗じて、アセンブリ座標のベクトルに直しています
議長に報告する   記録済み
psychic
Sr. メンバー
****

オフライン

投稿: 59



I'm a llama!

プロファイルを見る
Re:法線の距離・・・
« 返信 #4 投稿日: 2011/10/13 - 23:32:18 »
引用して返信

こんばんは
返事遅くなりました

hisa様

まさにこれです!
動作確認いたしました
ASSY上でしっかり取得できました
ありがとうございました^^
議長に報告する   記録済み
ページ: [1] Page Top 返信 返信のお知らせ Print 
仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: 法線の距離・・・ 前のトピック 次のトピック
ジャンプします: