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

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









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

仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: Assemblyの構成部品の表示/非表示 前のトピック 次のトピック
ページ: [1] Page Bottom 返信 返信のお知らせ Print 
   著者  トピック: Assemblyの構成部品の表示/非表示  (閲覧数 4372 回)
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Assemblyの構成部品の表示/非表示
« 投稿日: 2010/12/07 - 17:10:47 »
引用して返信

いつも参考にさせて頂いております。 

SolidWorks 2006 sp5.1を使用しておりまして、操作の手数を短縮しようとマクロの製作に挑戦中のマクロ初心者です。

AssemblyファイルのFeatureManager上もしくは直接に構成部品を選択して、表示/非表示を行うマクロを作りたいのですが、動作を繰り返すマクロ文が出来なくて困っています。

単一動作であれば、"ShowComponent2(表示)"、"HideComponent2(非表示)"で動くのですが、If 〜 Then文などで動作を繰り返すコードが判りません。

エキスパートのみなさま、アドバイスを頂けないでしょうか。よろしくお願いします。
議長に報告する   記録済み
Makoron
カタマリの王様!?
*****

オフライン

投稿: 1277



SW2011SP5.0

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #1 投稿日: 2010/12/08 - 10:19:37 »
引用して返信

zignanさん、こんにちは。

こんな感じでどうでしょう。

Code:
Option Explicit

Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModelDoc2 As SldWorks.ModelDoc2
    Dim swSelectionMgr As SldWorks.SelectionMgr
   
    Set swApp = Application.SldWorks
    Set swModelDoc2 = swApp.ActiveDoc
    Set swSelectionMgr = swModelDoc2.SelectionManager

    Dim i As Long
    Dim swComponent2 As SldWorks.Component2
   
    For i = 1 To swSelectionMgr.GetSelectedObjectCount
        ' 選択されているものから、Component2オブジェクトを取得
        Set swComponent2 = swSelectionMgr.GetSelectedObjectsComponent3(i, -1)
        ' 構成部品または、構成部品に含まれる要素が選択されている場合、表示/非表示の反転処理
        If Not (swComponent2 Is Nothing) Then
            Select Case swComponent2.Visible
                Case swComponentVisibilityState_e.swComponentVisible
                    swComponent2.Visible = swComponentVisibilityState_e.swComponentHidden
                Case swComponentVisibilityState_e.swComponentHidden
                    swComponent2.Visible = swComponentVisibilityState_e.swComponentVisible
            End Select
        End If
    Next i
   
End Sub

議長に報告する   記録済み
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #2 投稿日: 2010/12/09 - 11:23:40 »
引用して返信

Makoronさん、いつもアドバイスありがとうございます。

作って頂いたマクロ文を確認しまして、シンプルな判りやすい文章で思ってたとおりの動作をして大変満足しております。
swComponentVisible/swComponentHiddenというコードもあるのですね。  
API Helpをもっと見るようにしたいと思います。

それで、部品のスケッチや平面を表示/非表示するよう今回の文章をアレンジして、下記のとおりFeatureオブジェクトで作ってみたのですが、成り立ちませんでした。

Dim swFeature As SldWorks.Feature

    For i = 1 To swSelectionMgr.GetSelectedObjectCount
        Set swFeature = swSelectionMgr.GetSelectedObjectsComponent3(i, -1)
        If Not (swFeature Is Nothing) Then
            Select Case swFeature.Visible
              Case swVisibilityState_e.swVisibilityStateHide
                swFeature .Visible= swVisibilityState_e.swVisibilityStateShown
              Case swVisibilityState_e.swVisibilityStateShown
                swFeature .Visible= swVisibilityState_e.swVisibilityStateHide
            End Select
        End If
    Next

何故かアドバイスをもらえないでしょうか。
議長に報告する   記録済み
Makoron
カタマリの王様!?
*****

オフライン

投稿: 1277



