vtkSmartPointer<vtkAlgorithm> GlyphMagnitudeColorMapping::createFilter(AbstractVisualizedData & visualizedData, unsigned int port)
{
    if (port != 0)
    {
        return vtkSmartPointer<vtkPassThrough>::New();
    }

    const auto filterIt = m_filters.find(&visualizedData);

    // Return already created filter (in this case, visualizedData is valid for this mapping)
    if (filterIt != m_filters.end())
    {
        return filterIt->second;
    }

    // Check if the mapping can be applied to the provided visualization
    const auto glyphMappingDataIt = m_glyphMappingData.find(static_cast<RenderedData3D *>(&visualizedData));
    if (glyphMappingDataIt == m_glyphMappingData.end())
    {
        return vtkSmartPointer<vtkPassThrough>::New();
    }

    // Create the mapping pipeline
    assert(glyphMappingDataIt->second);
    auto & glyphMappingData = *glyphMappingDataIt->second;

    auto norm = vtkSmartPointer<vtkVectorNorm>::New();
    norm->SetInputConnection(glyphMappingData.vectorDataOutputPort());

    auto assignVectors = vtkSmartPointer<vtkAssignAttribute>::New();
    assignVectors->Assign(m_vectorName.toUtf8().data(), vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA);
    assignVectors->SetInputConnection(norm->GetOutputPort());

    auto setArrayName = vtkSmartPointer<ArrayChangeInformationFilter>::New();
    setArrayName->EnableRenameOn();
    setArrayName->SetArrayName(s_normScalarsName);
    setArrayName->SetAttributeType(vtkDataSetAttributes::SCALARS);
    setArrayName->SetAttributeLocation(IndexType::points);
    setArrayName->SetInputConnection(assignVectors->GetOutputPort());

    m_filters[&visualizedData] = setArrayName;

    return setArrayName;
}
void Array3DEvent::LoadFromXml(gd::Project & project, const TiXmlElement * elem)
{
    if ( elem->FirstChildElement( "Conditions" ) != NULL )
        gd::EventsListSerialization::OpenConditions(project, conditions, elem->FirstChildElement( "Conditions" ));
    else
        std::cout << "Aucune informations sur les conditions d'un évènement";

    if ( elem->FirstChildElement( "Actions" ) != NULL )
        gd::EventsListSerialization::OpenActions(project, actions, elem->FirstChildElement( "Actions" ));
    else
        std::cout << "Aucune informations sur les actions d'un évènement";

    if ( elem->FirstChildElement( "Events" ) != NULL )
        gd::EventsListSerialization::LoadEventsFromXml(project, events, elem->FirstChildElement( "Events" ));

    std::string arrayName_;
    GD_CURRENT_ELEMENT_LOAD_ATTRIBUTE_STRING("name", arrayName_);
    SetArrayName(arrayName_);
}