objetsAdd/CMathGraphDocAdd.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 CMathGraphDoc from '../objets/CMathGraphDoc'
import CListeObjets from '../objets/CListeObjets'
import NatObj from '../types/NatObj'
import { chaineNombre } from '../kernel/kernel'
import Dimf from '../types/Dimf'

export default CMathGraphDoc

/**
 * Fonction changeant les outils autorisés
 * @param {MtgApp} app L'application propriétaire
 * @param itemsCochesInterdits true si les outil sont les outils interdits et false sinon
 * @param {number[]} itemsArray  Les toolIndex des outils autorisés.
 * @param nivFilter Le niveau pour filtrer les outils.
 * Dans le cas où itemCochesInterdits est true, il faut rajouter à la liste des outils interdits les outils
 * qui ne sont pas permis dans ce niveau
 */
CMathGraphDoc.prototype.setIdMenus = function (app, itemsCochesInterdits, itemsArray, nivFilter) {
  let i, tabTool, ind, eb, tab, size, tool
  this.itemsCochesInterdits = itemsCochesInterdits
  this.listeIdMenus = []
  for (i = 0; i < itemsArray.length; i++) {
    this.listeIdMenus.push(itemsArray[i]) // à revoir
  }
  if ((itemsCochesInterdits) && nivFilter !== 3) {
    tabTool = ['Points', 'Droites', 'Segments', 'Cercles', 'Polys', 'Marques', 'Lieux', 'Transf', 'Mes', 'Disp', 'Calculs', 'Surfaces']
    for (ind = 0; ind < tabTool.length; ind++) {
      eb = app['bar' + tabTool[ind]]
      tab = eb.tab
      size = tab.length
      for (i = 0; i < size; i++) {
        tool = app['outil' + tab[i]]
        if (!app.levels[nivFilter].toolDispo(tool.toolIndex)) this.listeIdMenus.push(tool.toolIndex)
      }
    }
  }
}

/**
 * Fonction changeant les outils autorisés à partir du docuent doc
 * @param {CMathGraphDoc} doc
 */
CMathGraphDoc.prototype.setIdMenusFromDoc = function (doc) {
  this.itemsCochesInterdits = doc.itemsCochesInterdits
  this.listeIdMenus = []
  const lim = doc.listeIdMenus
  for (let i = 0; i < lim.length; i++) {
    this.listeIdMenus.push(lim[i])
  }
}
/**
 * Fonction renvoyant true si la figure a des outils spécifiés.
 * Utilisé dans OptionsFigDlgs
 * @returns {boolean}
 */
CMathGraphDoc.prototype.hasOwnTools = function () {
  return (!this.itemsCochesInterdits || this.listeIdMenus.length !== 0)
}

/**
 * Fonction renvoyant le code Tikz de la figure sans les déclarations
 * @param {MtgApp} app L'application
 * @param coefMult Coefficient multiplicateur pour la taille
 * @param {boolean} bu Si true, la longueur unité de la figure est utilisée
 * @param {boolean}isCommented Si true, des commentaires sont ajoutés pour décrire chaque objet graphique
 * @returns {string}
 */
CMathGraphDoc.prototype.getTikzCodeOnly = function (app, coefMult, bu, isCommented) {
  let i; let elb; let ch; let stb
  const doc = app.doc
  const avecCadre = app.cadre !== null

  const dimf = avecCadre ? new Dimf(app.widthCadre, app.heightCadre) : doc.dimf
  // Il faut cloner la liste principale car sinon certains elements avec nom masque se verront avec un nom
  // masqué et il y aura des pbs de rafraichissement
  const list = new CListeObjets(this.listePr)
  app.listePr.setCopy(list)
  // list.positionne(false, doc.dimf);
  list.positionneTikz(false, dimf)
  // sc = (coefMult !== 1) ? "[scale = " + chaineNombre(coefMult, 4) +"]" : "";
  stb = '\\begin{tikzpicture}' + '\n'
  // stb.append("\\linespread{1.2}" + sc + "\n");
  // On recherche d'abord toutes les couleurs du document et on leur affecte un code dérivé de l'hexadécimal
  const vect = []
  for (i = 0; i < list.longueur(); i++) {
    elb = list.get(i)
    if (elb.existe && !elb.estElementIntermediaire() && elb.estDeNature(NatObj.NTtObj)) {
      if (!elb.masque) stb = elb.addTikzColors(stb, vect)
    }
  }
  // On fait un clipping du rectangle d'affichage
  const clipx = chaineNombre(list.tikzLongueur(dimf.x, dimf, bu), 2)
  const clipy = chaineNombre(list.tikzLongueur(dimf.y, dimf, bu), 2)
  stb += '\\clip (' + clipx + ',0) rectangle (0,' + clipy + ');' + '\n'
  for (i = 0; i < list.longueur(); i++) {
    elb = list.get(i)
    if (elb.existe && !elb.estElementIntermediaire() && elb.estDeNature(NatObj.NTtObj)) {
      if (!elb.masque) {
        ch = elb.tikz(dimf, true, coefMult, bu)
        if (ch !== '') {
          if (isCommented) stb += '% ' + elb.infoHist().replace('\n', ' ') + '\n'
          stb += ch + '\n'
        }
      }
    }
  }
  stb += '\\end{tikzpicture}' + '\n'
  return stb.replace('°', '\\degres')
}

CMathGraphDoc.prototype.getTikz = function (app, coefMult, bu, isCommented) {
  let stb = '\\documentclass[10pt,a4paper]{article}' + '\n'
  stb += '\\usepackage{tikz}' + '\n'
  stb += '\\usetikzlibrary{patterns}' + '\n'
  stb += '\\usepackage{amsfonts}' + '\n'
  stb += '\\usepackage{amsmath}' + '\n'
  stb += '\\usepackage{amssymb}' + '\n'
  stb += '\\usepackage{fix-cm}' + '\n'
  stb += '\\usepackage[utf8]{inputenc}' + '\n'
  stb += '\\usepackage[T1]{fontenc}' + '\n'
  // Ajout version 4.9.3 pour gérer le symbole degré
  stb += '\\usepackage[french]{babel}' + '\n'
  stb += '\\usepackage{textcomp}' + '\n'
  // Fin ajout
  stb += '\\begin{document}' + '\n'
  stb += this.getTikzCodeOnly(app, coefMult, bu, isCommented)
  stb += '\\end{document}' + '\n'
  return stb
}