#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Test000
Checks the availability of the external plugins :
 1 NETGENPLUGIN
 2 GMSHPLUGIN
 3 MG-CADSURF           (BLSURFPLUGIN)
 4 MG-TETRA             (GHS3DPLUGIN)
 5 MG-HEXA              (HEXOTICPLUGIN)
 6 MG-HYBRID            (HYBRIDPLUGIN)
Copyright EDF R&D 2017
"""
__revision__ = "V1.0"
#
# Computation of the meshes: T/F
ComputeMeshes = True

import salome
import platform

salome.salome_init_without_session()
theStudy = salome.myStudy
#
import iparameters
IPAR = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", 1))

# fill list AP_MODULES_LIST
IPAR.append("AP_MODULES_LIST", "Geometry")
IPAR.append("AP_MODULES_LIST", "Mesh")

ERROR = 0
MESSAGE = ""
#
while not ERROR :

###
### A. GEOM component
###
  import GEOM
  from salome.geom import geomBuilder
  geompy = geomBuilder.New()
  O = geompy.MakeVertex(0, 0, 0, "0")
  OX = geompy.MakeVectorDXDYDZ(1, 0, 0, "OX")
  OY = geompy.MakeVectorDXDYDZ(0, 1, 0, "OY")
  OZ = geompy.MakeVectorDXDYDZ(0, 0, 1, "OZ")
  BOX = geompy.MakeBoxDXDYDZ(200, 200, 200, "BOX")

###
### B. SMESH component
###

  import  SMESH
  from salome.smesh import smeshBuilder

  smesh = smeshBuilder.New()

# B.1. NETGEN
  TEXTE = "NETGEN_1D2D3D"
  MESH_1 = smesh.Mesh(BOX)
  smesh.SetName(MESH_1.GetMesh(), "M_"+TEXTE)
  try :
    NETGEN_2D3D = MESH_1.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
  except :
    MESSAGE += "\nImpossible d'utiliser "+TEXTE
    ERROR += 1
  else :
    if ComputeMeshes :
      smesh.SetName(NETGEN_2D3D.GetAlgorithm(), TEXTE)
      OK_COMPUTE = MESH_1.Compute()
      if not OK_COMPUTE :
        MESSAGE += "\nErreur avec "+TEXTE
        ERROR += 1
      else :
        print(TEXTE+": OK")

# B.2. Gmsh
  # GMSH for windows not yet implemented BOS #18709
  if platform.system() != "Windows" :
    TEXTE = "Gmsh"
    MESH_2 = smesh.Mesh(BOX)
    smesh.SetName(MESH_2.GetMesh(), "M_"+TEXTE)
    try :
      GMSH = MESH_2.Tetrahedron(algo=smeshBuilder.GMSH)
    except :
      MESSAGE += "\nImpossible d'utiliser "+TEXTE
      ERROR += 1
    else :
      if ComputeMeshes :
        smesh.SetName(GMSH.GetAlgorithm(), TEXTE)
        OK_COMPUTE = MESH_2.Compute()
        if not OK_COMPUTE :
          MESSAGE += "\nErreur avec "+TEXTE
          ERROR += 1
        else :
          print(TEXTE+": OK")
  else :
    print("Skipping B.2 on windows")

# B.3. MG_CADSurf
  TEXTE = "MG_CADSurf"
  MESH_3 = smesh.Mesh(BOX)
  smesh.SetName(MESH_3.GetMesh(), "M_"+TEXTE)
  try :
    MG_CADSurf = MESH_3.Triangle(algo=smeshBuilder.MG_CADSurf)
  except :
    MESSAGE += "\nImpossible d'utiliser "+TEXTE
    ERROR += 1
#   On arrete tout en cas de problème car les suivants en dépendent
    break
  else :
    if ComputeMeshes :
      smesh.SetName(MG_CADSurf.GetAlgorithm(), TEXTE)
      OK_COMPUTE = MESH_3.Compute()
      if not OK_COMPUTE :
        MESSAGE += "\nErreur avec "+TEXTE
        ERROR += 1
      else :
        print(TEXTE+": OK")

# B.4. MG_Tetra
  TEXTE = "MG_Tetra"
  MESH_4 = smesh.Mesh(BOX)
  smesh.SetName(MESH_4.GetMesh(), "M_"+TEXTE)
  MG_CADSurf_Te = MESH_4.Triangle(algo=smeshBuilder.MG_CADSurf)
  try :
    MG_Tetra = MESH_4.Tetrahedron(algo=smeshBuilder.MG_Tetra)
  except :
    MESSAGE += "\nImpossible d'utiliser "+TEXTE
    ERROR += 1
  else :
    if ComputeMeshes :
      smesh.SetName(MG_Tetra.GetAlgorithm(), TEXTE)
      OK_COMPUTE = MESH_4.Compute()
      if not OK_COMPUTE :
        MESSAGE += "\nErreur avec "+TEXTE
        ERROR += 1
      else :
        print(TEXTE+": OK")

# B.5. MG_Hexa
  TEXTE = "MG_Hexa"
  MESH_5 = smesh.Mesh(BOX)
  smesh.SetName(MESH_5.GetMesh(), "M_"+TEXTE)
  MG_CADSurf_He = MESH_5.Triangle(algo=smeshBuilder.MG_CADSurf)
  try :
    MG_Hexa = MESH_5.Hexahedron(algo=smeshBuilder.MG_Hexa)
  except :
    MESSAGE += "\nImpossible d'utiliser "+TEXTE
    ERROR += 1
  else :
    if ComputeMeshes :
      smesh.SetName(MG_Hexa.GetAlgorithm(), TEXTE)
      OK_COMPUTE = MESH_5.Compute()
      if not OK_COMPUTE :
        MESSAGE += "\nErreur avec "+TEXTE
        ERROR += 1
      else :
        print(TEXTE+": OK")

# B.6. MG_Hybrid
  TEXTE = "MG_Hybrid"
  MESH_6 = smesh.Mesh(BOX)
  smesh.SetName(MESH_6.GetMesh(), "M_"+TEXTE)
  MG_CADSurf_Hy = MESH_6.Triangle(algo=smeshBuilder.MG_CADSurf)
  try :
    MG_Hybrid = MESH_6.Tetrahedron(algo=smeshBuilder.HYBRID)
  except :
    MESSAGE += "\nImpossible d'utiliser "+TEXTE
    ERROR += 1
  else :
    if ComputeMeshes :
      smesh.SetName(MG_Hybrid.GetAlgorithm(), TEXTE)
      OK_COMPUTE = MESH_6.Compute()
      if not OK_COMPUTE :
        MESSAGE += "\nErreur avec "+TEXTE
        ERROR += 1
      else :
        print(TEXTE+": OK")

  break

###
### C. End
###
if ERROR :
  raise Exception("\n\nNombre d'erreurs : %d" % ERROR + MESSAGE + "\n")
else :
  print("\nAucun problème\n")