SW2011SP5.0

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #3 投稿日: 2010/12/09 - 14:41:44 »
引用して返信

zignanさん、こんにちは。

Set swFeature = swSelectionMgr.GetSelectedObjectsComponent3(i, -1)
この部分が間違っています!

SelectionMgr::GetSelectedObjectsComponent3は、
アセンブリドキュメント内で、現在選択されているものから
その構成部品(SldWorks.Component2)を取得する為のものです。
なので、すべてNothingが帰ってくるので正常に動作しないのです。

また、
swFeature.Visible= swVisibilityState_e.swVisibilityStateShown
swFeature.Visible= swVisibilityState_e.swVisibilityStateHide
も正常に動作しません。
swFeature.Visibleは読み取り専用のプロパティなので、
マクロからの設定には利用できません。

正常に動作させるためには、
SelectionMgr::GetSelectedObject6 を使い、
swModelDoc2.UnBlankRefGeomやswModelDoc2.UnblankSketchにより
表示/非表示の切り替えが必要です。
さらに、swModelDoc2.UnBlankRefGeomなどを利用する際には、
「現在選択されているもの」が条件に入るため、複数選択に対応するために、前にhisaさんが作成した
「抑制/抑制解除」の時の様に、まず選択中のオブジェクトを読み取っておく必要もあります。

で、コードが長くなってしまうのですが、以下のような感じで動作すると思います。
(スケッチ・参照平面以外にも、原点・参照軸も対象としてみました。)
(原点の判断に多少の不安があります。)
(選択を元に戻す処理で、表示が正しく行われない問題もあります。)
Code:
Option Explicit

Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModelDoc2 As SldWorks.ModelDoc2
    Dim swSelectionMgr As SldWorks.SelectionMgr
   
    Set swApp = Application.SldWorks
    Set swModelDoc2 = swApp.ActiveDoc
    Set swSelectionMgr = swModelDoc2.SelectionManager

    ' 選択数を取得
    Dim lngSelCount As Long
    lngSelCount = swSelectionMgr.GetSelectedObjectCount
    If lngSelCount = 0 Then
        Exit Sub
    End If

    ' 選択済みオブジェクトの読み取り(表示/非表示処理の際、選択解除するため)
    Dim i As Long
    Dim vntSelObject() As Variant
    ReDim vntSelObject(lngSelCount)
    Dim lngSelObjectType() As Long
    ReDim lngSelObjectType(lngSelCount)
    For i = 1 To lngSelCount
        Set vntSelObject(i) = swSelectionMgr.GetSelectedObject6(i, -1)
        lngSelObjectType(i) = swSelectionMgr.GetSelectedObjectType3(i, -1)
    Next

    ' スケッチ・原点・参照平面・参照軸の時だけ、表示/非表示の反転処理
    Dim swFeature As SldWorks.Feature
    For i = 1 To lngSelCount
        Call swModelDoc2.ClearSelection2(True)
        ' スケッチ・原点・参照平面・参照軸のFeatureオブジェクトを取得
        Set swFeature = Nothing
        Select Case lngSelObjectType(i)
            Case swSelectType_e.swSelSKETCHES
                ' スケッチ
                Set swFeature = vntSelObject(i)
            Case swSelectType_e.swSelEXTSKETCHPOINTS
                ' 原点のFeatureオブジェクトを取得(GetSelectedObject6ではSketchPointとなってしまうため)
                Dim SketchPoint As SldWorks.SketchPoint
                Set SketchPoint = vntSelObject(i)
                If SketchPoint.X = 0# And SketchPoint.Y = 0# And SketchPoint.Z = 0# Then
                    Dim OriginFeature As SldWorks.Feature
                    Set OriginFeature = swModelDoc2.FirstFeature
                    Do While Not (OriginFeature Is Nothing)
                        If OriginFeature.GetTypeName = "OriginProfileFeature" Then
                            Set swFeature = OriginFeature
                            Exit Do
                        End If
                        Set OriginFeature = OriginFeature.GetNextFeature
                    Loop
                End If
            Case swSelectType_e.swSelDATUMPLANES
                ' 参照平面
                Set swFeature = vntSelObject(i)
            Case swSelectType_e.swSelDATUMAXES
                ' 参照軸
                Set swFeature = vntSelObject(i)
        End Select
        ' 表示/非表示の反転処理
        If Not (swFeature Is Nothing) Then
            ' 対象を選択
            Call swFeature.Select2(False, -1)
            ' 反転処理(スケッチか平面を判断せずに両方の処理を行う)
            Select Case swFeature.Visible
                Case swVisibilityState_e.swVisibilityStateHide
                    swModelDoc2.UnBlankRefGeom
                    swModelDoc2.UnblankSketch
                Case swVisibilityState_e.swVisibilityStateShown
                    Call swFeature.Select2(False, -1)
                    swModelDoc2.BlankRefGeom
                    swModelDoc2.BlankSketch
            End Select
        End If
    Next

    ' 選択を解除したので、元の選択状態に戻す
    For i = 1 To lngSelCount
        Call vntSelObject(i).Select(True)
    Next
   
