outils/OutilArcParRapporteur.js

/*
 * Created by yvesb on 14/01/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 { ConvDegRad, uniteAngleRadian } from '../kernel/kernel'
import StyleTrait from '../types/StyleTrait'
import CValeurAngle from '../objets/CValeurAngle'
import CValeur from '../objets/CValeur'
import CArcDeCercle from '../objets/CArcDeCercle'
import OutilRapporteur from '../outils/OutilRapporteur'
import Color from '../types/Color'
import CSegment from '../objets/CSegment'
import CPointImage from '../objets/CPointImage'
import MotifPoint from '../types/MotifPoint'
import CCercleOA from '../objets/CCercleOA'
import CDroiteDirectionFixe from '../objets/CDroiteDirectionFixe'
import CPointLieDroite from '../objets/CPointLieDroite'
import CPointLieCercle from '../objets/CPointLieCercle'
import CMesureAngleOriente from '../objets/CMesureAngleOriente'
import CMesureAngleGeometrique from '../objets/CMesureAngleGeometrique'
import CHomothetie from '../objets/CHomothetie'
import CValeurAffichee from '../objets/CValeurAffichee'
import CAffLiePt from '../objets/CAffLiePt'
import StyleEncadrement from '../types/StyleEncadrement'
import CResultatValeur from '../objets/CResultatValeur'

export default OutilArcParRapporteur

/**
 * Outil de création d'un arc de cercle par rapporteur
 * @param {MtgApp} app L'application propriétaire
 * @param toolName String : Le nom de l'outil
 * @param toolIndex Integer : L'index de l'outil tel que dans la version Java
 * @constructor
 */
function OutilArcParRapporteur (app, toolName, toolIndex) {
  if (arguments.length === 1) OutilRapporteur.call(this, app, 'ArcParRapporteur', 33036, true)
  else OutilRapporteur.call(this, app, toolName, toolIndex)
}

OutilArcParRapporteur.prototype = new OutilRapporteur()

