Starting linux setup system.
128
LogarithmPlotter/__init__.py
Normal file
|
@ -0,0 +1,128 @@
|
|||
"""
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from PySide2.QtWidgets import QApplication, QFileDialog
|
||||
from PySide2.QtQml import QQmlApplicationEngine, qmlRegisterType
|
||||
from PySide2.QtCore import Qt, QObject, Signal, Slot, Property
|
||||
from PySide2.QtGui import QIcon, QImage
|
||||
from PySide2 import __version__ as PySide2_version
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
from platform import release as os_release
|
||||
from json import dumps
|
||||
from sys import platform, argv, version as sys_version
|
||||
import webbrowser
|
||||
|
||||
__VERSION__ = "0.0.1.dev0"
|
||||
|
||||
tempfile = tempfile.mkstemp(suffix='.png')[1]
|
||||
|
||||
def get_linux_theme():
|
||||
des = {
|
||||
"KDE": "Flat",
|
||||
"gnome": "default",
|
||||
"lxqt": "fusion",
|
||||
"mate": "fusion",
|
||||
}
|
||||
if "XDG_SESSION_DESKTOP" in os.environ:
|
||||
return des[os.environ["XDG_SESSION_DESKTOP"]] if os.environ["XDG_SESSION_DESKTOP"] in des else "fusion"
|
||||
else:
|
||||
# Android
|
||||
return "Material"
|
||||
|
||||
class Helper(QObject):
|
||||
|
||||
@Slot(str, str)
|
||||
def write(self, filename, filedata):
|
||||
if os.path.exists(os.path.dirname(os.path.realpath(filename))):
|
||||
f = open(os.path.realpath(filename), 'w', -1, 'utf8')
|
||||
f.write(filedata)
|
||||
f.close()
|
||||
|
||||
@Slot(str, result=str)
|
||||
def load(self, filename):
|
||||
if os.path.exists(os.path.realpath(filename)):
|
||||
f = open(os.path.realpath(filename), 'r', -1, 'utf8')
|
||||
data = f.read()
|
||||
f.close()
|
||||
return data
|
||||
return '{}'
|
||||
|
||||
@Slot(result=str)
|
||||
def gettmpfile(self):
|
||||
global tempfile
|
||||
return tempfile
|
||||
|
||||
@Slot()
|
||||
def copyImageToClipboard(self):
|
||||
global tempfile
|
||||
clipboard = QApplication.clipboard()
|
||||
clipboard.setImage(QImage(tempfile))
|
||||
|
||||
@Slot(result=str)
|
||||
def getVersion(self):
|
||||
return __VERSION__
|
||||
|
||||
@Slot(result=str)
|
||||
def getDebugInfos(self):
|
||||
"""
|
||||
Returns the version info about Qt, PySide2 & Python
|
||||
"""
|
||||
return "Built with PySide2 (Qt) v{} and python v{}".format(PySide2_version, sys_version.split("\n")[0])
|
||||
|
||||
@Slot(str)
|
||||
def openUrl(self, url):
|
||||
webbrowser.open(url)
|
||||
|
||||
def run():
|
||||
pwd = os.getcwd()
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
os.environ["QT_QUICK_CONTROLS_STYLE"] = {
|
||||
"linux": get_linux_theme(),
|
||||
"freebsd": get_linux_theme(),
|
||||
"win32": "universal" if os_release == "10" else "fusion",
|
||||
"cygwin": "fusion",
|
||||
"darwin": "imagine"
|
||||
}[platform]
|
||||
|
||||
app = QApplication(argv)
|
||||
app.setApplicationName("LogarithmPlotter")
|
||||
app.setOrganizationName("Ad5001")
|
||||
app.setWindowIcon(QIcon(os.path.realpath(os.path.join(os.getcwd(), "..", "logplotter.svg"))))
|
||||
engine = QQmlApplicationEngine()
|
||||
helper = Helper()
|
||||
engine.rootContext().setContextProperty("Helper", helper)
|
||||
|
||||
engine.addImportPath(os.path.realpath(os.path.join(os.getcwd(), "qml")))
|
||||
engine.load(os.path.realpath(os.path.join(os.getcwd(), "qml", "LogGraph.qml")))
|
||||
|
||||
os.chdir(pwd)
|
||||
if len(argv) > 0 and os.path.exists(argv[-1]) and argv[-1].split('.')[-1] in ['json', 'lgg', 'lpf']:
|
||||
print(argv[-1])
|
||||
engine.rootObjects()[0].loadDiagram(argv[-1])
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
if not engine.rootObjects():
|
||||
print("No root object")
|
||||
exit(-1)
|
||||
app.exec_()
|
||||
|
||||
os.remove(tempfile)
|
||||
|
4
LogarithmPlotter/__main__.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
from .run import run
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
107
LogarithmPlotter/qml/About.qml
Normal file
|
@ -0,0 +1,107 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Dialogs 1.3 as D
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
|
||||
D.Dialog {
|
||||
id: about
|
||||
title: `About LogarithmPlotter`
|
||||
width: 400
|
||||
height: 600
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
source: "../logplotter.svg"
|
||||
sourceSize.width: 64
|
||||
sourceSize.height: 64
|
||||
width: 64
|
||||
height: 64
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.rightMargin: width/2
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 10
|
||||
}
|
||||
|
||||
Label {
|
||||
id: appName
|
||||
anchors.top: logo.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.topMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
width: parent.width
|
||||
wrapMode: Text.WordWrap
|
||||
font.pixelSize: 25
|
||||
text: "LogarithmPlotter v" + Helper.getVersion()
|
||||
}
|
||||
|
||||
Label {
|
||||
id: description
|
||||
anchors.top: appName.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.topMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
width: parent.width
|
||||
wrapMode: Text.WordWrap
|
||||
font.pixelSize: 18
|
||||
text: "Create graphs with logarithm scales."
|
||||
}
|
||||
|
||||
Label {
|
||||
id: debugInfos
|
||||
anchors.top: description.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.topMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
width: parent.width
|
||||
wrapMode: Text.WordWrap
|
||||
font.pixelSize: 14
|
||||
text: Helper.getDebugInfos()
|
||||
}
|
||||
|
||||
Label {
|
||||
id: copyrightInfos
|
||||
anchors.top: debugInfos.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 10
|
||||
width: Math.min(410, parent.width)
|
||||
wrapMode: Text.WordWrap
|
||||
textFormat: Text.RichText
|
||||
font.pixelSize: 13
|
||||
text: "Copyright © 2021 Ad5001 <mail@ad5001.eu><br>
|
||||
<br>
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<br>
|
||||
<br>
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<br>
|
||||
<br>
|
||||
You should have received a copy of the GNU General Public License along with this program. If not, see <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>."
|
||||
onLinkActivated: Helper.openUrl(link)
|
||||
}
|
||||
|
||||
Button {
|
||||
id: openIssueButton
|
||||
anchors.top: copyrightInfos.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.topMargin: 10
|
||||
text: 'Report a bug'
|
||||
icon.name: 'bug'
|
||||
onClicked: Helper.openUrl('https://git.ad5001.eu/Ad5001/LogarithmPlotter')
|
||||
}
|
||||
}
|
110
LogarithmPlotter/qml/AppMenuBar.qml
Normal file
|
@ -0,0 +1,110 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import "js/objects.js" as Objects
|
||||
import "js/historylib.js" as HistoryLib
|
||||
|
||||
MenuBar {
|
||||
Menu {
|
||||
title: qsTr("&File")
|
||||
Action {
|
||||
text: qsTr("&Load...")
|
||||
shortcut: StandardKey.Open
|
||||
onTriggered: settings.load()
|
||||
icon.name: 'document-open'
|
||||
|
||||
}
|
||||
Action {
|
||||
text: qsTr("&Save")
|
||||
shortcut: StandardKey.Save
|
||||
onTriggered: settings.save()
|
||||
icon.name: 'document-save'
|
||||
}
|
||||
Action {
|
||||
text: qsTr("Save &As...")
|
||||
shortcut: StandardKey.SaveAs
|
||||
onTriggered: settings.saveAs()
|
||||
icon.name: 'document-save-as'
|
||||
|
||||
}
|
||||
MenuSeparator { }
|
||||
Action {
|
||||
text: qsTr("&Quit")
|
||||
shortcut: StandardKey.Quit
|
||||
onTriggered: Qt.quit()
|
||||
icon.name: 'application-exit'
|
||||
}
|
||||
}
|
||||
Menu {
|
||||
title: qsTr("&Edit")
|
||||
Action {
|
||||
text: qsTr("&Undo")
|
||||
shortcut: StandardKey.Undo
|
||||
onTriggered: history.undo()
|
||||
icon.name: 'edit-undo'
|
||||
icon.color: enabled ? sysPalette.windowText : sysPaletteIn.windowText
|
||||
enabled: history.undoCount > 0
|
||||
}
|
||||
Action {
|
||||
text: qsTr("&Redo")
|
||||
shortcut: StandardKey.Redo
|
||||
onTriggered: history.redo()
|
||||
icon.name: 'edit-redo'
|
||||
icon.color: enabled ? sysPalette.windowText : sysPaletteIn.windowText
|
||||
enabled: history.redoCount > 0
|
||||
}
|
||||
MenuSeparator { }
|
||||
Action {
|
||||
text: qsTr("&Copy diagram")
|
||||
shortcut: StandardKey.Copy
|
||||
onTriggered: root.copyDiagramToClipboard()
|
||||
icon.name: 'edit-copy'
|
||||
}
|
||||
}
|
||||
Menu {
|
||||
title: qsTr("&Create")
|
||||
// Services repeater
|
||||
Repeater {
|
||||
model: Object.keys(Objects.types)
|
||||
|
||||
MenuItem {
|
||||
text: modelData
|
||||
visible: Objects.types[modelData].createable()
|
||||
height: visible ? implicitHeight : 0
|
||||
icon.source: './icons/'+modelData+'.svg' // Default to dark version
|
||||
icon.name: modelData
|
||||
icon.color: sysPalette.windowText
|
||||
onTriggered: {
|
||||
var newObj = Objects.createNewRegisteredObject(modelData)
|
||||
history.addToHistory(new HistoryLib.CreateNewObject(newObj.name, modelData, newObj.export()))
|
||||
objectLists.update()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Menu {
|
||||
title: qsTr("&Help")
|
||||
Action {
|
||||
text: qsTr("&About")
|
||||
icon.name: 'about'
|
||||
onTriggered: about.open()
|
||||
}
|
||||
}
|
||||
}
|
71
LogarithmPlotter/qml/ComboBoxSetting.qml
Normal file
|
@ -0,0 +1,71 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
Item {
|
||||
id: control
|
||||
height: 30
|
||||
|
||||
signal activated(int newIndex)
|
||||
signal accepted()
|
||||
|
||||
property string label: ''
|
||||
property alias model: combox.model
|
||||
property alias editable: combox.editable
|
||||
property alias editText: combox.editText
|
||||
property alias currentIndex: combox.currentIndex
|
||||
property string icon: ""
|
||||
|
||||
function find(elementName) {
|
||||
return combox.find(elementName)
|
||||
}
|
||||
|
||||
Icon {
|
||||
id: iconLabel
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: icon == "" ? 0 : 3
|
||||
source: control.visible ? control.icon : ""
|
||||
width: height
|
||||
height: icon == "" && visible ? 0 : 24
|
||||
color: sysPalette.windowText
|
||||
}
|
||||
|
||||
Label {
|
||||
id: labelItem
|
||||
anchors.left: iconLabel.right
|
||||
anchors.leftMargin: icon == "" ? 0 : 5
|
||||
height: 30
|
||||
anchors.top: parent.top
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: control.label +": "
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
id: combox
|
||||
height: 30
|
||||
anchors.left: labelItem.right
|
||||
anchors.leftMargin: 5
|
||||
width: control.width - labelItem.width - iconLabel.width - 10
|
||||
onActivated: function(newIndex) {
|
||||
control.activated(newIndex)
|
||||
}
|
||||
onAccepted: control.accepted()
|
||||
}
|
||||
}
|
32
LogarithmPlotter/qml/FileDialog.qml
Normal file
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick.Dialogs 1.3 as D
|
||||
|
||||
D.FileDialog {
|
||||
id: fileDialog
|
||||
|
||||
property bool exportMode: false
|
||||
|
||||
title: exportMode ? "Export Logarithm Plot file" : "Import Logarithm Plot file"
|
||||
nameFilters: ["Logarithm Plot File (*.lpf *.lgg)", "Old Logarithm Plot Data (*.json)", "All files (*)"]
|
||||
|
||||
folder: shortcuts.documents
|
||||
selectExisting: !exportMode
|
||||
|
||||
}
|
139
LogarithmPlotter/qml/History.qml
Normal file
|
@ -0,0 +1,139 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQml 2.12
|
||||
import "js/objects.js" as Objects
|
||||
import "js/historylib.js" as HistoryLib
|
||||
|
||||
|
||||
Item {
|
||||
// Using a QtObject is necessary in order to have proper property propagation in QML
|
||||
id: historyObj
|
||||
property int undoCount: 0
|
||||
property int redoCount: 0
|
||||
property var undoStack: []
|
||||
property var redoStack: []
|
||||
|
||||
function clear() {
|
||||
undoStack = []
|
||||
redoStack = []
|
||||
}
|
||||
|
||||
function serialize() {
|
||||
let undoSt = [], redoSt = [];
|
||||
for(let i = 0; i < undoCount; i++)
|
||||
undoSt.push([
|
||||
undoStack[i].type(),
|
||||
undoStack[i].export()
|
||||
]);
|
||||
for(let i = 0; i < redoCount; i++)
|
||||
redoSt.push([
|
||||
redoStack[i].type(),
|
||||
redoStack[i].export()
|
||||
]);
|
||||
return [undoSt, redoSt]
|
||||
}
|
||||
|
||||
function unserialize(undoSt, redoSt) {
|
||||
clear();
|
||||
for(let i = 0; i < undoSt.length; i++)
|
||||
undoStack.push(new HistoryLib.Actions[undoSt[i][0]](...undoSt[i][1]))
|
||||
for(let i = 0; i < redoSt.length; i++)
|
||||
redoStack.push(new HistoryLib.Actions[redoSt[i][0]](...redoSt[i][1]))
|
||||
undoCount = undoSt.length;
|
||||
redoCount = redoSt.length;
|
||||
objectLists.update()
|
||||
}
|
||||
|
||||
|
||||
function addToHistory(action) {
|
||||
if(action instanceof HistoryLib.Action) {
|
||||
console.log("Added new entry to history: " + action.getReadableString())
|
||||
undoStack.push(action)
|
||||
undoCount++;
|
||||
redoStack = []
|
||||
redoCount = 0
|
||||
}
|
||||
}
|
||||
|
||||
function undo() {
|
||||
if(undoStack.length > 0) {
|
||||
var action = undoStack.pop()
|
||||
action.undo()
|
||||
objectLists.update()
|
||||
redoStack.push(action)
|
||||
undoCount--;
|
||||
redoCount++;
|
||||
}
|
||||
}
|
||||
|
||||
function redo() {
|
||||
if(redoStack.length > 0) {
|
||||
var action = redoStack.pop()
|
||||
action.redo()
|
||||
objectLists.update()
|
||||
undoStack.push(action)
|
||||
undoCount++;
|
||||
redoCount--;
|
||||
}
|
||||
}
|
||||
|
||||
function undoMultipleDefered(toUndoCount) {
|
||||
undoTimer.toUndoCount = toUndoCount;
|
||||
undoTimer.start()
|
||||
}
|
||||
|
||||
function redoMultipleDefered(toRedoCount) {
|
||||
redoTimer.toRedoCount = toRedoCount;
|
||||
redoTimer.start()
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: undoTimer
|
||||
interval: 5; running: false; repeat: true
|
||||
property int toUndoCount: 0
|
||||
onTriggered: {
|
||||
if(toUndoCount > 0) {
|
||||
historyObj.undo()
|
||||
toUndoCount--;
|
||||
} else {
|
||||
running = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: redoTimer
|
||||
interval: 5; running: false; repeat: true
|
||||
property int toRedoCount: 0
|
||||
onTriggered: {
|
||||
if(toRedoCount > 0) {
|
||||
historyObj.redo()
|
||||
toRedoCount--;
|
||||
} else {
|
||||
running = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
Objects.history = historyObj
|
||||
Objects.HistoryLib = HistoryLib
|
||||
}
|
||||
}
|
124
LogarithmPlotter/qml/HistoryBrowser.qml
Normal file
|
@ -0,0 +1,124 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick 2.12
|
||||
import "js/utils.js" as Utils
|
||||
|
||||
ScrollView {
|
||||
id: historyBrowser
|
||||
|
||||
property int actionWidth: width-20
|
||||
|
||||
Flickable {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
contentHeight: redoColumn.height + nowRect.height + undoColumn.height
|
||||
contentWidth: parent.width
|
||||
|
||||
Column {
|
||||
id: redoColumn
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: historyBrowser.actionWidth
|
||||
|
||||
Repeater {
|
||||
model: history.redoCount
|
||||
|
||||
Button {
|
||||
id: redoButton
|
||||
width: historyBrowser.actionWidth
|
||||
height: 30
|
||||
flat: true
|
||||
text: history.redoStack[index].getReadableString()
|
||||
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: text
|
||||
|
||||
onClicked: {
|
||||
history.redoMultipleDefered(history.redoCount-index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: nowRect.top
|
||||
text: "Redo >"
|
||||
color: sysPaletteIn.windowText
|
||||
transform: Rotation { origin.x: 30; origin.y: 30; angle: 270}
|
||||
height: 70
|
||||
width: 20
|
||||
visible: history.redoCount > 0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: nowRect
|
||||
anchors.right: parent.right
|
||||
anchors.top: redoColumn.bottom
|
||||
width: historyBrowser.actionWidth
|
||||
height: 30
|
||||
color: sysPalette.highlight
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 5
|
||||
text: "> Now"
|
||||
color: sysPalette.windowText
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
id: undoColumn
|
||||
anchors.right: parent.right
|
||||
anchors.top: nowRect.bottom
|
||||
width: historyBrowser.actionWidth
|
||||
|
||||
Repeater {
|
||||
model: history.undoCount
|
||||
|
||||
Button {
|
||||
id: undoButton
|
||||
width: historyBrowser.actionWidth
|
||||
height: 30
|
||||
flat: true
|
||||
text: history.undoStack[history.undoCount-index-1].getReadableString()
|
||||
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: text
|
||||
|
||||
onClicked: {
|
||||
history.undoMultipleDefered(index+1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
anchors.top: undoColumn.top
|
||||
text: "< Undo"
|
||||
color: sysPaletteIn.windowText
|
||||
transform: Rotation { origin.x: 30; origin.y: 30; angle: 270}
|
||||
height: 60
|
||||
width: 20
|
||||
visible: history.undoCount > 0
|
||||
}
|
||||
}
|
||||
}
|
37
LogarithmPlotter/qml/Icon.qml
Normal file
|
@ -0,0 +1,37 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import QtQuick 2.7
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
Item {
|
||||
property color color: "#000000"
|
||||
property alias source: img.source
|
||||
|
||||
Image {
|
||||
id: img
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
smooth: true
|
||||
visible: false
|
||||
}
|
||||
ColorOverlay {
|
||||
anchors.fill: img
|
||||
source: img
|
||||
color: parent.color
|
||||
}
|
||||
}
|
190
LogarithmPlotter/qml/ListSetting.qml
Normal file
|
@ -0,0 +1,190 @@
|
|||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQml.Models 2.12
|
||||
|
||||
Column {
|
||||
id: control
|
||||
|
||||
signal changed()
|
||||
|
||||
property string label: ''
|
||||
property string icon: ''
|
||||
property bool dictionaryMode: false
|
||||
property string keyType: "string"
|
||||
property string valueType: "string"
|
||||
property string preKeyLabel: ""
|
||||
property string postKeyLabel: ": "
|
||||
property var keyRegexp: /^.+$/
|
||||
property var valueRegexp: /^.+$/
|
||||
property bool forbidAdding: false
|
||||
|
||||
|
||||
property alias model: repeater.model
|
||||
|
||||
Row {
|
||||
height: 30
|
||||
width: parent.width;
|
||||
Icon {
|
||||
id: iconLabel
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: icon == "" ? 0 : 3
|
||||
source: control.visible ? control.icon : ""
|
||||
width: height
|
||||
height: icon == "" || !visible ? 0 : 24
|
||||
color: sysPalette.windowText
|
||||
}
|
||||
Label {
|
||||
id: labelItem
|
||||
height: 30
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: control.label +": "
|
||||
}
|
||||
}
|
||||
|
||||
Repeater {
|
||||
id: repeater
|
||||
width: control.width
|
||||
model: ListModel {}
|
||||
|
||||
Row {
|
||||
id: defRow
|
||||
height: addEntryBtn.height
|
||||
width: parent.width
|
||||
|
||||
Text {
|
||||
id: preKeyText
|
||||
height: parent.height
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
color: sysPalette.windowText
|
||||
text: control.preKeyLabel
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: keyInput
|
||||
visible: control.dictionaryMode
|
||||
height: parent.height
|
||||
width: visible ? 50 : 0
|
||||
validator: RegExpValidator {
|
||||
regExp: control.keyRegexp
|
||||
}
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
color: sysPalette.windowText
|
||||
text: visible ? control.model.get(index).key : false
|
||||
selectByMouse: true
|
||||
onEditingFinished: {
|
||||
var value = text
|
||||
if(control.keyType == 'int') {
|
||||
value = parseInt(value)
|
||||
if(value.toString()=="NaN")
|
||||
value = ""
|
||||
}
|
||||
if(control.keyType == 'double') {
|
||||
value = parseFloat(value)
|
||||
if(value.toString()=="NaN")
|
||||
value = ""
|
||||
}
|
||||
if(value !== "" && valueInput.acceptableInput) {
|
||||
control.model.setProperty(index, 'key', value)
|
||||
control.changed()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: postKeyText
|
||||
visible: control.dictionaryMode
|
||||
height: parent.height
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
color: sysPalette.windowText
|
||||
text: control.postKeyLabel
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: valueInput
|
||||
height: parent.height
|
||||
width: parent.width - x - deleteButton.width - 5
|
||||
validator: RegExpValidator {
|
||||
regExp: control.valueRegexp
|
||||
}
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
color: sysPalette.windowText
|
||||
text: visible ? control.model.get(index).val : false
|
||||
selectByMouse: true
|
||||
onEditingFinished: {
|
||||
var value = text
|
||||
if(control.valueType == 'int') {
|
||||
value = parseInt(value)
|
||||
if(value.toString()=="NaN")
|
||||
value = ""
|
||||
}
|
||||
if(control.valueType == 'double') {
|
||||
value = parseFloat(value)
|
||||
if(value.toString()=="NaN")
|
||||
value = ""
|
||||
}
|
||||
if(value !== "" && keyInput.acceptableInput) {
|
||||
control.model.setProperty(index, 'val', value)
|
||||
control.changed()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
width: 5
|
||||
height: parent.height
|
||||
}
|
||||
|
||||
Button {
|
||||
id: deleteButton
|
||||
width: visible ? parent.height : 0
|
||||
height: width
|
||||
icon.source: './icons/delete.svg'
|
||||
icon.name: 'delete'
|
||||
visible: !control.forbidAdding
|
||||
|
||||
onClicked: {
|
||||
control.model.remove(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: addEntryBtn
|
||||
visible: !control.forbidAdding
|
||||
text: '+ Add Entry'
|
||||
width: control.width
|
||||
|
||||
onClicked: {
|
||||
control.model.append({
|
||||
key: control.keyType == 'string' ? '' : model.count,
|
||||
val: control.valueType == 'string' ? '' : 0
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function importModel(importer) {
|
||||
model.clear()
|
||||
for(var key in importer)
|
||||
model.append({
|
||||
key: control.keyType == 'string' ? key.toString() : parseFloat(key),
|
||||
val: control.valueType == 'string' ? importer[key].toString() : parseFloat(importer[key])
|
||||
})
|
||||
}
|
||||
|
||||
function exportModel() {
|
||||
if(dictionaryMode) {
|
||||
var ret = {}
|
||||
for(var i = 0; i < model.count; i++)
|
||||
ret[model.get(i).key] = model.get(i).val
|
||||
return ret
|
||||
} else {
|
||||
var ret = []
|
||||
for(var i = 0; i < model.count; i++)
|
||||
ret.push(model.get(i).val)
|
||||
return ret
|
||||
}
|
||||
}
|
||||
}
|
235
LogarithmPlotter/qml/LogGraph.qml
Normal file
|
@ -0,0 +1,235 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQml 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick.Layouts 1.15
|
||||
import QtQuick 2.12
|
||||
import "js/objects.js" as Objects
|
||||
|
||||
|
||||
ApplicationWindow {
|
||||
id: root
|
||||
visible: true
|
||||
width: 1000
|
||||
height: 500
|
||||
color: sysPalette.window
|
||||
title: "LogarithmPlotter " + (settings.saveFilename != "" ? " - " + settings.saveFilename.split('/')[settings.saveFilename.split('/').length -1] : "")
|
||||
|
||||
SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active }
|
||||
SystemPalette { id: sysPaletteIn; colorGroup: SystemPalette.Disabled }
|
||||
History { id: history }
|
||||
|
||||
menuBar: AppMenuBar {}
|
||||
|
||||
About {id: about}
|
||||
|
||||
Drawer {
|
||||
id: sidebar
|
||||
width: 300
|
||||
height: parent.height
|
||||
y: root.menuBar.height
|
||||
readonly property bool inPortrait: root.width < root.height
|
||||
modal: inPortrait
|
||||
interactive: inPortrait
|
||||
position: inPortrait ? 0 : 1
|
||||
visible: !inPortrait
|
||||
|
||||
|
||||
TabBar {
|
||||
id: sidebarSelector
|
||||
width: parent.width
|
||||
anchors.top: parent.top
|
||||
TabButton {
|
||||
text: qsTr("Objects")
|
||||
icon.name: 'polygon-add-nodes'
|
||||
icon.color: sysPalette.windowText
|
||||
//height: 24
|
||||
}
|
||||
TabButton {
|
||||
text: qsTr("Settings")
|
||||
icon.name: 'preferences-system'
|
||||
icon.color: sysPalette.windowText
|
||||
//height: 24
|
||||
}
|
||||
TabButton {
|
||||
text: qsTr("History")
|
||||
icon.name: 'history'
|
||||
icon.color: sysPalette.windowText
|
||||
//height: 24
|
||||
}
|
||||
}
|
||||
|
||||
StackLayout {
|
||||
id: sidebarContents
|
||||
anchors.top: sidebarSelector.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.topMargin: 5
|
||||
anchors.leftMargin: 5
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 20
|
||||
width: parent.width - 10
|
||||
currentIndex: sidebarSelector.currentIndex
|
||||
z: -1
|
||||
clip: true
|
||||
|
||||
ObjectLists {
|
||||
id: objectLists
|
||||
onChanged: drawCanvas.requestPaint()
|
||||
}
|
||||
|
||||
Settings {
|
||||
id: settings
|
||||
onChanged: drawCanvas.requestPaint()
|
||||
}
|
||||
|
||||
HistoryBrowser {
|
||||
id: historyBrowser
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogGraphCanvas {
|
||||
id: drawCanvas
|
||||
anchors.top: parent.top
|
||||
anchors.left: sidebar.inPortrait ? parent.left : sidebar.right
|
||||
height: parent.height
|
||||
width: sidebar.inPortrait ? parent.width : parent.width - sidebar.position*sidebar.width
|
||||
x: sidebar.position*sidebar.width
|
||||
|
||||
xmin: settings.xmin
|
||||
ymax: settings.ymax
|
||||
xzoom: settings.xzoom
|
||||
yzoom: settings.yzoom
|
||||
xlabel: settings.xaxislabel
|
||||
ylabel: settings.yaxislabel
|
||||
yaxisstep: settings.yaxisstep
|
||||
xaxisstep: settings.xaxisstep
|
||||
logscalex: settings.logscalex
|
||||
linewidth: settings.linewidth
|
||||
textsize: settings.textsize
|
||||
showxgrad: settings.showxgrad
|
||||
showygrad: settings.showygrad
|
||||
}
|
||||
|
||||
function saveDiagram(filename) {
|
||||
if(['json', 'lpf', 'lgg'].indexOf(filename.split('.')[filename.split('.').length-1]) == -1)
|
||||
filename += '.lpf'
|
||||
settings.saveFilename = filename
|
||||
var objs = {}
|
||||
for(var objType in Objects.currentObjects){
|
||||
objs[objType] = []
|
||||
for(var obj of Objects.currentObjects[objType]) {
|
||||
objs[objType].push(obj.export())
|
||||
}
|
||||
}
|
||||
Helper.write(filename, JSON.stringify({
|
||||
"xzoom": settings.xzoom,
|
||||
"yzoom": settings.yzoom,
|
||||
"xmin": settings.xmin,
|
||||
"ymax": settings.ymax,
|
||||
"xaxisstep": settings.xaxisstep,
|
||||
"yaxisstep": settings.yaxisstep,
|
||||
"xaxislabel": settings.xaxislabel,
|
||||
"yaxislabel": settings.yaxislabel,
|
||||
"logscalex": settings.logscalex,
|
||||
"linewidth": settings.linewidth,
|
||||
"showxgrad": settings.showxgrad,
|
||||
"showygrad": settings.showygrad,
|
||||
"textsize": settings.textsize,
|
||||
"history": history.serialize(),
|
||||
"width": root.width,
|
||||
"height": root.height,
|
||||
"objects": objs,
|
||||
"type": "logplotv1"
|
||||
}))
|
||||
}
|
||||
|
||||
function loadDiagram(filename) {
|
||||
var data = JSON.parse(Helper.load(filename))
|
||||
var error = "";
|
||||
if(Object.keys(data).includes("type") && data["type"] == "logplotv1") {
|
||||
history.clear()
|
||||
// Importing settings
|
||||
settings.saveFilename = filename
|
||||
settings.xzoom = data["xzoom"]
|
||||
settings.yzoom = data["yzoom"]
|
||||
settings.xmin = data["xmin"]
|
||||
settings.ymax = data["ymax"]
|
||||
settings.xaxisstep = data["xaxisstep"]
|
||||
settings.yaxisstep = data["yaxisstep"]
|
||||
settings.xaxislabel = data["xaxislabel"]
|
||||
settings.yaxislabel = data["yaxislabel"]
|
||||
settings.logscalex = data["logscalex"]
|
||||
if("showxgrad" in data)
|
||||
settings.showxgrad = data["showxgrad"]
|
||||
if("showygrad" in data)
|
||||
settings.textsize = data["showygrad"]
|
||||
if("linewidth" in data)
|
||||
settings.linewidth = data["linewidth"]
|
||||
if("textsize" in data)
|
||||
settings.textsize = data["textsize"]
|
||||
if("history" in data)
|
||||
history.unserialize(...data["history"])
|
||||
root.height = data["height"]
|
||||
root.width = data["width"]
|
||||
|
||||
// Importing objectw
|
||||
Objects.currentObjects = {}
|
||||
for(var objType in data['objects']) {
|
||||
if(Object.keys(Objects.types).indexOf(objType) > -1) {
|
||||
Objects.currentObjects[objType] = []
|
||||
for(var objData of data['objects'][objType]) {
|
||||
var obj = new Objects.types[objType](...objData)
|
||||
Objects.currentObjects[objType].push(obj)
|
||||
}
|
||||
} else {
|
||||
error += "Unknown object type: " +objType + "\n";
|
||||
}
|
||||
}
|
||||
// Refreshing sidebar
|
||||
if(sidebarSelector.currentIndex == 0) {
|
||||
// For some reason, if we load a file while the tab is on object,
|
||||
// we get stuck in a Qt-side loop? Qt bug or side-effect here, I don't know.
|
||||
sidebarSelector.currentIndex = 1
|
||||
objectLists.update()
|
||||
delayRefreshTimer.start()
|
||||
} else {
|
||||
objectLists.update()
|
||||
}
|
||||
} else {
|
||||
error = "Invalid file provided."
|
||||
}
|
||||
if(error != "") {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: delayRefreshTimer
|
||||
repeat: false
|
||||
interval: 1
|
||||
onTriggered: sidebarSelector.currentIndex = 0
|
||||
}
|
||||
|
||||
function copyDiagramToClipboard() {
|
||||
var file = Helper.gettmpfile()
|
||||
drawCanvas.save(file)
|
||||
Helper.copyImageToClipboard()
|
||||
}
|
||||
}
|
241
LogarithmPlotter/qml/LogGraphCanvas.qml
Normal file
|
@ -0,0 +1,241 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import "js/objects.js" as Objects
|
||||
import "js/utils.js" as Utils
|
||||
import "js/mathlib.js" as MathLib
|
||||
|
||||
|
||||
Canvas {
|
||||
id: canvas
|
||||
anchors.top: separator.bottom
|
||||
anchors.left: parent.left
|
||||
height: parent.height - 90
|
||||
width: parent.width
|
||||
|
||||
property double xmin: 0
|
||||
property double ymax: 0
|
||||
property int xzoom: 10
|
||||
property int yzoom: 10
|
||||
property string xaxisstep: "4"
|
||||
property string yaxisstep: "4"
|
||||
property string xlabel: ""
|
||||
property string ylabel: ""
|
||||
property int maxgradx: 8
|
||||
property double linewidth: 1
|
||||
property double textsize: 14
|
||||
property bool logscalex: false
|
||||
property bool showxgrad: false
|
||||
property bool showygrad: false
|
||||
|
||||
property var yaxisstepExpr: (new MathLib.Expression(`x*(${yaxisstep})`))
|
||||
property double yaxisstep1: yaxisstepExpr.execute(1)
|
||||
property int drawMaxY: Math.ceil(Math.max(Math.abs(ymax), Math.abs(px2y(canvasSize.height)))/yaxisstep1)
|
||||
property var xaxisstepExpr: (new MathLib.Expression(`x*(${xaxisstep})`))
|
||||
property double xaxisstep1: xaxisstepExpr.execute(1)
|
||||
property int drawMaxX: Math.ceil(Math.max(Math.abs(xmin), Math.abs(px2x(canvasSize.width)))/xaxisstep1)
|
||||
|
||||
|
||||
onPaint: {
|
||||
//console.log('Redrawing')
|
||||
var ctx = getContext("2d");
|
||||
reset(ctx)
|
||||
drawGrille(ctx)
|
||||
drawAxises(ctx)
|
||||
ctx.lineWidth = linewidth
|
||||
for(var objType in Objects.currentObjects) {
|
||||
for(var obj of Objects.currentObjects[objType]){
|
||||
ctx.strokeStyle = obj.color
|
||||
ctx.fillStyle = obj.color
|
||||
if(obj.visible) obj.draw(canvas, ctx)
|
||||
}
|
||||
}
|
||||
ctx.lineWidth = 1
|
||||
drawLabels(ctx)
|
||||
|
||||
}
|
||||
|
||||
function reset(ctx){
|
||||
// Reset
|
||||
ctx.fillStyle = "#FFFFFF"
|
||||
ctx.strokeStyle = "#000000"
|
||||
ctx.font = `${canvas.textsize-2}px sans-serif`
|
||||
ctx.fillRect(0,0,width,height)
|
||||
}
|
||||
|
||||
// Drawing the log based graph
|
||||
function drawGrille(ctx) {
|
||||
ctx.strokeStyle = "#C0C0C0"
|
||||
if(logscalex) {
|
||||
for(var xpow = -maxgradx; xpow <= maxgradx; xpow++) {
|
||||
for(var xmulti = 1; xmulti < 10; xmulti++) {
|
||||
drawXLine(ctx, Math.pow(10, xpow)*xmulti)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(var x = 0; x < drawMaxX; x+=1) {
|
||||
drawXLine(ctx, x*xaxisstep1)
|
||||
drawXLine(ctx, -x*xaxisstep1)
|
||||
}
|
||||
}
|
||||
for(var y = 0; y < drawMaxY; y+=1) {
|
||||
drawYLine(ctx, y*yaxisstep1)
|
||||
drawYLine(ctx, -y*yaxisstep1)
|
||||
}
|
||||
}
|
||||
|
||||
function drawAxises(ctx) {
|
||||
ctx.strokeStyle = "#000000"
|
||||
var axisypos = logscalex ? 1 : 0
|
||||
drawXLine(ctx, axisypos)
|
||||
drawYLine(ctx, 0)
|
||||
var axisypx = x2px(axisypos) // X coordinate of Y axis
|
||||
var axisxpx = y2px(0) // Y coordinate of X axis
|
||||
// Drawing arrows
|
||||
drawLine(ctx, axisypx, 0, axisypx-10, 10)
|
||||
drawLine(ctx, axisypx, 0, axisypx+10, 10)
|
||||
drawLine(ctx, canvasSize.width, axisxpx, canvasSize.width-10, axisxpx-10)
|
||||
drawLine(ctx, canvasSize.width, axisxpx, canvasSize.width-10, axisxpx+10)
|
||||
}
|
||||
|
||||
function drawLabels(ctx) {
|
||||
var axisypx = x2px(logscalex ? 1 : 0) // X coordinate of Y axis
|
||||
var axisxpx = y2px(0) // Y coordinate of X axis
|
||||
// Labels
|
||||
ctx.fillStyle = "#000000"
|
||||
ctx.font = `${canvas.textsize+2}px sans-serif`
|
||||
ctx.fillText(ylabel, axisypx+10, 24)
|
||||
var textSize = ctx.measureText(xlabel).width
|
||||
ctx.fillText(xlabel, canvasSize.width-14-textSize, axisxpx-5)
|
||||
// Axis graduation labels
|
||||
ctx.font = `${canvas.textsize-2}px sans-serif`
|
||||
|
||||
var txtMinus = ctx.measureText('-').width
|
||||
if(showxgrad) {
|
||||
if(logscalex) {
|
||||
for(var xpow = -maxgradx; xpow <= maxgradx; xpow+=1) {
|
||||
var textSize = ctx.measureText("10"+Utils.textsup(xpow)).width
|
||||
if(xpow != 0)
|
||||
drawVisibleText(ctx, "10"+Utils.textsup(xpow), x2px(Math.pow(10,xpow))-textSize/2, axisxpx+16+(6*(y==0)))
|
||||
}
|
||||
} else {
|
||||
for(var x = 1; x < drawMaxX; x += 1) {
|
||||
var drawX = x*xaxisstep1
|
||||
var txtX = xaxisstepExpr.simplify(x)
|
||||
var textSize = measureText(ctx, txtX, 6).height
|
||||
drawVisibleText(ctx, txtX, x2px(drawX)-4, axisxpx+textsize/2+textSize)
|
||||
drawVisibleText(ctx, '-'+txtX, x2px(-drawX)-4, axisxpx+textsize/2+textSize)
|
||||
}
|
||||
}
|
||||
}
|
||||
if(showygrad) {
|
||||
for(var y = 0; y < drawMaxY; y += 1) {
|
||||
var drawY = y*yaxisstep1
|
||||
var txtY = yaxisstepExpr.simplify(y)
|
||||
var textSize = ctx.measureText(txtY).width
|
||||
drawVisibleText(ctx, txtY, axisypx-6-textSize, y2px(drawY)+4+(10*(y==0)))
|
||||
if(y != 0)
|
||||
drawVisibleText(ctx, '-'+txtY, axisypx-6-textSize-txtMinus, y2px(-drawY)+4)
|
||||
}
|
||||
}
|
||||
ctx.fillStyle = "#FFFFFF"
|
||||
}
|
||||
|
||||
function drawXLine(ctx, x) {
|
||||
if(visible(x, ymax)) {
|
||||
drawLine(ctx, x2px(x), 0, x2px(x), canvasSize.height)
|
||||
}
|
||||
}
|
||||
|
||||
function drawYLine(ctx, y) {
|
||||
if(visible(xmin, y)) {
|
||||
drawLine(ctx, 0, y2px(y), canvasSize.width, y2px(y))
|
||||
}
|
||||
}
|
||||
|
||||
function drawVisibleText(ctx, text, x, y) {
|
||||
if(x > 0 && x < canvasSize.width && y > 0 && y < canvasSize.height) {
|
||||
text.toString().split("\n").forEach(function(txt, i){
|
||||
ctx.fillText(txt, x, y+(canvas.textsize*i))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Method to calculate multi-line string dimensions
|
||||
function measureText(ctx, text) {
|
||||
var theight = 0
|
||||
var twidth = 0
|
||||
text.split("\n").forEach(function(txt, i){
|
||||
theight += canvas.textsize
|
||||
if(ctx.measureText(txt).width > twidth) twidth = ctx.measureText(txt).width
|
||||
})
|
||||
return {'width': twidth, 'height': theight}
|
||||
}
|
||||
|
||||
// Converts x coordinate to it's relative position on the
|
||||
function x2px(x) {
|
||||
if(logscalex) {
|
||||
var logxmin = Math.log(xmin)
|
||||
return (Math.log(x)-logxmin)*xzoom
|
||||
} else return (x - xmin)*xzoom
|
||||
}
|
||||
// Converts y coordinate to it's relative position on the
|
||||
// Y is NOT ln based.
|
||||
function y2px(y) {
|
||||
return (ymax-y)*yzoom
|
||||
}
|
||||
// Reverse functions
|
||||
function px2x(px) {
|
||||
if(logscalex) {
|
||||
return Math.exp(px/xzoom+Math.log(xmin))
|
||||
} else return (px/xzoom+xmin)
|
||||
}
|
||||
function px2y(px) {
|
||||
return -(px/yzoom-ymax)
|
||||
}
|
||||
// Checks whether a point is visible or not.
|
||||
function visible(x, y) {
|
||||
return (x2px(x) >= 0 && x2px(x) <= canvasSize.width) && (y2px(y) >= 0 && y2px(y) <= canvasSize.height)
|
||||
}
|
||||
// Draws a line from a (x1, y1) to (x2, y2)
|
||||
function drawLine(ctx, x1, y1, x2, y2) {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(x1, y1);
|
||||
ctx.lineTo(x2, y2);
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
function drawDashedLine2(ctx, x1, y1, x2, y2, dashPxSize = 5) {
|
||||
ctx.setLineDash([dashPxSize, dashPxSize]);
|
||||
drawLine(ctx, x1, y1, x2, y2)
|
||||
ctx.setLineDash([]);
|
||||
}
|
||||
|
||||
function drawDashedLine(ctx, x1, y1, x2, y2, dashPxSize = 10) {
|
||||
var distance = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
|
||||
var progPerc = dashPxSize/distance
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(x1, y1);
|
||||
for(var i = 0; i < 1; i += progPerc) {
|
||||
ctx.lineTo(x1-(x1-x2)*i, y1-(y1-y2)*i)
|
||||
ctx.moveTo(x1-(x1-x2)*(i+progPerc/2), y1-(y1-y2)*(i+progPerc/2))
|
||||
}
|
||||
ctx.stroke();
|
||||
}
|
||||
}
|
471
LogarithmPlotter/qml/ObjectLists.qml
Normal file
|
@ -0,0 +1,471 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Dialogs 1.3 as D
|
||||
import QtQuick.Controls 2.12
|
||||
import "js/objects.js" as Objects
|
||||
import "js/mathlib.js" as MathLib
|
||||
import "js/utils.js" as Utils
|
||||
import "js/historylib.js" as HistoryLib
|
||||
|
||||
|
||||
ListView {
|
||||
id: objectListList
|
||||
|
||||
signal changed()
|
||||
|
||||
property var listViews: {'':''} // Needs to be initialized or will be undefined -_-
|
||||
|
||||
model: Object.keys(Objects.types)
|
||||
implicitHeight: contentItem.childrenRect.height + footer.height + 10
|
||||
|
||||
delegate: ListView {
|
||||
id: objTypeList
|
||||
property string objType: objectListList.model[index]
|
||||
property var editingRows: []
|
||||
model: Objects.currentObjects[objType]
|
||||
width: objectListList.width
|
||||
implicitHeight: contentItem.childrenRect.height
|
||||
visible: model != undefined && model.length > 0
|
||||
interactive: false
|
||||
|
||||
Component.onCompleted: objectListList.listViews[objType] = objTypeList // Listing in order to be refreshed
|
||||
|
||||
header: Row {
|
||||
width: typeHeaderText.width + typeVisibilityCheckBox.visible
|
||||
height: visible ? 20 : 0
|
||||
visible: objTypeList.visible
|
||||
|
||||
CheckBox {
|
||||
id: typeVisibilityCheckBox
|
||||
checked: Objects.currentObjects[objType] != undefined ? Objects.currentObjects[objType].every(obj => obj.visible) : true
|
||||
onClicked: {
|
||||
for(var obj of Objects.currentObjects[objType]) obj.visible = this.checked
|
||||
for(var obj of objTypeList.editingRows) obj.objVisible = this.checked
|
||||
objectListList.changed()
|
||||
}
|
||||
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: checked ? `Hide all ${Objects.types[objType].typeMultiple()}` : `Show all ${Objects.types[objType].typeMultiple()}`
|
||||
}
|
||||
|
||||
Label {
|
||||
id: typeHeaderText
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: Objects.types[objType].typeMultiple() + ":"
|
||||
font.pixelSize: 20
|
||||
}
|
||||
}
|
||||
|
||||
delegate: Item {
|
||||
id: controlRow
|
||||
property var obj: Objects.currentObjects[objType][index]
|
||||
property alias objVisible: objVisibilityCheckBox.checked
|
||||
height: 40
|
||||
width: objTypeList.width
|
||||
|
||||
Component.onCompleted: objTypeList.editingRows.push(controlRow)
|
||||
|
||||
CheckBox {
|
||||
id: objVisibilityCheckBox
|
||||
checked: Objects.currentObjects[objType][index].visible
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 5
|
||||
onClicked: {
|
||||
history.addToHistory(new HistoryLib.EditedVisibility(
|
||||
Objects.currentObjects[objType][index].name, objType, this.checked
|
||||
))
|
||||
Objects.currentObjects[objType][index].visible = this.checked
|
||||
objectListList.changed()
|
||||
controlRow.obj = Objects.currentObjects[objType][index]
|
||||
}
|
||||
|
||||
ToolTip.visible: hovered
|
||||
ToolTip.text: checked ? `Hide ${objType} ${obj.name}` : `Show ${objType} ${obj.name}`
|
||||
}
|
||||
|
||||
Label {
|
||||
id: objDescription
|
||||
anchors.left: objVisibilityCheckBox.right
|
||||
anchors.right: deleteButton.left
|
||||
height: parent.height
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: obj.getReadableString()
|
||||
font.pixelSize: 14
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
objEditor.obj = Objects.currentObjects[objType][index]
|
||||
objEditor.objType = objType
|
||||
objEditor.objIndex = index
|
||||
objEditor.editingRow = controlRow
|
||||
objEditor.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: deleteButton
|
||||
width: parent.height - 10
|
||||
height: width
|
||||
anchors.right: colorPickRect.left
|
||||
anchors.rightMargin: 5
|
||||
anchors.topMargin: 5
|
||||
icon.source: './icons/delete.svg'
|
||||
icon.name: 'delete'
|
||||
|
||||
onClicked: {
|
||||
history.addToHistory(new HistoryLib.DeleteObject(
|
||||
objEditor.obj.name, objEditor.objType, objEditor.obj.export()
|
||||
))
|
||||
Objects.currentObjects[objType][index].delete()
|
||||
Objects.currentObjects[objType].splice(index, 1)
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: colorPickRect
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 5
|
||||
anchors.topMargin: 5
|
||||
color: obj.color
|
||||
width: parent.height - 10
|
||||
height: width
|
||||
radius: Math.min(width, height)
|
||||
border.width: 2
|
||||
border.color: sysPalette.windowText
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: pickColor.open()
|
||||
}
|
||||
}
|
||||
|
||||
D.ColorDialog {
|
||||
id: pickColor
|
||||
color: obj.color
|
||||
title: `Pick new color for ${objType} ${obj.name}`
|
||||
onAccepted: {
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
obj.name, objType, "color",
|
||||
obj.color, color.toString()
|
||||
))
|
||||
obj.color = color.toString()
|
||||
controlRow.obj = Objects.currentObjects[objType][index]
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Object editor
|
||||
D.Dialog {
|
||||
id: objEditor
|
||||
property string objType: 'Point'
|
||||
property int objIndex: 0
|
||||
property QtObject editingRow: QtObject{}
|
||||
property var obj: Objects.currentObjects[objType][objIndex]
|
||||
title: `LogarithmPlotter`
|
||||
width: 300
|
||||
height: 400
|
||||
|
||||
Label {
|
||||
id: dlgTitle
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: `Edit properties of ${objEditor.objType} ${objEditor.obj.name}`
|
||||
font.pixelSize: 20
|
||||
color: sysPalette.windowText
|
||||
}
|
||||
|
||||
Column {
|
||||
id: dlgProperties
|
||||
anchors.top: dlgTitle.bottom
|
||||
width: objEditor.width - 20
|
||||
spacing: 10
|
||||
|
||||
TextSetting {
|
||||
id: nameProperty
|
||||
height: 30
|
||||
label: "Name"
|
||||
icon: "icons/settings/custom/label.svg"
|
||||
min: 1
|
||||
width: dlgProperties.width
|
||||
defValue: objEditor.obj.name
|
||||
onChanged: function(newValue) {
|
||||
var newName = Utils.parseName(newValue)
|
||||
if(newName != '' && objEditor.obj.name != newName) {
|
||||
if(Objects.getObjectByName(newName) != null) {
|
||||
console.log(Objects.getObjectByName(newName).name, newName)
|
||||
newName = Objects.getNewName(newName)
|
||||
}
|
||||
history.addToHistory(new HistoryLib.NameChanged(
|
||||
objEditor.obj.name, objEditor.objType, newName
|
||||
))
|
||||
Objects.currentObjects[objEditor.objType][objEditor.objIndex].name = newName
|
||||
objEditor.obj = Objects.currentObjects[objEditor.objType][objEditor.objIndex]
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ComboBoxSetting {
|
||||
id: labelContentProperty
|
||||
height: 30
|
||||
width: dlgProperties.width
|
||||
label: "Label content"
|
||||
model: ["null", "name", "name + value"]
|
||||
icon: "icons/settings/custom/label.svg"
|
||||
currentIndex: model.indexOf(objEditor.obj.labelContent)
|
||||
onActivated: function(newIndex) {
|
||||
Objects.currentObjects[objEditor.objType][objEditor.objIndex].labelContent = model[newIndex]
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
|
||||
// Dynamic properties
|
||||
Repeater {
|
||||
id: dlgCustomProperties
|
||||
|
||||
Item {
|
||||
height: customPropComment.height + customPropText.height + customPropCheckBox.height + customPropCombo.height + customPropListDict.height
|
||||
width: dlgProperties.width
|
||||
property string label: Utils.camelCase2readable(modelData[0])
|
||||
|
||||
Label {
|
||||
id: customPropComment
|
||||
width: parent.width
|
||||
height: visible ? implicitHeight : 0
|
||||
visible: modelData[0].startsWith('comment')
|
||||
text: visible ? modelData[1].replace(/\{name\}/g, objEditor.obj.name) : ''
|
||||
//color: sysPalette.windowText
|
||||
wrapMode: Text.WordWrap
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: customPropText
|
||||
height: visible ? 30 : 0
|
||||
width: parent.width
|
||||
label: parent.label
|
||||
icon: `icons/settings/custom/${parent.label}.svg`
|
||||
isDouble: modelData[1] == 'number'
|
||||
visible: paramTypeIn(modelData[1], ['Expression', 'Domain', 'string', 'number'])
|
||||
defValue: visible ? {
|
||||
'Expression': () => Utils.simplifyExpression(objEditor.obj[modelData[0]].toEditableString()),
|
||||
'Domain': () => objEditor.obj[modelData[0]].toString(),
|
||||
'string': () => objEditor.obj[modelData[0]],
|
||||
'number': () => objEditor.obj[modelData[0]]
|
||||
}[modelData[1]]() : ""
|
||||
onChanged: function(newValue) {
|
||||
var newValue = {
|
||||
'Expression': () => new MathLib.Expression(newValue),
|
||||
'Domain': () => MathLib.parseDomain(newValue),
|
||||
'string': () => newValue,
|
||||
'number': () => parseFloat(newValue)
|
||||
}[modelData[1]]()
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
objEditor.obj.name, objEditor.objType, modelData[0],
|
||||
objEditor.obj[modelData[0]], newValue
|
||||
))
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = newValue
|
||||
objEditor.obj[modelData[0]] = newValue
|
||||
Objects.currentObjects[objEditor.objType][objEditor.objIndex].update()
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
id: customPropCheckBox
|
||||
visible: modelData[1] == 'Boolean'
|
||||
height: visible ? 20 : 0
|
||||
width: parent.width
|
||||
text: parent.label
|
||||
icon: visible ? `icons/settings/custom/${parent.label}.svg` : ''
|
||||
|
||||
checked: visible ? objEditor.obj[modelData[0]] : false
|
||||
onClicked: {
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
objEditor.obj.name, objEditor.objType, modelData[0],
|
||||
objEditor.obj[modelData[0]], this.checked
|
||||
))
|
||||
objEditor.obj[modelData[0]] = this.checked
|
||||
Objects.currentObjects[objEditor.objType][objEditor.objIndex].update()
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
|
||||
ComboBoxSetting {
|
||||
id: customPropCombo
|
||||
width: dlgProperties.width
|
||||
height: visible ? 30 : 0
|
||||
label: parent.label
|
||||
icon: `icons/settings/custom/${parent.label}.svg`
|
||||
// True to select an object of type, false for enums.
|
||||
property bool selectObjMode: paramTypeIn(modelData[1], ['ObjectType'])
|
||||
|
||||
model: visible ?
|
||||
(selectObjMode ? Objects.getObjectsName(modelData[1].objType).concat(['+ Create new ' + modelData[1].objType]) : modelData[1].values)
|
||||
: []
|
||||
visible: paramTypeIn(modelData[1], ['ObjectType', 'Enum'])
|
||||
currentIndex: model.indexOf(selectObjMode ? objEditor.obj[modelData[0]].name : objEditor.obj[modelData[0]])
|
||||
|
||||
onActivated: function(newIndex) {
|
||||
// Setting object property.
|
||||
if(selectObjMode) {
|
||||
var selectedObj = Objects.getObjectByName(model[newIndex], modelData[1].objType)
|
||||
if(selectedObj == null) {
|
||||
selectedObj = Objects.createNewRegisteredObject(modelData[1].objType)
|
||||
history.addToHistory(new HistoryLib.CreateNewObject(selectedObj.name, modelData[1].objType, selectedObj.export()))
|
||||
model = Objects.getObjectsName(modelData[1].objType).concat(['+ Create new ' + modelData[1].objType])
|
||||
currentIndex = model.indexOf(selectedObj.name)
|
||||
}
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex].requiredBy = objEditor.obj[modelData[0]].filter((obj) => objEditor.obj.name != obj.name)
|
||||
objEditor.obj.requiredBy = objEditor.obj.requiredBy.filter((obj) => objEditor.obj.name != obj.name)
|
||||
selectedObj.requiredBy.push(Objects.currentObjects[objEditor.objType][objEditor.objIndex])
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
objEditor.obj.name, objEditor.objType, modelData[0],
|
||||
objEditor.obj[modelData[0]], selectedObj
|
||||
))
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = selectedObj
|
||||
objEditor.obj[modelData[0]] = selectedObj
|
||||
} else {
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
objEditor.obj.name, objEditor.objType, modelData[0],
|
||||
objEditor.obj[modelData[0]], model[newIndex]
|
||||
))
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = model[newIndex]
|
||||
objEditor.obj[modelData[0]] = model[newIndex]
|
||||
}
|
||||
// Refreshing
|
||||
Objects.currentObjects[objEditor.objType][objEditor.objIndex].update()
|
||||
objectListList.update()
|
||||
}
|
||||
}
|
||||
|
||||
ListSetting {
|
||||
id: customPropListDict
|
||||
width: parent.width
|
||||
height: visible ? implicitHeight : 0
|
||||
|
||||
visible: paramTypeIn(modelData[1], ['List', 'Dict'])
|
||||
label: parent.label
|
||||
//icon: `icons/settings/custom/${parent.label}.svg`
|
||||
dictionaryMode: paramTypeIn(modelData[1], ['Dict'])
|
||||
keyType: dictionaryMode ? modelData[1].keyType : 'string'
|
||||
valueType: visible ? modelData[1].valueType : 'string'
|
||||
preKeyLabel: visible ? (dictionaryMode ? modelData[1].preKeyLabel : modelData[1].label).replace(/\{name\}/g, objEditor.obj.name) : ''
|
||||
postKeyLabel: visible ? (dictionaryMode ? modelData[1].postKeyLabel : '').replace(/\{name\}/g, objEditor.obj.name) : ''
|
||||
keyRegexp: dictionaryMode ? modelData[1].keyFormat : /^.+$/
|
||||
valueRegexp: visible ? modelData[1].format : /^.+$/
|
||||
forbidAdding: visible ? modelData[1].forbidAdding : false
|
||||
|
||||
onChanged: {
|
||||
var exported = exportModel()
|
||||
history.addToHistory(new HistoryLib.EditedProperty(
|
||||
objEditor.obj.name, objEditor.objType, modelData[0],
|
||||
objEditor.obj[modelData[0]], exported
|
||||
))
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = exported
|
||||
objEditor.obj[modelData[0]] = exported
|
||||
//Objects.currentObjects[objEditor.objType][objEditor.objIndex].update()
|
||||
objEditor.obj.update()
|
||||
objectListList.update()
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
if(visible) importModel(objEditor.obj[modelData[0]])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function show() {
|
||||
dlgCustomProperties.model = [] // Reset
|
||||
var objProps = Objects.types[objEditor.objType].properties()
|
||||
dlgCustomProperties.model = Object.keys(objProps).map(prop => [prop, objProps[prop]]) // Converted to 2-dimentional array.
|
||||
objEditor.open()
|
||||
}
|
||||
}
|
||||
|
||||
// Create items
|
||||
footer: Column {
|
||||
id: createRow
|
||||
width: parent.width
|
||||
|
||||
Label {
|
||||
id: createTitle
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
text: '+ Create new:'
|
||||
font.pixelSize: 20
|
||||
//color: sysPalette.windowText
|
||||
}
|
||||
|
||||
Grid {
|
||||
width: parent.width
|
||||
columns: 3
|
||||
Repeater {
|
||||
model: Object.keys(Objects.types)
|
||||
|
||||
Button {
|
||||
id: createBtn
|
||||
text: modelData
|
||||
width: parent.width/3
|
||||
visible: Objects.types[modelData].createable()
|
||||
height: visible ? implicitHeight : 0
|
||||
display: AbstractButton.TextUnderIcon
|
||||
icon.source: './icons/'+modelData+'.svg' // Default to dark version
|
||||
icon.name: modelData
|
||||
icon.width: 24
|
||||
icon.height: 24
|
||||
icon.color: 'white'//sysPalette.windowText
|
||||
|
||||
onClicked: {
|
||||
var newObj = Objects.createNewRegisteredObject(modelData)
|
||||
history.addToHistory(new HistoryLib.CreateNewObject(newObj.name, modelData, newObj.export()))
|
||||
objectListList.update()
|
||||
objEditor.obj = Objects.currentObjects[modelData][Objects.currentObjects[modelData].length - 1]
|
||||
objEditor.objType = modelData
|
||||
objEditor.objIndex = Objects.currentObjects[modelData].length - 1
|
||||
objEditor.editingRow = objectListList.listViews[modelData].editingRows[objEditor.objIndex]
|
||||
objEditor.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function update() {
|
||||
objectListList.changed()
|
||||
for(var objType in objectListList.listViews) {
|
||||
objectListList.listViews[objType].model = Objects.currentObjects[objType]
|
||||
}
|
||||
}
|
||||
|
||||
function paramTypeIn(parameter, types = []) {
|
||||
if(types.includes(parameter.toString())) return true
|
||||
if(typeof parameter == 'object' && 'type' in parameter)
|
||||
return types.includes(parameter.type)
|
||||
return false
|
||||
}
|
||||
}
|
324
LogarithmPlotter/qml/Settings.qml
Normal file
|
@ -0,0 +1,324 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick 2.12
|
||||
import "js/utils.js" as Utils
|
||||
|
||||
ScrollView {
|
||||
id: settings
|
||||
|
||||
signal changed()
|
||||
|
||||
property int settingWidth: settings.width
|
||||
|
||||
property int xzoom: 100
|
||||
property int yzoom: 10
|
||||
property double xmin: 5/10
|
||||
property double ymax: 25
|
||||
property string xaxisstep: "4"
|
||||
property string yaxisstep: "4"
|
||||
property string xaxislabel: ""
|
||||
property string yaxislabel: ""
|
||||
property double linewidth: 1
|
||||
property double textsize: 14
|
||||
property bool logscalex: true
|
||||
property string saveFilename: ""
|
||||
property bool showxgrad: true
|
||||
property bool showygrad: true
|
||||
|
||||
Column {
|
||||
//height: 30*12 //30*Math.max(1, Math.ceil(7 / columns))
|
||||
//columns: Math.floor(width / settingWidth)
|
||||
spacing: 10
|
||||
|
||||
FileDialog {
|
||||
id: fdiag
|
||||
onAccepted: {
|
||||
var filePath = fileUrl.toString().substr(7)
|
||||
settings.saveFilename = filePath
|
||||
if(exportMode) {
|
||||
root.saveDiagram(filePath)
|
||||
} else {
|
||||
root.loadDiagram(filePath)
|
||||
if(xAxisLabel.find(settings.xaxislabel) == -1) xAxisLabel.model.append({text: settings.xaxislabel})
|
||||
xAxisLabel.editText = settings.xaxislabel
|
||||
if(yAxisLabel.find(settings.yaxislabel) == -1) yAxisLabel.model.append({text: settings.yaxislabel})
|
||||
yAxisLabel.editText = settings.yaxislabel
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Zoom
|
||||
TextSetting {
|
||||
id: zoomX
|
||||
height: 30
|
||||
isInt: true
|
||||
label: "X Zoom"
|
||||
min: 1
|
||||
icon: "icons/settings/xzoom.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.xzoom
|
||||
onChanged: function(newValue) {
|
||||
settings.xzoom = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: zoomY
|
||||
height: 30
|
||||
isInt: true
|
||||
label: "Y Zoom"
|
||||
icon: "icons/settings/yzoom.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.yzoom
|
||||
onChanged: function(newValue) {
|
||||
settings.yzoom = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
// Positioning the graph
|
||||
TextSetting {
|
||||
id: minX
|
||||
height: 30
|
||||
isDouble: true
|
||||
min: -Infinity
|
||||
label: "Min X"
|
||||
icon: "icons/settings/xmin.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.xmin
|
||||
onChanged: function(newValue) {
|
||||
settings.xmin = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: maxY
|
||||
height: 30
|
||||
isDouble: true
|
||||
label: "Max Y"
|
||||
icon: "icons/settings/ymax.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.ymax
|
||||
onChanged: function(newValue) {
|
||||
settings.ymax = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: xAxisStep
|
||||
height: 30
|
||||
label: "X Axis Step"
|
||||
icon: "icons/settings/xaxisstep.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.xaxisstep
|
||||
visible: !settings.logscalex
|
||||
onChanged: function(newValue) {
|
||||
settings.xaxisstep = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: yAxisStep
|
||||
height: 30
|
||||
label: "Y Axis Step"
|
||||
icon: "icons/settings/yaxisstep.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.yaxisstep
|
||||
onChanged: function(newValue) {
|
||||
settings.yaxisstep = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: lineWidth
|
||||
height: 30
|
||||
isDouble: true
|
||||
label: "Line width"
|
||||
min: 1
|
||||
icon: "icons/settings/linewidth.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.linewidth
|
||||
onChanged: function(newValue) {
|
||||
settings.linewidth = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
TextSetting {
|
||||
id: textSize
|
||||
height: 30
|
||||
isDouble: true
|
||||
label: "Text size (px)"
|
||||
min: 1
|
||||
icon: "icons/settings/textsize.svg"
|
||||
width: settings.settingWidth
|
||||
defValue: settings.textsize
|
||||
onChanged: function(newValue) {
|
||||
settings.textsize = newValue
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
ComboBoxSetting {
|
||||
id: xAxisLabel
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
label: 'X Label'
|
||||
icon: "icons/settings/xlabel.svg"
|
||||
model: ListModel {
|
||||
ListElement { text: "" }
|
||||
ListElement { text: "x" }
|
||||
ListElement { text: "ω (rad/s)" }
|
||||
}
|
||||
currentIndex: find(settings.xaxislabel)
|
||||
editable: true
|
||||
onAccepted: function(){
|
||||
editText = Utils.parseName(editText, false)
|
||||
if (find(editText) === -1) model.append({text: editText})
|
||||
settings.xaxislabel = editText
|
||||
settings.changed()
|
||||
}
|
||||
onActivated: function(selectedId) {
|
||||
settings.xaxislabel = model.get(selectedId).text
|
||||
settings.changed()
|
||||
}
|
||||
Component.onCompleted: editText = settings.xaxislabel
|
||||
}
|
||||
|
||||
ComboBoxSetting {
|
||||
id: yAxisLabel
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
label: 'Y Label'
|
||||
icon: "icons/settings/ylabel.svg"
|
||||
model: ListModel {
|
||||
ListElement { text: "" }
|
||||
ListElement { text: "y" }
|
||||
ListElement { text: "G (dB)" }
|
||||
ListElement { text: "φ (°)" }
|
||||
ListElement { text: "φ (deg)" }
|
||||
ListElement { text: "φ (rad)" }
|
||||
}
|
||||
currentIndex: find(settings.yaxislabel)
|
||||
editable: true
|
||||
onAccepted: function(){
|
||||
editText = Utils.parseName(editText, false)
|
||||
if (find(editText) === -1) model.append({text: editText, yaxisstep: root.yaxisstep})
|
||||
settings.yaxislabel = editText
|
||||
settings.changed()
|
||||
}
|
||||
onActivated: function(selectedId) {
|
||||
settings.yaxislabel = model.get(selectedId).text
|
||||
settings.changed()
|
||||
}
|
||||
Component.onCompleted: editText = settings.yaxislabel
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
id: logScaleX
|
||||
checked: settings.logscalex
|
||||
text: 'X Log scale'
|
||||
onClicked: {
|
||||
settings.logscalex = checked
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
id: showXGrad
|
||||
checked: settings.showxgrad
|
||||
text: 'Show X graduation'
|
||||
onClicked: {
|
||||
settings.showxgrad = checked
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
id: showYGrad
|
||||
checked: settings.showygrad
|
||||
text: 'Show Y graduation'
|
||||
onClicked: {
|
||||
settings.showygrad = checked
|
||||
settings.changed()
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: copyToClipboard
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
text: "Copy to clipboard"
|
||||
icon.name: 'editcopy'
|
||||
onClicked: root.copyDiagramToClipboard()
|
||||
}
|
||||
|
||||
Button {
|
||||
id: saveDiagram
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
text: "Save plot"
|
||||
icon.name: 'document-save'
|
||||
onClicked: save()
|
||||
}
|
||||
|
||||
Button {
|
||||
id: saveDiagramAs
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
text: "Save plot as"
|
||||
icon.name: 'document-save-as'
|
||||
onClicked: saveAs()
|
||||
}
|
||||
|
||||
Button {
|
||||
id: loadDiagram
|
||||
height: 30
|
||||
width: settings.settingWidth
|
||||
text: "Load plot"
|
||||
icon.name: 'document-open'
|
||||
onClicked: load()
|
||||
}
|
||||
}
|
||||
|
||||
function save() {
|
||||
if(settings.saveFilename == "") {
|
||||
fdiag.exportMode = true
|
||||
fdiag.open()
|
||||
} else {
|
||||
root.saveDiagram(settings.saveFilename)
|
||||
}
|
||||
}
|
||||
|
||||
function saveAs() {
|
||||
fdiag.exportMode = true
|
||||
fdiag.open()
|
||||
}
|
||||
|
||||
function load() {
|
||||
fdiag.exportMode = false
|
||||
fdiag.open()
|
||||
}
|
||||
}
|
137
LogarithmPlotter/qml/TextSetting.qml
Normal file
|
@ -0,0 +1,137 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick 2.12
|
||||
|
||||
Item {
|
||||
id: control
|
||||
height: 30
|
||||
|
||||
signal changed(string newValue)
|
||||
|
||||
property bool isInt: false
|
||||
property bool isDouble: false
|
||||
property double min: -1
|
||||
property string label
|
||||
property string defValue
|
||||
property string icon: ""
|
||||
|
||||
Icon {
|
||||
id: iconLabel
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: icon == "" ? 0 : 3
|
||||
source: control.visible ? control.icon : ""
|
||||
width: height
|
||||
height: icon == "" || !visible ? 0 : 24
|
||||
color: sysPalette.windowText
|
||||
}
|
||||
|
||||
Label {
|
||||
id: labelItem
|
||||
anchors.left: iconLabel.right
|
||||
anchors.leftMargin: icon == "" ? 0 : 5
|
||||
height: parent.height
|
||||
anchors.top: parent.top
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
//color: sysPalette.windowText
|
||||
text: control.label +": "
|
||||
}
|
||||
|
||||
|
||||
TextField {
|
||||
id: input
|
||||
anchors.top: parent.top
|
||||
anchors.left: labelItem.right
|
||||
anchors.leftMargin: 5
|
||||
width: control.width - labelItem.width - iconLabel.width - 10
|
||||
height: parent.height
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
color: sysPalette.windowText
|
||||
focus: true
|
||||
text: control.defValue
|
||||
selectByMouse: true
|
||||
onEditingFinished: {
|
||||
var value = text
|
||||
if(control.isInt) value = Math.max(control.min,parseInt(value).toString()=="NaN"?control.min:parseInt(value))
|
||||
if(control.isDouble) value = Math.max(control.min,parseFloat(value).toString()=="NaN"?control.min:parseFloat(value))
|
||||
if(value != "" && value.toString() != defValue) {
|
||||
control.changed(value)
|
||||
defValue = value.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: "α"
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 5
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: 20
|
||||
height: width
|
||||
visible: !isInt && !isDouble
|
||||
onClicked: insertPopup.open()
|
||||
}
|
||||
|
||||
Popup {
|
||||
id: insertPopup
|
||||
x: input.x
|
||||
y: input.y + input.height
|
||||
width: 200
|
||||
height: insertGrid.insertChars/insertGrid.columns
|
||||
modal: true
|
||||
focus: true
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
|
||||
|
||||
Grid {
|
||||
id: insertGrid
|
||||
width: parent.width
|
||||
columns: 10
|
||||
|
||||
property var insertChars: [
|
||||
"α","β","γ","δ","ε","ζ","η","θ","κ","λ",
|
||||
"μ","ξ","ρ","ς","σ","τ","φ","χ","ψ","ω",
|
||||
"Γ","Δ","Θ","Λ","Ξ","Π","Σ","Φ","Ψ","Ω",
|
||||
"∞","∂"," "," "," "," "," "," "," "," ",
|
||||
"¹","²","³","⁴","⁵","⁶","⁷","⁸","⁹","⁰",
|
||||
"₁","₂","₃","₄","₅","₆","₇","₈","₉","₀",
|
||||
"ₐ","ₑ","ₒ","ₓ","ₔ","ₕ","ₖ","ₗ","ₘ","ₙ",
|
||||
"ₚ","ₛ","ₜ"," "," "," "," "," "," "," "
|
||||
|
||||
]
|
||||
Repeater {
|
||||
model: parent.insertChars.length
|
||||
|
||||
Button {
|
||||
id: insertBtn
|
||||
width: insertGrid.width/insertGrid.columns
|
||||
height: width
|
||||
text: insertGrid.insertChars[modelData]
|
||||
flat: text == " "
|
||||
|
||||
onClicked: {
|
||||
input.insert(input.cursorPosition, insertGrid.insertChars[modelData])
|
||||
insertPopup.close()
|
||||
input.focus = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
110
LogarithmPlotter/qml/icons/Function.svg
Normal file
|
@ -0,0 +1,110 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Function.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs833" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="15.268708"
|
||||
inkscape:cy="12.238724"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1403" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:date>2021</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Ad5001</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:rights>
|
||||
<cc:Agent>
|
||||
<dc:title>(C) Ad5001 2021 - Licensed under CC4.0-BY-NC-SA</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:rights>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-nc-nd/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc-nd/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1415"
|
||||
style="fill:#000000;fill-rule:evenodd"
|
||||
d="M 2,9 C 2,5 6,5 6,5 H 7 V 7 H 6 C 6,7 4,7 4,9 v 2 h 2 v 2 H 4 v 5 H 2 V 13 H 0 v -2 h 2 z"
|
||||
sodipodi:nodetypes="ccccccccccccccccc" />
|
||||
<path
|
||||
id="rect839"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 12,3 v 2 c 0,0 -2,0 -2,7 0,7 2,7 2,7 v 2 C 8,21 8,12 8,12 8,12 8,3 12,3 Z"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
id="rect857"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 12,10 h 2 l 6,8 h -2 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="rect857-7"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 12,18 h 2 l 6,-8 h -2 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="rect839-3"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 20,3 v 2 c 0,0 2,0 2,7 0,7 -2,7 -2,7 v 2 c 4,0 4,-9 4,-9 0,0 0,-9 -4,-9 z"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
92
LogarithmPlotter/qml/icons/Gain Bode.svg
Normal file
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Gain Bode.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="15.839192"
|
||||
inkscape:cx="15.763196"
|
||||
inkscape:cy="7.8365971"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:14.257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
id="rect835"
|
||||
width="14"
|
||||
height="2"
|
||||
x="0"
|
||||
y="17" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:17.3333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
x="-0.12666447"
|
||||
y="12.134649"
|
||||
id="text839"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan837"
|
||||
x="-0.12666447"
|
||||
y="12.134649"
|
||||
style="font-size:17.3333px">ω</tspan></text>
|
||||
<circle
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
id="path837"
|
||||
cx="13"
|
||||
cy="18"
|
||||
r="4" />
|
||||
<path
|
||||
id="rect837"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.10035"
|
||||
transform="rotate(30)"
|
||||
d="m 20.686533,-6.169873 2.232051,-0.1339746 -0.06218,13.8923049 -2.23205,0.1339746 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
88
LogarithmPlotter/qml/icons/Phase Bode.svg
Normal file
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Phase Bode.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="15.347905"
|
||||
inkscape:cy="8.3727678"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid19" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata13">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;stroke-width:1.1547"
|
||||
id="rect26"
|
||||
width="8"
|
||||
height="2"
|
||||
x="5"
|
||||
y="18" />
|
||||
<path
|
||||
id="rect26-3"
|
||||
style="fill:#000000;stroke-width:1.22474"
|
||||
d="m 15,2 v 14 h 2 V 4 h 7 V 2 Z"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<circle
|
||||
style="fill:#000000;stroke-width:2.09999"
|
||||
id="path45"
|
||||
cx="16"
|
||||
cy="19"
|
||||
r="4" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
x="6.4359932"
|
||||
y="11.702"
|
||||
id="text49"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan47"
|
||||
x="6.4359932"
|
||||
y="11.702"
|
||||
style="font-size:18px;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none">φ</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
78
LogarithmPlotter/qml/icons/Point.svg
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Point.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="23.448337"
|
||||
inkscape:cy="9.9487426"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1829"
|
||||
inkscape:window-height="916"
|
||||
inkscape:window-x="48"
|
||||
inkscape:window-y="31"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path1414"
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
d="m 9.979376,18.120606 a 3.5,3.5 0 0 1 -3.06333,3.854578 3.5,3.5 0 0 1 -3.8866522,-3.022533 3.5,3.5 0 0 1 2.9814002,-3.918293 3.5,3.5 0 0 1 3.9495,2.939936" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:17.3373px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00023"
|
||||
x="12.066752"
|
||||
y="13.922545"
|
||||
id="text14"
|
||||
transform="scale(0.99446808,1.0055627)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan12"
|
||||
x="12.066752"
|
||||
y="13.922545"
|
||||
style="font-size:17.3373px;stroke-width:1.00023">A</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
85
LogarithmPlotter/qml/icons/Repartition.svg
Normal file
|
@ -0,0 +1,85 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Repartition.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs835" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="6.3508106"
|
||||
inkscape:cy="10.678389"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1405" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata838">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<circle
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:0.377953"
|
||||
id="path1412"
|
||||
cx="4"
|
||||
cy="12"
|
||||
r="3" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:0.365137"
|
||||
id="rect1414"
|
||||
width="13"
|
||||
height="2"
|
||||
x="6"
|
||||
y="11" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1416"
|
||||
sodipodi:type="arc"
|
||||
sodipodi:cx="21.999399"
|
||||
sodipodi:cy="12"
|
||||
sodipodi:rx="3"
|
||||
sodipodi:ry="3"
|
||||
sodipodi:start="1.5707963"
|
||||
sodipodi:end="4.712389"
|
||||
sodipodi:arc-type="arc"
|
||||
d="m 21.999399,15 a 3,3 0 0 1 -2.598076,-1.5 3,3 0 0 1 0,-3 3,3 0 0 1 2.598076,-1.5"
|
||||
sodipodi:open="true" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
103
LogarithmPlotter/qml/icons/Sequence.svg
Normal file
|
@ -0,0 +1,103 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Sequence.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="-1.4929284"
|
||||
inkscape:cy="9.7261905"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
showguides="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid19" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata13">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17.3333px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;text-anchor:middle"
|
||||
x="7.483983"
|
||||
y="16.134649"
|
||||
id="text908"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan906"
|
||||
x="7.483983"
|
||||
y="16.134649"
|
||||
style="font-size:17.3333px">u</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;text-anchor:middle;stroke-width:1.00003"
|
||||
x="16.365566"
|
||||
y="18.663307"
|
||||
id="text912"
|
||||
transform="scale(1.0000324,0.9999676)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan910"
|
||||
x="16.365566"
|
||||
y="18.663307"
|
||||
style="font-size:17px;stroke-width:1.00003">n</tspan></text>
|
||||
<g
|
||||
aria-label="("
|
||||
id="text852"
|
||||
style="font-style:normal;font-weight:normal;font-size:12px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.4396;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(1.0022756,0,0,1.2616817,-0.26079098,-9.0560687)">
|
||||
<path
|
||||
d="M 2.712,9.86 C 1.536,11.528 0.48,12.956 0.48,15.8 c 0,2.844 1.056,4.272 2.232,5.94 L 3.408,21.26 C 2.328,19.664 1.632,18.368 1.632,15.8 c 0,-2.58 0.696,-3.864 1.776,-5.46 z"
|
||||
style="font-size:12px;stroke:#000000;stroke-width:0.4396;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path854" />
|
||||
</g>
|
||||
<g
|
||||
aria-label="("
|
||||
id="text852-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:12px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.4396;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(-1.0030304,0,0,1.2658306,24.414952,-9.1000412)">
|
||||
<path
|
||||
d="M 2.712,9.86 C 1.536,11.528 0.48,12.956 0.48,15.8 c 0,2.844 1.056,4.272 2.232,5.94 L 3.408,21.26 C 2.328,19.664 1.632,18.368 1.632,15.8 c 0,-2.58 0.696,-3.864 1.776,-5.46 z"
|
||||
style="font-size:12px;stroke:#000000;stroke-width:0.4396;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path854-6" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
96
LogarithmPlotter/qml/icons/Somme gains Bode.svg
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Somme gains Bode.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="63.356768"
|
||||
inkscape:cx="15.947723"
|
||||
inkscape:cy="5.6917309"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect838"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 2,2 H 8 V 3 H 4 L 7,6 4,9 h 4 v 1 H 2 V 9 L 5,6 2,3 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:14.257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
id="rect835"
|
||||
width="14"
|
||||
height="2"
|
||||
x="0"
|
||||
y="17" />
|
||||
<circle
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
id="path837"
|
||||
cx="13"
|
||||
cy="18"
|
||||
r="4" />
|
||||
<path
|
||||
id="rect837"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.10035"
|
||||
transform="rotate(30)"
|
||||
d="m 20.686533,-6.169873 2.232051,-0.1339746 -0.06218,13.8923049 -2.23205,0.1339746 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<g
|
||||
aria-label="G"
|
||||
id="text846"
|
||||
style="font-style:normal;font-weight:normal;font-size:12px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none">
|
||||
<path
|
||||
d="m 13,2 c 0,0 -3,0 -3,3 0,3 0,5 3,5 2,0 3,0 3,-2 V 6 h -3 v 1 h 2 v 1 c 0,1 -1,1 -2,1 -1,0 -2,0 -2,-4 0,-1 1,-2 2,-2 2,0 2,1 2,1 h 1 c 0,0 0,-2 -3,-2 z"
|
||||
style="font-size:12px"
|
||||
id="path848"
|
||||
sodipodi:nodetypes="sssccccccsssccs" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
93
LogarithmPlotter/qml/icons/Somme gains Bode2.svg
Normal file
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Somme gains Bode.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="22.985246"
|
||||
inkscape:cy="9.8906279"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path1414"
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
d="m 19.979376,19.120606 a 3.5,3.5 0 0 1 -3.06333,3.854578 3.5,3.5 0 0 1 -3.886652,-3.022533 3.5,3.5 0 0 1 2.9814,-3.918293 3.5,3.5 0 0 1 3.9495,2.939936" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:16.166;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
id="rect835"
|
||||
width="18"
|
||||
height="2"
|
||||
x="0"
|
||||
y="18.5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
x="-0.5703125"
|
||||
y="11.875"
|
||||
id="text839"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan837"
|
||||
x="-0.5703125"
|
||||
y="11.875"
|
||||
style="font-size:16px">ΣG</tspan></text>
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:19.0663;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0"
|
||||
id="rect835-3"
|
||||
width="25.038315"
|
||||
height="2"
|
||||
x="-10.17229"
|
||||
y="23.748709"
|
||||
ry="0"
|
||||
transform="rotate(-60)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
92
LogarithmPlotter/qml/icons/Somme phases Bode.svg
Normal file
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Somme phases Bode.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="15.347905"
|
||||
inkscape:cy="8.3727678"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid19" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata13">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;stroke-width:1.41421"
|
||||
id="rect26"
|
||||
width="12"
|
||||
height="2"
|
||||
x="9"
|
||||
y="18" />
|
||||
<rect
|
||||
style="fill:#000000;stroke-width:0.912867"
|
||||
id="rect26-3"
|
||||
width="5"
|
||||
height="2"
|
||||
x="19"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;stroke-width:1.5"
|
||||
id="rect43"
|
||||
width="2"
|
||||
height="16"
|
||||
x="19"
|
||||
y="4" />
|
||||
<circle
|
||||
style="fill:#000000;stroke-width:2.09999"
|
||||
id="path45"
|
||||
cx="20"
|
||||
cy="19"
|
||||
r="3.5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:16px;line-height:1.25;font-family:sans-serif;text-align:center;letter-spacing:0px;text-anchor:middle"
|
||||
x="8.7617188"
|
||||
y="11.664062"
|
||||
id="text49"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan47"
|
||||
x="8.7617188"
|
||||
y="11.664062"
|
||||
style="font-size:16px">Σφ</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
77
LogarithmPlotter/qml/icons/Text.svg
Normal file
|
@ -0,0 +1,77 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Text.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="13.763421"
|
||||
inkscape:cy="16.975675"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
aria-label="X"
|
||||
transform="matrix(0.99446808,0,0,1.0055627,2,0.50000001)"
|
||||
id="text14"
|
||||
style="font-style:normal;font-weight:normal;font-size:17.3373px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00023" />
|
||||
<path
|
||||
id="rect12"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.670999;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 4,3 h 8 V 5 H 9 v 14 h 3 v 2 H 4 V 19 H 7 V 5 H 4 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
<path
|
||||
id="rect837"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 16,5 h 2 v 3 h 2 v 2 h -2 v 5 c 0,2 2,2 2,2 v 2 c 0,0 -4,0 -4,-4 V 10 H 14 V 8 h 2 z"
|
||||
sodipodi:nodetypes="ccccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
85
LogarithmPlotter/qml/icons/X Cursor.svg
Normal file
|
@ -0,0 +1,85 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="X Cursor.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="19.545462"
|
||||
inkscape:cy="13.163586"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1829"
|
||||
inkscape:window-height="916"
|
||||
inkscape:window-x="19"
|
||||
inkscape:window-y="31"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
aria-label="X"
|
||||
transform="matrix(0.99446808,0,0,1.0055627,-2.2765848e-8,0.50000001)"
|
||||
id="text14"
|
||||
style="font-style:normal;font-weight:normal;font-size:17.3373px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00023" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.774803;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect12"
|
||||
width="2"
|
||||
height="24"
|
||||
x="17"
|
||||
y="0"
|
||||
ry="2.14841e-13" />
|
||||
<path
|
||||
id="rect835"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 5,2 h 2 l 8,14 h -2 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="rect835-6"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 15,2 H 13 L 5,16 h 2 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
104
LogarithmPlotter/qml/icons/delete.svg
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="delete.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="34.185532"
|
||||
inkscape:cy="11.508793"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid19" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata13">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:1.55662"
|
||||
id="rect26"
|
||||
width="1"
|
||||
height="14"
|
||||
x="5"
|
||||
y="8" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:2.73862"
|
||||
id="rect869"
|
||||
width="20"
|
||||
height="1"
|
||||
x="2"
|
||||
y="-7"
|
||||
transform="scale(1,-1)" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:0.474342"
|
||||
id="rect871"
|
||||
width="1"
|
||||
height="2"
|
||||
x="8"
|
||||
y="3" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:1.34164"
|
||||
id="rect873"
|
||||
width="8"
|
||||
height="1"
|
||||
x="8"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:0.500005"
|
||||
id="rect875"
|
||||
width="1"
|
||||
height="2"
|
||||
x="15"
|
||||
y="3" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:1.55662"
|
||||
id="rect26-3"
|
||||
width="1"
|
||||
height="14"
|
||||
x="18"
|
||||
y="8" />
|
||||
<rect
|
||||
style="fill:#000000;stroke:none;stroke-width:0.981983"
|
||||
id="rect894"
|
||||
width="12"
|
||||
height="1"
|
||||
x="6"
|
||||
y="21" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="xaxisstep.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="9.6822382"
|
||||
inkscape:cy="11.578501"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1818"
|
||||
inkscape:window-height="998"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="10"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="15" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34663"
|
||||
id="rect1413-7"
|
||||
width="14"
|
||||
height="1"
|
||||
x="6"
|
||||
y="-21"
|
||||
transform="rotate(90)" />
|
||||
<path
|
||||
id="rect1003"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.3094"
|
||||
d="M 5,10 8,7 v 2 h 9 V 7 l 3,3 -3,3 V 11 H 8 v 2 z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34663"
|
||||
id="rect1413-7-5"
|
||||
width="14"
|
||||
height="1"
|
||||
x="6"
|
||||
y="-5"
|
||||
transform="rotate(90)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="yaxisstep.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="9.6822382"
|
||||
inkscape:cy="11.578501"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="7"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="12" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34662"
|
||||
id="rect1413"
|
||||
width="1"
|
||||
height="14"
|
||||
x="3"
|
||||
y="-18"
|
||||
transform="rotate(90)" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34662"
|
||||
id="rect1413-7"
|
||||
width="1"
|
||||
height="14.000001"
|
||||
x="19"
|
||||
y="-18"
|
||||
transform="rotate(90)" />
|
||||
<path
|
||||
id="rect1003"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.3094"
|
||||
d="m 14,4 3,3 h -2 v 9 h 2 l -3,3 -3,-3 h 2 V 7 h -2 z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/Display Mode.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
appearance.svg
|
1
LogarithmPlotter/qml/icons/settings/custom/Display Style.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
appearance.svg
|
95
LogarithmPlotter/qml/icons/settings/custom/Expression.svg
Normal file
|
@ -0,0 +1,95 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Expression.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs833" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="32"
|
||||
inkscape:cx="13.74978"
|
||||
inkscape:cy="12.103821"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1403" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:date>2021</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Ad5001</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:rights>
|
||||
<cc:Agent>
|
||||
<dc:title>(C) Ad5001 2021 - Licensed under CC4.0-BY-NC-SA</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:rights>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-nc-nd/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc-nd/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1021-2"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 17,7.000225 c 2,0 2,3 2,3 l -1,1 c 0,0 -1,-2 -2,-2 0,0 -2,0 -3,3 -1,3 -1,4 -1,4 0,2 5,-2 5,-2 l 1,1 c -2.247519,2.247519 -3.646932,3.015351 -5,3 -2.259097,-0.02563 -4,-1 -1.999999,-6 1.999999,-5 5.999999,-5 5.999999,-5 z"
|
||||
sodipodi:nodetypes="ccccccccscc" />
|
||||
<path
|
||||
id="rect1021-2-2"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 6,18.000225 c -2,0 -2,-3 -2,-3 l 1,-1 c 0,0 1,2 2,2 0,0 2,0 3,-3 1,-3 1,-4 1,-4 0,-2 -5,2 -5,2 l -1,-1 c 2.247519,-2.247519 3.646932,-3.015351 5,-3 2.259097,0.02563 4,1 1.999999,6 -1.999999,5 -5.999999,5 -5.999999,5 z"
|
||||
sodipodi:nodetypes="ccccccccscc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
87
LogarithmPlotter/qml/icons/settings/custom/Gain.svg
Normal file
|
@ -0,0 +1,87 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)"
|
||||
sodipodi:docname="Gain.svg"
|
||||
id="SVGRoot"
|
||||
version="1.1"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
height="24.0px"
|
||||
width="24.0px">
|
||||
<defs
|
||||
id="defs836">
|
||||
<clipPath
|
||||
id="clipPath3595">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
width="24"
|
||||
height="12"
|
||||
x="0"
|
||||
y="6"
|
||||
id="rect1039" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="18.046532"
|
||||
inkscape:cy="11.804721"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="73"
|
||||
inkscape:window-y="434"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1122"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2.44949"
|
||||
d="M 8,0 C 5,0 2,4 -1,9 l 1,2 C 3.5,6 6,2 8,2 13.597845,2 17.919626,19.388459 24,24 V 21 C 19.230304,15.926658 14.735387,0 8,0 Z"
|
||||
sodipodi:nodetypes="sccsccs" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
id="rect1129"
|
||||
width="24"
|
||||
height="2"
|
||||
x="0"
|
||||
y="15" />
|
||||
<path
|
||||
id="rect1131"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 8,3 3,4 H 9 v 4 h 2 L 8,15 5,11 H 7 V 7 H 5 Z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/Label Position.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
arrow.svg
|
1
LogarithmPlotter/qml/icons/settings/custom/Label X.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
position.svg
|
64
LogarithmPlotter/qml/icons/settings/custom/Pass.svg
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Pass.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="11.650251"
|
||||
inkscape:cy="15.624271"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="102"
|
||||
inkscape:window-y="150"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect832"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 5,7 h 14 l 5,9 -1,2 -5,-9 H 6 L 1,18 0,16 Z"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/Phase.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
angle.svg
|
1
LogarithmPlotter/qml/icons/settings/custom/Point Style.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
appearance.svg
|
69
LogarithmPlotter/qml/icons/settings/custom/Rounding.svg
Normal file
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="rouding.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="17.970864"
|
||||
inkscape:cy="15.528273"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="102"
|
||||
inkscape:window-y="110"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect832"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 5,8 C 8,1 16,13 19,6 V 8 C 16,15 8,3 5,10 Z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="rect832-6"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 5,16 c 3,-7 11,5 14,-2 v 2 C 16,23 8,11 5,18 Z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/Target Element.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
target.svg
|
|
@ -0,0 +1 @@
|
|||
position.svg
|
77
LogarithmPlotter/qml/icons/settings/custom/Text.svg
Normal file
|
@ -0,0 +1,77 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="Text.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs1469" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="13.763421"
|
||||
inkscape:cy="16.975675"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2039" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid2058" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata1472">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
aria-label="X"
|
||||
transform="matrix(0.99446808,0,0,1.0055627,2,0.50000001)"
|
||||
id="text14"
|
||||
style="font-style:normal;font-weight:normal;font-size:17.3373px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00023" />
|
||||
<path
|
||||
id="rect12"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.670999;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 4,3 h 8 V 5 H 9 v 14 h 3 v 2 H 4 V 19 H 7 V 5 H 4 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
<path
|
||||
id="rect837"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 16,5 h 2 v 3 h 2 v 2 h -2 v 5 c 0,2 2,2 2,2 v 2 c 0,0 -4,0 -4,-4 V 10 H 14 V 8 h 2 z"
|
||||
sodipodi:nodetypes="ccccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/Unit.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
angle.svg
|
1
LogarithmPlotter/qml/icons/settings/custom/X.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
position.svg
|
1
LogarithmPlotter/qml/icons/settings/custom/Y.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
position.svg
|
64
LogarithmPlotter/qml/icons/settings/custom/angle.svg
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="angle.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="15.839192"
|
||||
inkscape:cx="5.5160288"
|
||||
inkscape:cy="18.543661"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="102"
|
||||
inkscape:window-y="110"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect832"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.26779"
|
||||
d="M 4,16 17,3 18,5 16,7 c 4,3 4,7 4,8 v 1 h -1 c 0,-1 0,-5 -4,-8 l -8,8 h 15 v 2 H 2 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
54
LogarithmPlotter/qml/icons/settings/custom/appearance.svg
Normal file
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
version="1.1"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg4"
|
||||
sodipodi:docname="appearance.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="748"
|
||||
inkscape:window-height="480"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="14.895833"
|
||||
inkscape:cx="11.573135"
|
||||
inkscape:cy="8.9383247"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M4 21.832c4.587.38 2.944-4.493 7.188-4.538l1.838 1.534c.458 5.538-6.315 6.773-9.026 3.004zm14.065-7.115c1.427-2.239 5.847-9.749 5.847-9.749.352-.623-.43-1.273-.976-.813 0 0-6.572 5.714-8.511 7.525-1.532 1.432-1.539 2.086-2.035 4.447l1.68 1.4c2.227-.915 2.868-1.039 3.995-2.81zm-11.999 3.876c.666-1.134 1.748-2.977 4.447-3.262.434-2.087.607-3.3 2.547-5.112 1.373-1.282 4.938-4.409 7.021-6.229-1-2.208-4.141-4.023-8.178-3.99-6.624.055-11.956 5.465-11.903 12.092.023 2.911 1.081 5.571 2.82 7.635 1.618.429 2.376.348 3.246-1.134zm6.952-15.835c1.102-.006 2.005.881 2.016 1.983.004 1.103-.882 2.009-1.986 2.016-1.105.009-2.008-.88-2.014-1.984-.013-1.106.876-2.006 1.984-2.015zm-5.997 2.001c1.102-.01 2.008.877 2.012 1.983.012 1.106-.88 2.005-1.98 2.016-1.106.007-2.009-.881-2.016-1.988-.009-1.103.877-2.004 1.984-2.011zm-2.003 5.998c1.106-.007 2.01.882 2.016 1.985.01 1.104-.88 2.008-1.986 2.015-1.105.008-2.005-.88-2.011-1.985-.011-1.105.879-2.004 1.981-2.015zm10.031 8.532c.021 2.239-.882 3.718-1.682 4.587l-.046.044c5.255-.591 9.062-4.304 6.266-7.889-1.373 2.047-2.534 2.442-4.538 3.258z"
|
||||
id="path2"
|
||||
style="fill:#000000" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
64
LogarithmPlotter/qml/icons/settings/custom/arrow.svg
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="arrow.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="15.839192"
|
||||
inkscape:cx="23.69014"
|
||||
inkscape:cy="2.1236293"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="102"
|
||||
inkscape:window-y="110"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect832"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 9,3 3,-3 3,3 H 13 V 9 L 18,4 17,3 h 4 v 4 l -1,-1 -5,5 h 6 V 9 l 3,3 -3,3 v -2 h -6 l 5,5 1,-1 v 4 h -4 l 1,-1 -5,-5 v 6 h 2 l -3,3 -3,-3 h 2 v -6 l -5,5 1,1 H 3 v -4 l 1,1 5,-5 H 3 v 2 L 0,12 3,9 v 2 H 9 L 4,6 3,7 V 3 H 7 L 6,4 11,9 V 3 Z"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
70
LogarithmPlotter/qml/icons/settings/custom/label.svg
Normal file
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="label.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="44.8"
|
||||
inkscape:cx="23.034941"
|
||||
inkscape:cy="13.488091"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="110"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1420-3"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.05505"
|
||||
d="M 7,5 H 23 V 7 H 9 l -5,5 5,5 H 21 V 7 h 2 v 10 2 H 7 L 1,13 v -2 z"
|
||||
sodipodi:nodetypes="ccccccccccccccc" />
|
||||
<circle
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
id="path833"
|
||||
cx="16"
|
||||
cy="12"
|
||||
r="3" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
63
LogarithmPlotter/qml/icons/settings/custom/position.svg
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="icon.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="9.4491763"
|
||||
inkscape:cy="10.106407"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="93"
|
||||
inkscape:window-y="51"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect832"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 12 2 C 12 2 6 2 6 8 C 6 12 12 21.935547 12 21.935547 C 12 21.935547 18 12 18 8 C 18 2 12 2 12 2 z M 11.949219 5 A 3 3 0 0 1 12 5 A 3 3 0 0 1 15 8 A 3 3 0 0 1 12 11 A 3 3 0 0 1 9 8 A 3 3 0 0 1 11.949219 5 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
64
LogarithmPlotter/qml/icons/settings/custom/target.svg
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="target.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="15.839192"
|
||||
inkscape:cx="11.15549"
|
||||
inkscape:cy="18.172294"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1580"
|
||||
inkscape:window-height="900"
|
||||
inkscape:window-x="93"
|
||||
inkscape:window-y="51"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect833"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.05798"
|
||||
d="m 11,3 h 2 v 8 h 3 C 16,8 13,8 13,8 V 6 c 0,0 5,0 5,5 h 3 v 2 h -3 c 0,5 -5,5 -5,5 v -2 c 0,0 3,0 3,-3 h -3 v 8 H 11 V 13 H 8 c 0,3 3,3 3,3 v 2 c 0,0 -5,0 -5,-5 H 3 V 11 H 6 C 6,6 11,6 11,6 v 2 c 0,0 -3,0 -3,3 h 3 z"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
1
LogarithmPlotter/qml/icons/settings/custom/ω₀.svg
Symbolic link
|
@ -0,0 +1 @@
|
|||
angle.svg
|
80
LogarithmPlotter/qml/icons/settings/linewidth.svg
Normal file
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="linewidth.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="6.3741139"
|
||||
inkscape:cy="13.782634"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="3" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:5.16398"
|
||||
id="rect1420-3"
|
||||
width="20"
|
||||
height="4"
|
||||
x="2"
|
||||
y="8" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:7.30297"
|
||||
id="rect1420-3-6"
|
||||
width="20"
|
||||
height="6"
|
||||
x="2"
|
||||
y="15" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
104
LogarithmPlotter/qml/icons/settings/textsize.svg
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="textsize.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs833" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="8"
|
||||
inkscape:cx="-23.020311"
|
||||
inkscape:cy="14.000331"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1403" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:date>2021</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Ad5001</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:rights>
|
||||
<cc:Agent>
|
||||
<dc:title>(C) Ad5001 2021 - Licensed under CC4.0-BY-NC-SA</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:rights>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-nc-nd/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc-nd/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1021-2"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 15 7.5214844 C 13.703216 8.0990522 12.071184 9.3220377 11 12 C 8.999999 17 10.740903 17.97437 13 18 C 13.628595 18.007132 14.271011 17.836312 15 17.435547 L 15 15.429688 C 13.606222 16.332721 12 17.136051 12 16 C 12 16 12 15 13 12 C 13.53565 10.393051 14.351576 9.6589924 15 9.3125 L 15 7.5214844 z " />
|
||||
<path
|
||||
id="rect1021-2-2"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 6,18.000225 c -2,0 -2,-3 -2,-3 l 1,-1 c 0,0 1,2 2,2 0,0 2,0 3,-3 1,-3 1,-4 1,-4 0,-2 -5,2 -5,2 l -1,-1 c 2.247519,-2.247519 3.646932,-3.015351 5,-3 2.259097,0.02563 4,1 1.999999,6 -1.999999,5 -5.999999,5 -5.999999,5 z"
|
||||
sodipodi:nodetypes="ccccccccscc" />
|
||||
<path
|
||||
id="rect834"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2.44949"
|
||||
d="m 17,14 h 2 v 6 h 3 l -4,4 -4,-4 h 3 z"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
id="rect834-3"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:2.44949"
|
||||
d="m 17,12 h 2 V 6 h 3 L 18,2 14,6 h 3 z"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
94
LogarithmPlotter/qml/icons/settings/xaxisstep.svg
Normal file
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="xaxisstep.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="9.6822382"
|
||||
inkscape:cy="11.578501"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1818"
|
||||
inkscape:window-height="998"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="4"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="15" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34663"
|
||||
id="rect1413-7"
|
||||
width="14"
|
||||
height="1"
|
||||
x="6"
|
||||
y="-21"
|
||||
transform="rotate(90)" />
|
||||
<path
|
||||
id="rect1003"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.3094"
|
||||
d="m 9,10 3,-3 v 2 h 5 V 7 l 3,3 -3,3 v -2 h -5 v 2 z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34663"
|
||||
id="rect1413-7-5"
|
||||
width="14"
|
||||
height="1"
|
||||
x="6"
|
||||
y="-9"
|
||||
transform="rotate(90)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
78
LogarithmPlotter/qml/icons/settings/xlabel.svg
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="xlabel.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="7.6028031"
|
||||
inkscape:cy="9.4464758"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.47213"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="5"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="17" />
|
||||
<path
|
||||
id="rect1413"
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.4142"
|
||||
d="m 21,8 v 1 h -2 v 5 h 2 v 1 h -5 v -1 h 2 V 9 H 16 V 8 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
80
LogarithmPlotter/qml/icons/settings/xmin.svg
Normal file
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="xmin.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="7.9418411"
|
||||
inkscape:cy="14.202968"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="18"
|
||||
x="7"
|
||||
y="3" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="15" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.78884"
|
||||
id="rect1413"
|
||||
width="1"
|
||||
height="8"
|
||||
x="3"
|
||||
y="12" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
73
LogarithmPlotter/qml/icons/settings/xzoom.svg
Normal file
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="xzoom.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="3.2863506"
|
||||
inkscape:cy="11.157143"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1418"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
d="m 17,13 4,4 -4,4 V 18 H 3 v -2 h 14 z"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
id="path834"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 6.949219,5 A 3,3 0 0 0 4,8 3,3 0 0 0 7,11 3,3 0 0 0 10,8 3,3 0 0 0 7,5 3,3 0 0 0 6.94922,5 Z m 0.002,1 A 2,2 0 0 1 7,6 2,2 0 0 1 9,8 2,2 0 0 1 7,10 2,2 0 0 1 5,8 2,2 0 0 1 6.951172,6 Z" />
|
||||
<path
|
||||
id="rect841"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 8,10 1,-1 4,4 -1,1 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
94
LogarithmPlotter/qml/icons/settings/yaxisstep.svg
Normal file
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="yaxisstep.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="31.678384"
|
||||
inkscape:cx="9.6822382"
|
||||
inkscape:cy="11.578501"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="7"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="18" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34662"
|
||||
id="rect1413"
|
||||
width="1"
|
||||
height="14"
|
||||
x="3"
|
||||
y="-18"
|
||||
transform="rotate(90)" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:3.34662"
|
||||
id="rect1413-7"
|
||||
width="1"
|
||||
height="14.000001"
|
||||
x="15"
|
||||
y="-18"
|
||||
transform="rotate(90)" />
|
||||
<path
|
||||
id="rect1003"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2.3094"
|
||||
d="m 14,4 3,3 h -2 v 5 h 2 l -3,3 -3,-3 h 2 V 7 h -2 z"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
78
LogarithmPlotter/qml/icons/settings/ylabel.svg
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="ylabel.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="7.6028031"
|
||||
inkscape:cy="9.4464758"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.47213"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="20"
|
||||
x="5"
|
||||
y="2" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="17" />
|
||||
<path
|
||||
id="rect1413"
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.4142"
|
||||
d="m 14,3 v 1 h -2 v 5 h 2 v 1 H 9 V 9 h 2 V 4 H 9 V 3 Z"
|
||||
sodipodi:nodetypes="ccccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
81
LogarithmPlotter/qml/icons/settings/ymax.svg
Normal file
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="ymax.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="22.4"
|
||||
inkscape:cx="7.9418411"
|
||||
inkscape:cy="14.202968"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
id="rect1418"
|
||||
width="2"
|
||||
height="18"
|
||||
x="7"
|
||||
y="3" />
|
||||
<rect
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:3.65149"
|
||||
id="rect1420"
|
||||
width="20"
|
||||
height="2"
|
||||
x="2"
|
||||
y="15" />
|
||||
<rect
|
||||
style="fill:#ff0000;fill-rule:evenodd;stroke-width:1.78884"
|
||||
id="rect1413"
|
||||
width="1"
|
||||
height="8"
|
||||
x="4"
|
||||
y="-12"
|
||||
transform="rotate(90)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
73
LogarithmPlotter/qml/icons/settings/yzoom.svg
Normal file
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24.0px"
|
||||
height="24.0px"
|
||||
viewBox="0 0 24.0 24.0"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
sodipodi:docname="yzoom.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2021-09-07)">
|
||||
<defs
|
||||
id="defs836" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="11.2"
|
||||
inkscape:cx="-43.489258"
|
||||
inkscape:cy="12.995845"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1406" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata839">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="rect1418"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:4.24264"
|
||||
d="M 3,7 7,3 11,7 H 8 V 21 H 6 V 7 Z"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
id="path834"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="M 12.949219,11 A 3,3 0 0 0 10,14 a 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 3,3 0 0 0 -0.05078,0 z m 0.002,1 A 2,2 0 0 1 13,12 a 2,2 0 0 1 2,2 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 1.951172,-2 z" />
|
||||
<path
|
||||
id="rect841"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke-width:2"
|
||||
d="m 14,16 1,-1 4,4 -1,1 z"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
1837
LogarithmPlotter/qml/js/expr-eval.js
Normal file
175
LogarithmPlotter/qml/js/historylib.js
Normal file
|
@ -0,0 +1,175 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// This library helps containing actions to be undone or redone (in other words, editing history)
|
||||
// Each type of event is repertoried as an action that can be listed for everything that's undoable.
|
||||
.pragma library
|
||||
|
||||
.import "objects.js" as Objects
|
||||
.import "utils.js" as Utils
|
||||
.import "mathlib.js" as MathLib
|
||||
|
||||
class Action {
|
||||
// Type of the action done.
|
||||
type(){return 'Unknown'}
|
||||
|
||||
// TargetName is the name of the object that's targeted by the event.
|
||||
constructor(targetName = "", targetType = "Point") {
|
||||
this.targetName = targetName
|
||||
this.targetType = targetType
|
||||
}
|
||||
|
||||
undo() {}
|
||||
|
||||
redo() {}
|
||||
|
||||
export() {
|
||||
return [this.targetName, this.targetType]
|
||||
}
|
||||
|
||||
getReadableString() {
|
||||
return 'Unknown action'
|
||||
}
|
||||
}
|
||||
|
||||
class CreateNewObject extends Action {
|
||||
// Action used for the creation of an object
|
||||
type(){return 'CreateNewObject'}
|
||||
|
||||
constructor(targetName = "", targetType = "Point", properties = []) {
|
||||
super(targetName, targetType)
|
||||
this.targetProperties = properties
|
||||
}
|
||||
|
||||
|
||||
undo() {
|
||||
var targetIndex = Objects.getObjectsName(this.targetType).indexOf(this.targetName)
|
||||
Objects.currentObjects[this.targetType][targetIndex].delete()
|
||||
Objects.currentObjects[this.targetType].splice(targetIndex, 1)
|
||||
}
|
||||
|
||||
redo() {
|
||||
Objects.createNewRegisteredObject(this.targetType, this.targetProperties)
|
||||
}
|
||||
|
||||
export() {
|
||||
return [this.targetName, this.targetType, this.targetProperties]
|
||||
}
|
||||
|
||||
getReadableString() {
|
||||
return `New ${this.targetType} ${this.targetName} created.`
|
||||
}
|
||||
}
|
||||
|
||||
class DeleteObject extends CreateNewObject {
|
||||
// Action used at the deletion of an object. Basicly the same thing as creating a new object, except Redo & Undo are reversed.
|
||||
type(){return 'DeleteObject'}
|
||||
|
||||
undo() {
|
||||
super.redo()
|
||||
}
|
||||
|
||||
redo() {
|
||||
super.undo()
|
||||
}
|
||||
|
||||
getReadableString() {
|
||||
return `${this.targetType} ${this.targetName} deleted.`
|
||||
}
|
||||
}
|
||||
|
||||
class EditedProperty extends Action {
|
||||
// Action used everytime an object's property has been changed
|
||||
type(){return 'EditedProperty'}
|
||||
|
||||
constructor(targetName = "", targetType = "Point", targetProperty = "visible", previousValue = false, newValue = true, valueIsExpressionNeedingImport = false) {
|
||||
super(targetName, targetType)
|
||||
this.targetProperty = targetProperty
|
||||
this.targetPropertyReadable = Utils.camelCase2readable(this.targetProperty)
|
||||
this.previousValue = previousValue
|
||||
this.newValue = newValue
|
||||
if(valueIsExpressionNeedingImport) {
|
||||
this.previousValue = new MathLib.Expression(this.previousValue);
|
||||
this.newValue = new MathLib.Expression(this.newValue);
|
||||
}
|
||||
}
|
||||
|
||||
undo() {
|
||||
Objects.getObjectByName(this.targetName, this.targetType)[this.targetProperty] = this.previousValue
|
||||
}
|
||||
|
||||
redo() {
|
||||
Objects.getObjectByName(this.targetName, this.targetType)[this.targetProperty] = this.newValue
|
||||
}
|
||||
|
||||
export() {
|
||||
if(this.previousValue instanceof MathLib.Expression) {
|
||||
return [this.targetName, this.targetType, this.targetProperty, this.previousValue.toEditableString(), this.newValue.toEditableString(), true]
|
||||
} else {
|
||||
return [this.targetName, this.targetType, this.targetProperty, this.previousValue, this.newValue, false]
|
||||
}
|
||||
}
|
||||
|
||||
getReadableString() {
|
||||
var prev = this.previousValue == null ? ""+this.previousValue : this.previousValue.toString()
|
||||
var next = this.newValue == null ? ""+this.newValue : this.newValue.toString()
|
||||
return `${this.targetPropertyReadable} of ${this.targetType} ${this.targetName} changed from "${prev}" to "${next}".`
|
||||
}
|
||||
}
|
||||
|
||||
class EditedVisibility extends EditedProperty {
|
||||
// Action used everytime an object's property has been changed
|
||||
type(){return 'EditedVisibility'}
|
||||
|
||||
constructor(targetName = "", targetType = "Point", newValue = true) {
|
||||
super(targetName, targetType, "visible", !newValue, newValue)
|
||||
}
|
||||
|
||||
getReadableString() {
|
||||
if(this.newValue) {
|
||||
return `${this.targetType} ${this.targetName} shown.`
|
||||
} else {
|
||||
return `${this.targetType} ${this.targetName} hidden.`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class NameChanged extends EditedProperty {
|
||||
// Action used everytime an object's property has been changed
|
||||
type(){return 'EditedVisibility'}
|
||||
|
||||
constructor(targetName = "", targetType = "Point", newName = "") {
|
||||
super(targetName, targetType, "name", targetName, newName)
|
||||
}
|
||||
|
||||
undo() {
|
||||
Objects.getObjectByName(this.newValue, this.targetType)['name'] = this.previousValue
|
||||
}
|
||||
|
||||
redo() {
|
||||
Objects.getObjectByName(this.previousValue, this.targetType)[this.targetProperty] = this.newValue
|
||||
}
|
||||
}
|
||||
|
||||
var Actions = {
|
||||
"Action": Action,
|
||||
"CreateNewObject": CreateNewObject,
|
||||
"DeleteObject": DeleteObject,
|
||||
"EditedProperty": EditedProperty,
|
||||
"EditedVisibility": EditedVisibility,
|
||||
}
|
653
LogarithmPlotter/qml/js/mathlib.js
Normal file
|
@ -0,0 +1,653 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.pragma library
|
||||
|
||||
.import "expr-eval.js" as ExprEval
|
||||
.import "utils.js" as Utils
|
||||
|
||||
|
||||
|
||||
var evalVariables = { // Variables not provided by expr-eval.js, needs to be provided manualy
|
||||
"pi": Math.PI,
|
||||
"π": Math.PI,
|
||||
"inf": Infinity,
|
||||
"Infinity": Infinity,
|
||||
"∞": Infinity,
|
||||
"e": Math.E,
|
||||
"E": Math.E
|
||||
}
|
||||
|
||||
var currentVars = {}
|
||||
|
||||
const parser = new ExprEval.Parser()
|
||||
parser.functions.integral = function(a, b, f, variable) {
|
||||
// https://en.wikipedia.org/wiki/Simpson%27s_rule
|
||||
f = parser.parse(f).toJSFunction(variable, currentVars)
|
||||
return (b-a)/6*(f(a)+4*f((a+b)/2)+f(b))
|
||||
}
|
||||
|
||||
const DERIVATION_PRECISION = 0.1
|
||||
|
||||
parser.functions.derivative = function(f, variable, x) {
|
||||
f = parser.parse(f).toJSFunction(variable, currentVars)
|
||||
return (f(x+DERIVATION_PRECISION/2)-f(x-DERIVATION_PRECISION/2))/DERIVATION_PRECISION
|
||||
}
|
||||
|
||||
class Expression {
|
||||
constructor(expr) {
|
||||
this.expr = expr
|
||||
this.calc = parser.parse(expr).simplify()
|
||||
this.cached = this.isConstant()
|
||||
this.cachedValue = this.cached ? this.calc.evaluate(evalVariables) : null
|
||||
}
|
||||
|
||||
isConstant() {
|
||||
return !this.expr.includes("x") && !this.expr.includes("n")
|
||||
}
|
||||
|
||||
execute(x = 1) {
|
||||
if(this.cached) return this.cachedValue
|
||||
currentVars = Object.assign({'x': x}, evalVariables)
|
||||
return this.calc.evaluate(currentVars)
|
||||
}
|
||||
|
||||
simplify(x) {
|
||||
var expr = this.calc.substitute('x', x).simplify()
|
||||
if(expr.evaluate(evalVariables) == 0) return '0'
|
||||
var str = Utils.makeExpressionReadable(expr.toString());
|
||||
if(str != undefined && str.match(/^\d*\.\d+$/)) {
|
||||
if(str.split('.')[1].split('0').length > 7) {
|
||||
// Likely rounding error
|
||||
str = parseFloat(str.substring(0, str.length-1)).toString();
|
||||
}
|
||||
}
|
||||
return str
|
||||
}
|
||||
|
||||
duplicate() {
|
||||
return new Expression(this.toEditableString())
|
||||
}
|
||||
|
||||
toEditableString() {
|
||||
return this.calc.toString()
|
||||
}
|
||||
|
||||
toString(forceSign=false) {
|
||||
var str = Utils.makeExpressionReadable(this.calc.toString())
|
||||
if(str[0] != '-' && forceSign) str = '+' + str
|
||||
return str
|
||||
}
|
||||
}
|
||||
|
||||
function executeExpression(expr){
|
||||
return (new Expression(expr.toString())).execute()
|
||||
}
|
||||
|
||||
class Sequence extends Expression {
|
||||
constructor(name, baseValues = {}, valuePlus = 1, expr = "") {
|
||||
// u[n+valuePlus] = expr
|
||||
super(expr)
|
||||
this.name = name
|
||||
this.baseValues = baseValues
|
||||
this.calcValues = Object.assign({}, baseValues)
|
||||
for(var n in this.calcValues)
|
||||
if(['string', 'number'].includes(typeof this.calcValues[n]))
|
||||
this.calcValues[n] = parser.parse(this.calcValues[n].toString()).simplify().evaluate(evalVariables)
|
||||
this.valuePlus = parseInt(valuePlus)
|
||||
}
|
||||
|
||||
isConstant() {
|
||||
return this.expr.indexOf("n") == -1
|
||||
}
|
||||
|
||||
execute(n = 1) {
|
||||
if(n in this.calcValues)
|
||||
return this.calcValues[n]
|
||||
this.cache(n)
|
||||
return this.calcValues[n]
|
||||
}
|
||||
|
||||
simplify(n = 1) {
|
||||
if(n in this.calcValues)
|
||||
return Utils.makeExpressionReadable(this.calcValues[n].toString())
|
||||
this.cache(n)
|
||||
return Utils.makeExpressionReadable(this.calcValues[n].toString())
|
||||
}
|
||||
|
||||
cache(n = 1) {
|
||||
var str = Utils.simplifyExpression(this.calc.substitute('n', n-this.valuePlus).toString())
|
||||
var expr = parser.parse(str).simplify()
|
||||
var l = {'n': n-this.valuePlus} // Just in case, add n (for custom functions)
|
||||
l[this.name] = this.calcValues
|
||||
currentVars = Object.assign(l, evalVariables)
|
||||
this.calcValues[n] = expr.evaluate(currentVars)
|
||||
}
|
||||
|
||||
toString(forceSign=false) {
|
||||
var str = Utils.makeExpressionReadable(this.calc.toString())
|
||||
if(str[0] != '-' && forceSign) str = '+' + str
|
||||
var subtxt = this.valuePlus == 0 ? 'ₙ' : Utils.textsub('n+' + this.valuePlus)
|
||||
var ret = `${this.name}${subtxt} = ${str}${this.baseValues.length == 0 ? '' : "\n"}`
|
||||
ret += Object.keys(this.baseValues).map(
|
||||
n => `${this.name}${Utils.textsub(n)} = ${this.baseValues[n]}`
|
||||
).join('; ')
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Domains
|
||||
class Domain {
|
||||
constructor() {}
|
||||
|
||||
includes(x) { return false }
|
||||
|
||||
toString() { return '???' }
|
||||
|
||||
union(domain) { return domain }
|
||||
|
||||
intersection(domain) { return this }
|
||||
|
||||
static import(frm) {
|
||||
switch(frm.trim().toUpperCase()) {
|
||||
case "R":
|
||||
case "ℝ":
|
||||
return Domain.R
|
||||
break;
|
||||
case "RE":
|
||||
case "R*":
|
||||
case "ℝ*":
|
||||
return Domain.RE
|
||||
break;
|
||||
case "RP":
|
||||
case "R+":
|
||||
case "ℝ⁺":
|
||||
return Domain.RP
|
||||
break;
|
||||
case "RM":
|
||||
case "R-":
|
||||
case "ℝ⁻":
|
||||
return Domain.RM
|
||||
break;
|
||||
case "RPE":
|
||||
case "REP":
|
||||
case "R+*":
|
||||
case "R*+":
|
||||
case "ℝ*⁺":
|
||||
case "ℝ⁺*":
|
||||
return Domain.RPE
|
||||
break;
|
||||
case "RME":
|
||||
case "REM":
|
||||
case "R-*":
|
||||
case "R*-":
|
||||
case "ℝ⁻*":
|
||||
case "ℝ*⁻":
|
||||
return Domain.RME
|
||||
break;
|
||||
case "ℕ":
|
||||
case "N":
|
||||
case "ZP":
|
||||
case "ℤ⁺":
|
||||
return Domain.N
|
||||
break;
|
||||
case "NLOG":
|
||||
case "ℕˡᵒᵍ":
|
||||
return Domain.NLog
|
||||
break;
|
||||
case "NE":
|
||||
case "NP":
|
||||
case "N*":
|
||||
case "N+":
|
||||
case "ℕ*":
|
||||
case "ℕ⁺":
|
||||
case "ZPE":
|
||||
case "ZEP":
|
||||
case "Z+*":
|
||||
case "Z*+":
|
||||
case "ℤ⁺*":
|
||||
case "ℤ*⁺":
|
||||
return Domain.NE
|
||||
break;
|
||||
case "Z":
|
||||
case "ℤ":
|
||||
return Domain.Z
|
||||
break;
|
||||
case "ZM":
|
||||
case "Z-":
|
||||
case "ℤ⁻":
|
||||
return Domain.ZM
|
||||
break;
|
||||
case "ZME":
|
||||
case "ZEM":
|
||||
case "Z-*":
|
||||
case "Z*-":
|
||||
case "ℤ⁻*":
|
||||
case "ℤ*⁻":
|
||||
return Domain.ZME
|
||||
break;
|
||||
case "ZE":
|
||||
case "Z*":
|
||||
case "ℤ*":
|
||||
return Domain.ZE
|
||||
break;
|
||||
default:
|
||||
return new EmptySet()
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class EmptySet extends Domain {
|
||||
|
||||
includes(x) { return false }
|
||||
|
||||
toString() { return "∅" }
|
||||
|
||||
union(domain) { return domain }
|
||||
|
||||
intersection(domain) { return this }
|
||||
|
||||
static import(frm) { return new EmptySet() }
|
||||
}
|
||||
|
||||
class Range extends Domain {
|
||||
constructor(begin, end, openBegin, openEnd) {
|
||||
super()
|
||||
if(typeof begin == 'number' || typeof begin == 'string') begin = new Expression(begin.toString())
|
||||
this.begin = begin
|
||||
if(typeof end == 'number' || typeof end == 'string') end = new Expression(end.toString())
|
||||
this.end = end
|
||||
this.openBegin = openBegin
|
||||
this.openEnd = openEnd
|
||||
this.displayName = (openBegin ? "]" : "[") + begin.toString() + ";" + end.toString() + (openEnd ? "[" : "]")
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
return ((this.openBegin && x > this.begin.execute()) || (!this.openBegin && x >= this.begin.execute())) &&
|
||||
((this.openEnd && x < this.end.execute()) || (!this.openEnd && x <= this.end.execute()))
|
||||
}
|
||||
|
||||
toString() {
|
||||
return this.displayName
|
||||
}
|
||||
|
||||
union(domain) {
|
||||
if(domain instanceof EmptySet) return this
|
||||
if(domain instanceof DomainSet) return domain.union(this)
|
||||
if(domain instanceof UnionDomain) return domain.union(this)
|
||||
if(domain instanceof IntersectionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof Range) return new UnionDomain(this, domain)
|
||||
}
|
||||
|
||||
intersection(domain) {
|
||||
if(domain instanceof EmptySet) return domain
|
||||
if(domain instanceof DomainSet) return domain.intersection(this)
|
||||
if(domain instanceof UnionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return domain.intersection(this)
|
||||
if(domain instanceof MinusDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof Range) return new IntersectionDomain(this, domain)
|
||||
}
|
||||
|
||||
static import(frm) {
|
||||
var openBegin = frm.trim().charAt(0) == "]"
|
||||
var openEnd = frm.trim().charAt(frm.length -1) == "["
|
||||
var [begin, end] = frm.substr(1, frm.length-2).split(";")
|
||||
return new Range(begin.trim(), end.trim(), openBegin, openEnd)
|
||||
}
|
||||
}
|
||||
|
||||
class SpecialDomain extends Domain {
|
||||
// For special domains (N, Z...)
|
||||
// isValidExpr is function returning true when number is in domain
|
||||
// false when it isn't.
|
||||
// nextValue provides the next positive value in the domain
|
||||
// after the one given.
|
||||
constructor(displayName, isValid, next = x => true, previous = x => true,
|
||||
moveSupported = true) {
|
||||
super()
|
||||
this.displayName = displayName
|
||||
this.isValid = isValid
|
||||
this.nextValue = next
|
||||
this.prevValue = previous
|
||||
this.moveSupported = moveSupported
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
return this.isValid(x)
|
||||
}
|
||||
|
||||
next(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
return this.nextValue(x)
|
||||
}
|
||||
|
||||
previous(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
return this.prevValue(x)
|
||||
}
|
||||
|
||||
toString() {
|
||||
return this.displayName
|
||||
}
|
||||
|
||||
union(domain) {
|
||||
if(domain instanceof EmptySet) return this
|
||||
if(domain instanceof DomainSet) return domain.union(this)
|
||||
if(domain instanceof UnionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof Range) return new UnionDomain(this, domain)
|
||||
}
|
||||
|
||||
intersection(domain) {
|
||||
if(domain instanceof EmptySet) return domain
|
||||
if(domain instanceof DomainSet) return domain.intersection(this)
|
||||
if(domain instanceof UnionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof Range) return new IntersectionDomain(this, domain)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class DomainSet extends SpecialDomain {
|
||||
constructor(values) {
|
||||
super('', x => true, x => x, true)
|
||||
console.log(values)
|
||||
var newVals = {}
|
||||
this.executedValues = []
|
||||
for(var value of values) {
|
||||
var expr = new Expression(value.toString())
|
||||
var ex = expr.execute()
|
||||
newVals[ex] = expr
|
||||
this.executedValues.push(ex)
|
||||
}
|
||||
this.executedValues.sort((a,b) => a-b)
|
||||
this.values = this.executedValues.map(val => newVals[val])
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
for(var value of this.values)
|
||||
if(x == value.execute()) return true
|
||||
return false
|
||||
}
|
||||
|
||||
next(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
if(x < this.executedValues[0]) return this.executedValues[0]
|
||||
for(var i = 1; i < this.values.length; i++) {
|
||||
var prevValue = this.executedValues[i-1]
|
||||
var value = this.executedValues[i]
|
||||
if(x >= prevValue && x < value) return value
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
previous(x) {
|
||||
if(typeof x == 'string') x = executeExpression(x)
|
||||
if(x > this.executedValues[this.executedValues.length-1])
|
||||
return this.executedValues[this.executedValues.length-1]
|
||||
for(var i = 1; i < this.values.length; i++) {
|
||||
var prevValue = this.executedValues[i-1]
|
||||
var value = this.executedValues[i]
|
||||
if(x > prevValue && x <= value) return prevValue
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
toString() {
|
||||
return "{" + this.values.join(";") + "}"
|
||||
}
|
||||
|
||||
union(domain) {
|
||||
if(domain instanceof EmptySet) return this
|
||||
if(domain instanceof DomainSet) {
|
||||
var newValues = []
|
||||
var values = this.values.concat(domain.values).filter(function(val){
|
||||
newValues.push(val.execute())
|
||||
return newValues.indexOf(val.execute()) == newValues.length - 1
|
||||
})
|
||||
return new DomainSet(values)
|
||||
}
|
||||
var notIncludedValues = []
|
||||
for(var value in this.values) {
|
||||
var value = this.executedValues[i]
|
||||
if(domain instanceof Range) {
|
||||
if(domain.begin.execute() == value && domain.openBegin) {
|
||||
domain.openBegin = false
|
||||
}
|
||||
if(domain.end.execute() == value && domain.openEnd) {
|
||||
domain.openEnd = false
|
||||
}
|
||||
}
|
||||
if(!domain.includes(value))
|
||||
notIncludedValues.push(this.values[i].toEditableString())
|
||||
}
|
||||
if(notIncludedValues.length == 0) return domain
|
||||
return new UnionDomain(domain, new DomainSet(notIncludedValues))
|
||||
}
|
||||
|
||||
intersection(domain) {
|
||||
if(domain instanceof EmptySet) return domain
|
||||
if(domain instanceof DomainSet) {
|
||||
var domValues = domain.values.map(expr => expr.execute())
|
||||
this.values = this.values.filter(function(val){
|
||||
return domValues.indexOf(val.execute()) >= 0
|
||||
})
|
||||
return this
|
||||
}
|
||||
var includedValues = []
|
||||
for(var i in this.values) {
|
||||
var value = this.executedValues[i]
|
||||
if(domain instanceof Range) {
|
||||
if(domain.begin.execute() == value && !domain.openBegin) {
|
||||
domain.openBegin = false
|
||||
}
|
||||
if(domain.end.execute() == value && !domain.openEnd) {
|
||||
domain.openEnd = false
|
||||
}
|
||||
}
|
||||
if(domain.includes(value))
|
||||
includedValues.push(this.values[i].toEditableString())
|
||||
}
|
||||
if(includedValues.length == 0) return new EmptySet()
|
||||
if(includedValues.length == this.values.length) return this
|
||||
return new IntersectionDomain(domain, new DomainSet(includedValues))
|
||||
}
|
||||
|
||||
static import(frm) {
|
||||
return new DomainSet(frm.substr(1, frm.length-2).split(";"))
|
||||
}
|
||||
}
|
||||
|
||||
class UnionDomain extends Domain {
|
||||
constructor(dom1, dom2) {
|
||||
super()
|
||||
this.dom1 = dom1
|
||||
this.dom2 = dom2
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
return this.dom1.includes(x) || this.dom2.includes(x)
|
||||
}
|
||||
|
||||
toString() {
|
||||
return this.dom1.toString() + " ∪ " + this.dom2.toString()
|
||||
}
|
||||
|
||||
union(domain) {
|
||||
if(domain instanceof EmptySet) return this
|
||||
if(domain instanceof DomainSet) return domain.union(this)
|
||||
if(domain instanceof Range) return domain.union(this)
|
||||
if(domain instanceof UnionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new MinusDomain(this, domain)
|
||||
}
|
||||
|
||||
intersection(domain) {
|
||||
if(domain instanceof EmptySet) return domain
|
||||
if(domain instanceof DomainSet) return domain.intersection(this)
|
||||
if(domain instanceof UnionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return this.dom1.intersection(domain.dom1).intersection(this.dom2).intersection(domain.dom2)
|
||||
if(domain instanceof MinusDomain) return new IntersectionDomain(this, domain)
|
||||
}
|
||||
|
||||
static import(frm) {
|
||||
var domains = frm.trim().split("∪")
|
||||
if(domains.length == 1) domains = frm.trim().split("U") // Fallback
|
||||
var dom1 = parseDomain(domains.pop())
|
||||
var dom2 = parseDomain(domains.join('∪'))
|
||||
return dom1.union(dom2)
|
||||
}
|
||||
}
|
||||
|
||||
class IntersectionDomain extends Domain {
|
||||
constructor(dom1, dom2) {
|
||||
super()
|
||||
this.dom1 = dom1
|
||||
this.dom2 = dom2
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
return this.dom1.includes(x) && this.dom2.includes(x)
|
||||
}
|
||||
|
||||
toString() {
|
||||
return this.dom1.toString() + " ∩ " + this.dom2.toString()
|
||||
}
|
||||
|
||||
union(domain) {
|
||||
if(domain instanceof EmptySet) return this
|
||||
if(domain instanceof DomainSet) return domain.union(this)
|
||||
if(domain instanceof Range) return domain.union(this)
|
||||
if(domain instanceof UnionDomain) return this.dom1.union(domain.dom1).union(this.dom2).union(domain.dom2)
|
||||
if(domain instanceof IntersectionDomain) return new UnionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new MinusDomain(this, domain)
|
||||
}
|
||||
|
||||
intersection(domain) {
|
||||
if(domain instanceof EmptySet) return domain
|
||||
if(domain instanceof DomainSet) return domain.intersection(this)
|
||||
if(domain instanceof UnionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof IntersectionDomain) return new IntersectionDomain(this, domain)
|
||||
if(domain instanceof MinusDomain) return new IntersectionDomain(this, domain)
|
||||
}
|
||||
|
||||
static import(frm) {
|
||||
var domains = frm.trim().split("∩")
|
||||
var dom1 = parseDomain(domains.pop())
|
||||
var dom2 = parseDomain(domains.join('∩'))
|
||||
return dom1.intersection(dom2)
|
||||
}
|
||||
}
|
||||
|
||||
class MinusDomain extends Domain {
|
||||
constructor(dom1, dom2) {
|
||||
super()
|
||||
this.dom1 = dom1
|
||||
this.dom2 = dom2
|
||||
}
|
||||
|
||||
includes(x) {
|
||||
return this.dom1.includes(x) && !this.dom2.includes(x)
|
||||
}
|
||||
|
||||
toString() {
|
||||
return this.dom1.toString() + "∖" + this.dom2.toString()
|
||||
}
|
||||
|
||||
static import(frm) {
|
||||
var domains = frm.trim().split("∖")
|
||||
if(domains.length == 1) domains = frm.trim().split("\\") // Fallback
|
||||
var dom1 = parseDomain(domains.shift())
|
||||
var dom2 = parseDomain(domains.join('∪'))
|
||||
return new MinusDomain(dom1, dom2)
|
||||
}
|
||||
}
|
||||
|
||||
Domain.RE = new MinusDomain("R", "{0}")
|
||||
Domain.RE.displayName = "ℝ*"
|
||||
|
||||
Domain.R = new Range(-Infinity,Infinity,true,true)
|
||||
Domain.R.displayName = "ℝ"
|
||||
Domain.RP = new Range(0,Infinity,true,false)
|
||||
Domain.RP.displayName = "ℝ⁺"
|
||||
Domain.RM = new Range(-Infinity,0,true,false)
|
||||
Domain.RM.displayName = "ℝ⁻"
|
||||
Domain.RPE = new Range(0,Infinity,true,true)
|
||||
Domain.RPE.displayName = "ℝ⁺*"
|
||||
Domain.RME = new Range(-Infinity,0,true,true)
|
||||
Domain.RME.displayName = "ℝ⁻*"
|
||||
Domain.N = new SpecialDomain('ℕ', x => x%1==0 && x >= 0,
|
||||
x => Math.max(Math.floor(x)+1, 0),
|
||||
x => Math.max(Math.ceil(x)-1, 0))
|
||||
Domain.NE = new SpecialDomain('ℕ*', x => x%1==0 && x > 0,
|
||||
x => Math.max(Math.floor(x)+1, 1),
|
||||
x => Math.max(Math.ceil(x)-1, 1))
|
||||
Domain.Z = new SpecialDomain('ℤ', x => x%1==0, x => Math.floor(x)+1, x => Math.ceil(x)-1)
|
||||
Domain.ZE = new SpecialDomain('ℤ*', x => x%1==0 && x != 0,
|
||||
x => Math.floor(x)+1 == 0 ? Math.floor(x)+2 : Math.floor(x)+1,
|
||||
x => Math.ceil(x)-1 == 0 ? Math.ceil(x)-2 : Math.ceil(x)-1)
|
||||
Domain.ZM = new SpecialDomain('ℤ⁻', x => x%1==0 && x <= 0,
|
||||
x => Math.min(Math.floor(x)+1, 0),
|
||||
x => Math.min(Math.ceil(x)-1, 0))
|
||||
Domain.ZME = new SpecialDomain('ℤ⁻*', x => x%1==0 && x < 0,
|
||||
x => Math.min(Math.floor(x)+1, -1),
|
||||
x => Math.min(Math.ceil(x)-1, -1))
|
||||
Domain.NLog = new SpecialDomain('ℕˡᵒᵍ',
|
||||
x => x/Math.pow(10, x.toString().length-1) % 1 == 0 && x > 0,
|
||||
function(x) {
|
||||
var x10pow = Math.pow(10, x.toString().length-1)
|
||||
return Math.max(1, (Math.floor(x/x10pow)+1)*x10pow)
|
||||
},
|
||||
function(x) {
|
||||
var x10pow = Math.pow(10, x.toString().length-1)
|
||||
return Math.max(1, (Math.ceil(x/x10pow)-1)*x10pow)
|
||||
})
|
||||
|
||||
var refedDomains = []
|
||||
|
||||
function parseDomain(domain) {
|
||||
if(!domain.includes(')') && !domain.includes('(')) return parseDomainSimple(domain)
|
||||
var domStr
|
||||
while((domStr = /\(([^)(]+)\)/.exec(domain)) !== null) {
|
||||
var dom = parseDomainSimple(domStr[1].trim());
|
||||
domain = domain.replace(domStr[0], 'D' + refedDomains.length)
|
||||
refedDomains.push(dom)
|
||||
}
|
||||
return parseDomainSimple(domain)
|
||||
}
|
||||
|
||||
function parseDomainSimple(domain) {
|
||||
domain = domain.trim()
|
||||
if(domain.includes("U") || domain.includes("∪")) return UnionDomain.import(domain)
|
||||
if(domain.includes("∩")) return IntersectionDomain.import(domain)
|
||||
if(domain.includes("∖") || domain.includes("\\")) return MinusDomain.import(domain)
|
||||
if(domain.charAt(0) == "{" && domain.charAt(domain.length -1) == "}") return DomainSet.import(domain)
|
||||
if(domain.includes("]") || domain.includes("[")) return Range.import(domain)
|
||||
if(["R", "ℝ", "N", "ℕ", "Z", "ℤ"].some(str => domain.toUpperCase().includes(str)))
|
||||
return Domain.import(domain)
|
||||
if(domain[0] == 'D') return refedDomains[parseInt(domain.substr(1))]
|
||||
return new EmptySet()
|
||||
}
|
1419
LogarithmPlotter/qml/js/objects.js
Normal file
56
LogarithmPlotter/qml/js/parameters.js
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
class Enum {
|
||||
constructor(...values) {
|
||||
this.type = 'Enum'
|
||||
this.values = values
|
||||
}
|
||||
}
|
||||
|
||||
class ObjectType {
|
||||
constructor(objType) {
|
||||
this.type = 'ObjectType'
|
||||
this.objType = objType
|
||||
}
|
||||
}
|
||||
|
||||
class List {
|
||||
constructor(type, format = /^.+$/, label = '', forbidAdding = false) {
|
||||
// type can be string, int and double.
|
||||
this.type = 'List'
|
||||
this.valueType = type
|
||||
this.format = format
|
||||
this.label = label
|
||||
this.forbidAdding = forbidAdding
|
||||
}
|
||||
}
|
||||
|
||||
class Dictionary {
|
||||
constructor(type, keyType = 'string', format = /^.+$/, keyFormat = /^.+$/, preKeyLabel = '', postKeyLabel = ': ', forbidAdding = false) {
|
||||
// type & keyType can be string, int and double.
|
||||
this.type = 'Dict'
|
||||
this.valueType = type
|
||||
this.keyType = keyType
|
||||
this.format = format
|
||||
this.keyFormat = keyFormat
|
||||
this.preKeyLabel = preKeyLabel
|
||||
this.postKeyLabel = postKeyLabel
|
||||
this.forbidAdding = forbidAdding
|
||||
}
|
||||
}
|
349
LogarithmPlotter/qml/js/utils.js
Normal file
|
@ -0,0 +1,349 @@
|
|||
/**
|
||||
* LogarithmPlotter - Create graphs with logarithm scales.
|
||||
* Copyright (C) 2021 Ad5001
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.pragma library
|
||||
|
||||
var powerpos = {
|
||||
"-": "⁻",
|
||||
"+": "⁺",
|
||||
"=": "⁼",
|
||||
" ": " ",
|
||||
"(": "⁽",
|
||||
")": "⁾",
|
||||
"0": "⁰",
|
||||
"1": "¹",
|
||||
"2": "²",
|
||||
"3": "³",
|
||||
"4": "⁴",
|
||||
"5": "⁵",
|
||||
"6": "⁶",
|
||||
"7": "⁷",
|
||||
"8": "⁸",
|
||||
"9": "⁹",
|
||||
"a": "ᵃ",
|
||||
"b": "ᵇ",
|
||||
"c": "ᶜ",
|
||||
"d": "ᵈ",
|
||||
"e": "ᵉ",
|
||||
"f": "ᶠ",
|
||||
"g": "ᵍ",
|
||||
"h": "ʰ",
|
||||
"i": "ⁱ",
|
||||
"j": "ʲ",
|
||||
"k": "ᵏ",
|
||||
"l": "ˡ",
|
||||
"m": "ᵐ",
|
||||
"n": "ⁿ",
|
||||
"o": "ᵒ",
|
||||
"p": "ᵖ",
|
||||
"r": "ʳ",
|
||||
"s": "ˢ",
|
||||
"t": "ᵗ",
|
||||
"u": "ᵘ",
|
||||
"v": "ᵛ",
|
||||
"w": "ʷ",
|
||||
"x": "ˣ",
|
||||
"y": "ʸ",
|
||||
"z": "ᶻ"
|
||||
}
|
||||
|
||||
var indicepos = {
|
||||
"-": "₋",
|
||||
"+": "₊",
|
||||
"=": "₌",
|
||||
"(": "₍",
|
||||
")": "₎",
|
||||
" ": " ",
|
||||
"0": "₀",
|
||||
"1": "₁",
|
||||
"2": "₂",
|
||||
"3": "₃",
|
||||
"4": "₄",
|
||||
"5": "₅",
|
||||
"6": "₆",
|
||||
"7": "₇",
|
||||
"8": "₈",
|
||||
"9": "₉",
|
||||
"a": "ₐ",
|
||||
"e": "ₑ",
|
||||
"h": "ₕ",
|
||||
"i": "ᵢ",
|
||||
"j": "ⱼ",
|
||||
"k": "ₖ",
|
||||
"l": "ₗ",
|
||||
"m": "ₘ",
|
||||
"n": "ₙ",
|
||||
"o": "ₒ",
|
||||
"p": "ₚ",
|
||||
"r": "ᵣ",
|
||||
"s": "ₛ",
|
||||
"t": "ₜ",
|
||||
"u": "ᵤ",
|
||||
"v": "ᵥ",
|
||||
"x": "ₓ",
|
||||
}
|
||||
// Put a text in sup position
|
||||
function textsup(text) {
|
||||
var ret = ""
|
||||
text = text.toString()
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
if(Object.keys(powerpos).indexOf(text[i]) >= 0) {
|
||||
ret += powerpos[text[i]]
|
||||
} else {
|
||||
ret += text[i]
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// Put a text in sub position
|
||||
function textsub(text) {
|
||||
var ret = ""
|
||||
text = text.toString()
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
if(Object.keys(indicepos).indexOf(text[i]) >= 0) {
|
||||
ret += indicepos[text[i]]
|
||||
} else {
|
||||
ret += text[i]
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
function simplifyExpression(str) {
|
||||
var replacements = [
|
||||
// Operations not done by parser.
|
||||
[// Decomposition way 2
|
||||
/(^.?|[+-] |\()([-.\d\w]+) ([*/]) \((([-.\d\w] [*/] )?[-\d\w.]+) ([+\-]) (([-.\d\w] [*/] )?[\d\w.+]+)\)(.?$| [+-]|\))/g,
|
||||
"$1$2 $3 $4 $6 $2 $3 $7$9"
|
||||
],
|
||||
[ // Decomposition way 2
|
||||
/(^.?|[+-] |\()\((([-.\d\w] [*/] )?[-\d\w.]+) ([+\-]) (([-.\d\w] [*/] )?[\d\w.+]+)\) ([*/]) ([-.\d\w]+)(.?$| [+-]|\))/g,
|
||||
"$1$8 $7 $2 $4 $8 $7 $5$9"
|
||||
],
|
||||
[ // Factorisation of π elements.
|
||||
/(([-\d\w.]+ [*/] )*)(pi|π)(( [/*] [-\d\w.]+)*) ([+-]) (([-\d\w.]+ [*/] )*)(pi|π)(( [/*] [-\d\w.]+)*)?/g,
|
||||
function(match, m1, n1, pi1, m2, ope2, n2, opeM, m3, n3, pi2, m4, ope4, n4) {
|
||||
// g1, g2, g3 , g4, g5, g6, g7, g8, g9, g10, g11,g12 , g13
|
||||
// We don't care about mx & pix, ope2 & ope4 are either / or * for n2 & n4.
|
||||
// n1 & n3 are multiplied, opeM is the main operation (- or +).
|
||||
// Putting all n in form of number
|
||||
//n2 = n2 == undefined ? 1 : parseFloat(n)
|
||||
n1 = m1 == undefined ? 1 : eval(m1 + '1')
|
||||
n2 = m2 == undefined ? 1 : eval('1' + m2)
|
||||
n3 = m3 == undefined ? 1 : eval(m3 + '1')
|
||||
n4 = m4 == undefined ? 1 : eval('1' + m4)
|
||||
//var [n1, n2, n3, n4] = [n1, n2, n3, n4].map(n => n == undefined ? 1 : parseFloat(n))
|
||||
// Falling back to * in case it does not exist (the corresponding n would be 1)
|
||||
var [ope2, ope4] = [ope2, ope4].map(ope => ope == '/' ? '/' : '*')
|
||||
var coeff1 = n1*n2
|
||||
var coeff2 = n3*n4
|
||||
var coefficient = coeff1+coeff2-(opeM == '-' ? 2*coeff2 : 0)
|
||||
|
||||
return `${coefficient} * π`
|
||||
}
|
||||
],
|
||||
[ // Removing parenthesis when content is only added from both sides.
|
||||
/(^.?|[+-] |\()\(([^)(]+)\)(.?$| [+-]|\))/g,
|
||||
function(match, b4, middle, after) {return `${b4}${middle}${after}`}
|
||||
],
|
||||
[ // Removing parenthesis when content is only multiplied.
|
||||
/(^.?|[*\/] |\()\(([^)(+-]+)\)(.?$| [*\/+-]|\))/g,
|
||||
function(match, b4, middle, after) {return `${b4}${middle}${after}`}
|
||||
],
|
||||
[ // Removing parenthesis when content is only multiplied.
|
||||
/(^.?|[*\/-+] |\()\(([^)(+-]+)\)(.?$| [*\/]|\))/g,
|
||||
function(match, b4, middle, after) {return `${b4}${middle}${after}`}
|
||||
],
|
||||
[// Simplification additions/substractions.
|
||||
/(^.?|[^*\/] |\()([-.\d]+) (\+|\-) (\([^)(]+\)|[^)(]+) (\+|\-) ([-.\d]+)(.?$| [^*\/]|\))/g,
|
||||
function(match, b4, n1, op1, middle, op2, n2, after) {
|
||||
var total
|
||||
if(op2 == '+') {
|
||||
total = parseFloat(n1) + parseFloat(n2)
|
||||
} else {
|
||||
total = parseFloat(n1) - parseFloat(n2)
|
||||
}
|
||||
return `${b4}${total} ${op1} ${middle}${after}`
|
||||
}
|
||||
],
|
||||
[// Simplification multiplications/divisions.
|
||||
/([-.\d]+) (\*|\/) (\([^)(]+\)|[^)(+-]+) (\*|\/) ([-.\d]+)/g,
|
||||
function(match, n1, op1, middle, op2, n2) {
|
||||
if(parseInt(n1) == n1 && parseInt(n2) == n2 && op2 == '/' &&
|
||||
(parseInt(n1) / parseInt(n2)) % 1 != 0) {
|
||||
// Non int result for int division.
|
||||
return `(${n1} / ${n2}) ${op1} ${middle}`
|
||||
} else {
|
||||
if(op2 == '*') {
|
||||
return `${parseFloat(n1) * parseFloat(n2)} ${op1} ${middle}`
|
||||
} else {
|
||||
return `${parseFloat(n1) / parseFloat(n2)} ${op1} ${middle}`
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
[// Starting & ending parenthesis if not needed.
|
||||
/^\((.*)\)$/g,
|
||||
function(match, middle) {
|
||||
var str = middle
|
||||
// Replace all groups
|
||||
while(/\([^)(]+\)/g.test(str))
|
||||
str = str.replace(/\([^)(]+\)/g, '')
|
||||
// There shouldn't be any more parenthesis
|
||||
// If there is, that means the 2 parenthesis are needed.
|
||||
if(!str.includes(')') && !str.includes('(')) {
|
||||
return middle
|
||||
} else {
|
||||
return `(${middle})`
|
||||
}
|
||||
|
||||
}
|
||||
],
|
||||
// Simple simplifications
|
||||
[/(\s|^|\()0(\.0+)? \* (\([^)(]+\))/g, '$10'],
|
||||
[/(\s|^|\()0(\.0+)? \* ([^)(+-]+)/g, '$10'],
|
||||
[/(\([^)(]\)) \* 0(\.0+)?(\s|$|\))/g, '0$3'],
|
||||
[/([^)(+-]) \* 0(\.0+)?(\s|$|\))/g, '0$3'],
|
||||
[/(\s|^|\()1(\.0+)? (\*|\/) /g, '$1'],
|
||||
[/(\s|^|\()0(\.0+)? (\+|\-) /g, '$1'],
|
||||
[/ (\*|\/) 1(\.0+)?(\s|$|\))/g, '$3'],
|
||||
[/ (\+|\-) 0(\.0+)?(\s|$|\))/g, '$3'],
|
||||
[/(^| |\() /g, '$1'],
|
||||
[/ ($|\))/g, '$1'],
|
||||
]
|
||||
|
||||
// Replacements
|
||||
var found
|
||||
do {
|
||||
found = false
|
||||
for(var replacement of replacements)
|
||||
while(replacement[0].test(str)) {
|
||||
found = true
|
||||
str = str.replace(replacement[0], replacement[1])
|
||||
}
|
||||
} while(found)
|
||||
return str
|
||||
}
|
||||
|
||||
|
||||
function makeExpressionReadable(str) {
|
||||
var replacements = [
|
||||
// variables
|
||||
[/pi/g, 'π'],
|
||||
[/Infinity/g, '∞'],
|
||||
[/inf/g, '∞'],
|
||||
// Other
|
||||
[/ \* /g, '×'],
|
||||
[/ \^ /g, '^'],
|
||||
[/\^\(([^\^]+)\)/g, function(match, p1) { return textsup(p1) }],
|
||||
[/\^([^ "]+)/g, function(match, p1) { return textsup(p1) }],
|
||||
[/_\(([^_]+)\)/g, function(match, p1) { return textsub(p1) }],
|
||||
[/_([^ "]+)/g, function(match, p1) { return textsub(p1) }],
|
||||
[/\[([^\[\]]+)\]/g, function(match, p1) { return textsub(p1) }],
|
||||
[/(\d|\))×/g, '$1'],
|
||||
//[/×(\d|\()/g, '$1'],
|
||||
[/\(([^)(+.\/-]+)\)/g, "$1"],
|
||||
[/integral\((.+), ?(.+), ?("|')(.+)("|'), ?("|')(.+)("|')\)/g, function(match, a, b, p1, body, p2, p3, by, p4) {
|
||||
if(a.length < b.length) {
|
||||
return `∫${textsub(a)}${textsup(b)} ${body} d${by}`
|
||||
} else {
|
||||
return `∫${textsup(b)}${textsub(a)} ${body} d${by}`
|
||||
}
|
||||
}],
|
||||
[/derivative\(?("|')(.+)("|'), ?("|')(.+)("|'), ?(.+)\)?/g, function(match, p1, body, p2, p3, by, p4, x) {
|
||||
return `d(${body.replace(new RegExp(by, 'g'), 'x')})/dx`
|
||||
}]
|
||||
]
|
||||
|
||||
str = simplifyExpression(str)
|
||||
// Replacements
|
||||
for(var replacement of replacements)
|
||||
while(replacement[0].test(str))
|
||||
str = str.replace(replacement[0], replacement[1])
|
||||
return str
|
||||
}
|
||||
|
||||
function parseName(str, removeUnallowed = true) {
|
||||
var replacements = [
|
||||
// Greek letters
|
||||
[/([^a-z]|^)al(pha)?([^a-z]|$)/g, '$1α$3'],
|
||||
[/([^a-z]|^)be(ta)?([^a-z]|$)/g, '$1β$3'],
|
||||
[/([^a-z]|^)ga(mma)?([^a-z]|$)/g, '$1γ$3'],
|
||||
[/([^a-z]|^)de(lta)?([^a-z]|$)/g, '$1δ$3'],
|
||||
[/([^a-z]|^)ep(silon)?([^a-z]|$)/g, '$1ε$3'],
|
||||
[/([^a-z]|^)ze(ta)?([^a-z]|$)/g, '$1ζ$3'],
|
||||
[/([^a-z]|^)et(a)?([^a-z]|$)/g, '$1η$3'],
|
||||
[/([^a-z]|^)th(eta)?([^a-z]|$)/g, '$1θ$3'],
|
||||
[/([^a-z]|^)io(ta)?([^a-z]|$)/g, '$1ι$3'],
|
||||
[/([^a-z]|^)ka(ppa)([^a-z]|$)?/g, '$1κ$3'],
|
||||
[/([^a-z]|^)la(mbda)?([^a-z]|$)/g, '$1λ$3'],
|
||||
[/([^a-z]|^)mu([^a-z]|$)/g, '$1μ$2'],
|
||||
[/([^a-z]|^)nu([^a-z]|$)/g, '$1ν$2'],
|
||||
[/([^a-z]|^)xi([^a-z]|$)/g, '$1ξ$2'],
|
||||
[/([^a-z]|^)rh(o)?([^a-z]|$)/g, '$1ρ$3'],
|
||||
[/([^a-z]|^)si(gma)?([^a-z]|$)/g, '$1σ$3'],
|
||||
[/([^a-z]|^)ta(u)?([^a-z]|$)/g, '$1τ$3'],
|
||||
[/([^a-z]|^)up(silon)?([^a-z]|$)/g, '$1υ$3'],
|
||||
[/([^a-z]|^)ph(i)?([^a-z]|$)/g, '$1φ$3'],
|
||||
[/([^a-z]|^)ch(i)?([^a-z]|$)/g, '$1χ$3'],
|
||||
[/([^a-z]|^)ps(i)?([^a-z]|$)/g, '$1ψ$3'],
|
||||
[/([^a-z]|^)om(ega)?([^a-z]|$)/g, '$1ω$3'],
|
||||
// Capital greek letters
|
||||
[/([^a-z]|^)gga(mma)?([^a-z]|$)/g, '$1Γ$3'],
|
||||
[/([^a-z]|^)gde(lta)?([^a-z]|$)/g, '$1Δ$3'],
|
||||
[/([^a-z]|^)gth(eta)?([^a-z]|$)/g, '$1Θ$3'],
|
||||
[/([^a-z]|^)gla(mbda)?([^a-z]|$)/g, '$1Λ$3'],
|
||||
[/([^a-z]|^)gxi([^a-z]|$)/g, '$1Ξ$2'],
|
||||
[/([^a-z]|^)gpi([^a-z]|$)/g, '$1Π$2'],
|
||||
[/([^a-z]|^)gsi(gma)([^a-z]|$)?/g, '$1Σ$3'],
|
||||
[/([^a-z]|^)gph(i)?([^a-z]|$)/g, '$1Φ$3'],
|
||||
[/([^a-z]|^)gps(i)?([^a-z]|$)/g, '$1Ψ$3'],
|
||||
[/([^a-z]|^)gom(ega)?([^a-z]|$)/g, '$1Ω$3'],
|
||||
// Underscores
|
||||
[/_\(([^_]+)\)/g, function(match, p1) { return textsub(p1) }],
|
||||
[/_([^" ]+)/g, function(match, p1) { return textsub(p1) }],
|
||||
// Array elements
|
||||
[/\[([^\]\[]+)\]/g, function(match, p1) { return textsub(p1) }],
|
||||
// Removing
|
||||
[/[xπℝℕ\\∪∩\]\[ ()^/÷*×+=\d-]/g , ''],
|
||||
]
|
||||
if(!removeUnallowed) replacements.pop()
|
||||
// Replacements
|
||||
for(var replacement of replacements)
|
||||
str = str.replace(replacement[0], replacement[1])
|
||||
return str
|
||||
}
|
||||
|
||||
String.prototype.toLatinUppercase = function() {
|
||||
return this.replace(/[a-z]/g, function(match){return match.toUpperCase()})
|
||||
}
|
||||
|
||||
function camelCase2readable(label) {
|
||||
var parsed = parseName(label, false)
|
||||
return parsed.charAt(0).toLatinUppercase() + parsed.slice(1).replace(/([A-Z])/g," $1")
|
||||
}
|
||||
|
||||
function getRandomColor() {
|
||||
var clrs = '0123456789ABCDEF';
|
||||
var color = '#';
|
||||
for(var i = 0; i < 6; i++) {
|
||||
color += clrs[Math.floor(Math.random() * (16-5*(i%2==0)))];
|
||||
}
|
||||
return color;
|
||||
}
|