outils/OutilMatriceCoord.js

/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */
import Outil from '../outils/Outil'
import NomMesureDlg from 'src/dialogs/NomMesureDlg'
import NatObj from 'src/types/NatObj'
import CMesureX from 'src/objets/CMesureX'
import CMesureY from 'src/objets/CMesureY'
import CValeur from 'src/objets/CValeur'
import CResultatValeur from 'src/objets/CResultatValeur'
import CMatrice from 'src/objets/CMatrice'
import NatCal from 'src/types/NatCal'

export default OutilMatriceCoord

/**
 * Outil servant à créer un matrice dynamique de coordonnées de points sur lesquels on clique
 * @param {MtgApp} app L'application propriétaire
 * @constructor
 */
function OutilMatriceCoord (app) {
  // Dernier paramètre à false car cet outil n'a pas d'icône associée
  Outil.call(this, app, 'MatriceCoord', 32052, false, false, false, false)
}

OutilMatriceCoord.prototype = new Outil()

OutilMatriceCoord.prototype.select = function () {
  Outil.prototype.select.call(this)
  const app = this.app
  const self = this
  this.listePoints = []
  new NomMesureDlg(this.app, 'NomMat',
    function (st, rep) {
      self.nomMat = st
      self.rep = rep
      app.outilPointageActif = app.outilPointageCre
      app.outilPointageCre.aDesigner = NatObj.NTtPoint
      app.outilPointageCre.reset()
      self.resetClignotement()
      app.indication('ClicPts', self.preIndication())
    },
    function () {
      app.activeOutilCapt()
    }, true, 'NomMat')
}

OutilMatriceCoord.prototype.deselect = function () {
  this.listePoints = null
  Outil.prototype.deselect.call(this)
  this.app.showStopButton(false)
}

OutilMatriceCoord.prototype.traiteObjetDesigne = function (elg) {
  this.listePoints.push(elg)
  this.ajouteClignotementDe(elg)
  this.excluDeDesignation(elg)
  if (this.listePoints.length > 1) this.app.showStopButton(true)
}

OutilMatriceCoord.prototype.creeObjet = function () {
  // On crée des mesures des abscisses et des ordonnées de points cliqués
  const app = this.app
  const list = app.listePr
  const listePoints = this.listePoints
  const nbPts = listePoints.length
  const tabmesabs = []
  const tabmesord = []
  for (let i = 0; i < nbPts; i++) {
    const pt = listePoints[i]
    if (pt.nom === '') {
      pt.donneNom(list.genereNomPourPointOuDroite('M', true))
      pt.nomMasque = true
    }
    const mesabs = new CMesureX(list, null, false,
      list.genereNomPourCalcul('mesx', true), this.rep, listePoints[i])
    tabmesabs.push(mesabs)
    const mesord = new CMesureY(list, null, false,
      list.genereNomPourCalcul('mesy', true), this.rep, listePoints[i])
    tabmesord.push(mesord)
    app.ajouteElement(mesabs)
    app.ajouteElement(mesord)
  }
  // On crée une matrice de deux colonnes formées des mesures d'abscisses en première colonne
  // et d'ordonnées en deuxième
  const tabVal = []
  for (let i = 0; i < nbPts; i++) {
    const lig = []
    for (let j = 0; j < 2; j++) {
      lig.push(new CValeur(list, new CResultatValeur(list, tabmesabs[i])))
      lig.push(new CValeur(list, new CResultatValeur(list, tabmesord[i])))
    }
    tabVal.push(lig)
  }
  const mat = new CMatrice(list, null, false, this.nomMat, nbPts, 2, tabVal)
  app.ajouteElement(mat)
  this.saveFig()
  app.activeOutilCapt()
  app.showStopButton(false)
}

OutilMatriceCoord.prototype.actionFin = function () {
  this.annuleClignotement()
  this.creeObjet()
}

OutilMatriceCoord.prototype.preIndication = function () {
  return 'MatriceCoord'
}

OutilMatriceCoord.prototype.activationValide = function () {
  return this.app.listePr.nombreObjetsCalcul(NatCal.NRepere) > 0
}