/*
* 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 NatObj from '../types/NatObj'
import CElementGraphique from './CElementGraphique'
import { cens } from 'src/kernel/kernel'
import StyleRemplissage from 'src/types/StyleRemplissage'
import { defaultSurfOpacity } from 'src/objets/CMathGraphDoc'
export default CSurfaceAncetre
/**
* Classe ancêtre de toutes les surfaces.
* @constructor
* @extends CElementGraphique
* @param {CListeObjets} listeProprietaire La liste propriétaire.
* @param {CImplementationProto} impProto null ou la construction propriétaire.
* @param {boolean} estElementFinal true si élément final de construction.
* @param {Color} couleur La couleur.
* @param {boolean} masque true si l'objet est masqué.
* @param {StyleRemplissage} styleRemplissage Entier donnant le style de remplissage.
*/
function CSurfaceAncetre (listeProprietaire, impProto, estElementFinal, couleur, masque, styleRemplissage) {
if (arguments.length === 0) return // Ajout version 4.9.9.4
if (arguments.length === 1) CElementGraphique.call(this, listeProprietaire)
else {
CElementGraphique.call(this, listeProprietaire, impProto, estElementFinal, couleur, true, 0, 0, masque, '', 16)
this.styleRemplissage = styleRemplissage
}
}
CSurfaceAncetre.prototype = new CElementGraphique()
CSurfaceAncetre.prototype.constructor = CSurfaceAncetre
CSurfaceAncetre.prototype.superClass = 'CElementGraphique'
CSurfaceAncetre.prototype.className = 'CSurfaceAncetre'
CSurfaceAncetre.prototype.getNature = function () {
return NatObj.NSurface
}
CSurfaceAncetre.prototype.confonduAvec = function (p) {
if (p.className === this.className) {
return (this.styleRemplissage === p.styleRemplissage)
} else return false
}
CSurfaceAncetre.prototype.chaineDesignation = function () {
return 'desSurface'
}
CSurfaceAncetre.prototype.peutGenererLieuObjet = function () {
return false
}
CSurfaceAncetre.prototype.donneStyleRemplissage = function (style) {
this.styleRemplissage = style
if (this.pattern !== null) document.getElementById('mtg32_patterns').removeChild(this.pattern)
if (style !== StyleRemplissage.transp && style !== StyleRemplissage.plein) { this.createPattern() } else this.pattern = null
}
// Spécifique JavaScript
CSurfaceAncetre.prototype.createPattern = function () {
const mtg32patterns = document.getElementById('mtg32_patterns')
// Modifié version 6.3.2 car le player ne marchait pas avec des hachures
// var pat = document.getElementById(this.index + "mtg32pattern");
const idPattern = this.listeProprietaire.id + this.index + 'mtg32pattern'
const pat = document.getElementById(idPattern)
if (pat !== null) mtg32patterns.removeChild(pat)
const p = cens('pattern')
this.pattern = p
const path = cens('path')
p.setAttribute('patternUnits', 'userSpaceOnUse')
p.setAttribute('x', '0')
p.setAttribute('y', '0')
p.setAttribute('width', '6')
p.setAttribute('height', '6')
const style = 'fill:none; stroke:' + this.color + '; stroke-width:0.5;'
const d = this.getPattern(false)
path.setAttribute('d', d)
path.setAttribute('style', style)
p.appendChild(path)
// p.setAttribute("id", this.index + "mtg32pattern"); // Modifié version 6.3.2
p.setAttribute('id', idPattern)
mtg32patterns.appendChild(p)
}
/**
* Fonction renvoyant le pattern pour les quadrillages
* @param bForExport Si true, on exporte la figure et on utilise alors un cadre de 8 sur 8
* sinon on utilise un cadre de 6 sur 6
* @param {number} coef Le coefficient multiplicateur utilisé pour l'exportation (arrondi à l'unité)
* @returns {string}
*/
CSurfaceAncetre.prototype.getPattern = function (bForExport, coef) {
if (bForExport) {
// var coefarr = (coef < 1) ? 1 : Math.round(coef); // On arrondit à l'entier le plus proche si >= 1
const a3 = String(coef * 3)
const a6 = String(coef * 6)
const a5 = String(coef * 6 - 1)
const a7 = String(coef * 6 + 1)
switch (this.styleRemplissage) {
case StyleRemplissage.horizontal:
return 'M 0 ' + a3 + ' L ' + a6 + ' ' + a3
case StyleRemplissage.vertical:
return 'M ' + a3 + ' 0 L ' + a3 + ' ' + a6
case StyleRemplissage.bas45:
return 'M 0 0 l ' + a6 + ' ' + a6 + 'M -1 ' + a5 + ' l 2 2 M ' + a5 + ' -1 l 2 2'
case StyleRemplissage.haut45:
return 'M 0 ' + a6 + ' l ' + a6 + ' -' + a6 + ' M -1 1 l 2 -2 M ' + a5 + ' ' + a7 + ' l 2 -2'
}
} else {
switch (this.styleRemplissage) {
case StyleRemplissage.horizontal:
return 'M 0 3 L 6 3'
case StyleRemplissage.vertical:
return 'M 3 0 L 3 6'
case StyleRemplissage.bas45:
return 'M 0 0 l 6 6 M -1 5 l 2 2 M 5 -1 l 2 2'
case StyleRemplissage.haut45:
return 'M 0 6 l 6 -6 M-1 1 l2 -2 M 5 7 l 2 -2'
}
}
}
CSurfaceAncetre.prototype.removePattern = function () {
// Modifié version 6.3.2 car le player ne marchaitn pas avec des hachures
// var pattern = document.getElementById(this.index + "mtg32pattern");
const pattern = document.getElementById(this.listeProprietaire.id + this.index + 'mtg32pattern')
if (pattern !== null) {
document.getElementById('mtg32_patterns').removeChild(pattern)
}
}
// Fonction ajoutée version 6.5.2 pour permettre de modifier directement des éléments de la figure
/**
* Fonction donnant directement au svg element représentant l'élément graphique la couleur de l'élément
*/
CSurfaceAncetre.prototype.setgColor = function () {
if (this.g) {
const style = this.styleRemplissage
if (style !== StyleRemplissage.transp && style !== StyleRemplissage.plein) {
// Si le style est un style de hachures, pour changer la couleur il faut appeler donneStyleRemplissage
this.donneStyleRemplissage(style)
} else {
this.g.style.fill = this.couleur.rgbWithoutOpacity()
this.g.style.fillOpacity = this.couleur.opacity
}
return true
} else return false
}
CSurfaceAncetre.prototype.read = function (inps, list) {
CElementGraphique.prototype.read.call(this, inps, list)
// POur les versions antérieures à la version 8.0 (numéro de version 20)
// l'opacité était globale et donnée par le document propriétaire
// Sinon elle est enregistrée avec la couleur elle-même
const numeroVersion = list.numeroVersion
if (numeroVersion < 20) {
if (list.documentProprietaire) this.couleur.opacity = list.documentProprietaire.opacity
else this.couleur.opacity = defaultSurfOpacity
this.color = this.couleur.rgb()
}
this.styleRemplissage = inps.readInt()
}
CSurfaceAncetre.prototype.write = function (oups, list) {
CElementGraphique.prototype.write.call(this, oups, list)
oups.writeInt(this.styleRemplissage)
}