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さん、すいません。。。
自分でも情けない限りですが、めげずに頑張ります。
|
|
|
|