[Insight-users] VectorContainer, removing element

Laurent Mundeleer lmundele at ulb.ac.be
Fri, 06 Feb 2004 08:11:20 +0100


Hi Luis,
thanks for all his informations.
I isolate the nodes per slice, because the user as to pick up them on 
the screen, so it's easier to do like this (I think).
I show the nodes on a vtk canvas, and place them in the structure of itk 
parallely.
It works fine but for the moment the user as no right to error ;-)

Thanks again

Laurent


Luis Ibanez wrote:

>
> Hi Laurent,
>
> You may find useful to look at the STL documentation
>
> http://www.sgi.com/tech/stl/table_of_contents.html
>
> In particular to the std::vector class
>
> http://www.sgi.com/tech/stl/Vector.html
>
> Note the methods
>
>    iterator erase(iterator pos)
>    iterator erase(iterator first, iterator last
>
>
> Since the itk::VectorContainer derives from
> the std::vector, you can simply invoke any
> of these two erase methods.
>
> Note that erasing invalidates the iterators
> that are 'on and after' the deleted positions,
> so you should use the iterator returned by the
> erase() method. This is the iterator pointing
> to the next valid position after the removal
> of the entries.
>
>
> For deleting the container in one of the
> VectorContainer array entries, you can simply
> assign the SmartPointer to zero.
>
>     seeds[27] = 0;
>
> This will cause the reference count of the
> VectorContainer to be decremented (and if
> no other smart pointer was pointing to it,
> the container will be destroyed).
>
> Note that if you plan to reuse the location
> 27 later on, you could rather do
>
>     seeds[27] = NodeContainer::New();
>
> That is, assign a freshly created container.
> The previous container will still be destroyed,
> but you will have the safety of having an empty
> container available at the same position.
>
>
> Out of curiosity,
> Why do you want to isolate the nodes per Z slice ?
>
> The FastMarching method is N-Dimensional, you could
> simple have a unique NodeContainer holding all the
> seed points of the image....
>
>
>
> Regards,
>
>
>
>   Luis
>
>
> --------------------------
> Laurent Mundeleer wrote:
>
>> Hi Luis,
>>
>> in fact I'd like to do both. The 128 elements are representing the z
>> coordonate of my image volume.
>> Brad allready send me elements of answer :
>>
>>> The VectorContainer provides a DeleteIndex method to remove an element 
>>
>>
>> from one entry in seeds.  If you want to remove an entire container from
>>
>>> seeds[x], then that is up to you because it is just a standard array.
>>> I suggest you convert seeds to look like this:
>>>
>>> std::vector< NodeContainer::Pointer > seeds;
>>>
>>> or
>>>
>>> std::set< NodeContainer::Pointer > seeds;
>>>
>>> Then there is no limit to the number of seeds and you get the STL 
>>
>>
>> container features to manage the structure.
>>
>>>
>>> -Brad
>>
>>
>>
>> But I'm not quite familiar with STL so I'm still looking how I'll do to
>> delete all a range of seeds, or a particular seed (found by a
>> approximation of the x,y coordinates).
>> For the moment it will be all the nodes for a z value, it will be 
>> easier.
>>
>> Thanks for the help
>>
>> Laurent
>>
>> Luis Ibanez wrote:
>>
>>>
>>>
>>> Hi Laurent,
>>>
>>> With:
>>>
>>>     NodeContainer::Pointer seeds[128];
>>>
>>> You are declaring an array of 128
>>> SmartPointers to:
>>>
>>>   "VectorContainer< unsigned int, NodeType >".
>>>
>>> When you say that you want to delete some
>>> elements from "seeds", do you mean that you
>>> want to destroy one of the 128 entries in
>>> this array of smart pointers ?
>>>
>>> or, do you mean that from one of those
>>> 128 Containers you want to delete some
>>> of its NodeType entries ?
>>>
>>>
>>> Please let us know,
>>>
>>>
>>> Thanks
>>>
>>>
>>>    Luis
>>>
>>>
>>>
>>>
>>> --------------------------
>>>
>>> Laurent Mundeleer wrote:
>>>
>>>> in fact I think I didn't gave you enough information, here's some 
>>>> code :
>>>> ...
>>>>
>>>>    typedef itk::FastMarchingImageFilter<Image2DType, Image2DType> 
>>>> fastMarchingType;
>>>>    typedef fastMarchingType::NodeContainer NodeContainer;
>>>>    typedef fastMarchingType::NodeType NodeType;
>>>>
>>>> ...
>>>>    NodeContainer::Pointer seeds[128];
>>>> ...
>>>> void levelSetITK::addSeed(float *pos, float ratio)
>>>> {      typedef NodeType::IndexType IndexType;
>>>>    IndexType point;
>>>>
>>>>    float ratio0 = ratio*0.969;
>>>>    float ratio1 = ratio*0.98;
>>>>
>>>>    point[0] = static_cast<IndexType::IndexValueType>( pos[0]*ratio0 );
>>>>    point[1] = static_cast<IndexType::IndexValueType>( pos[1]*ratio1 );
>>>>      NodeType node;
>>>>
>>>>    node.SetValue( -25.0 );
>>>>    node.SetIndex( point );
>>>>
>>>>    int p = (int) pos[2];
>>>>    seeds[p]->InsertElement( nbreSeed[p], node );
>>>>    nbreSeed[p]++;
>>>> }
>>>>
>>>> and I'd like to remove some element from seeds.
>>>>
>>>> Thanks
>>>>
>>>> Laurent
>>>>
>>>> Brad King wrote:
>>>>
>>>>> Laurent Mundeleer wrote:
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I can't figure how to remove an element anywhere in a 
>>>>>> VectorContainer (like erase(pos) in stl) ??
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> The class derives from std::vector, so the same methods should be 
>>>>> available.  However, you should know that itk::VectorContainer is 
>>>>> used by itk::Image to manage memory for pixel buffers.  It is not 
>>>>> intended to be used as a general-purpose container by user code.
>>>>>
>>>>> -Brad
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>>
>
>
>
>

-- 
********************************************
Laurent Mundeleer
Université Libre de Bruxelles (ULB)
Service des Systèmes Logiques et Numériques (SLN) CP165/57
50, Av. F.Roosevelt
1050 Bruxelles
Belgium
tel : ++32.2.650.22.97
fax : ++32.2.650.22.98
e-mail : lmundele at ulb.ac.be
********************************************