End Sub




議長に報告する   記録済み
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #4 投稿日: 2010/12/09 - 15:54:01 »
引用して返信

Makoronさん、ご回答をありがとうございます。

何かトンチンカンなマクロ文を掲載して質問してしまい、お恥ずかしい限りです。
でも恥をかいた分、単に表示/非表示をするのにもアセンブリ、部品、図面それぞれで
コードが異なり、また取得方法も違ってくるのがMakoronさんに教えて頂いたおかげで
なんとなく判った気持ちになってます。

頂いたマクロ文について、色々と不明瞭な所はありますが、まずはAPI Helpを見ながら
自分なりに噛み砕いてみます。

色々とありがとうございました。
議長に報告する   記録済み
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #5 投稿日: 2010/12/15 - 08:47:09 »
引用して返信

Makoronさん、みなさん、おはようございます。

「表示/非表示」関連で質問します。
今度は図面上の図面ビュー(オブジェクト12番)を「表示/非表示」したいのですが、実行コードは、swDrawingDoc.SuppressView /swDrawingDoc.UnsuppressViewだと思うのですが、状態を取得するコードを見つけ出せまん。

アドバイスをお願いします。
議長に報告する   記録済み
Makoron
カタマリの王様!?
*****

オフライン

投稿: 1277



SW2011SP5.0

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #6 投稿日: 2010/12/15 - 09:47:04 »
引用して返信

zignanさん、おはようございます。

選択ビューを非表示
DrawingDoc::SuppressView
選択ビューを表示
DrawingDoc::UnsuppressView

特定のビューの表示状態を取得
View::GetVisible
特定のビューの表示状態を設定
View::SetVisible

特定のビューの抑制状態を取得/設定
View::SuppressState

ってな感じです。
ビューの表示状態を確認するには
DrawingDocオブジェクトから、Viewオブジェクトを取得して巡回しながら
View::GetVisibleにて確認する必要があります。

話が変わりますが、
スレッド内容が変わる場合は、別のスレッドで書いた方がいいと思います。
そのほうが見やすいし、ほかの人が探すときも探しやすいよ。
(この件の次からで良いです。)
議長に報告する   記録済み
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #7 投稿日: 2010/12/15 - 15:02:41 »
引用して返信

Makoronさん、スレッドの件すいませんでした。

それで先日教えてもらった文法で作ってみたのですが、いつもの如く動きません。。。

