/*
* 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 { getStr } from '../kernel/kernel'
import Nat from '../types/Nat'
import NatObj from '../types/NatObj'
import OutilObjetPar2Objets from './OutilObjetPar2Objets'
import CSurfaceDeuxLieux from '../objets/CSurfaceDeuxLieux'
import CImplementationProto from '../objets/CImplementationProto'
import AvertDlg from '../dialogs/AvertDlg'
import { defaultSurfOpacity } from 'src/objets/CMathGraphDoc'
export default OutilCouronne
/**
* Outil servant à créer une surface délimitée par un polygône, un cercle, un arc de cercle ou un lieu fermé
* @param {MtgApp} app L'application propriétaire
* @constructor
*/
function OutilCouronne (app) {
const nat = Nat.or(NatObj.NLieu, NatObj.NCercle, NatObj.NPolygone)
OutilObjetPar2Objets.call(this, app, 'Couronne', 32873, true, nat, nat)
}
OutilCouronne.prototype = new OutilObjetPar2Objets()
OutilCouronne.prototype.isSurfTool = function () {
return true
}
OutilCouronne.prototype.select = function () {
// On ne doit pas pouvoir désigner des lieux de points non fermés
OutilObjetPar2Objets.prototype.select.call(this)
const list = this.app.listePr
for (let i = 0; i < list.longueur(); i++) {
const el = list.get(i)
if (el.estDeNature(NatObj.NLieu) && !el.infoLieu.fermeOuNon) this.excluDeDesignation(el)
}
}
OutilCouronne.prototype.indication = function (ind) {
switch (ind) {
case 1 : return 'indCour'
case 2 : return 'indCour'
}
}
OutilCouronne.prototype.creeObjet = function () {
let proto; let surf
const app = this.app
const list = app.listePr
const docConsAv = app.docConsAv
const ob1 = this.ob1; const ob2 = this.ob2
// Cas où l'utilisateur a cliqué sur deux lieux fermés : Inutile d'utiliser une macro-construction
const coul = app.getCouleur()
coul.opacity = defaultSurfOpacity
if (ob1.estDeNature(NatObj.NLieu) && ob2.estDeNature(NatObj.NLieu)) {
surf = new CSurfaceDeuxLieux(app.listePr, null, false, app.getCouleur(), false, app.getStyleRemplissage(), ob1, ob2)
app.ajouteElement(surf)
const verif = app.verifieDernierElement(1)
if (verif) {
// L'élément créé existe bien et a été ajouté à la liste
surf.creeAffichage(this.app.svgFigure, false, app.doc.couleurFond)
this.annuleClignotement()
this.saveFig()
} else new AvertDlg(app, 'DejaCree')
this.reselect()
return
} else if (this.sontDeNat(NatObj.NCercle, NatObj.NCercle)) proto = docConsAv.getPrototype('Couronne')
else if (this.sontDeNat(NatObj.NCercle, NatObj.NPolygone)) proto = docConsAv.getPrototype('CouronneCerclePoly')
else if (this.sontDeNat(NatObj.NPolygone, NatObj.NPolygone)) proto = docConsAv.getPrototype('CouronnePolys')
else if (this.sontDeNat(NatObj.NCercle, NatObj.NLieu)) proto = docConsAv.getPrototype('CouronneCercleLieu')
else if (this.sontDeNat(NatObj.NPolygone, NatObj.NLieu)) proto = docConsAv.getPrototype('CouronnePolyLieu')
// On affecte les éléments sources au prototype
proto.get(0).elementAssocie = this.ob1
proto.get(1).elementAssocie = this.ob2
const impProto = new CImplementationProto(list, proto)
impProto.implemente(app.dimf, proto)
impProto.nomProto = getStr('Couronne')
surf = impProto.dernierFinal(NatObj.NSurface)
surf.donneCouleur(coul)
surf.donneStyleRemplissage(app.getStyleRemplissage())
const indImpProto = list.indexOf(impProto)
list.positionne(false, app.dimf)
list.setReady4MathJax()
list.afficheTout(indImpProto, app.svgFigure, true, app.doc.couleurFond)
// Corrigé version 5.6.4
if (app.estExercice) app.listePourConst = app.listePourConstruction()
app.gestionnaire.enregistreFigureEnCours('Couronne')
}
/**
* Fonction renvoyant true si this.ob1 et this.obj sont de nature nat1 et nat2.
* Dans le cas où c'est le cas, this.ob1 et this.ob2 sont remaniés si nécessaire de façon à ce que
* Si au moins un des deux est un cercle, this.ob1 pointe sur le cercle
* Si aucun n'est un cercle et si au moins un des deux est un polygone, this.ob1 pointe sur le polygone
* @param nat1
* @param nat2
*/
OutilCouronne.prototype.sontDeNat = function (nat1, nat2) {
const ob1 = this.ob1; const ob2 = this.ob2
if ((ob1.estDeNature(nat1) && ob2.estDeNature(nat2)) || (ob1.estDeNature(nat2) && ob2.estDeNature(nat1))) {
if (ob1.estDeNature(NatObj.NCercle)) return true
if (ob2.estDeNature(NatObj.NCercle)) {
this.ob1 = ob2
this.ob2 = ob1
} else {
if (ob1.estDeNature(NatObj.NPolygone)) return true
if (ob2.estDeNature(NatObj.NPolygone)) {
this.ob1 = ob2
this.ob2 = ob1
}
}
return true
} else return false
}
OutilCouronne.prototype.preIndication = function () {
return 'Couronne'
}