2016-11-22 4 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))' добавляет 'reference' в подсерию к коллекции циклов. Эта ссылка просто указывает на одну и ту же подсерию, и поэтому, когда подсекция очищается, коллекция циклов указывает на эту коллекцию, которая теперь пуста. Вы не можете добавить подзадачу 'by-value'. Вы можете создавать новую коллекцию каждый раз, копировать элементы подзадачи в эту новую коллекцию и добавлять эту новую коллекцию в коллекцию циклов. Когда вы не очистите эту новую коллекцию, коллекция циклов сохранится. – dee

+0

Но как я могу справиться с этим с переменным количеством подкатегорий в цикле? Насколько я знаю, я не могу точно определить переменную, основанную на переменной; т.е. oLoop & i = oLoop1, oLoop2 для i = 1 до 2 – MechMachineMan

+0

Возможно, мне просто нужно переосмыслить мой подход и сохранить только oLoops как ObjectCollection прямо перед тем, как сделать вызов, требующий их как ObjectCollection ... ie; хранить их в массиве и преобразовывать массив в ObjectCollection. – MechMachineMan

ответ

1

Что я пытался сказать в комментарии, было следующее. В этом примере вы можете видеть, что нет необходимости знать число items в container.


Когда новый item следует добавить к container создать один:

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 См.

Смежные вопросы