Code:
 Dim swView As SldWorks.View
  Dim swDrawingDoc As SldWorks.DrawingDoc

  Set swDrawingDoc = swApp.ActiveDoc
  Set swSelectionMgr = swDrawingDoc.SelectionManager

 For i = 1 To swSelectionMgr.GetSelectedObjectCount
  Set swView = swSelectionMgr.GetSelectedObject5(i)         
  If Not (swView Is Nothing) Then
  Select Case swView.GetVisible
   Case swDrawingDoc.UnsuppressView
     swView.Visible = swView.SetVisible(swDrawingDoc.SuppressView)
      Case swDrawingDoc.SuppressView
        swView.Visible = swView.SetVisible(swDrawingDoc.UnsuppressView)
    End Select
  End If
  Next i


議長に報告する   記録済み
Makoron
カタマリの王様!?
*****

オフライン

投稿: 1277



SW2011SP5.0

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #8 投稿日: 2010/12/15 - 16:01:50 »
引用して返信

zignanさん、もう少しAPIHelpをよく見た方がいいかも・・・
メソッドやプロパティの使い方が・・・微妙です。

たとえば、
Select Case swView.GetVisible
   Case swDrawingDoc.UnsuppressView
のところでいうと、
View::GetVisible は Boolean を返すので、swDrawingDoc.UnsuppressViewで判断できないです。

また、
swView.Visible = swView.SetVisible(swDrawingDoc.SuppressView)
のところでいうと、
View::SetVisibleには、戻り値がないので「swView.Visible =」は不要です。
そして、View::SetVisibleの引数は、2個ありますし、値もBooleanです。

ただ、テストしている段階で View::GetVisible の不具合が見つかったので、
この部分の処理を含めた形で、サンプルをのっけます。

Code:
Option Explicit

Sub main()

    Dim swApp As SldWorks.SldWorks
    Set swApp = Application.SldWorks

    Dim swDrawingDoc As SldWorks.DrawingDoc
    Dim swSelectionMgr As SldWorks.SelectionMgr
    Set swDrawingDoc = swApp.ActiveDoc
    Set swSelectionMgr = swDrawingDoc.SelectionManager

    ' 選択されているビューオブジェクトを取得
    ' swView.SetVisibleで選択が解除されるため、読み取っておく必要がある
    Dim i As Long
    Dim swView As SldWorks.View
    Dim swSelectView() As SldWorks.View
    ReDim swSelectView(0)
    Dim lngCount As Long
    lngCount = 0
    On Error Resume Next
    For i = 1 To swSelectionMgr.GetSelectedObjectCount
        Set swView = swSelectionMgr.GetSelectedObject5(i)
        If Not (swView Is Nothing) Then
            lngCount = lngCount + 1
            ReDim Preserve swSelectView(lngCount)
            Set swSelectView(lngCount) = swView
        End If
    Next i
    On Error GoTo 0
   
    ' 選択ビューの表示状態を変更
    ' View::GetVisibleはBoolean(True=-1,False=0)を返すはずですが、
    ' 正しく返さなかった(True=1,False=0)ので
    ' (swSelectView(i).GetVisible  <> 0)でBooleanの値に変換しています。
    For i = 1 To UBound(swSelectView)
        Select Case (swSelectView(i).GetVisible <> 0)
            Case True
                Call swSelectView(i).SetVisible(False, False)
            Case False
                Call swSelectView(i).SetVisible(True, False)
        End Select
    Next i
   
End Sub


zignanさん、もう少し頑張ってVBを勉強すると、もっと迷いもなく作成できるようになると思います。
(近くで操作しながら説明できると、もっと上手に説明できると思いますが、掲示板では難しいですね。)
議長に報告する   記録済み
zignan
Full メンバー
***

オフライン

投稿: 29



I'm a llama!

プロファイルを見る
Re:Assemblyの構成部品の表示/非表示
« 返信 #9 投稿日: 2010/12/15 - 16:31:12 »
引用して返信

Makoronさん、すいません。。。

自分でも情けない限りですが、めげずに頑張ります。
議長に報告する   記録済み
ページ: [1] Page Top 返信 返信のお知らせ Print 
仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: Assemblyの構成部品の表示/非表示 前のトピック 次のトピック
ジャンプします: