project(monitoring)

# TODO properly define the path to the XML Schema at run time (in MonitoringManager and MonitoringManagerFactory)
# otherwise this generates an error when executing the application on a machine that have no or a different
# source dir path!
#add_definitions(-DMONITORIN_XSD="${CMAKE_CURRENT_SOURCE_DIR}/../schema/MonitorIn.xsd")
#add_definitions(-DMONITOROUT_XSD="${CMAKE_CURRENT_SOURCE_DIR}/../schema/MonitorOut.xsd")

if(MML_GENERATE_GUI)
  find_package(Qt4 REQUIRED)
  include(${QT_USE_FILE})
  add_definitions(-DMML_GENERATE_GUI)
endif(MML_GENERATE_GUI)

# "find" SOFA (you need to have a SOFA_DIR environment variable
# or to define it manually during configuration process)
set(MML_SOFA_DIR $ENV{MML_SOFA_DIR} CACHE PATH "Where to find SOFA")
if(EXISTS ${MML_SOFA_DIR})
  # Compile Sofa .scn import filter? (ON or OFF)
  option(MML_SOFA_SUPPORT "Compile Sofa Simulator?" ON)
endif(EXISTS ${MML_SOFA_DIR})

# sofa settings
if(MML_SOFA_SUPPORT)
  option(MML_SOFA_RELEASE "Set to ON if (soon to be next Release) Svn development version of Sofa is available in ${MML_SOFA_DIR}" OFF)
  if(MML_SOFA_RELEASE)
    add_definitions(-DSOFA_RELEASE)
  endif()
  # compilation flag
  add_definitions(-DSOFA_SUPPORT)
  add_definitions(-DSOFA_PATH="${MML_SOFA_DIR}")
  # library settings
  if(WIN32)
    set(MML_SOFA_LIB_DIR ${MML_SOFA_DIR}/lib/win32/ReleaseVC9 ${MML_SOFA_DIR}/lib/win32 ${MML_SOFA_DIR}/lib ${MML_SOFA_DIR}/bin )
  else(WIN32)
    set(MML_SOFA_LIB_DIR ${MML_SOFA_DIR}/lib/linux ${MML_SOFA_DIR}/lib)
  endif(WIN32)
  if(NOT MML_SOFA_RELEASE)
    # Sofa1.0 from svn branch
    set(MML_SOFA_LIBS sofacore sofacomponent sofasimulation sofatree sofahelper sofadefaulttype)
  else()
    set(MML_SOFA_LIBS sofacore sofa_component_dev
    sofa_component_advanced_dev sofa_component_misc_dev
    sofa_component
    sofa_non_uniform_fem_dev
    sofa_advanced_fem sofa_mjed_fem sofa_advanced_constraint sofa_advanced_interaction sofa_misc_topology_dev sofa_misc_mapping_dev sofa_misc_forcefield_dev sofa_misc_fem_dev sofa_misc_collision_dev sofa_misc_solver_dev sofa_misc_dev
    sofa_exporter sofa_loader sofa_misc_forcefield sofa_component_base sofa_component_common sofa_component_general sofa_component_advanced sofa_component_misc sofahelper sofa_engine sofa_sph_fluid sofa_non_uniform_fem sofa_base_topology sofa_boundary_condition sofa_haptics sofa_constraint sofatree sofa_base_linear_solver sofa_implicit_ode_solver sofa_simple_fem sofa_topology_mapping sofa_user_interaction sofa_misc_collision sofa_preconditioner sofa_misc_topology sofa_mesh_collision sofa_volumetric_data sofabgl sofa_base_collision sofa_deformable sofa_graph_component sofa_base_mechanics sofa_rigid sofa_base_animation_loop sofa_object_interaction sofa_explicit_ode_solver sofa_eigen2_solver sofa_validation sofa_dense_solver sofa_eulerian_fluid sofa_misc_mapping sofa_misc_fem sofa_misc_engine sofa_misc_solver sofa_misc
    sofa_base_visual #-lnewmat -lGLEW -lpng
        sofasimulation #-lminiFlowVR
        sofacore #-ltinyxml
        sofadefaulttype #-lQt3Support -lQtOpenGL -lQtGui -lQtCore -lGLU -lGL -lpthread
            sofamodeler
    )
  endif()
  # add debug suffix
  if(WIN32)
        if( CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
            set(MML_SOFA_LIBS_WIN32 ${MML_SOFA_LIBS})
            set(MML_SOFA_LIBS)
            if(MML_SOFA_RELEASE)
                set(SOFA_VERSION_SUFFIX "_1_0d")
            else()
                set(SOFA_VERSION_SUFFIX "d")
            endif()
            foreach(SOFA_LIB ${MML_SOFA_LIBS_WIN32})
                    set(MML_SOFA_LIBS ${MML_SOFA_LIBS} ${SOFA_LIB}${SOFA_VERSION_SUFFIX})
            endforeach()
        endif()
  endif()
  # includes
  set(MML_SOFA_INCLUDE_DIR ${MML_SOFA_DIR}/include ${MML_SOFA_DIR}/modules ${MML_SOFA_DIR}/framework
    ${MML_SOFA_DIR}/extlibs/miniBoost ${MML_SOFA_DIR}/include/modules
    ${MML_SOFA_DIR}/include/framework ${MML_SOFA_DIR}/include/extlibs/miniBoost )
  if(MML_GENERATE_GUI)
    set(sofa_MOC_SRCS
	simulator/simulators/Sofa/SofaWidget.h
    )

    set(sofa_UIS
    	simulator/simulators/Sofa/SofaWidget.ui
    )
    
    qt4_wrap_ui(sofa_UIS_H ${sofa_UIS})
    qt4_wrap_cpp(sofa_MOC_UI ${sofa_UIS_H})
    qt4_wrap_cpp(sofa_MOCS ${sofa_MOC_SRCS})
    set(sofa_QT_SRC
      simulator/simulators/Sofa/SofaWidget.cpp
    )
  endif(MML_GENERATE_GUI)
  set(MML_SOFA_HEADERS
    simulator/simulators/Sofa/SofaSimulator.h
    simulator/simulators/Sofa/TranslationConstraint.h
    ${sofa_UIS_H}
    ${sofa_MOC_SRCS}
  )
  set(MML_SOFA_SRC
    simulator/simulators/Sofa/SofaSimulator.cpp
    simulator/simulators/Sofa/TranslationConstraint.cpp
    simulator/simulators/Sofa/TranslationConstraint.inl
    ${sofa_MOCS}
    ${sofa_MOC_UI}
    ${sofa_QT_SRC}
  )
endif(MML_SOFA_SUPPORT)


set(MML_ANSYS_BIN $ENV{MML_ANSYS_BIN} CACHE FILE "Where to find Ansys binary")
set(MML_ANSYS_WORKING_DIR $ENV{MML_ANSYS_WORKING_DIR} CACHE PATH "Specify a folder for ansys working files")
if(EXISTS ${MML_ANSYS_BIN})
if(EXISTS ${MML_ANSYS_WORKING_DIR})
  # Compile Ansys simulator files (ON or OFF)
  option(MML_ANSYS_SUPPORT "Compile Ansys simulator?" ON)

  # ansys settings
  if(MML_ANSYS_SUPPORT)
    # compilation flag
    add_definitions(-DANSYS_SUPPORT)
    add_definitions(-DANSYS_BIN="${MML_ANSYS_BIN}" -DANSYS_WORKING_DIR="${MML_ANSYS_WORKING_DIR}")
    
    if(MML_GENERATE_GUI)
    set(ansys_MOC_SRCS
	simulator/simulators/Ansys/AnsysWidget.h
    )

    set(ansys_UIS
    	simulator/simulators/Ansys/AnsysWidget.ui
    )
    
    qt4_wrap_ui(ansys_UIS_H ${ansys_UIS})
    qt4_wrap_cpp(ansys_MOC_UI ${ansys_UIS_H})
    qt4_wrap_cpp(ansys_MOCS ${ansys_MOC_SRCS})
    set(ansys_QT_SRC
      simulator/simulators/Ansys/AnsysWidget.cpp
    )
    endif(MML_GENERATE_GUI)

    set(MML_ANSYS_HEADERS
      simulator/simulators/Ansys/AnsysBatch.h
      simulator/simulators/Ansys/AnsysBatchWriter.h
      simulator/simulators/Ansys/AnsysBatchWriters/PrepWriter.h
      simulator/simulators/Ansys/AnsysBatchWriters/SoluWriter.h
      simulator/simulators/Ansys/AnsysBatchWriters/PostWriter.h
      simulator/simulators/Ansys/AnsysBatchWriters/ParametersWriter.h
      simulator/simulators/Ansys/AnsysSimulator.h
      ${ansys_UIS_H}
      ${ansys_MOC_SRCS}
    )
    set(MML_ANSYS_SRC
      simulator/simulators/Ansys/AnsysBatch.cpp
      simulator/simulators/Ansys/AnsysBatchWriter.cpp
      simulator/simulators/Ansys/AnsysBatchWriters/PrepWriter.cpp
      simulator/simulators/Ansys/AnsysBatchWriters/SoluWriter.cpp
      simulator/simulators/Ansys/AnsysBatchWriters/PostWriter.cpp
      simulator/simulators/Ansys/AnsysBatchWriters/ParametersWriter.cpp
      simulator/simulators/Ansys/AnsysSimulator.cpp
      ${ansys_MOCS}
      ${ansys_MOC_UI}
      ${ansys_QT_SRC}
    )
  endif(MML_ANSYS_SUPPORT)
endif(EXISTS ${MML_ANSYS_WORKING_DIR})
endif(EXISTS ${MML_ANSYS_BIN})

set(MML_ARTISYNTH_BIN $ENV{MML_ARTISYNTH_BIN} CACHE FILE "Where to find artisynth binary")
set(MML_ARTISYNTH_WORKING_DIR $ENV{MML_ARTISYNTH_WORKING_DIR} CACHE PATH "Specify a folder for artisynth working files")
if(EXISTS ${MML_ARTISYNTH_BIN})
if(EXISTS ${MML_ARTISYNTH_WORKING_DIR})
  # Compile ARTISYNTH simulator files (ON or OFF)
  option(MML_ARTISYNTH_SUPPORT "Compile Artisynth simulator?" ON)

  # ARTISYNTH settings
  if(MML_ARTISYNTH_SUPPORT)
    # compilation flag
    add_definitions(-DARTISYNTH_SUPPORT)
    add_definitions(-DARTISYNTH_BIN="${MML_ARTISYNTH_BIN}" -DARTISYNTH_WORKING_DIR="${MML_ARTISYNTH_WORKING_DIR}")
    set(MML_ARTISYNTH_HEADERS
      simulator/simulators/ArtiSynth/ArtiSynthSimulator.h
    )
    set(MML_ARTISYNTH_SRC
      simulator/simulators/ArtiSynth/ArtiSynthSimulator.cpp
    )
  endif(MML_ARTISYNTH_SUPPORT)
endif(EXISTS ${MML_ARTISYNTH_WORKING_DIR})
endif(EXISTS ${MML_ARTISYNTH_BIN})

if(MML_GENERATE_GUI)
    set(MML_MOC_SRCS
	simulator/SimulatorWidget.h
	tools/Xmlhighlighter.h
    )
  qt4_wrap_cpp(MML_MOCS ${MML_MOC_SRCS})
  set(MML_QT_SRC
      simulator/SimulatorWidget.cpp
      tools/Xmlhighlighter.cpp
    )
endif(MML_GENERATE_GUI)

set(monitoring_H
  stoppingCriterion/StoppingCriterion.h
  stoppingCriterion/StoppingCriterionFactory.h
  stoppingCriterion/stoppingCriteria/Criterion.h
  stoppingCriterion/stoppingCriteria/CriterionFactory.h
  stoppingCriterion/stoppingCriteria/MultipleCriterion.h
  stoppingCriterion/stoppingCriteria/MultipleCriterionFactory.h
  stoppingCriterion/stoppingCriteria/Method.h
  stoppingCriterion/stoppingCriteria/MethodFactory.h
  stoppingCriterion/stoppingCriteria/criteria/Force.h 
  stoppingCriterion/stoppingCriteria/criteria/KineticEnergy.h
  stoppingCriterion/stoppingCriteria/criteria/Position.h
  stoppingCriterion/stoppingCriteria/criteria/Time.h
  stoppingCriterion/stoppingCriteria/criteria/Velocity.h
  stoppingCriterion/stoppingCriteria/multipleCriteria/AndMultipleCriterion.h
  stoppingCriterion/stoppingCriteria/multipleCriteria/OrMultipleCriterion.h
  stoppingCriterion/stoppingCriteria/methods/MinThreshold.h
  stoppingCriterion/stoppingCriteria/methods/Threshold.h
  simulator/Simulator.h
  simulator/NonInteractiveSimulator.h
  simulator/InteractiveSimulator.h
  simulator/SimulatorFactory.h
  simulator/simulators/InitSimulators.h
  ${MML_SOFA_HEADERS}
  ${MML_ANSYS_HEADERS}
  ${MML_ARTISYNTH_HEADERS}
  ${MML_MOC_SRCS}
  monitor/Monitor.h 
  monitor/MonitorFactory.h
  monitor/monitors/MonitorGeometricDeviation.h
  monitor/monitors/MonitorPosition.h
  monitor/monitors/MonitorRen.h
  monitor/monitors/MonitorForce.h
  monitor/monitors/MonitorPointSetDistance.h
  monitor/monitors/MonitorPointFinalSetDistance.h
  monitor/monitors/MonitorVolume.h
  monitor/monitors/MonitorSurface.h
  monitor/monitors/MonitorDisplacement.h
  monitor/monitors/MonitorNormDisplacement.h
  reference/Reference.h
  tools/Chrono.h
  tools/Tools.h
  tools/Macros.h
  tools/AtomIterator.h
  tools/SurfaceExtractor/Facet.h
  tools/SurfaceExtractor/SurfaceExtractor.h
  manager/MonitoringManager.h
  manager/MonitoringManagerFactory.h
  manager/InteractiveMonitoringManager.h
  manager/NonInteractiveMonitoringManager.h
)

set(monitoring_SRCS
  ${monitoring_H}
  stoppingCriterion/StoppingCriterion.cpp
  stoppingCriterion/StoppingCriterionFactory.cpp
  stoppingCriterion/stoppingCriteria/Criterion.cpp
  stoppingCriterion/stoppingCriteria/CriterionFactory.cpp
  stoppingCriterion/stoppingCriteria/MultipleCriterion.cpp
  stoppingCriterion/stoppingCriteria/MultipleCriterionFactory.cpp
  stoppingCriterion/stoppingCriteria/Method.cpp
  stoppingCriterion/stoppingCriteria/MethodFactory.cpp
  stoppingCriterion/stoppingCriteria/criteria/Force.cpp 
  stoppingCriterion/stoppingCriteria/criteria/KineticEnergy.cpp
  stoppingCriterion/stoppingCriteria/criteria/Position.cpp
  stoppingCriterion/stoppingCriteria/criteria/Time.cpp
  stoppingCriterion/stoppingCriteria/criteria/Velocity.cpp
  stoppingCriterion/stoppingCriteria/multipleCriteria/AndMultipleCriterion.cpp
  stoppingCriterion/stoppingCriteria/multipleCriteria/OrMultipleCriterion.cpp
  stoppingCriterion/stoppingCriteria/methods/MinThreshold.cpp
  stoppingCriterion/stoppingCriteria/methods/Threshold.cpp
  simulator/Simulator.cpp
  simulator/NonInteractiveSimulator.cpp
  simulator/InteractiveSimulator.cpp
  simulator/SimulatorFactory.cpp
  ${MML_SOFA_SRC}
  ${MML_ANSYS_SRC}
  ${MML_ARTISYNTH_SRC}
  ${MML_MOCS}
  ${MML_QT_SRC}
  monitor/Monitor.cpp
  monitor/MonitorFactory.cpp
  monitor/monitors/MonitorGeometricDeviation.cpp
  monitor/monitors/MonitorPosition.cpp
  monitor/monitors/MonitorRen.cpp
  monitor/monitors/MonitorForce.cpp
  monitor/monitors/MonitorPointSetDistance.cpp
  monitor/monitors/MonitorPointFinalSetDistance.cpp
  monitor/monitors/MonitorVolume.cpp
  monitor/monitors/MonitorSurface.cpp
  monitor/monitors/MonitorDisplacement.cpp
  monitor/monitors/MonitorNormDisplacement.cpp
  reference/Reference.cpp
  tools/Chrono.cpp
  tools/Tools.cpp
  tools/AtomIterator.cpp
  tools/SurfaceExtractor/Facet.cpp
  tools/SurfaceExtractor/SurfaceExtractor.cpp
  manager/MonitoringManager.cpp
  manager/MonitoringManagerFactory.cpp
  manager/InteractiveMonitoringManager.cpp
  manager/NonInteractiveMonitoringManager.cpp
)

set(monitoring_LIBRARIES
  mml
  pml
  lml
)

set(monitoring_link)

if(MML_SOFA_SUPPORT)
  set(monitoring_LIBRARIES
  ${monitoring_LIBRARIES}
  ${MML_SOFA_LIBS}
  )
  set(monitoring_link ${monitoring_link} ${MML_SOFA_LIB_DIR})
endif(MML_SOFA_SUPPORT)

if(MML_GENERATE_GUI)
  set(monitoring_LIBRARIES
  ${monitoring_LIBRARIES}
  ${QT_LIBRARIES}
  )
endif(MML_GENERATE_GUI)

set(monitoring_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
          ${CMAKE_CURRENT_BINARY_DIR}
          #${CMAKE_CURRENT_BINARY_DIR}/../schema # for the xsd generated headers
          ${MML_INCLUDE_DIRECTORIES}
          ${MML_SOFA_INCLUDE_DIR}
)

if(MML_GENERATE_GUI)
  set(monitoring_INCLUDE_DIR ${monitoring_INCLUDE_DIR} ${QT_INCLUDE_DIR})
endif(MML_GENERATE_GUI)

include_directories(${monitoring_INCLUDE_DIR})

link_directories(${monitoring_link})

add_library(monitoring STATIC ${monitoring_SRCS}) # better use static libs for distributing executables

target_link_libraries(monitoring ${monitoring_LIBRARIES})


add_dependencies(monitoring lml pml mml)

#--------------
# installation
#--------------
export_headers(
  manager/MonitoringManager.h
  manager/MonitoringManagerFactory.h
  manager/InteractiveMonitoringManager.h
  manager/NonInteractiveMonitoringManager.h 
  SUBDIRECTORY manager
  COMPONENT monitoring
)

export_headers(
  tools/Chrono.h
  tools/Tools.h
  tools/Macros.h
  tools/SurfaceExtractor/Facet.h
  tools/SurfaceExtractor/SurfaceExtractor.h
  SUBDIRECTORY tools
  COMPONENT monitoring
)

export_headers(
  reference/Reference.h
  SUBDIRECTORY reference
  COMPONENT monitoring
)

export_headers(
  monitor/Monitor.h 
  monitor/MonitorFactory.h
  SUBDIRECTORY monitor
  COMPONENT monitoring
)

export_headers(
  monitor/monitors/MonitorGeometricDeviation.h
  monitor/monitors/MonitorPosition.h
  monitor/monitors/MonitorRen.h
  monitor/monitors/MonitorForce.h
  monitor/monitors/MonitorPointSetDistance.h
  monitor/monitors/MonitorPointFinalSetDistance.h
  SUBDIRECTORY monitor/monitors
  COMPONENT monitoring
)

if(MML_ANSYS_SUPPORT)
export_headers(
  simulator/simulators/Ansys/AnsysBatch.h
  simulator/simulators/Ansys/AnsysBatchWriter.h
  simulator/simulators/Ansys/AnsysSimulator.h
  SUBDIRECTORY simulator/simulators/Ansys
  COMPONENT monitoring
)

export_headers(
  simulator/simulators/Ansys/AnsysBatchWriters/PrepWriter.h
  simulator/simulators/Ansys/AnsysBatchWriters/SoluWriter.h
  simulator/simulators/Ansys/AnsysBatchWriters/PostWriter.h
  simulator/simulators/Ansys/AnsysBatchWriters/ParametersWriter.h
  SUBDIRECTORY simulator/simulators/Ansys/AnsysBatchWriters
  COMPONENT monitoring
)
endif()

if(MML_ARTISYNTH_SUPPORT)
export_headers(
  simulator/simulators/ArtiSynth/ArtiSynthSimulator.h
  SUBDIRECTORY simulator/simulators/ArtiSynth
  COMPONENT monitoring
)
endif()

if(MML_SOFA_SUPPORT)
export_headers(
  ${MML_SOFA_HEADERS}
  SUBDIRECTORY simulator/simulators/Sofa
  COMPONENT monitoring
)
endif()

if(MML_GENERATE_GUI)
export_headers(
  simulator/SimulatorWidget.h
  SUBDIRECTORY simulator
  COMPONENT monitoring
)

export_headers(
  tools/Xmlhighlighter.h
  SUBDIRECTORY tools
  COMPONENT monitoring
)
endif(MML_GENERATE_GUI)

export_headers(
  simulator/Simulator.h
  simulator/NonInteractiveSimulator.h
  simulator/InteractiveSimulator.h
  simulator/SimulatorFactory.h
  SUBDIRECTORY simulator
  COMPONENT monitoring
)

export_headers(
  simulator/simulators/InitSimulators.h
  SUBDIRECTORY simulator/simulators
  COMPONENT monitoring
)

export_headers(
  stoppingCriterion/StoppingCriterion.h
  stoppingCriterion/StoppingCriterionFactory.h
  SUBDIRECTORY stoppingCriterion
  COMPONENT monitoring
)

export_headers(
  stoppingCriterion/stoppingCriteria/Criterion.h
  stoppingCriterion/stoppingCriteria/CriterionFactory.h
  stoppingCriterion/stoppingCriteria/MultipleCriterion.h
  stoppingCriterion/stoppingCriteria/MultipleCriterionFactory.h
  stoppingCriterion/stoppingCriteria/Method.h
  stoppingCriterion/stoppingCriteria/MethodFactory.h
  SUBDIRECTORY stoppingCriterion/stoppingCriteria
  COMPONENT monitoring
)

export_headers(
  stoppingCriterion/stoppingCriteria/criteria/Force.h 
  stoppingCriterion/stoppingCriteria/criteria/KineticEnergy.h
  stoppingCriterion/stoppingCriteria/criteria/Position.h
  stoppingCriterion/stoppingCriteria/criteria/Time.h
  stoppingCriterion/stoppingCriteria/criteria/Velocity.h
  SUBDIRECTORY stoppingCriterion/stoppingCriteria/criteria
  COMPONENT monitoring
)

export_headers(
  stoppingCriterion/stoppingCriteria/multipleCriteria/AndMultipleCriterion.h
  stoppingCriterion/stoppingCriteria/multipleCriteria/OrMultipleCriterion.h
  SUBDIRECTORY stoppingCriterion/stoppingCriteria/multipleCriteria
  COMPONENT monitoring
)

export_headers(
  stoppingCriterion/stoppingCriteria/methods/MinThreshold.h
  stoppingCriterion/stoppingCriteria/methods/Threshold.h
  SUBDIRECTORY stoppingCriterion/methods
  COMPONENT monitoring
)

# lib installation
install(TARGETS monitoring
        ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}
        COMPONENT monitoring
)


