diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objects.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objects.mjs index c45b65e..039ba49 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objects.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objects.mjs @@ -36,6 +36,28 @@ class ObjectsAPI extends Module { this.currentObjectsByName = {} } + /** + * Creates a new name for an object, based on the allowedLetters. + * If variables with each of the allowedLetters is created, a subscript + * number is added to the name. + * @param {string} allowedLetters + * @param {string} prefix - Prefix to the name. + * @return {string} New unused name for a new object. + */ + getNewName(allowedLetters, prefix='') { + // Allows to get a new name, based on the allowed letters, + // as well as adding a sub number when needs be. + let newid = 0 + let ret + do { + let letter = allowedLetters[newid % allowedLetters.length] + let num = Math.floor((newid - (newid % allowedLetters.length)) / allowedLetters.length) + ret = prefix + letter + (num > 0 ? textsub(num-1) : '') + newid += 1 + } while(ret in this.currentObjectsByName) + return ret + } + /** * Renames an object from its old name to the new one. * @param {string} oldName - Current name of the object. diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/autoload.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/autoload.mjs index f29710b..dc84bb0 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/autoload.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/autoload.mjs @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -import { API as ObjectsCommonAPI } from "common.mjs" +import Objects from "../objects.mjs" +import { DrawableObject } from "common.mjs" import Point from "point.mjs" import Text from "text.mjs" import Function from "function.mjs" @@ -28,15 +29,29 @@ import XCursor from "xcursor.mjs" import Sequence from "sequence.mjs" import RepartitionFunction from "repartition.mjs" +/** + * Registers the object obj in the object list. + * @param {DrawableObject} obj - Object to be registered. + */ +function registerObject(obj) { + // Registers an object to be used in LogarithmPlotter. + if(obj.prototype instanceof DrawableObject) { + if(!Objects.types[obj.type()]) + Objects.types[obj.type()] = obj + } else { + console.error("Could not register object " + (obj?.type() ?? obj.constructor.name) + ", as it isn't a DrawableObject.") + } +} + if(Object.keys(Modules.Objects.types).length === 0) { - ObjectsCommonAPI.registerObject(Point) - ObjectsCommonAPI.registerObject(Text) - ObjectsCommonAPI.registerObject(Function) - ObjectsCommonAPI.registerObject(GainBode) - ObjectsCommonAPI.registerObject(PhaseBode) - ObjectsCommonAPI.registerObject(SommeGainsBode) - ObjectsCommonAPI.registerObject(SommePhasesBode) - ObjectsCommonAPI.registerObject(XCursor) - ObjectsCommonAPI.registerObject(Sequence) - ObjectsCommonAPI.registerObject(RepartitionFunction) -} \ No newline at end of file + registerObject(Point) + registerObject(Text) + registerObject(Function) + registerObject(GainBode) + registerObject(PhaseBode) + registerObject(SommeGainsBode) + registerObject(SommePhasesBode) + registerObject(XCursor) + registerObject(Sequence) + registerObject(RepartitionFunction) +} diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/common.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/common.mjs index 173aef4..2c6270a 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/common.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/common.mjs @@ -24,59 +24,6 @@ import {ensureTypeSafety, serializesByPropertyType} from "../parameters.mjs" // This file contains the default data to be imported from all other objects -class ObjectsCommonAPI extends Module { - - constructor() { - super('ObjectsCommon', [ - Modules.Objects, - Modules.ExprParser, - Modules.Latex - ]) - } - - /** - * Creates a new name for an object, based on the allowedLetters. - * If variables with each of the allowedLetters is created, a subscript - * number is added to the name. - * @param {string} allowedLetters - * @param {string} prefix - Prefix to the name. - * @return {string} New unused name for a new object. - */ - getNewName(allowedLetters, prefix='') { - // Allows to get a new name, based on the allowed letters, - // as well as adding a sub number when needs be. - let newid = 0 - let ret - do { - let letter = allowedLetters[newid % allowedLetters.length] - let num = Math.floor((newid - (newid % allowedLetters.length)) / allowedLetters.length) - ret = prefix + letter + (num > 0 ? textsub(num-1) : '') - newid += 1 - } while(ret in Objects.currentObjectsByName) - return ret - } - - /** - * Registers the object obj in the object list. - * @param {DrawableObject} obj - Object to be registered. - */ - registerObject(obj) { - // Registers an object to be used in LogarithmPlotter. - // This function is called from autoload.mjs - if(obj.prototype instanceof DrawableObject) { - if(!Objects.types[obj.type()]) - Objects.types[obj.type()] = obj - } else { - console.error("Could not register object " + (obj.type()) + ", as it isn't a DrawableObject.") - } - } -} - -/** @type {ObjectsCommonAPI} */ -Modules.ObjectsCommon = Modules.ObjectsCommon || new ObjectsCommonAPI() - -export const API = Modules.ObjectsCommon - /** * Class to extend for every type of object that * can be drawn on the canvas. diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/function.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/function.mjs index fb9e93c..2448d50 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/function.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/function.mjs @@ -17,7 +17,8 @@ */ import { textsub } from "../utils.mjs" -import { API as Common, ExecutableObject } from "common.mjs" +import Objects from "../objects.mjs" +import { ExecutableObject } from "common.mjs" import { parseDomain, Expression, SpecialDomain } from "../mathlib.mjs" import * as P from "../parameters.mjs" import Latex from "../math/latex.mjs" @@ -50,7 +51,7 @@ export default class Function extends ExecutableObject { expression = 'x', definitionDomain = 'RPE', destinationDomain = 'R', displayMode = 'application', labelPosition = 'above', labelX = 1, drawPoints = true, drawDashedLines = true) { - if(name == null) name = Common.getNewName('fghjqlmnopqrstuvwabcde') + if(name == null) name = Objects.getNewName('fghjqlmnopqrstuvwabcde') super(name, visible, color, labelContent) if(typeof expression == 'number' || typeof expression == 'string') expression = new Expression(expression.toString()) this.expression = expression diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/gainbode.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/gainbode.mjs index 938aa33..f86d747 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/gainbode.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/gainbode.mjs @@ -21,7 +21,7 @@ import * as P from "../parameters.mjs" import Objects from "../objects.mjs" import Latex from "../math/latex.mjs" -import { API as Common, ExecutableObject } from "common.mjs" +import { ExecutableObject } from "common.mjs" import Function from "function.mjs" import { API as HistoryAPI } from "../history/common.mjs" @@ -43,7 +43,7 @@ export default class GainBode extends ExecutableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', om_0 = '', pass = 'high', gain = '20', labelPosition = 'above', labelX = 1, omGraduation = false) { - if(name == null) name = Common.getNewName('G') + if(name == null) name = Objects.getNewName('G') if(name === 'G') name = 'G₀' // G is reserved for sum of BODE magnitudes (Somme gains Bode). super(name, visible, color, labelContent) if(typeof om_0 == "string") { @@ -51,7 +51,7 @@ export default class GainBode extends ExecutableObject { om_0 = Objects.currentObjectsByName[om_0] if(om_0 == null) { // Create new point - om_0 = Objects.createNewRegisteredObject('Point', [Common.getNewName('ω'), true, this.color, 'name']) + om_0 = Objects.createNewRegisteredObject('Point', [Objects.getNewName('ω'), true, this.color, 'name']) HistoryAPI.addToHistory(new CreateNewObject(om_0.name, 'Point', om_0.export())) om_0.update() labelPosition = 'below' diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/phasebode.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/phasebode.mjs index 97fdae2..dcdd615 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/phasebode.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/phasebode.mjs @@ -19,11 +19,11 @@ import { executeExpression, Expression } from "../mathlib.mjs" import * as P from "../parameters.mjs" import Objects from "../objects.mjs" -import Latex from "../math/latex.mjs" - -import { API as Common, ExecutableObject } from "common.mjs" import { API as HistoryAPI } from "../history/common.mjs" import { CreateNewObject } from "../historylib.mjs" +import Latex from "../math/latex.mjs" + +import { ExecutableObject } from "common.mjs" export default class PhaseBode extends ExecutableObject { @@ -40,7 +40,7 @@ export default class PhaseBode extends ExecutableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', om_0 = '', phase = 90, unit = '°', labelPosition = 'above', labelX = 1) { - if(name == null) name = Common.getNewName('φ') + if(name == null) name = Objects.getNewName('φ') if(name === 'φ') name = 'φ₀' // φ is reserved for sum of BODE phases (Somme phases Bode). super(name, visible, color, labelContent) if(typeof phase == 'number' || typeof phase == 'string') phase = new Expression(phase.toString()) @@ -50,7 +50,7 @@ export default class PhaseBode extends ExecutableObject { om_0 = Objects.currentObjectsByName[om_0] if(om_0 == null) { // Create new point - om_0 = Objects.createNewRegisteredObject('Point', [Common.getNewName('ω'), this.color, 'name']) + om_0 = Objects.createNewRegisteredObject('Point', [Objects.getNewName('ω'), this.color, 'name']) om_0.labelPosition = this.phase.execute() >= 0 ? 'above' : 'below' HistoryAPI.history.addToHistory(new CreateNewObject(om_0.name, 'Point', om_0.export())) labelPosition = 'below' diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/point.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/point.mjs index f53eb72..66a493c 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/point.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/point.mjs @@ -18,8 +18,10 @@ import { Expression } from "../mathlib.mjs" import * as P from "../parameters.mjs" +import Objects from "../objects.mjs" import Latex from "../math/latex.mjs" -import { API as Common, DrawableObject } from "common.mjs" + +import { DrawableObject } from "common.mjs" export default class Point extends DrawableObject { @@ -36,7 +38,7 @@ export default class Point extends DrawableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', x = 1, y = 0, labelPosition = 'above', pointStyle = '●') { - if(name == null) name = Common.getNewName('ABCDEFJKLMNOPQRSTUVW') + if(name == null) name = Objects.getNewName('ABCDEFJKLMNOPQRSTUVW') super(name, visible, color, labelContent) if(typeof x == 'number' || typeof x == 'string') x = new Expression(x.toString()) this.x = x diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/repartition.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/repartition.mjs index 2dd632d..89db16d 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/repartition.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/repartition.mjs @@ -16,10 +16,12 @@ * along with this program. If not, see . */ -import { API as Common, ExecutableObject } from "common.mjs" import * as P from "../parameters.mjs" +import Objects from "../objects.mjs" import Latex from "../math/latex.mjs" +import { ExecutableObject } from "common.mjs" + export default class RepartitionFunction extends ExecutableObject { static type(){return 'Repartition'} @@ -46,7 +48,7 @@ export default class RepartitionFunction extends ExecutableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', probabilities = {'0': '0'}, labelPosition = 'above', labelX = 1) { - if(name == null) name = Common.getNewName('XYZUVW', "F_") + if(name == null) name = Objects.getNewName('XYZUVW', "F_") super(name, visible, color, labelContent) this.probabilities = probabilities this.labelPosition = labelPosition diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/sequence.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/sequence.mjs index 10cb154..11f1be7 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/sequence.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/sequence.mjs @@ -19,8 +19,9 @@ import { Sequence as MathSequence, Domain } from "../mathlib.mjs" import * as P from "../parameters.mjs" import Latex from "../math/latex.mjs" +import Objects from "../objects.mjs" -import { API as Common, ExecutableObject } from "common.mjs" +import { ExecutableObject } from "common.mjs" import Function from "function.mjs" @@ -45,7 +46,7 @@ export default class Sequence extends ExecutableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', drawPoints = true, drawDashedLines = true, defaultExp = {1: "n"}, baseValues = {0: 0}, labelPosition = 'above', labelX = 1) { - if(name == null) name = Common.getNewName('uvwPSUVWabcde') + if(name == null) name = Objects.getNewName('uvwPSUVWabcde') super(name, visible, color, labelContent) this.drawPoints = drawPoints this.drawDashedLines = drawDashedLines diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/text.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/text.mjs index dfd0d27..fab2818 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/text.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/text.mjs @@ -18,9 +18,10 @@ import { Expression } from "../mathlib.mjs" import * as P from "../parameters.mjs" +import Objects from "../objects.mjs" import Latex from "../math/latex.mjs" -import { API as Common, DrawableObject } from "common.mjs" +import { DrawableObject } from "common.mjs" export default class Text extends DrawableObject { @@ -41,7 +42,7 @@ export default class Text extends DrawableObject { constructor(name = null, visible = true, color = null, labelContent = 'null', x = 1, y = 0, labelPosition = 'center', text = 'New text', disableLatex = false) { - if(name == null) name = Common.getNewName('t') + if(name == null) name = Objects.getNewName('t') super(name, visible, color, labelContent) if(typeof x == 'number' || typeof x == 'string') x = new Expression(x.toString()) this.x = x diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/xcursor.mjs b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/xcursor.mjs index 2e3c6e0..4ab8b3d 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/xcursor.mjs +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/objs/xcursor.mjs @@ -21,7 +21,7 @@ import * as P from "../parameters.mjs" import Latex from "../math/latex.mjs" import Objects from "../objects.mjs" -import { API as Common, DrawableObject } from "common.mjs" +import { DrawableObject } from "common.mjs" export default class XCursor extends DrawableObject { @@ -45,7 +45,7 @@ export default class XCursor extends DrawableObject { constructor(name = null, visible = true, color = null, labelContent = 'name + value', x = 1, targetElement = null, labelPosition = 'left', approximate = true, rounding = 3, displayStyle = '— — — — — — —', targetValuePosition = 'Next to target') { - if(name == null) name = Common.getNewName('X') + if(name == null) name = Objects.getNewName('X') super(name, visible, color, labelContent) this.approximate = approximate this.rounding = rounding