outils/OutilCreationLiaison.js

/*
 * Created by yvesb on 20/03/2017.
 */
/*
 * 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 NatObj from '../types/NatObj'
import Nat from '../types/Nat'
import CPointLieDroite from '../objets/CPointLieDroite'
import CPointLieCercle from '../objets/CPointLieCercle'
import CPointLieLigne from '../objets/CPointLieLigne'
import CPointLiePoint from '../objets/CPointLiePoint'
import CPointLieLieuParPtLie from '../objets/CPointLieLieuParPtLie'
import CPointLieLieuParVar from '../objets/CPointLieLieuParVar'
import Pointeur from '../types/Pointeur'
import AvertDlg from '../dialogs/AvertDlg'

export default OutilCreationLiaison

/**
 * Outil servant à transformer un point libre en un point lié à u  objet
 * @param {MtgApp} app L'application propriétaire
 * @constructor
 */
function OutilCreationLiaison (app) {
  Outil.call(this, app, 'CreationLiaison', 32877, true)
}

OutilCreationLiaison.prototype = new Outil()

OutilCreationLiaison.prototype.select = function () {
  Outil.prototype.select.call(this)
  const app = this.app
  this.point = null // Pointera sur le point libre qu'on veut lier à un objet
  app.outilPointageActif = app.outilPointageObjetClignotant
  app.listeClignotante.ajouteObjetsParNatureNonMasques(app.listePr, NatObj.NPointBase)
  app.outilPointageActif.aDesigner = NatObj.NPointBase
  app.outilPointageActif.reset(false, true) // Deuxième paramètre true pour pouvoir désigner un objet clignotant
  this.resetClignotement()
  app.indication('indCrLiaison1')
}

OutilCreationLiaison.prototype.traiteObjetDesigne = function (elg, point) {
  const app = this.app
  if (this.point === null) {
    this.point = elg
    // On n'exclut pas pointPourTrace d'une désignation possible car le point lié peut être égal
    // au point générateur du lieu
    this.annuleClignotement()
    app.outilPointageActif = app.outilPointageCre
    app.outilPointageActif.aDesigner = Nat.or(NatObj.NTteDroite, NatObj.NCercle, NatObj.NArc, NatObj.NTtPoint,
      NatObj.NPolygone, NatObj.NLigneBrisee, NatObj.NLieu, NatObj.NPointBase)
    app.outilPointageActif.reset()
    this.ajouteClignotementDe(elg)
    this.excluDeDesignation(elg)
    this.resetClignotement()
    app.indication('indCrLiaison2')
  } else {
    if (elg.appartientABlocDependantPourReclassement(this.point)) {
      const self = this
      new AvertDlg(app, 'OpImp', function () {
        self.app.activeOutilCapt()
      })
    } else this.creeLiaison(elg, point)
  }
}

OutilCreationLiaison.prototype.creeLiaison = function (el, point) {
  let Cl, ptLie
  const app = this.app
  const list = app.listePr
  this.annuleClignotement()
  if (el.estDeNature(NatObj.NTteDroite)) {
    Cl = CPointLieDroite
  } else {
    if (el.estDeNature(NatObj.NTtCercle)) {
      Cl = CPointLieCercle
    } else {
      if (el.estDeNature(Nat.or(NatObj.NPolygone, NatObj.NLigneBrisee))) {
        Cl = CPointLieLigne
      } else {
        if (el.estDeNature(NatObj.NTtPoint)) {
          Cl = CPointLiePoint
        } else {
          if (el.estDeNature(NatObj.NLieu)) {
            if (el.className === 'CLieuDePoints') {
              Cl = CPointLieLieuParPtLie
            } else {
              // Cas d'un point lié à un lieu de points généré par une variable
              Cl = CPointLieLieuParVar
            }
          }
        }
      }
    }
  }
  if (Cl === CPointLiePoint) {
    ptLie = new Cl(app.listePr, null, false, this.point.couleur, this.point.nomMasque,
      this.point.decX, this.point.decY, this.point.masque, this.point.nom, this.point.tailleNom,
      this.point.motif, this.point.marquePourTrace, el)
  } else {
    ptLie = new Cl(app.listePr, null, false, this.point.couleur, this.point.nomMasque,
      this.point.decX, this.point.decY, this.point.masque, this.point.nom, this.point.tailleNom,
      this.point.motif, this.point.marquePourTrace, this.point.fixed, 0, el)
    const abs = new Pointeur()
    const pointres = { x: 0, y: 0 }
    ptLie.testDeplacement(app.dimf, point.x, point.y, pointres, abs)
    ptLie.donneAbscisse(abs.getValue())
  }
  const indicePointRemplace = list.indexOf(this.point)
  const indiceObjetCible = el.estElementFinal ? list.indexOf(el.impProto.dernierObjetFinal()) : list.indexOf(el)
  list.remplaceObjet(this.point, ptLie)
  list.remplacePoint(this.point, ptLie)
  ptLie.tag = this.point.tag // Ajout version 6.6.0

  // Si l'objet auquel on doit lier le point a été créé après le
  // point, il faut décaler le point ainsi que tous les objets en
  // dépendant et ayant été créés entre ce point et l'objet
  // immédiatement après cet objet}
  if (indicePointRemplace < indiceObjetCible) list.decaleDependants(indicePointRemplace, indiceObjetCible)

  // Ajout version 4.8.0 : Il faut remettre à jour les index de chaque élément de la liste (CElementBase.index)
  list.updateIndexes()
  this.point.removegElement(app.svgFigure)
  const coulFond = app.doc.couleurFond
  ptLie.positionne(false, app.dimf)
  ptLie.creeAffichage(app.svgFigure, false, coulFond)
  list.metAJour() // Ajout version 6.3.0
  list.positionne(false, app.dimf)
  list.update(app.svgFigure, coulFond, true)
  this.saveFig()
  app.reInitConst()
  app.activeOutilCapt()
}