2016-11-22 13 views
1

私がしようとしているのは、Autodesk Inventorです。私はスケッチで一連の行を繰り返すプログラムを書いています。接続された行のグループを集めてコレクションに入れます。次に、これらのコレクションのコレクションを処理します。コレクションのコレクション - 参照ではなく値によるサブコレクションの作成方法

私は一時的なコレクションに行を追加し、この一時的なコレクションをループのコレクションに追加することで、ループごとに未知の量のコレクションを生成する必要がないようにしようとしています。しかし、Clearメソッドを使用して一時的なコレクションをリセットするとすぐに、ループのコレクションにプッシュした情報が消去されます。一時コレクションに含まれているものとは無関係に、ループのコレクション内の情報を作成する方法はありますか?

ご覧のとおり、問題は、接続する線の数がわからないことがあるため、サブコレクションの数がわからないことです。

ここに私のコードです。

Dim oLoopColl As New Collection 
Dim oSubColl As ObjectCollection 
Set oSubColl = ThisApplication.TransientObjects.CreateObjectCollection 

For j = 1 To oSLColl.Count 
    oSubColl.Add (oSLColl.Item(j)) 
    'Check for last item to see if it is part of the first 
    If j = oSLColl.Count Then 
     If oSLColl.Item(j).EndSketchPoint Is oSLColl.Item(1).StartSketchPoint Then 
      MsgBox ("Last SL is part of first coll!") 
      oLoopColl.Item(1).Add (oSLColl.Item(j)) 
      oSubColl.Clear 
     Else 
      Call oLoopColl.Add(oSubColl, CStr(j)) 
     End If 
    Else 
     If Not oSLColl.Item(j).EndSketchPoint Is oSLColl.Item(j + 1).StartSketchPoint Then 
      Call oLoopColl.Add(oSubColl, CStr(j)) 
      oSubColl.Clear 
     End If 
    End If 
Next 
oSubColl.Clear 
Set oSubColl = Nothing 
+0

oLoopColl.Add(oSubColl、CStr(j))というコードは、ループコレクションにサブコレクションに '参照 'を追加します。この参照は同じサブコレクションを指しているだけなので、サブコレクションがクリアされると、ループコレクションはこのコレクションを指していますが、これは現在空です。サブコレクション 'by-value'を追加することはできません。毎回新しいコレクションを作成し、サブコレクションの要素をこの新しいコレクションにコピーして、この新しいコレクションをループコレクションに追加することができます。この新しいコレクションをクリアしないと、ループコレクションはそれを保持します。 – dee

+0

しかし、これをループ内のサブコレクションの可変数でどのように扱うべきですか? 私が知る限り、変数に基づいて変数を正確に定義することはできません。つまり、oLoop&i = oLoop1、oLoop2 for i = 1〜2 – MechMachineMan

+0

多分私は自分のアプローチを考え直し、oLoopsをObjectCollectionとして保存する必要があります。それらを配列に格納し、配列をObjectCollectionに変換します。 – MechMachineMan

答えて

1

私がコメントで言ったことは次のとおりです。この例では、containeritemsの番号を知る必要はないことがわかります。新しいitemcontainerに追加する必要があります


1を作成します。

Set item = New Collection 

次に、この新しいitem

item.Add "Some-New-Item" 

項目を追加そして最後に、この新しいitemへの参照を追加container

container.Add item 

containerは、itemが存在するメモリ場所への参照を保存します。そして、次のアイテムを追加してから、次のアイテムを追加することができます。


Option Explicit 

Private Const ColItem As String = "Col_Item_" 

Sub Demo() 
    Dim container As VBA.Collection 
    Dim item As VBA.Collection 

    Set container = New Collection 

    Set item = New Collection 
    item.Add ColItem & 1 
    item.Add ColItem & 11 
    item.Add ColItem & 111 
    container.Add item 

    Set item = New Collection 
    item.Add ColItem & 2 
    item.Add ColItem & 22 
    item.Add ColItem & 222 
    container.Add item 

    ' Clear is not part of VBA-Collection so Remove-all could simulate it 
    ' When Clear would be called here then all the items will be removed 
    ' and the container will reference an empty collection 
    item.Remove 2 

    Dim outer, inner 
    For Each outer In container 
     For Each inner In outer 
      Debug.Print inner 
     Next inner 
    Next outer 
End Sub 

出力:

Col_Item_1 
Col_Item_11 
Col_Item_111 
Col_Item_2 
Col_Item_222 

why not use As Newを参照してください。