OutilArcParRapporteur.prototype.ajouteObjetsVisuels = function () {
  const app = this.app
  let ptp = null
  const listeVisuelle = this.app.listeObjetsVisuels
  const stfc = StyleTrait.stfc(listeVisuelle)
  const stfp = StyleTrait.stfp(listeVisuelle)
  const bl = Color.black
  if (this.point2 === null) {
    ptp = this.ajouteRapporteur(this.point1) // Le pointeur renvoyé dans ptp est
    // un pointeur sur un point d'intersection d'une demi-droite avec un cercle.
    this.ptCercle = new CCercleOA(listeVisuelle, null, false, bl, false, stfc, this.point1, ptp)
    app.ajouteObjetVisuel(this.ptCercle)
    app.afficheObjetVisuels(0) // Ajout version 6.4.4
  } else {
    const inddeb = listeVisuelle.longueur()
    // Si le point dont on veut créer l'image a été désigné, le cercle précédent
    // devient fixe en remplaçant dans la liste visuelle le point souris
    // par Point2
    listeVisuelle.remplacePoint(app.mousePoint, this.point2)
    // Pour pouvoir initialiser l'abscisse du point lié, il faut mesurer
    // un angle orienté à partir d'une horizontale
    const ptdh = new CDroiteDirectionFixe(listeVisuelle, null, false, bl, true, 0, 0, true, '', 16, stfc, 1, this.point1, true, 1)
    app.ajouteObjetVisuel(ptdh)
    // On lui lie un point d'abscisse 1
    const ptld = new CPointLieDroite(listeVisuelle, null, false, bl, true, 0, 0, true, '', 16,
      MotifPoint.petitRond, false, false, 1, ptdh)
    app.ajouteObjetVisuel(ptld)
    // On mesure l'angle
    const ptmao = new CMesureAngleOriente(listeVisuelle, null, false, ptld, this.point1, this.point2, '')
    app.ajouteObjetVisuel(ptmao)
    app.listeObjetsVisuels.positionne(false, app.dimf)
    // On rajoute un point lié au cercle pointé par ptCercle
    // Son abscisse est son angle polaire en radians
    let ang = ptmao.rendValeur() * ConvDegRad
    if (ang < 0) ang = ang + 2 * Math.PI
    const ptPointLie = new CPointLieCercle(listeVisuelle, null, false, bl, true, 0, 0, false, '', 16,
      MotifPoint.petitRond, false, false, ang, this.ptCercle)
    app.ajouteObjetVisuel(ptPointLie)
    // On crée la mesure de l'angle orienté point2, point1, pointSouris
    this.ptMesureAngle = new CMesureAngleOriente(listeVisuelle, null, false, this.point2, this.point1, ptPointLie, '')
    app.ajouteObjetVisuel(this.ptMesureAngle)
    // On crée aussi la mesure de l'angle géométrique pour affichage sur le rapporteur
    const ptmesag = new CMesureAngleGeometrique(listeVisuelle, null, false, this.point2, this.point1, ptPointLie)
    app.ajouteObjetVisuel(ptmesag)
    // On crée une nouveau point écarté du rapporteur
    // Pour cela on crée une homothétie
    const ptHom2 = new CHomothetie(listeVisuelle, null, false, this.point1, new CValeur(listeVisuelle, 1.25))
    app.ajouteObjetVisuel(ptHom2)
    const ptimh = new CPointImage(listeVisuelle, null, false, bl, true, 0, 0, true, '', 16, MotifPoint.petitRond, false,
      ptPointLie, ptHom2)
    app.ajouteObjetVisuel(ptimh)
    // On crée l'image provisoire du point
    // D'abord une rotation
    const valang = new CValeurAngle(listeVisuelle, new CResultatValeur(listeVisuelle, this.ptMesureAngle))
    const doc = app.doc
    // On affiche la valeur liée au point précédent avec effacement de ce qu'il y a dessous
    const ptaff = new CValeurAffichee(listeVisuelle, null, false, Color.blue, 0, 0, 0, 0, false, ptimh, 16,
      StyleEncadrement.Sans, false, doc.couleurFond, CAffLiePt.alignHorCent,
      CAffLiePt.alignVerCent, ptmesag, '', '°', 0)
    app.ajouteObjetVisuel(ptaff)
    // L'arc de cercle
    // var ptArc = new CArcDeCercle(frame.cadreActif().listePr, null, false,
    //  frame.couleurActive(), false, frame.styleTraitActif(), point1, point2, null, valang);
    this.ajouteArcVisuel(valang)
    // On crée un segment pointillés (on ne sait pas si on est à l'intérieur
    // ou l'extérieur du rapporteur
    const ptseg1 = new CSegment(listeVisuelle, null, false, bl, false, stfp, this.point1, ptPointLie)
    app.ajouteObjetVisuel(ptseg1)
    app.afficheObjetVisuels(inddeb) // Ajout version 6.4.4
    // On passe la main à l'outil de désignation ad hoc
    app.outilPointageActif = app.outilPointageRapporteur
    app.outilPointageActif.reset()
    app.outilPointageRapporteur.associePointLie(ptPointLie)
  }
}

OutilArcParRapporteur.prototype.ajouteArcVisuel = function (valang) {
  const app = this.app
  app.ajouteObjetVisuel(new CArcDeCercle(app.listeVisuelle, null, false, app.getCouleur(), false, app.getStyleTrait(),
    this.point1, this.point2, null, valang))
}

OutilArcParRapporteur.prototype.creeObjet = function () {
  const app = this.app
  const liste = app.listePr
  const svg = app.svgFigure
  let valeurAngle = this.ptMesureAngle.rendValeur()
  const indiceImpInitial = liste.longueur()

  // On arrondit au degré près en degrés
  // Modifié version 5.1.1
  // if (liste.uniteAngle == UniteAngle.Radian) valeurAngle = valeurAngle*CValeurAngle.convRadDeg;
  if (liste.uniteAngle === uniteAngleRadian) valeurAngle = valeurAngle * ConvDegRad
  // Modifié version 7.3 pour optimisation
  // if (valeurAngle !== Math.floor(valeurAngle)) valeurAngle = Math.floor(valeurAngle + 0.5)
  valeurAngle = Math.round(valeurAngle)
  if (valeurAngle === -180) valeurAngle = 180
  const valang = new CValeurAngle(liste, valeurAngle)
  const ptArc = new CArcDeCercle(liste, null, false, app.getCouleur(), false, app.getStyleTrait(),
    this.point1, this.point2, null, valang)
  app.ajouteElement(ptArc)

  if (app.verifieDernierElement(1)) {
    this.saveFig()
    liste.afficheTout(indiceImpInitial, svg, true, app.doc.couleurFond)
  }
  this.deselect()
  this.select()
}

OutilArcParRapporteur.prototype.isWorking = function () {
  return (this.point1 !== null) && (this.point2 !== null)
}