From 75a988b546b879f5f0000df705fe2818612eeca6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 16 Mar 2020 22:24:57 +0300 Subject: [PATCH 01/11] Move to new kotlin and plugin --- build.gradle.kts | 22 ++++---- dataforge-vis-common/build.gradle.kts | 21 ++----- .../vis/common/AbstractVisualObject.kt | 4 +- .../kotlin/hep/dataforge/vis/common/Colors.kt | 7 ++- .../hep/dataforge/vis/common/StyleSheet.kt | 5 +- .../hep/dataforge/vis/common/VisualObject.kt | 21 +++---- .../hep/dataforge/vis/common/valueWidget.kt | 9 +-- .../dataforge/vis/js/editor/propertyEditor.kt | 4 +- .../dataforge/vis/fx/editor/ConfigEditor.kt | 2 +- .../hep/dataforge/vis/fx/editor/FXMeta.kt | 6 +- .../dataforge/vis/fx/editor/ValueChooser.kt | 2 +- .../vis/fx/editor/ValueChooserBase.kt | 2 +- .../fx/editor/VisualObjectEditorFragment.kt | 2 +- .../dataforge/vis/fx/demo/MetaEditorDemo.kt | 22 ++++---- .../vis/spatial/gdml/GDMLTransformer.kt | 3 +- .../vis/spatial/gdml/generateSchema.kt | 10 ++-- dataforge-vis-spatial/build.gradle.kts | 18 ++---- .../kotlin/hep/dataforge/vis/spatial/Box.kt | 2 - .../hep/dataforge/vis/spatial/Composite.kt | 2 - .../hep/dataforge/vis/spatial/ConeSegment.kt | 2 - .../hep/dataforge/vis/spatial/Convex.kt | 2 - .../hep/dataforge/vis/spatial/Extruded.kt | 2 - .../hep/dataforge/vis/spatial/Label3D.kt | 5 +- .../hep/dataforge/vis/spatial/Material3D.kt | 32 ++++++----- .../hep/dataforge/vis/spatial/PolyLine.kt | 4 +- .../kotlin/hep/dataforge/vis/spatial/Proxy.kt | 5 +- .../hep/dataforge/vis/spatial/Sphere.kt | 2 - .../kotlin/hep/dataforge/vis/spatial/Tube.kt | 2 - .../hep/dataforge/vis/spatial/Visual3D.kt | 17 +++--- .../dataforge/vis/spatial/VisualGroup3D.kt | 9 +-- .../dataforge/vis/spatial/VisualObject3D.kt | 15 ++--- .../hep/dataforge/vis/spatial/geometry.kt | 5 +- .../dataforge/vis/spatial/serialization.kt | 56 +++++++------------ .../vis/spatial/specifications/Axes.kt | 18 ++++++ .../vis/spatial/specifications/AxesSpec.kt | 17 ------ .../{CameraSpec.kt => Camera.kt} | 13 +++-- .../vis/spatial/specifications/Canvas.kt | 15 +++++ .../vis/spatial/specifications/CanvasSpec.kt | 15 ----- .../vis/spatial/specifications/Controls.kt | 9 +++ .../spatial/specifications/ControlsSpec.kt | 11 ---- .../hep/dataforge/vis/spatial/ConvexTest.kt | 7 ++- .../vis/spatial/three/ThreeCanvas.kt | 28 +++++----- .../vis/spatial/three/ThreeVisualObject.kt | 2 - .../hep/dataforge/vis/spatial/three/csg.kt | 2 +- .../dataforge/vis/spatial/fx/FXCanvas3D.kt | 4 +- .../dataforge/vis/spatial/fx/OrbitControls.kt | 2 +- demo/gdml/build.gradle.kts | 17 ++---- .../vis/spatial/gdml/demo/GDMLDemoApp.kt | 8 +-- .../{web => resources}/css/jsoneditor.min.css | 0 .../jsMain/{web => resources}/css/main.css | 0 .../img/jsoneditor-icons.svg | 0 .../src/jsMain/{web => resources}/index.html | 0 .../vis/spatial/gdml/demo/readFile.kt | 4 +- demo/muon-monitor/build.gradle.kts | 13 ++--- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 4 +- .../{web => resources}/css/jsoneditor.min.css | 0 .../jsMain/{web => resources}/css/main.css | 0 .../img/jsoneditor-icons.svg | 0 .../src/jsMain/{web => resources}/index.html | 0 demo/spatial-showcase/build.gradle.kts | 12 ++-- .../hep/dataforge/vis/spatial/demo/demo.kt | 12 ++-- .../vis/spatial/demo/ThreeDemoApp.kt | 9 --- .../vis/spatial/demo/ThreeDemoGrid.kt | 4 -- .../src/jsMain/{web => resources}/index.html | 0 .../dataforge/vis/spatial/demo/FXDemoGrid.kt | 4 +- 65 files changed, 230 insertions(+), 322 deletions(-) create mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt delete mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/AxesSpec.kt rename dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/{CameraSpec.kt => Camera.kt} (67%) create mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt delete mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CanvasSpec.kt create mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt delete mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/ControlsSpec.kt rename demo/gdml/src/jsMain/{web => resources}/css/jsoneditor.min.css (100%) rename demo/gdml/src/jsMain/{web => resources}/css/main.css (100%) rename demo/gdml/src/jsMain/{web => resources}/img/jsoneditor-icons.svg (100%) rename demo/gdml/src/jsMain/{web => resources}/index.html (100%) rename demo/muon-monitor/src/jsMain/{web => resources}/css/jsoneditor.min.css (100%) rename demo/muon-monitor/src/jsMain/{web => resources}/css/main.css (100%) rename demo/muon-monitor/src/jsMain/{web => resources}/img/jsoneditor-icons.svg (100%) rename demo/muon-monitor/src/jsMain/{web => resources}/index.html (100%) rename demo/spatial-showcase/src/jsMain/{web => resources}/index.html (100%) diff --git a/build.gradle.kts b/build.gradle.kts index c1218820..82f0e8d5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,10 @@ -import scientifik.useSerialization +import scientifik.fx +import scientifik.serialization -val dataforgeVersion by extra("0.1.5-dev-6") +val dataforgeVersion by extra("0.1.5") plugins { - val kotlinVersion = "1.3.61" - val toolsVersion = "0.3.2" - - kotlin("jvm") version kotlinVersion apply false - id("kotlin-dce-js") version kotlinVersion apply false + val toolsVersion = "0.4.0" id("scientifik.mpp") version toolsVersion apply false id("scientifik.jvm") version toolsVersion apply false id("scientifik.js") version toolsVersion apply false @@ -26,16 +23,17 @@ allprojects { } group = "hep.dataforge" - version = "0.1.1-dev" -} - -subprojects{ - this.useSerialization() + version = "0.1.2-dev" } val githubProject by extra("dataforge-vis") val bintrayRepo by extra("dataforge") +val fxVersion by extra("14") subprojects { apply(plugin = "scientifik.publish") + serialization() + afterEvaluate { + fx(scientifik.FXModule.CONTROLS, version = fxVersion) + } } \ No newline at end of file diff --git a/dataforge-vis-common/build.gradle.kts b/dataforge-vis-common/build.gradle.kts index 6459c337..1774b6ed 100644 --- a/dataforge-vis-common/build.gradle.kts +++ b/dataforge-vis-common/build.gradle.kts @@ -1,21 +1,16 @@ -import org.openjfx.gradle.JavaFXOptions -import scientifik.useSerialization +import scientifik.serialization plugins { id("scientifik.mpp") - id("org.openjfx.javafxplugin") } val dataforgeVersion: String by rootProject.extra //val kvisionVersion: String by rootProject.extra("2.0.0-M1") -useSerialization() +serialization() +val fxVersion: String by rootProject.extra kotlin { - jvm{ - withJava() - } - sourceSets { commonMain{ dependencies { @@ -24,7 +19,7 @@ kotlin { } jvmMain{ dependencies { - api("no.tornado:tornadofx:1.7.19") + api("no.tornado:tornadofx:1.7.20") //api("no.tornado:tornadofx-controlsfx:0.1.1") api("de.jensd:fontawesomefx-fontawesome:4.7.0-11"){ exclude(group = "org.openjfx") @@ -38,13 +33,9 @@ kotlin { dependencies { api("hep.dataforge:dataforge-output-html:$dataforgeVersion") //api(npm("bootstrap","4.4.1")) - implementation(npm("jsoneditor")) + implementation(npm("jsoneditor","8.6.1")) implementation(npm("file-saver")) } } } -} - -configure { - modules("javafx.controls") -} +} \ No newline at end of file diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt index 5487a304..3c76a4cc 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt @@ -1,8 +1,10 @@ package hep.dataforge.vis.common import hep.dataforge.meta.* +import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.Name import hep.dataforge.names.asName +import hep.dataforge.values.Value import hep.dataforge.vis.common.VisualObject.Companion.STYLE_KEY import kotlinx.serialization.Transient @@ -22,7 +24,7 @@ abstract class AbstractVisualObject : VisualObject { get() = properties?.get(STYLE_KEY).stringList set(value) { //val allStyles = (field + value).distinct() - setProperty(STYLE_KEY, value) + setProperty(STYLE_KEY, Value.of(value)) updateStyles(value) } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt index 3335c086..5681f572 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt @@ -1,6 +1,9 @@ package hep.dataforge.vis.common -import hep.dataforge.meta.* +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.get +import hep.dataforge.meta.number import hep.dataforge.values.ValueType import hep.dataforge.values.int import kotlin.math.max @@ -234,7 +237,7 @@ object Colors { /** * Convert three bytes representing color to Meta */ - fun rgbToMeta(r: UByte, g: UByte, b: UByte): Meta = buildMeta { + fun rgbToMeta(r: UByte, g: UByte, b: UByte): Meta = Meta { RED_KEY put r.toInt() GREEN_KEY put g.toInt() BLUE_KEY put b.toInt() diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt index 7b70a0dc..365fff8e 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.common -import hep.dataforge.io.serialization.MetaSerializer import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.asName @@ -46,7 +45,7 @@ class StyleSheet() { } operator fun set(key: String, builder: MetaBuilder.() -> Unit) { - val newStyle = get(key)?.let { buildMeta(it, builder) } ?: buildMeta(builder) + val newStyle = get(key)?.edit(builder) ?: Meta(builder) set(key, newStyle.seal()) } @@ -58,7 +57,7 @@ class StyleSheet() { TODO("Not yet implemented") } - override fun serialize(encoder: Encoder, obj: StyleSheet) { + override fun serialize(encoder: Encoder, value: StyleSheet) { TODO("Not yet implemented") } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt index 6aad894a..9e4cfd0b 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt @@ -1,6 +1,9 @@ package hep.dataforge.vis.common -import hep.dataforge.meta.* +import hep.dataforge.meta.Laminate +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.scheme.Configurable import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.toName @@ -28,17 +31,12 @@ interface VisualObject : Configurable { */ fun allProperties(): Laminate - /** - * Set property for this object - */ - fun setProperty(name: Name, value: Any?) { - config[name] = value - } - /** * Get property including or excluding parent properties */ - fun getProperty(name: Name, inherit: Boolean = true): MetaItem<*>? + fun getProperty(name: Name, inherit: Boolean): MetaItem<*>? + + override fun getProperty(name: Name): MetaItem<*>? = getProperty(name, true) /** * Trigger property invalidation event. If [name] is empty, notify that the whole object is changed @@ -77,11 +75,6 @@ interface VisualObject : Configurable { */ fun VisualObject.getProperty(key: String, inherit: Boolean = true): MetaItem<*>? = getProperty(key.toName(), inherit) -/** - * Set [VisualObject] property using key as a String - */ -fun VisualObject.setProperty(key: String, value: Any?) = setProperty(key.toName(), value) - /** * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt index 8c45686f..8f3ade43 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt @@ -1,7 +1,8 @@ package hep.dataforge.vis.common -import hep.dataforge.descriptors.ValueDescriptor import hep.dataforge.meta.* +import hep.dataforge.meta.descriptors.ValueDescriptor +import hep.dataforge.meta.scheme.getProperty /** * Extension property to access the "widget" key of [ValueDescriptor] @@ -9,14 +10,14 @@ import hep.dataforge.meta.* var ValueDescriptor.widget: Meta get() = this.config["widget"].node?: EmptyMeta set(value) { - this.config["widget"] = value + config["widget"] = value } /** * Extension property to access the "widget.type" key of [ValueDescriptor] */ var ValueDescriptor.widgetType: String? - get() = this["widget.type"].string + get() = getProperty("widget.type").string set(value) { - this.config["widget.type"] = value + config["widget.type"] = value } \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt index 590c208f..19f715a0 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt @@ -1,9 +1,9 @@ package hep.dataforge.vis.js.editor -import hep.dataforge.io.toJson import hep.dataforge.js.jsObject import hep.dataforge.meta.DynamicMeta import hep.dataforge.meta.Meta +import hep.dataforge.meta.toJson import hep.dataforge.meta.update import hep.dataforge.names.Name import hep.dataforge.names.isEmpty @@ -12,8 +12,6 @@ import hep.dataforge.vis.common.findStyle import kotlinx.html.dom.append import kotlinx.html.js.* import org.w3c.dom.Element -import kotlin.collections.forEach -import kotlin.collections.isNotEmpty import kotlin.collections.set import kotlin.dom.clear diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt index 93af2df4..c04b0719 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt @@ -8,8 +8,8 @@ package hep.dataforge.vis.fx.editor import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView import hep.dataforge.context.Global -import hep.dataforge.descriptors.NodeDescriptor import hep.dataforge.meta.Config +import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.names.NameToken import hep.dataforge.vis.fx.dfIconView import javafx.scene.Node diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt index 2eb14215..7a9395ee 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt @@ -1,9 +1,9 @@ package hep.dataforge.vis.fx.editor -import hep.dataforge.descriptors.ItemDescriptor -import hep.dataforge.descriptors.NodeDescriptor -import hep.dataforge.descriptors.ValueDescriptor import hep.dataforge.meta.* +import hep.dataforge.meta.descriptors.ItemDescriptor +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.meta.descriptors.ValueDescriptor import hep.dataforge.names.Name import hep.dataforge.names.NameToken import hep.dataforge.names.asName diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt index f8946a4a..72128543 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt @@ -7,9 +7,9 @@ package hep.dataforge.vis.fx.editor import hep.dataforge.context.Context import hep.dataforge.context.Named -import hep.dataforge.descriptors.ValueDescriptor import hep.dataforge.meta.EmptyMeta import hep.dataforge.meta.Meta +import hep.dataforge.meta.descriptors.ValueDescriptor import hep.dataforge.names.toName import hep.dataforge.provider.Type import hep.dataforge.provider.provideByType diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt index 7cbbcc1f..dc474cb5 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt @@ -5,7 +5,7 @@ */ package hep.dataforge.vis.fx.editor -import hep.dataforge.descriptors.ValueDescriptor +import hep.dataforge.meta.descriptors.ValueDescriptor import hep.dataforge.values.Null import hep.dataforge.values.Value import javafx.beans.property.SimpleObjectProperty diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt index fd52d64c..05d9315c 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt @@ -1,8 +1,8 @@ package hep.dataforge.vis.fx.editor -import hep.dataforge.descriptors.NodeDescriptor import hep.dataforge.meta.Config import hep.dataforge.meta.Meta +import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.meta.update import hep.dataforge.vis.common.VisualObject import hep.dataforge.vis.common.findStyle diff --git a/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt b/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt index 09ec35fc..62ca8870 100644 --- a/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt +++ b/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt @@ -1,8 +1,8 @@ package hep.dataforge.vis.fx.demo -import hep.dataforge.descriptors.NodeDescriptor -import hep.dataforge.meta.buildMeta -import hep.dataforge.meta.toConfig +import hep.dataforge.meta.Meta +import hep.dataforge.meta.asConfig +import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.values.ValueType import hep.dataforge.vis.fx.editor.ConfigEditor import hep.dataforge.vis.fx.editor.FXMeta @@ -15,7 +15,7 @@ class MetaEditorDemoApp : App(MetaEditorDemo::class) class MetaEditorDemo : View("Meta editor demo") { - val meta = buildMeta { + val meta = Meta { "aNode" put { "innerNode" put { "innerValue" put true @@ -23,30 +23,30 @@ class MetaEditorDemo : View("Meta editor demo") { "b" put 223 "c" put "StringValue" } - }.toConfig() + }.asConfig() val descriptor = NodeDescriptor { - node("aNode") { + defineNode("aNode") { info = "A root demo node" - value("b") { + defineValue("b") { info = "b number value" type(ValueType.NUMBER) } - node("otherNode") { - value("otherValue") { + defineNode("otherNode") { + defineValue("otherValue") { type(ValueType.BOOLEAN) default(false) info = "default value" } } } - value("multiple"){ + defineValue("multiple") { info = "A sns value" multiple = true } } - private val rootNode = FXMeta.root(meta,descriptor) + private val rootNode = FXMeta.root(meta, descriptor) override val root = splitpane(Orientation.HORIZONTAL, MetaViewer(rootNode).root, ConfigEditor(rootNode).root) diff --git a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt index 9d664aff..bf8f81ac 100644 --- a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt +++ b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial.gdml import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder -import hep.dataforge.meta.buildMeta import hep.dataforge.names.Name import hep.dataforge.names.toName import hep.dataforge.vis.common.useStyle @@ -44,7 +43,7 @@ class GDMLTransformer(val root: GDML) { fun VisualObject3D.useStyle(name: String, builder: MetaBuilder.() -> Unit) { styleCache.getOrPut(name.toName()) { - buildMeta(builder) + Meta(builder) } useStyle(name) } diff --git a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt b/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt index 53768de4..857cc4e6 100644 --- a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt +++ b/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt @@ -60,13 +60,13 @@ private fun SerialModule.enumerate(type: KClass<*>): Sequence */ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): JsonObject { - if (descriptor.name in arrayOf( + if (descriptor.serialName in arrayOf( "hep.dataforge.vis.spatial.Point3D", "hep.dataforge.vis.spatial.Point2D", Meta::class.qualifiedName ) ) return json { - "\$ref" to "#/definitions/${descriptor.name}" + "\$ref" to "#/definitions/${descriptor.serialName}" } @@ -109,7 +109,7 @@ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): Jso val jsonType = descriptor.jsonType val objectData: MutableMap = mutableMapOf( - "description" to JsonLiteral(descriptor.name), + "description" to JsonLiteral(descriptor.serialName), "type" to JsonLiteral(jsonType) ) if (isEnum) { @@ -140,9 +140,9 @@ fun main() { "children" to json { "anyOf" to jsonArray { context.enumerate(VisualObject3D::class).forEach { - if (it.name == "hep.dataforge.vis.spatial.VisualGroup3D") { + if (it.serialName == "hep.dataforge.vis.spatial.VisualGroup3D") { +json { - "\$ref" to "#/definitions/${it.name}" + "\$ref" to "#/definitions/${it.serialName}" } } else { +jsonSchema(it, context) diff --git a/dataforge-vis-spatial/build.gradle.kts b/dataforge-vis-spatial/build.gradle.kts index f587d39d..b6b050a5 100644 --- a/dataforge-vis-spatial/build.gradle.kts +++ b/dataforge-vis-spatial/build.gradle.kts @@ -1,17 +1,12 @@ -import org.openjfx.gradle.JavaFXOptions -import scientifik.useSerialization +import scientifik.serialization plugins { id("scientifik.mpp") - id("org.openjfx.javafxplugin") } -useSerialization() +serialization() kotlin { - jvm { - withJava() - } sourceSets { commonMain { dependencies { @@ -32,14 +27,9 @@ kotlin { jsMain { dependencies { // api(project(":wrappers")) - implementation(npm("three", "0.106.2")) - implementation(npm("@hi-level/three-csg", "1.0.6")) + implementation(npm("three", "0.114.0")) + implementation(npm("three-csg-ts", "1.0.1")) } } } } - -configure { - modules("javafx.controls") -} - diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt index c2010a0f..26f35cb5 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial import hep.dataforge.context.Context -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.meta.Meta import hep.dataforge.meta.float @@ -29,7 +28,6 @@ class Box( override var rotation: Point3D? = null override var scale: Point3D? = null - @Serializable(ConfigSerializer::class) override var properties: Config? = null //TODO add helper for color configuration diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt index a7b3c774..46cf3b0e 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.meta.update import hep.dataforge.vis.common.AbstractVisualObject @@ -34,7 +33,6 @@ class Composite( override var rotation: Point3D? = null override var scale: Point3D? = null - @Serializable(ConfigSerializer::class) override var properties: Config? = null } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt index f373a8de..c58f77fd 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -25,7 +24,6 @@ class ConeSegment( var angle: Float = PI2 ) : AbstractVisualObject(), VisualObject3D, Shape { - @Serializable(ConfigSerializer::class) override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt index e4168ed6..b7751919 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -14,7 +13,6 @@ import kotlinx.serialization.UseSerializers @SerialName("3d.convex") class Convex(val points: List) : AbstractVisualObject(), VisualObject3D { - @Serializable(ConfigSerializer::class) override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt index ae81eace..c713a2bb 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt @@ -1,7 +1,6 @@ @file:UseSerializers(Point2DSerializer::class, Point3DSerializer::class) package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -45,7 +44,6 @@ class Extruded( var layers: MutableList = ArrayList() ) : AbstractVisualObject(), VisualObject3D, Shape { - @Serializable(ConfigSerializer::class) override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt index 906b03de..31a416eb 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -12,9 +11,7 @@ import kotlinx.serialization.UseSerializers @Serializable @SerialName("3d.label") -class Label3D(var text: String, var fontSize: Double, var fontFamily: String) : AbstractVisualObject(), - VisualObject3D { - @Serializable(ConfigSerializer::class) +class Label3D(var text: String, var fontSize: Double, var fontFamily: String) : AbstractVisualObject(), VisualObject3D { override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt index f489c62a..0030ce53 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt @@ -1,16 +1,21 @@ package hep.dataforge.vis.spatial -import hep.dataforge.descriptors.NodeDescriptor -import hep.dataforge.meta.* +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.meta.double +import hep.dataforge.meta.get +import hep.dataforge.meta.node +import hep.dataforge.meta.scheme.* +import hep.dataforge.meta.set import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.values.ValueType +import hep.dataforge.values.asValue import hep.dataforge.vis.common.Colors import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY -class Material3D(override val config: Config) : Specific { +class Material3D : Scheme() { /** * Primary web-color for the material @@ -32,8 +37,7 @@ class Material3D(override val config: Config) : Specific { */ var wireframe by boolean(false, WIREFRAME_KEY) - companion object : Specification { - override fun wrap(config: Config): Material3D = Material3D(config) + companion object : SchemeSpec(::Material3D) { val MATERIAL_KEY = "material".asName() internal val COLOR_KEY = "color".asName() @@ -45,20 +49,20 @@ class Material3D(override val config: Config) : Specific { val MATERIAL_WIREFRAME_KEY = MATERIAL_KEY + WIREFRAME_KEY val descriptor = NodeDescriptor { - value(VisualObject3D.VISIBLE_KEY) { + defineValue(VisualObject3D.VISIBLE_KEY) { type(ValueType.BOOLEAN) default(true) } - node(MATERIAL_KEY) { - value(COLOR_KEY) { + defineNode(MATERIAL_KEY) { + defineValue(COLOR_KEY) { type(ValueType.STRING, ValueType.NUMBER) default("#ffffff") } - value(OPACITY_KEY) { + defineValue(OPACITY_KEY) { type(ValueType.NUMBER) default(1.0) } - value(WIREFRAME_KEY) { + defineValue(WIREFRAME_KEY) { type(ValueType.BOOLEAN) default(false) } @@ -71,14 +75,14 @@ class Material3D(override val config: Config) : Specific { * Set color as web-color */ fun VisualObject3D.color(webColor: String) { - setProperty(MATERIAL_COLOR_KEY, webColor) + setProperty(MATERIAL_COLOR_KEY, webColor.asValue()) } /** * Set color as integer */ fun VisualObject3D.color(rgb: Int) { - setProperty(MATERIAL_COLOR_KEY, rgb) + setProperty(MATERIAL_COLOR_KEY, rgb.asValue()) } fun VisualObject3D.color(r: UByte, g: UByte, b: UByte) = setProperty( @@ -92,7 +96,7 @@ fun VisualObject3D.color(r: UByte, g: UByte, b: UByte) = setProperty( var VisualObject3D.color: String? get() = getProperty(MATERIAL_COLOR_KEY)?.let { Colors.fromMeta(it) } set(value) { - setProperty(MATERIAL_COLOR_KEY, value) + setProperty(MATERIAL_COLOR_KEY, value?.asValue()) } val VisualObject3D.material: Material3D? @@ -110,5 +114,5 @@ fun VisualObject3D.material(builder: Material3D.() -> Unit) { var VisualObject3D.opacity: Double? get() = getProperty(MATERIAL_OPACITY_KEY).double set(value) { - setProperty(MATERIAL_OPACITY_KEY, value) + setProperty(MATERIAL_OPACITY_KEY, value?.asValue()) } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt index 24f5a3b9..20cdf0f2 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt @@ -2,9 +2,8 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config -import hep.dataforge.meta.number +import hep.dataforge.meta.scheme.number import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.vis.common.AbstractVisualObject @@ -16,7 +15,6 @@ import kotlinx.serialization.UseSerializers @Serializable @SerialName("3d.line") class PolyLine(var points: List) : AbstractVisualObject(), VisualObject3D { - @Serializable(ConfigSerializer::class) override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt index 9b72e6d5..e11bb4ba 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt @@ -1,9 +1,7 @@ -@file:UseSerializers(Point3DSerializer::class, NameSerializer::class, ConfigSerializer::class) +@file:UseSerializers(Point3DSerializer::class) package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer -import hep.dataforge.io.serialization.NameSerializer import hep.dataforge.meta.Config import hep.dataforge.meta.Laminate import hep.dataforge.meta.MetaItem @@ -36,7 +34,6 @@ class Proxy private constructor(val templateName: Name) : AbstractVisualObject() override var rotation: Point3D? = null override var scale: Point3D? = null - @Serializable(ConfigSerializer::class) override var properties: Config? = null /** diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt index b29af3c8..b9e628b7 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -23,7 +22,6 @@ class Sphere( var theta: Float = PI.toFloat() ) : AbstractVisualObject(), VisualObject3D, Shape { - @Serializable(ConfigSerializer::class) override var properties: Config? = null override var position: Point3D? = null diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt index d97ccce6..4822a560 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt @@ -1,7 +1,6 @@ @file:UseSerializers(Point3DSerializer::class) package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.common.set @@ -29,7 +28,6 @@ class Tube( override var rotation: Point3D? = null override var scale: Point3D? = null - @Serializable(ConfigSerializer::class) override var properties: Config? = null init { diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt index cb362558..3ee6cc93 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt @@ -4,10 +4,11 @@ import hep.dataforge.context.AbstractPlugin import hep.dataforge.context.Context import hep.dataforge.context.PluginFactory import hep.dataforge.context.PluginTag -import hep.dataforge.io.serialization.ConfigSerializer -import hep.dataforge.io.serialization.MetaSerializer -import hep.dataforge.io.serialization.NameSerializer -import hep.dataforge.meta.* +import hep.dataforge.meta.Meta +import hep.dataforge.meta.float +import hep.dataforge.meta.get +import hep.dataforge.meta.node +import hep.dataforge.meta.scheme.configure import hep.dataforge.names.Name import hep.dataforge.names.toName import hep.dataforge.vis.common.Visual @@ -39,10 +40,6 @@ class Visual3D(meta: Meta) : AbstractPlugin(meta) { val serialModule = SerializersModule { contextual(Point3DSerializer) contextual(Point2DSerializer) - contextual(NameSerializer) - contextual(NameTokenSerializer) - contextual(MetaSerializer) - contextual(ConfigSerializer) polymorphic(VisualObject::class, VisualObject3D::class) { VisualGroup3D::class with VisualGroup3D.serializer() @@ -52,8 +49,8 @@ class Visual3D(meta: Meta) : AbstractPlugin(meta) { Box::class with Box.serializer() Convex::class with Convex.serializer() Extruded::class with Extruded.serializer() - addSubclass(PolyLine.serializer()) - addSubclass(Label3D.serializer()) + subclass(PolyLine.serializer()) + subclass(Label3D.serializer()) } } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index 402290f8..cc9c23ea 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -1,16 +1,9 @@ @file:UseSerializers( - Point3DSerializer::class, - ConfigSerializer::class, - NameTokenSerializer::class, - NameSerializer::class, - MetaSerializer::class + Point3DSerializer::class ) package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.ConfigSerializer -import hep.dataforge.io.serialization.MetaSerializer -import hep.dataforge.io.serialization.NameSerializer import hep.dataforge.meta.Config import hep.dataforge.names.Name import hep.dataforge.names.NameToken diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt index 8e94ed65..6e1accd8 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt @@ -1,12 +1,13 @@ -@file:UseSerializers(Point3DSerializer::class, NameSerializer::class, NameTokenSerializer::class) +@file:UseSerializers(Point3DSerializer::class) package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.NameSerializer import hep.dataforge.meta.* +import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.output.Renderer +import hep.dataforge.values.asValue import hep.dataforge.vis.common.VisualObject import hep.dataforge.vis.spatial.VisualObject3D.Companion.DETAIL_KEY import hep.dataforge.vis.spatial.VisualObject3D.Companion.IGNORE_KEY @@ -64,7 +65,7 @@ interface VisualObject3D : VisualObject { var VisualObject3D.layer: Int get() = getProperty(LAYER_KEY).int ?: 0 set(value) { - setProperty(LAYER_KEY, value) + setProperty(LAYER_KEY, value.asValue()) } fun Renderer.render(meta: Meta = EmptyMeta, action: VisualGroup3D.() -> Unit) = @@ -86,7 +87,7 @@ enum class RotationOrder { */ var VisualObject3D.rotationOrder: RotationOrder get() = getProperty(VisualObject3D.rotationOrder).enum() ?: RotationOrder.XYZ - set(value) = setProperty(VisualObject3D.rotationOrder, value.name) + set(value) = setProperty(VisualObject3D.rotationOrder, value.name.asValue()) /** @@ -94,11 +95,11 @@ var VisualObject3D.rotationOrder: RotationOrder */ var VisualObject3D.detail: Int? get() = getProperty(DETAIL_KEY, false).int - set(value) = setProperty(DETAIL_KEY, value) + set(value) = setProperty(DETAIL_KEY, value?.asValue()) var VisualObject.visible: Boolean? get() = getProperty(VISIBLE_KEY).boolean - set(value) = setProperty(VISIBLE_KEY, value) + set(value) = setProperty(VISIBLE_KEY, value?.asValue()) /** * If this property is true, the object will be ignored on render. @@ -106,7 +107,7 @@ var VisualObject.visible: Boolean? */ var VisualObject.ignore: Boolean? get() = getProperty(IGNORE_KEY,false).boolean - set(value) = setProperty(IGNORE_KEY, value) + set(value) = setProperty(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? // get() = getProperty(SELECTED_KEY).boolean diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt index 75336e60..85d5466a 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt @@ -1,7 +1,6 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Meta -import hep.dataforge.meta.buildMeta import hep.dataforge.meta.get import hep.dataforge.meta.number @@ -13,7 +12,7 @@ expect class Point2D(x: Number, y: Number) { operator fun Point2D.component1() = x operator fun Point2D.component2() = y -fun Point2D.toMeta() = buildMeta { +fun Point2D.toMeta() = Meta { VisualObject3D.x put x VisualObject3D.y put y } @@ -34,7 +33,7 @@ operator fun Point3D.component3() = z fun Meta.point3D() = Point3D(this["x"].number ?: 0, this["y"].number ?: 0, this["y"].number ?: 0) -fun Point3D.toMeta() = buildMeta { +fun Point3D.toMeta() = Meta { VisualObject3D.x put x VisualObject3D.y put y VisualObject3D.z put z diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt index 37115129..5bb95aea 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt @@ -1,17 +1,14 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.serialization.descriptor -import hep.dataforge.names.NameToken -import hep.dataforge.names.toName +import hep.dataforge.meta.double import kotlinx.serialization.* -import kotlinx.serialization.internal.DoubleSerializer -import kotlinx.serialization.internal.StringDescriptor -import kotlinx.serialization.internal.nullable +import kotlinx.serialization.builtins.nullable +import kotlinx.serialization.builtins.serializer inline fun Decoder.decodeStructure( desc: SerialDescriptor, vararg typeParams: KSerializer<*> = emptyArray(), - crossinline block: CompositeDecoder.() -> R + crossinline block: CompositeDecoder.() -> R ): R { val decoder = beginStructure(desc, *typeParams) val res = decoder.block() @@ -31,7 +28,7 @@ inline fun Encoder.encodeStructure( @Serializer(Point3D::class) object Point3DSerializer : KSerializer { - override val descriptor: SerialDescriptor = descriptor("hep.dataforge.vis.spatial.Point3D") { + override val descriptor: SerialDescriptor = SerialDescriptor("hep.dataforge.vis.spatial.Point3D") { double("x", true) double("y", true) double("z", true) @@ -45,28 +42,28 @@ object Point3DSerializer : KSerializer { loop@ while (true) { when (val i = decodeElementIndex(descriptor)) { CompositeDecoder.READ_DONE -> break@loop - 0 -> x = decodeNullableSerializableElement(descriptor, 0, DoubleSerializer.nullable) ?: 0.0 - 1 -> y = decodeNullableSerializableElement(descriptor, 1, DoubleSerializer.nullable) ?: 0.0 - 2 -> z = decodeNullableSerializableElement(descriptor, 2, DoubleSerializer.nullable) ?: 0.0 + 0 -> x = decodeNullableSerializableElement(descriptor, 0, Double.serializer().nullable) ?: 0.0 + 1 -> y = decodeNullableSerializableElement(descriptor, 1, Double.serializer().nullable) ?: 0.0 + 2 -> z = decodeNullableSerializableElement(descriptor, 2, Double.serializer().nullable) ?: 0.0 else -> throw SerializationException("Unknown index $i") } } } - return Point3D(x?:0.0, y?:0.0, z?:0.0) + return Point3D(x ?: 0.0, y ?: 0.0, z ?: 0.0) } - override fun serialize(encoder: Encoder, obj: Point3D) { + override fun serialize(encoder: Encoder, value: Point3D) { encoder.encodeStructure(descriptor) { - if (obj.x != 0.0) encodeDoubleElement(descriptor, 0, obj.x) - if (obj.y != 0.0) encodeDoubleElement(descriptor, 1, obj.y) - if (obj.z != 0.0) encodeDoubleElement(descriptor, 2, obj.z) + if (value.x != 0.0) encodeDoubleElement(descriptor, 0, value.x) + if (value.y != 0.0) encodeDoubleElement(descriptor, 1, value.y) + if (value.z != 0.0) encodeDoubleElement(descriptor, 2, value.z) } } } @Serializer(Point2D::class) object Point2DSerializer : KSerializer { - override val descriptor: SerialDescriptor = descriptor("hep.dataforge.vis.spatial.Point2D") { + override val descriptor: SerialDescriptor = SerialDescriptor("hep.dataforge.vis.spatial.Point2D") { double("x", true) double("y", true) } @@ -78,32 +75,19 @@ object Point2DSerializer : KSerializer { loop@ while (true) { when (val i = decodeElementIndex(descriptor)) { CompositeDecoder.READ_DONE -> break@loop - 0 -> x = decodeNullableSerializableElement(descriptor, 0, DoubleSerializer.nullable) ?: 0.0 - 1 -> y = decodeNullableSerializableElement(descriptor, 1, DoubleSerializer.nullable) ?: 0.0 + 0 -> x = decodeNullableSerializableElement(descriptor, 0, Double.serializer().nullable) ?: 0.0 + 1 -> y = decodeNullableSerializableElement(descriptor, 1, Double.serializer().nullable) ?: 0.0 else -> throw SerializationException("Unknown index $i") } } } - return Point2D(x?:0.0, y?:0.0) + return Point2D(x ?: 0.0, y ?: 0.0) } - override fun serialize(encoder: Encoder, obj: Point2D) { + override fun serialize(encoder: Encoder, value: Point2D) { encoder.encodeStructure(descriptor) { - if (obj.x != 0.0) encodeDoubleElement(descriptor, 0, obj.x) - if (obj.y != 0.0) encodeDoubleElement(descriptor, 1, obj.y) + if (value.x != 0.0) encodeDoubleElement(descriptor, 0, value.x) + if (value.y != 0.0) encodeDoubleElement(descriptor, 1, value.y) } } -} - -@Serializer(NameToken::class) -object NameTokenSerializer : KSerializer { - override val descriptor: SerialDescriptor = StringDescriptor.withName("NameToken") - - override fun deserialize(decoder: Decoder): NameToken { - return decoder.decodeString().toName().first()!! - } - - override fun serialize(encoder: Encoder, obj: NameToken) { - encoder.encodeString(obj.toString()) - } } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt new file mode 100644 index 00000000..cda776c1 --- /dev/null +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt @@ -0,0 +1,18 @@ +package hep.dataforge.vis.spatial.specifications + +import hep.dataforge.meta.isEmpty +import hep.dataforge.meta.scheme.Scheme +import hep.dataforge.meta.scheme.SchemeSpec +import hep.dataforge.meta.scheme.boolean +import hep.dataforge.meta.scheme.double + +class Axes : Scheme() { + var visible by boolean(!config.isEmpty()) + var size by double(AXIS_SIZE) + var width by double(AXIS_WIDTH) + + companion object : SchemeSpec(::Axes) { + const val AXIS_SIZE = 1000.0 + const val AXIS_WIDTH = 3.0 + } +} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/AxesSpec.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/AxesSpec.kt deleted file mode 100644 index b46b9f4d..00000000 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/AxesSpec.kt +++ /dev/null @@ -1,17 +0,0 @@ -package hep.dataforge.vis.spatial.specifications - -import hep.dataforge.meta.* - -class AxesSpec(override val config: Config) : Specific { - var visible by boolean(!config.isEmpty()) - var size by double(AXIS_SIZE) - var width by double(AXIS_WIDTH) - - companion object : Specification { - override fun wrap(config: Config): AxesSpec = AxesSpec(config) - - const val AXIS_SIZE = 1000.0 - const val AXIS_WIDTH = 3.0 - - } -} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CameraSpec.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt similarity index 67% rename from dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CameraSpec.kt rename to dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt index eb23472f..fc131b4a 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CameraSpec.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt @@ -1,10 +1,14 @@ package hep.dataforge.vis.spatial.specifications -import hep.dataforge.meta.* +import hep.dataforge.meta.scheme.Scheme +import hep.dataforge.meta.scheme.SchemeSpec +import hep.dataforge.meta.scheme.double +import hep.dataforge.meta.scheme.int import kotlin.math.PI -class CameraSpec(override val config: Config) : Specific { +class Camera : Scheme() { var fov by int(FIELD_OF_VIEW) + //var aspect by double(1.0) var nearClip by double(NEAR_CLIP) var farClip by double(FAR_CLIP) @@ -14,11 +18,10 @@ class CameraSpec(override val config: Config) : Specific { var latitude by double(INITIAL_LATITUDE) val zenith: Double get() = PI / 2 - latitude - companion object : Specification { - override fun wrap(config: Config): CameraSpec = CameraSpec(config) + companion object : SchemeSpec(::Camera) { const val INITIAL_DISTANCE = 300.0 const val INITIAL_AZIMUTH = 0.0 - const val INITIAL_LATITUDE = PI/6 + const val INITIAL_LATITUDE = PI / 6 const val NEAR_CLIP = 0.1 const val FAR_CLIP = 10000.0 const val FIELD_OF_VIEW = 75 diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt new file mode 100644 index 00000000..a10b3186 --- /dev/null +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt @@ -0,0 +1,15 @@ +package hep.dataforge.vis.spatial.specifications + +import hep.dataforge.meta.scheme.Scheme +import hep.dataforge.meta.scheme.SchemeSpec +import hep.dataforge.meta.scheme.int +import hep.dataforge.meta.scheme.spec + +class Canvas : Scheme() { + var axes by spec(Axes, Axes.empty()) + var camera by spec(Camera, Camera.empty()) + var controls by spec(Controls, Controls.empty()) + var minSize by int(300) + + companion object : SchemeSpec(::Canvas) +} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CanvasSpec.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CanvasSpec.kt deleted file mode 100644 index d9cbded6..00000000 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/CanvasSpec.kt +++ /dev/null @@ -1,15 +0,0 @@ -package hep.dataforge.vis.spatial.specifications - -import hep.dataforge.meta.* - -class CanvasSpec(override val config: Config) : Specific { - var axes by spec(AxesSpec) - var camera by spec(CameraSpec) - var controls by spec(ControlsSpec) - var minSize by int(300) - - companion object: Specification{ - override fun wrap(config: Config): CanvasSpec = CanvasSpec(config) - - } -} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt new file mode 100644 index 00000000..7d142b67 --- /dev/null +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt @@ -0,0 +1,9 @@ +package hep.dataforge.vis.spatial.specifications + +import hep.dataforge.meta.scheme.Scheme +import hep.dataforge.meta.scheme.SchemeSpec + + +class Controls : Scheme() { + companion object : SchemeSpec(::Controls) +} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/ControlsSpec.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/ControlsSpec.kt deleted file mode 100644 index 2a828766..00000000 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/ControlsSpec.kt +++ /dev/null @@ -1,11 +0,0 @@ -package hep.dataforge.vis.spatial.specifications - -import hep.dataforge.meta.Config -import hep.dataforge.meta.Specific -import hep.dataforge.meta.Specification - -class ControlsSpec(override val config: Config) : Specific { - companion object : Specification { - override fun wrap(config: Config): ControlsSpec = ControlsSpec(config) - } -} \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/ConvexTest.kt b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/ConvexTest.kt index 0c2b4143..62482282 100644 --- a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/ConvexTest.kt +++ b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/ConvexTest.kt @@ -1,8 +1,9 @@ package hep.dataforge.vis.spatial -import hep.dataforge.io.toMeta import hep.dataforge.meta.MetaItem import hep.dataforge.meta.getIndexed +import hep.dataforge.meta.node +import hep.dataforge.meta.toMetaItem import kotlin.test.Test import kotlin.test.assertEquals @@ -26,9 +27,9 @@ class ConvexTest { val convex = group.first() as Convex val json = Visual3D.json.toJson(Convex.serializer(), convex) - val meta = json.toMeta() + val meta = json.toMetaItem().node!! - val points = meta.getIndexed("points").values.map { (it as MetaItem.NodeItem<*>).node.point3D()} + val points = meta.getIndexed("points").values.map { (it as MetaItem.NodeItem<*>).node.point3D() } assertEquals(8, points.count()) assertEquals(8, convex.points.size) diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt index 08717e92..483d48ec 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt @@ -2,7 +2,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.context.Context import hep.dataforge.meta.Meta -import hep.dataforge.meta.get +import hep.dataforge.meta.scheme.getProperty import hep.dataforge.meta.string import hep.dataforge.names.Name import hep.dataforge.names.plus @@ -10,9 +10,9 @@ import hep.dataforge.names.toName import hep.dataforge.output.Renderer import hep.dataforge.vis.common.Colors import hep.dataforge.vis.spatial.VisualObject3D -import hep.dataforge.vis.spatial.specifications.CameraSpec -import hep.dataforge.vis.spatial.specifications.CanvasSpec -import hep.dataforge.vis.spatial.specifications.ControlsSpec +import hep.dataforge.vis.spatial.specifications.Camera +import hep.dataforge.vis.spatial.specifications.Canvas +import hep.dataforge.vis.spatial.specifications.Controls import hep.dataforge.vis.spatial.three.ThreeMaterials.HIGHLIGHT_MATERIAL import info.laht.threekt.WebGLRenderer import info.laht.threekt.cameras.PerspectiveCamera @@ -39,7 +39,7 @@ import kotlin.math.sin /** * */ -class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: CanvasSpec) : Renderer { +class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val canvas: Canvas) : Renderer { override val context: Context get() = three.context @@ -53,15 +53,15 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas var clickListener: ((Name) -> Unit)? = null - val axes = AxesHelper(spec.axes.size.toInt()).apply { - visible = spec.axes.visible + val axes = AxesHelper(canvas.axes.size.toInt()).apply { + visible = canvas.axes.visible } val scene: Scene = Scene().apply { add(axes) } - val camera = buildCamera(spec.camera) + val camera = buildCamera(canvas.camera) init { element.clear() @@ -90,7 +90,7 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas } - addControls(renderer.domElement, spec.controls) + addControls(renderer.domElement, canvas.controls) fun animate() { val mesh = pick() @@ -108,7 +108,7 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas element.appendChild(renderer.domElement) - renderer.setSize(max(spec.minSize, element.offsetWidth), max(spec.minSize, element.offsetWidth)) + renderer.setSize(max(canvas.minSize, element.offsetWidth), max(canvas.minSize, element.offsetWidth)) element.onresize = { renderer.setSize(element.offsetWidth, element.offsetWidth) @@ -142,7 +142,7 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas } } - private fun buildCamera(spec: CameraSpec) = PerspectiveCamera( + private fun buildCamera(spec: Camera) = PerspectiveCamera( spec.fov, 1.0, spec.nearClip, @@ -153,8 +153,8 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas translateZ(spec.distance * sin(spec.zenith) * cos(spec.azimuth)) } - private fun addControls(element: Node, controlsSpec: ControlsSpec) { - when (controlsSpec["type"].string) { + private fun addControls(element: Node, controls: Controls) { + when (controls.getProperty("type").string) { "trackball" -> TrackballControls(camera, element) else -> OrbitControls(camera, element) } @@ -211,5 +211,5 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val spec: Canvas } } -fun ThreePlugin.output(element: HTMLElement, spec: CanvasSpec = CanvasSpec.empty()): ThreeCanvas = +fun ThreePlugin.output(element: HTMLElement, spec: Canvas = Canvas.empty()): ThreeCanvas = ThreeCanvas(element, this, spec) \ No newline at end of file diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt index 5970a76d..16b5b37d 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt @@ -2,7 +2,6 @@ package hep.dataforge.vis.spatial.three -import hep.dataforge.io.serialization.ConfigSerializer import hep.dataforge.meta.Config import hep.dataforge.vis.common.AbstractVisualObject import hep.dataforge.vis.spatial.Point3D @@ -26,7 +25,6 @@ class CustomThreeVisualObject(val threeFactory: ThreeFactory) : override var rotation: Point3D? = null override var scale: Point3D? = null - @Serializable(ConfigSerializer::class) override var properties: Config? = null override fun toObject3D(): Object3D = threeFactory(this) diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/csg.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/csg.kt index 036f729a..615e4624 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/csg.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/csg.kt @@ -1,4 +1,4 @@ -@file:JsModule("@hi-level/three-csg") +@file:JsModule("three-csg-ts") @file:JsNonModule @file:Suppress( "INTERFACE_WITH_SUPERCLASS", diff --git a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXCanvas3D.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXCanvas3D.kt index 1704eeb2..499a2e5d 100644 --- a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXCanvas3D.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXCanvas3D.kt @@ -5,7 +5,7 @@ import hep.dataforge.context.ContextAware import hep.dataforge.meta.Meta import hep.dataforge.output.Renderer import hep.dataforge.vis.spatial.VisualObject3D -import hep.dataforge.vis.spatial.specifications.CanvasSpec +import hep.dataforge.vis.spatial.specifications.Canvas import javafx.application.Platform import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleObjectProperty @@ -14,7 +14,7 @@ import javafx.scene.paint.Color import org.fxyz3d.scene.Axes import tornadofx.* -class FXCanvas3D(val plugin: FX3DPlugin, val spec: CanvasSpec = CanvasSpec.empty()) : +class FXCanvas3D(val plugin: FX3DPlugin, val spec: Canvas = Canvas.empty()) : Fragment(), Renderer, ContextAware { override val context: Context get() = plugin.context diff --git a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/OrbitControls.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/OrbitControls.kt index aaa90ee9..ce3f2d7d 100644 --- a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/OrbitControls.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/OrbitControls.kt @@ -1,6 +1,5 @@ package hep.dataforge.vis.spatial.fx -import hep.dataforge.vis.spatial.specifications.CameraSpec import javafx.beans.InvalidationListener import javafx.beans.property.SimpleDoubleProperty import javafx.event.EventHandler @@ -15,6 +14,7 @@ import javafx.scene.transform.Rotate import javafx.scene.transform.Translate import tornadofx.* import kotlin.math.* +import hep.dataforge.vis.spatial.specifications.Camera as CameraSpec class OrbitControls internal constructor(camera: Camera, canvas: SubScene, spec: CameraSpec) { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 7558d178..864255b6 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -1,11 +1,15 @@ -import org.openjfx.gradle.JavaFXOptions +import scientifik.DependencyConfiguration +import scientifik.FXModule +import scientifik.fx plugins { id("scientifik.mpp") - id("org.openjfx.javafxplugin") id("application") } +val fxVersion: String by rootProject.extra +fx(FXModule.CONTROLS, version = fxVersion, configuration = DependencyConfiguration.IMPLEMENTATION) + kotlin { jvm { @@ -27,18 +31,9 @@ kotlin { api(project(":dataforge-vis-spatial-gdml")) } } - jvmMain{ - dependencies { - api("org.fxyz3d:fxyz3d:0.5.2") - } - } } } application { mainClassName = "hep.dataforge.vis.spatial.gdml.demo.GDMLDemoAppKt" -} - -configure { - modules("javafx.controls") } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt index 88a948f3..6eba931a 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial.gdml.demo import hep.dataforge.context.Global import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.meta.buildMeta +import hep.dataforge.meta.Meta import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty @@ -167,7 +167,7 @@ private class GDMLDemoApp : Application { //val descriptorMeta = Material3D.descriptor val properties = item.allProperties() - val bottom = buildMeta { + val bottom = Meta { VISIBLE_KEY put (item.visible ?: true) if (item is VisualObject3D) { MATERIAL_COLOR_KEY put "#ffffff" @@ -186,10 +186,6 @@ private class GDMLDemoApp : Application { selectElement(treeName) canvas.highlight(treeName) } - canvas.render(visual) - - - canvas.render(visual) message(null) spinner(false) diff --git a/demo/gdml/src/jsMain/web/css/jsoneditor.min.css b/demo/gdml/src/jsMain/resources/css/jsoneditor.min.css similarity index 100% rename from demo/gdml/src/jsMain/web/css/jsoneditor.min.css rename to demo/gdml/src/jsMain/resources/css/jsoneditor.min.css diff --git a/demo/gdml/src/jsMain/web/css/main.css b/demo/gdml/src/jsMain/resources/css/main.css similarity index 100% rename from demo/gdml/src/jsMain/web/css/main.css rename to demo/gdml/src/jsMain/resources/css/main.css diff --git a/demo/gdml/src/jsMain/web/img/jsoneditor-icons.svg b/demo/gdml/src/jsMain/resources/img/jsoneditor-icons.svg similarity index 100% rename from demo/gdml/src/jsMain/web/img/jsoneditor-icons.svg rename to demo/gdml/src/jsMain/resources/img/jsoneditor-icons.svg diff --git a/demo/gdml/src/jsMain/web/index.html b/demo/gdml/src/jsMain/resources/index.html similarity index 100% rename from demo/gdml/src/jsMain/web/index.html rename to demo/gdml/src/jsMain/resources/index.html diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt index 532e1399..b93f00c5 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt @@ -10,6 +10,8 @@ import scientifik.gdml.GDML import java.io.File import java.util.zip.GZIPInputStream import java.util.zip.ZipInputStream +import hep.dataforge.meta.* +import hep.dataforge.values.* fun Visual3D.Companion.readFile(file: File): VisualGroup3D = when { file.extension == "gdml" || file.extension == "xml" -> { @@ -18,7 +20,7 @@ fun Visual3D.Companion.readFile(file: File): VisualGroup3D = when { solidConfiguration = { parent, solid -> if (solid.name == "cave") { - setProperty(Material3D.MATERIAL_WIREFRAME_KEY, true) + setProperty(Material3D.MATERIAL_WIREFRAME_KEY, true.asValue()) } if (parent.physVolumes.isNotEmpty()) { useStyle("opaque") { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 48b34d0b..d2d746f9 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -1,15 +1,12 @@ -import scientifik.useSerialization +import scientifik.jsDistDirectory plugins { id("scientifik.mpp") - //id("org.openjfx.javafxplugin") id("application") } group = "ru.mipt.npm" -useSerialization() - val ktor_version = "1.3.0-rc" kotlin { @@ -22,7 +19,7 @@ kotlin { } } - val installJS = tasks.getByName("installJsDist") + val installJS = tasks.getByName("jsBrowserWebpack") jvm { withJava() @@ -30,7 +27,7 @@ kotlin { tasks.getByName("jvmProcessResources") { dependsOn(installJS) afterEvaluate { - from(installJS.destinationDir) + from(project.jsDistDirectory) } } } @@ -49,8 +46,8 @@ kotlin { implementation("io.ktor:ktor-serialization:$ktor_version") } } - jsMain{ - dependencies{ + jsMain { + dependencies { implementation("io.ktor:ktor-client-js:$ktor_version") implementation("io.ktor:ktor-client-serialization-js:$ktor_version") implementation(npm("text-encoding")) diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 3e680952..54f58f26 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -3,7 +3,7 @@ package ru.mipt.npm.muon.monitor import hep.dataforge.context.Global import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.meta.buildMeta +import hep.dataforge.meta.Meta import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty @@ -98,7 +98,7 @@ private class MMDemoApp : Application { //val descriptorMeta = Material3D.descriptor val properties = item.allProperties() - val bottom = buildMeta { + val bottom = Meta { VISIBLE_KEY put (item.visible ?: true) if (item is VisualObject3D) { MATERIAL_COLOR_KEY put "#ffffff" diff --git a/demo/muon-monitor/src/jsMain/web/css/jsoneditor.min.css b/demo/muon-monitor/src/jsMain/resources/css/jsoneditor.min.css similarity index 100% rename from demo/muon-monitor/src/jsMain/web/css/jsoneditor.min.css rename to demo/muon-monitor/src/jsMain/resources/css/jsoneditor.min.css diff --git a/demo/muon-monitor/src/jsMain/web/css/main.css b/demo/muon-monitor/src/jsMain/resources/css/main.css similarity index 100% rename from demo/muon-monitor/src/jsMain/web/css/main.css rename to demo/muon-monitor/src/jsMain/resources/css/main.css diff --git a/demo/muon-monitor/src/jsMain/web/img/jsoneditor-icons.svg b/demo/muon-monitor/src/jsMain/resources/img/jsoneditor-icons.svg similarity index 100% rename from demo/muon-monitor/src/jsMain/web/img/jsoneditor-icons.svg rename to demo/muon-monitor/src/jsMain/resources/img/jsoneditor-icons.svg diff --git a/demo/muon-monitor/src/jsMain/web/index.html b/demo/muon-monitor/src/jsMain/resources/index.html similarity index 100% rename from demo/muon-monitor/src/jsMain/web/index.html rename to demo/muon-monitor/src/jsMain/resources/index.html diff --git a/demo/spatial-showcase/build.gradle.kts b/demo/spatial-showcase/build.gradle.kts index 46d63633..fef9057c 100644 --- a/demo/spatial-showcase/build.gradle.kts +++ b/demo/spatial-showcase/build.gradle.kts @@ -1,11 +1,15 @@ -import org.openjfx.gradle.JavaFXOptions +import scientifik.DependencyConfiguration +import scientifik.FXModule +import scientifik.fx plugins { id("scientifik.mpp") - id("org.openjfx.javafxplugin") id("application") } +val fxVersion: String by rootProject.extra +fx(FXModule.CONTROLS, version = fxVersion, configuration = DependencyConfiguration.IMPLEMENTATION) + kotlin { jvm { @@ -32,8 +36,4 @@ kotlin { application { mainClassName = "hep.dataforge.vis.spatial.demo.FXDemoAppKt" -} - -configure { - modules("javafx.controls") } \ No newline at end of file diff --git a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt index ddb92491..9bc63834 100644 --- a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt +++ b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt @@ -1,13 +1,13 @@ package hep.dataforge.vis.spatial.demo -import hep.dataforge.meta.buildMeta -import hep.dataforge.meta.invoke +import hep.dataforge.meta.Meta +import hep.dataforge.meta.scheme.invoke import hep.dataforge.names.toName import hep.dataforge.output.OutputManager import hep.dataforge.vis.common.Colors import hep.dataforge.vis.common.VisualObject import hep.dataforge.vis.spatial.* -import hep.dataforge.vis.spatial.specifications.CanvasSpec +import hep.dataforge.vis.spatial.specifications.Canvas import kotlinx.coroutines.* import kotlin.math.PI import kotlin.math.cos @@ -16,14 +16,14 @@ import kotlin.random.Random fun OutputManager.demo(name: String, title: String = name, block: VisualGroup3D.() -> Unit) { - val meta = buildMeta { + val meta = Meta { "title" put title } val output = get(VisualObject::class, name.toName(), meta = meta) output.render(action = block) } -val canvasOptions = CanvasSpec { +val canvasOptions = Canvas { minSize = 500 axes { size = 500.0 @@ -31,7 +31,7 @@ val canvasOptions = CanvasSpec { } camera { distance = 600.0 - latitude = PI/6 + latitude = PI / 6 } } diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt index 7d9adc3e..984a3bcf 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt @@ -2,16 +2,7 @@ package hep.dataforge.vis.spatial.demo import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.vis.spatial.three.MeshThreeFactory.Companion.EDGES_ENABLED_KEY -import hep.dataforge.vis.spatial.three.MeshThreeFactory.Companion.WIREFRAME_ENABLED_KEY -import hep.dataforge.vis.spatial.x -import hep.dataforge.vis.spatial.y -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch import kotlin.browser.document -import kotlin.random.Random private class ThreeDemoApp : Application { diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt index 44a71b5a..0aee069d 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt @@ -3,15 +3,11 @@ package hep.dataforge.vis.spatial.demo import hep.dataforge.context.Global import hep.dataforge.meta.Meta import hep.dataforge.meta.get -import hep.dataforge.meta.invoke import hep.dataforge.meta.string import hep.dataforge.names.Name import hep.dataforge.output.OutputManager import hep.dataforge.output.Renderer import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.spatial.specifications.AxesSpec -import hep.dataforge.vis.spatial.specifications.CameraSpec -import hep.dataforge.vis.spatial.specifications.CanvasSpec import hep.dataforge.vis.spatial.three.ThreeCanvas import hep.dataforge.vis.spatial.three.ThreePlugin import hep.dataforge.vis.spatial.three.output diff --git a/demo/spatial-showcase/src/jsMain/web/index.html b/demo/spatial-showcase/src/jsMain/resources/index.html similarity index 100% rename from demo/spatial-showcase/src/jsMain/web/index.html rename to demo/spatial-showcase/src/jsMain/resources/index.html diff --git a/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt b/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt index 9357e5de..b608d100 100644 --- a/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt +++ b/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt @@ -9,8 +9,8 @@ import hep.dataforge.output.Renderer import hep.dataforge.vis.common.VisualObject import hep.dataforge.vis.spatial.fx.FX3DPlugin import hep.dataforge.vis.spatial.fx.FXCanvas3D -import hep.dataforge.vis.spatial.specifications.AxesSpec -import hep.dataforge.vis.spatial.specifications.CanvasSpec +import hep.dataforge.vis.spatial.specifications.Axes as AxesSpec +import hep.dataforge.vis.spatial.specifications.Canvas as CanvasSpec import javafx.collections.FXCollections import javafx.scene.Parent import javafx.scene.control.Tab -- 2.34.1 From 14de244c02dd05711e3c8690ff5a848938888295 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 17 Mar 2020 11:36:17 +0300 Subject: [PATCH 02/11] Move to new kotlin and plugin --- dataforge-vis-common/build.gradle.kts | 1 + .../hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt | 4 +++- .../hep/dataforge/vis/spatial/gdml/demo/readFile.kt | 4 ++-- demo/muon-monitor/build.gradle.kts | 12 ++---------- .../ru/mipt/npm/muon/monitor/server/MMServer.kt | 4 ++-- .../hep/dataforge/vis/spatial/demo/VariableBox.kt | 7 ++++--- settings.gradle.kts | 2 -- 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/dataforge-vis-common/build.gradle.kts b/dataforge-vis-common/build.gradle.kts index 1774b6ed..f673dde2 100644 --- a/dataforge-vis-common/build.gradle.kts +++ b/dataforge-vis-common/build.gradle.kts @@ -33,6 +33,7 @@ kotlin { dependencies { api("hep.dataforge:dataforge-output-html:$dataforgeVersion") //api(npm("bootstrap","4.4.1")) + implementation(npm("uri-js","4.2.2")) implementation(npm("jsoneditor","8.6.1")) implementation(npm("file-saver")) } diff --git a/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt b/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt index bac4481e..cab81846 100644 --- a/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt +++ b/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt @@ -1,7 +1,9 @@ package hep.dataforge.vis.spatial.gdml +import hep.dataforge.meta.scheme.setProperty import hep.dataforge.meta.string import hep.dataforge.names.toName +import hep.dataforge.values.asValue import hep.dataforge.vis.spatial.Material3D import hep.dataforge.vis.spatial.gdml.demo.cubes import kotlin.test.Test @@ -12,7 +14,7 @@ class GDMLVisualTest { fun testPrototypeProperty() { val gdml = cubes() val visual = gdml.toVisual() - visual["composite000.segment0".toName()]?.setProperty(Material3D.MATERIAL_COLOR_KEY, "red") + visual["composite000.segment0".toName()]?.setProperty(Material3D.MATERIAL_COLOR_KEY, "red".asValue()) assertEquals("red", visual["composite000.segment0".toName()]?.getProperty(Material3D.MATERIAL_COLOR_KEY).string) } } \ No newline at end of file diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt index b93f00c5..c89b1857 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt @@ -1,5 +1,7 @@ package hep.dataforge.vis.spatial.gdml.demo +import hep.dataforge.meta.scheme.setProperty +import hep.dataforge.values.asValue import hep.dataforge.vis.spatial.Material3D import hep.dataforge.vis.spatial.Visual3D import hep.dataforge.vis.spatial.VisualGroup3D @@ -10,8 +12,6 @@ import scientifik.gdml.GDML import java.io.File import java.util.zip.GZIPInputStream import java.util.zip.ZipInputStream -import hep.dataforge.meta.* -import hep.dataforge.values.* fun Visual3D.Companion.readFile(file: File): VisualGroup3D = when { file.extension == "gdml" || file.extension == "xml" -> { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index d2d746f9..b1f3126b 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -7,19 +7,11 @@ plugins { group = "ru.mipt.npm" -val ktor_version = "1.3.0-rc" +val ktor_version = "1.3.2" kotlin { - js { - browser { - webpackTask { - sourceMaps = true - } - } - } - - val installJS = tasks.getByName("jsBrowserWebpack") + val installJS = tasks.getByName("jsBrowserDistribution") jvm { withJava() diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt index f46f68e1..955ff67c 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt @@ -14,7 +14,7 @@ import io.ktor.http.content.static import io.ktor.response.respond import io.ktor.routing.Routing import io.ktor.routing.get -import io.ktor.serialization.serialization +import io.ktor.serialization.json import io.ktor.server.cio.CIO import io.ktor.server.engine.embeddedServer import org.apache.commons.math3.random.JDKRandomGenerator @@ -35,7 +35,7 @@ fun Application.module() { install(DefaultHeaders) install(CallLogging) install(ContentNegotiation) { - serialization(json = Visual3D.json) + json(json = Visual3D.json) } install(Routing) { get("/event") { diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt index 63e6c975..334721a2 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt @@ -4,11 +4,12 @@ package hep.dataforge.vis.spatial.demo import hep.dataforge.meta.int import hep.dataforge.meta.number +import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.plus import hep.dataforge.names.startsWith +import hep.dataforge.values.asValue import hep.dataforge.vis.common.getProperty import hep.dataforge.vis.common.set -import hep.dataforge.vis.common.setProperty import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.VisualObject3D.Companion.GEOMETRY_KEY import hep.dataforge.vis.spatial.demo.VariableBoxThreeFactory.Z_SIZE_KEY @@ -25,13 +26,13 @@ import kotlin.reflect.KClass internal var VisualObject3D.variableZSize: Number get() = getProperty(Z_SIZE_KEY, false).number ?: 0f set(value) { - setProperty(Z_SIZE_KEY, value) + setProperty(Z_SIZE_KEY, value.asValue()) } internal var VisualObject3D.value: Int get() = getProperty("value", false).int ?: 0 set(value) { - setProperty("value", value) + setProperty("value", value.asValue()) val size = value.toFloat() / 255f * 20f scaleZ = size z = -size / 2 diff --git a/settings.gradle.kts b/settings.gradle.kts index 7dbf2794..891155fd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,6 @@ pluginManagement { resolutionStrategy { eachPlugin { when (requested.id.id) { - "kotlin-dce-js" -> useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:${requested.version}") "scientifik.mpp", "scientifik.publish", "scientifik.jvm", "scientifik.js" -> useModule("scientifik:gradle-tools:${requested.version}") "org.openjfx.javafxplugin" -> useModule("org.openjfx:javafx-plugin:${requested.version}") } @@ -27,7 +26,6 @@ rootProject.name = "dataforge-vis" include( ":dataforge-vis-common", -// ":wrappers", ":dataforge-vis-spatial", ":dataforge-vis-spatial-gdml", ":demo:spatial-showcase", -- 2.34.1 From 150fdb24269028740bdda27a673b397b4532ac86 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 19 Mar 2020 14:15:36 +0300 Subject: [PATCH 03/11] package name refactoring --- .../vis/{common => }/AbstractVisualGroup.kt | 12 +++++++++--- .../vis/{common => }/AbstractVisualObject.kt | 4 ++-- .../kotlin/hep/dataforge/vis/{common => }/Colors.kt | 2 +- .../hep/dataforge/vis/{common => }/StyleSheet.kt | 2 +- .../kotlin/hep/dataforge/vis/{common => }/Visual.kt | 5 +++-- .../hep/dataforge/vis/{common => }/VisualGroup.kt | 5 +++-- .../hep/dataforge/vis/{common => }/VisualObject.kt | 4 ++-- .../vis/{common => }/VisualObjectDelegate.kt | 6 +++--- .../hep/dataforge/vis/{common => }/valueWidget.kt | 2 +- .../hep/dataforge/vis/{js => }/editor/bootstrap.kt | 2 +- .../hep/dataforge/vis/{js => }/editor/jsTree.kt | 8 ++++---- .../hep/dataforge/vis/{js => }/editor/jsoneditor.kt | 2 +- .../dataforge/vis/{js => }/editor/propertyEditor.kt | 6 +++--- .../kotlin/hep/dataforge/vis/{fx => }/FXPlugin.kt | 5 +++-- .../vis/{fx => }/editor/ColorValueChooser.kt | 2 +- .../vis/{fx => }/editor/ComboBoxValueChooser.kt | 2 +- .../dataforge/vis/{fx => }/editor/ConfigEditor.kt | 10 +++++++--- .../hep/dataforge/vis/{fx => }/editor/FXMeta.kt | 2 +- .../hep/dataforge/vis/{fx => }/editor/MetaViewer.kt | 13 +++++++++---- .../vis/{fx => }/editor/TextValueChooser.kt | 2 +- .../dataforge/vis/{fx => }/editor/ValueCallback.kt | 2 +- .../dataforge/vis/{fx => }/editor/ValueChooser.kt | 6 +++--- .../vis/{fx => }/editor/ValueChooserBase.kt | 2 +- .../{fx => }/editor/VisualObjectEditorFragment.kt | 6 +++--- .../vis/{fx => }/editor/VisualObjectTreeFragment.kt | 6 +++--- .../dataforge/vis/{fx => }/demo/MetaEditorDemo.kt | 12 +++++++----- .../dataforge/vis/spatial/gdml/GDMLTransformer.kt | 2 +- .../hep/dataforge/vis/spatial/gdml/visualGDML.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Box.kt | 8 ++++---- .../kotlin/hep/dataforge/vis/spatial/Composite.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/ConeSegment.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Convex.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Extruded.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Label3D.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Material3D.kt | 2 +- .../kotlin/hep/dataforge/vis/spatial/PolyLine.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Proxy.kt | 11 ++++++++--- .../kotlin/hep/dataforge/vis/spatial/Sphere.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Tube.kt | 4 ++-- .../kotlin/hep/dataforge/vis/spatial/Visual3D.kt | 4 ++-- .../hep/dataforge/vis/spatial/VisualGroup3D.kt | 8 ++++---- .../hep/dataforge/vis/spatial/VisualObject3D.kt | 2 +- .../vis/spatial/transform/RemoveSingleChild.kt | 6 +++--- .../hep/dataforge/vis/spatial/transform/UnRef.kt | 4 ++-- .../vis/spatial/transform/VisualTreeTransform.kt | 2 +- .../kotlin/hep/dataforge/vis/spatial/GroupTest.kt | 4 ++-- .../hep/dataforge/vis/spatial/PropertyTest.kt | 2 +- .../hep/dataforge/vis/spatial/three/ThreeCanvas.kt | 2 +- .../hep/dataforge/vis/spatial/three/ThreeFactory.kt | 2 +- .../dataforge/vis/spatial/three/ThreeMaterials.kt | 4 ++-- .../hep/dataforge/vis/spatial/three/ThreePlugin.kt | 2 +- .../vis/spatial/three/ThreeVisualObject.kt | 2 +- .../hep/dataforge/vis/spatial/three/outputConfig.kt | 2 +- .../hep/dataforge/vis/spatial/fx/FXMaterials.kt | 2 +- .../hep/dataforge/vis/spatial/fx/FXProxyFactory.kt | 2 +- .../vis/spatial/fx/VisualObjectFXBinding.kt | 2 +- .../dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt | 8 ++++---- .../dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt | 4 ++-- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt | 10 +++++----- .../kotlin/hep/dataforge/vis/spatial/demo/demo.kt | 4 ++-- .../hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt | 2 +- .../hep/dataforge/vis/spatial/demo/VariableBox.kt | 4 ++-- .../hep/dataforge/vis/spatial/demo/FXDemoGrid.kt | 2 +- 64 files changed, 151 insertions(+), 126 deletions(-) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/AbstractVisualGroup.kt (92%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/AbstractVisualObject.kt (96%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/Colors.kt (99%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/StyleSheet.kt (98%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/Visual.kt (95%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/VisualGroup.kt (95%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/VisualObject.kt (97%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/VisualObjectDelegate.kt (98%) rename dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/{common => }/valueWidget.kt (93%) rename dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/{js => }/editor/bootstrap.kt (98%) rename dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/{js => }/editor/jsTree.kt (93%) rename dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/{js => }/editor/jsoneditor.kt (99%) rename dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/{js => }/editor/propertyEditor.kt (94%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/FXPlugin.kt (98%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ColorValueChooser.kt (97%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ComboBoxValueChooser.kt (98%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ConfigEditor.kt (96%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/FXMeta.kt (99%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/MetaViewer.kt (91%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/TextValueChooser.kt (98%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ValueCallback.kt (94%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ValueChooser.kt (97%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/ValueChooserBase.kt (98%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/VisualObjectEditorFragment.kt (95%) rename dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/{fx => }/editor/VisualObjectTreeFragment.kt (93%) rename dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/{fx => }/demo/MetaEditorDemo.kt (85%) diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualGroup.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt similarity index 92% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualGroup.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt index a0af25b7..7ae5fb44 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualGroup.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.MetaItem import hep.dataforge.names.Name @@ -11,7 +11,8 @@ import kotlinx.serialization.Transient /** * Abstract implementation of mutable group of [VisualObject] */ -abstract class AbstractVisualGroup : AbstractVisualObject(), MutableVisualGroup { +abstract class AbstractVisualGroup : AbstractVisualObject(), + MutableVisualGroup { //protected abstract val _children: MutableMap @@ -37,7 +38,12 @@ abstract class AbstractVisualGroup : AbstractVisualObject(), MutableVisualGroup * Add listener for children change */ override fun onChildrenChange(owner: Any?, action: (Name, VisualObject?) -> Unit) { - structureChangeListeners.add(StructureChangeListeners(owner, action)) + structureChangeListeners.add( + StructureChangeListeners( + owner, + action + ) + ) } /** diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt similarity index 96% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt index 3c76a4cc..e13f6253 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/AbstractVisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt @@ -1,11 +1,11 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.* import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.values.Value -import hep.dataforge.vis.common.VisualObject.Companion.STYLE_KEY +import hep.dataforge.vis.VisualObject.Companion.STYLE_KEY import kotlinx.serialization.Transient internal data class PropertyListener( diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Colors.kt similarity index 99% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Colors.kt index 5681f572..b91dbcff 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Colors.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Colors.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaItem diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt similarity index 98% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt index 365fff8e..be82d8c6 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/StyleSheet.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt @@ -1,6 +1,6 @@ @file:UseSerializers(MetaSerializer::class) -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.* import hep.dataforge.names.Name diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Visual.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Visual.kt similarity index 95% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Visual.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Visual.kt index a469ac63..8aeb32a4 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/Visual.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/Visual.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.context.* import hep.dataforge.meta.Meta @@ -31,7 +31,8 @@ class Visual(meta: Meta) : AbstractPlugin(meta) { override val tag: PluginTag = PluginTag(name = "visual", group = PluginTag.DATAFORGE_GROUP) override val type: KClass = Visual::class - override fun invoke(meta: Meta, context: Context): Visual = Visual(meta) + override fun invoke(meta: Meta, context: Context): Visual = + Visual(meta) const val VISUAL_FACTORY_TYPE = "visual.factory" } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualGroup.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualGroup.kt similarity index 95% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualGroup.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualGroup.kt index c3f497bd..d077a269 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualGroup.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualGroup.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.names.* import hep.dataforge.provider.Provider @@ -6,7 +6,8 @@ import hep.dataforge.provider.Provider /** * Represents a group of [VisualObject] instances */ -interface VisualGroup : Provider, Iterable, VisualObject { +interface VisualGroup : Provider, Iterable, + VisualObject { /** * A map of top level named children */ diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt similarity index 97% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt index 9e4cfd0b..8a67c524 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.Laminate import hep.dataforge.meta.Meta @@ -8,7 +8,7 @@ import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.toName import hep.dataforge.provider.Type -import hep.dataforge.vis.common.VisualObject.Companion.TYPE +import hep.dataforge.vis.VisualObject.Companion.TYPE import kotlinx.serialization.Transient //private fun Laminate.withTop(meta: Meta): Laminate = Laminate(listOf(meta) + layers) diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObjectDelegate.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObjectDelegate.kt similarity index 98% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObjectDelegate.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObjectDelegate.kt index ec16f977..d0798522 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/VisualObjectDelegate.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObjectDelegate.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.* import hep.dataforge.names.Name @@ -105,8 +105,8 @@ fun VisualObject.int(default: Int, name: Name? = null, inherited: Boolean = fals inline fun > VisualObject.enum(default: E, name: Name? = null, inherited: Boolean = false) = - VisualObjectDelegateWrapper(this, name, default, inherited) { - item -> item.string?.let { enumValueOf(it) } + VisualObjectDelegateWrapper(this, name, default, inherited) { item -> + item.string?.let { enumValueOf(it) } } //merge properties diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt similarity index 93% rename from dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt rename to dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt index 8f3ade43..809ad4ed 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/common/valueWidget.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.common +package hep.dataforge.vis import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.ValueDescriptor diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/bootstrap.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt similarity index 98% rename from dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/bootstrap.kt rename to dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt index 171aa86d..f002e29c 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/bootstrap.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.js.editor +package hep.dataforge.vis.editor import kotlinx.html.* import kotlinx.html.js.div diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsTree.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt similarity index 93% rename from dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsTree.kt rename to dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt index dde67544..393f1f58 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsTree.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt @@ -1,10 +1,10 @@ -package hep.dataforge.vis.js.editor +package hep.dataforge.vis.editor import hep.dataforge.names.Name import hep.dataforge.names.plus -import hep.dataforge.vis.common.VisualGroup -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.common.isEmpty +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.isEmpty import kotlinx.html.TagConsumer import kotlinx.html.dom.append import kotlinx.html.js.* diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsoneditor.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsoneditor.kt similarity index 99% rename from dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsoneditor.kt rename to dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsoneditor.kt index 8bfaf93a..800396cb 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/jsoneditor.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsoneditor.kt @@ -6,7 +6,7 @@ "EXTERNAL_DELEGATION" ) -package hep.dataforge.vis.js.editor +package hep.dataforge.vis.editor import org.w3c.dom.HTMLElement diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt similarity index 94% rename from dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt rename to dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt index 19f715a0..3af199cf 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/js/editor/propertyEditor.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.js.editor +package hep.dataforge.vis.editor import hep.dataforge.js.jsObject import hep.dataforge.meta.DynamicMeta @@ -7,8 +7,8 @@ import hep.dataforge.meta.toJson import hep.dataforge.meta.update import hep.dataforge.names.Name import hep.dataforge.names.isEmpty -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.common.findStyle +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.findStyle import kotlinx.html.dom.append import kotlinx.html.js.* import org.w3c.dom.Element diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/FXPlugin.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt similarity index 98% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/FXPlugin.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt index ffe2ef64..dcd5795c 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/FXPlugin.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.fx +package hep.dataforge.vis import hep.dataforge.context.* import hep.dataforge.meta.EmptyMeta @@ -96,7 +96,8 @@ class FXPlugin(meta: Meta = EmptyMeta) : AbstractPlugin(meta) { companion object : PluginFactory { override val type: KClass = FXPlugin::class override val tag: PluginTag = PluginTag("vis.fx", group = PluginTag.DATAFORGE_GROUP) - override fun invoke(meta: Meta, context: Context): FXPlugin = FXPlugin(meta) + override fun invoke(meta: Meta, context: Context): FXPlugin = + FXPlugin(meta) } } diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ColorValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ColorValueChooser.kt similarity index 97% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ColorValueChooser.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ColorValueChooser.kt index 0dac4f8d..b130dc21 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ColorValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ColorValueChooser.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.Meta import hep.dataforge.names.Name diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ComboBoxValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ComboBoxValueChooser.kt similarity index 98% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ComboBoxValueChooser.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ComboBoxValueChooser.kt index a3643099..3b7bdc33 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ComboBoxValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ComboBoxValueChooser.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.Meta import hep.dataforge.meta.get diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ConfigEditor.kt similarity index 96% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ConfigEditor.kt index c04b0719..0b86456a 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ConfigEditor.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ConfigEditor.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView @@ -11,7 +11,7 @@ import hep.dataforge.context.Global import hep.dataforge.meta.Config import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.names.NameToken -import hep.dataforge.vis.fx.dfIconView +import hep.dataforge.vis.dfIconView import javafx.scene.Node import javafx.scene.control.* import javafx.scene.control.cell.TextFieldTreeTableCell @@ -128,7 +128,11 @@ class ConfigEditor( when (item) { is FXMetaValue -> { text = null - val chooser = ValueChooser.build(Global, item.valueProperty, item.descriptor) { + val chooser = ValueChooser.build( + Global, + item.valueProperty, + item.descriptor + ) { item.set(it) } graphic = chooser.node diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt similarity index 99% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt index 7a9395ee..10fe2ee3 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/FXMeta.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt @@ -1,4 +1,4 @@ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.ItemDescriptor diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/MetaViewer.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/MetaViewer.kt similarity index 91% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/MetaViewer.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/MetaViewer.kt index 1120ebf4..c433aac6 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/MetaViewer.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/MetaViewer.kt @@ -14,18 +14,23 @@ * limitations under the License. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.Meta -import hep.dataforge.vis.fx.dfIconView +import hep.dataforge.vis.dfIconView import javafx.beans.property.SimpleStringProperty import javafx.scene.control.TreeItem import javafx.scene.control.TreeSortMode import javafx.scene.control.TreeTableView import tornadofx.* -class MetaViewer(val rootNode: FXMetaNode<*>, title: String = "Meta viewer") : Fragment(title, dfIconView) { - constructor(meta: Meta, title: String = "Meta viewer"): this(FXMeta.root(meta),title = title) +class MetaViewer(val rootNode: FXMetaNode<*>, title: String = "Meta viewer") : Fragment(title, + dfIconView +) { + constructor(meta: Meta, title: String = "Meta viewer"): this( + FXMeta.root( + meta + ),title = title) override val root = borderpane { center { diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/TextValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/TextValueChooser.kt similarity index 98% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/TextValueChooser.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/TextValueChooser.kt index 92e59acf..c1f611fb 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/TextValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/TextValueChooser.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.Meta import hep.dataforge.names.Name diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueCallback.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueCallback.kt similarity index 94% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueCallback.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueCallback.kt index bf7cdb7b..7989eaed 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueCallback.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueCallback.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.values.Value diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt similarity index 97% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt index 72128543..596c3b29 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.context.Context import hep.dataforge.context.Named @@ -15,8 +15,8 @@ import hep.dataforge.provider.Type import hep.dataforge.provider.provideByType import hep.dataforge.values.Null import hep.dataforge.values.Value -import hep.dataforge.vis.common.widget -import hep.dataforge.vis.common.widgetType +import hep.dataforge.vis.widget +import hep.dataforge.vis.widgetType import javafx.beans.property.ObjectProperty import javafx.beans.value.ObservableValue import javafx.scene.Node diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooserBase.kt similarity index 98% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooserBase.kt index dc474cb5..9c415a43 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/ValueChooserBase.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooserBase.kt @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.descriptors.ValueDescriptor import hep.dataforge.values.Null diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectEditorFragment.kt similarity index 95% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectEditorFragment.kt index 05d9315c..43cdf21f 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectEditorFragment.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectEditorFragment.kt @@ -1,11 +1,11 @@ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor import hep.dataforge.meta.Config import hep.dataforge.meta.Meta import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.meta.update -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.common.findStyle +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.findStyle import javafx.beans.binding.Binding import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectTreeFragment.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectTreeFragment.kt similarity index 93% rename from dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectTreeFragment.kt rename to dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectTreeFragment.kt index 4f27ef87..fad759b9 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/fx/editor/VisualObjectTreeFragment.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/VisualObjectTreeFragment.kt @@ -1,7 +1,7 @@ -package hep.dataforge.vis.fx.editor +package hep.dataforge.vis.editor -import hep.dataforge.vis.common.VisualGroup -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject import javafx.beans.property.SimpleObjectProperty import javafx.scene.control.SelectionMode import javafx.scene.control.TreeItem diff --git a/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt b/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/demo/MetaEditorDemo.kt similarity index 85% rename from dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt rename to dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/demo/MetaEditorDemo.kt index 62ca8870..0c4060f1 100644 --- a/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/fx/demo/MetaEditorDemo.kt +++ b/dataforge-vis-common/src/jvmTest/kotlin/hep/dataforge/vis/demo/MetaEditorDemo.kt @@ -1,12 +1,12 @@ -package hep.dataforge.vis.fx.demo +package hep.dataforge.vis.demo import hep.dataforge.meta.Meta import hep.dataforge.meta.asConfig import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.values.ValueType -import hep.dataforge.vis.fx.editor.ConfigEditor -import hep.dataforge.vis.fx.editor.FXMeta -import hep.dataforge.vis.fx.editor.MetaViewer +import hep.dataforge.vis.editor.ConfigEditor +import hep.dataforge.vis.editor.FXMeta +import hep.dataforge.vis.editor.MetaViewer import javafx.geometry.Orientation import tornadofx.* @@ -49,7 +49,9 @@ class MetaEditorDemo : View("Meta editor demo") { private val rootNode = FXMeta.root(meta, descriptor) override val root = - splitpane(Orientation.HORIZONTAL, MetaViewer(rootNode).root, ConfigEditor(rootNode).root) + splitpane(Orientation.HORIZONTAL, MetaViewer(rootNode).root, ConfigEditor( + rootNode + ).root) } fun main() { diff --git a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt index bf8f81ac..3fdc1946 100644 --- a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt +++ b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt @@ -4,7 +4,7 @@ import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder import hep.dataforge.names.Name import hep.dataforge.names.toName -import hep.dataforge.vis.common.useStyle +import hep.dataforge.vis.useStyle import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import scientifik.gdml.* diff --git a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/visualGDML.kt b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/visualGDML.kt index 1f72a899..9f3bb093 100644 --- a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/visualGDML.kt +++ b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/visualGDML.kt @@ -4,8 +4,8 @@ package hep.dataforge.vis.spatial.gdml import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.plus -import hep.dataforge.vis.common.get -import hep.dataforge.vis.common.set +import hep.dataforge.vis.get +import hep.dataforge.vis.set import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.World.ONE import hep.dataforge.vis.spatial.World.ZERO diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt index 26f35cb5..47610f06 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt @@ -6,10 +6,10 @@ import hep.dataforge.meta.Config import hep.dataforge.meta.Meta import hep.dataforge.meta.float import hep.dataforge.meta.get -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.VisualFactory -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.VisualFactory +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.set import hep.dataforge.vis.spatial.Box.Companion.TYPE_NAME import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt index 46cf3b0e..55c8f227 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt @@ -4,8 +4,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.meta.update -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt index c58f77fd..e4a99c96 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt @@ -3,8 +3,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt index b7751919..9e4adc00 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt @@ -3,8 +3,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt index c713a2bb..c3440daf 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt @@ -2,8 +2,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt index 31a416eb..0a0688d4 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt @@ -3,8 +3,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt index 0030ce53..98ffe8b5 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt @@ -10,7 +10,7 @@ import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.values.ValueType import hep.dataforge.values.asValue -import hep.dataforge.vis.common.Colors +import hep.dataforge.vis.Colors import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt index 20cdf0f2..01176f46 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt @@ -6,8 +6,8 @@ import hep.dataforge.meta.Config import hep.dataforge.meta.scheme.number import hep.dataforge.names.asName import hep.dataforge.names.plus -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt index e11bb4ba..0e962b72 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt @@ -10,6 +10,7 @@ import hep.dataforge.names.Name import hep.dataforge.names.NameToken import hep.dataforge.names.asName import hep.dataforge.names.plus +import hep.dataforge.vis.* import hep.dataforge.vis.common.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -24,7 +25,8 @@ import kotlin.collections.set */ @Serializable @SerialName("3d.proxy") -class Proxy private constructor(val templateName: Name) : AbstractVisualObject(), VisualGroup, VisualObject3D { +class Proxy private constructor(val templateName: Name) : AbstractVisualObject(), + VisualGroup, VisualObject3D { constructor(parent: VisualGroup3D, templateName: Name) : this(templateName) { this.parent = parent @@ -44,7 +46,9 @@ class Proxy private constructor(val templateName: Name) : AbstractVisualObject() ?: error("Template with name $templateName not found in $parent") override val styleSheet: StyleSheet - get() = (parent as? VisualGroup)?.styleSheet ?: StyleSheet(this) + get() = (parent as? VisualGroup)?.styleSheet ?: StyleSheet( + this + ) override fun getProperty(name: Name, inherit: Boolean): MetaItem<*>? { return if (inherit) { @@ -86,7 +90,8 @@ class Proxy private constructor(val templateName: Name) : AbstractVisualObject() //override fun findAllStyles(): Laminate = Laminate((styles + prototype.styles).mapNotNull { findStyle(it) }) - inner class ProxyChild(val name: Name) : AbstractVisualObject(), VisualGroup { + inner class ProxyChild(val name: Name) : AbstractVisualObject(), + VisualGroup { val prototype: VisualObject get() = prototypeFor(name) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt index b9e628b7..459d144c 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt @@ -3,8 +3,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt index 4822a560..31514a4a 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt @@ -2,8 +2,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt index 3ee6cc93..22b8ea74 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt @@ -11,8 +11,8 @@ import hep.dataforge.meta.node import hep.dataforge.meta.scheme.configure import hep.dataforge.names.Name import hep.dataforge.names.toName -import hep.dataforge.vis.common.Visual -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.Visual +import hep.dataforge.vis.VisualObject import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration import kotlinx.serialization.modules.SerializersModule diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index cc9c23ea..aa804fad 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -9,10 +9,10 @@ import hep.dataforge.names.Name import hep.dataforge.names.NameToken import hep.dataforge.names.asName import hep.dataforge.names.isEmpty -import hep.dataforge.vis.common.AbstractVisualGroup -import hep.dataforge.vis.common.StyleSheet -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.common.set +import hep.dataforge.vis.AbstractVisualGroup +import hep.dataforge.vis.StyleSheet +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt index 6e1accd8..f42574d6 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt @@ -8,7 +8,7 @@ import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.output.Renderer import hep.dataforge.values.asValue -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.VisualObject3D.Companion.DETAIL_KEY import hep.dataforge.vis.spatial.VisualObject3D.Companion.IGNORE_KEY import hep.dataforge.vis.spatial.VisualObject3D.Companion.LAYER_KEY diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/RemoveSingleChild.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/RemoveSingleChild.kt index 636b9cc1..309bc873 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/RemoveSingleChild.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/RemoveSingleChild.kt @@ -2,9 +2,9 @@ package hep.dataforge.vis.spatial.transform import hep.dataforge.meta.update import hep.dataforge.names.asName -import hep.dataforge.vis.common.MutableVisualGroup -import hep.dataforge.vis.common.VisualGroup -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.MutableVisualGroup +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.* internal fun mergeChild(parent: VisualGroup, child: VisualObject): VisualObject { diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt index c96be89c..32104b95 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt @@ -2,8 +2,8 @@ package hep.dataforge.vis.spatial.transform import hep.dataforge.names.Name import hep.dataforge.names.asName -import hep.dataforge.vis.common.MutableVisualGroup -import hep.dataforge.vis.common.VisualGroup +import hep.dataforge.vis.MutableVisualGroup +import hep.dataforge.vis.VisualGroup import hep.dataforge.vis.spatial.Proxy import hep.dataforge.vis.spatial.VisualGroup3D import hep.dataforge.vis.spatial.prototypes diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/VisualTreeTransform.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/VisualTreeTransform.kt index 596aad56..88c6fd12 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/VisualTreeTransform.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/VisualTreeTransform.kt @@ -1,6 +1,6 @@ package hep.dataforge.vis.spatial.transform -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject /** * A root class for [VisualObject] tree optimization diff --git a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/GroupTest.kt b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/GroupTest.kt index 2608b53a..e5d6153d 100644 --- a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/GroupTest.kt +++ b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/GroupTest.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial -import hep.dataforge.vis.common.Colors -import hep.dataforge.vis.common.get +import hep.dataforge.vis.Colors +import hep.dataforge.vis.get import kotlin.math.PI import kotlin.test.Test import kotlin.test.assertEquals diff --git a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/PropertyTest.kt b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/PropertyTest.kt index fa15b905..9972b8c2 100644 --- a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/PropertyTest.kt +++ b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/PropertyTest.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.int import hep.dataforge.meta.set import hep.dataforge.names.asName -import hep.dataforge.vis.common.useStyle +import hep.dataforge.vis.useStyle import kotlin.test.Test import kotlin.test.assertEquals diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt index 483d48ec..6e3a9603 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt @@ -8,7 +8,7 @@ import hep.dataforge.names.Name import hep.dataforge.names.plus import hep.dataforge.names.toName import hep.dataforge.output.Renderer -import hep.dataforge.vis.common.Colors +import hep.dataforge.vis.Colors import hep.dataforge.vis.spatial.VisualObject3D import hep.dataforge.vis.spatial.specifications.Camera import hep.dataforge.vis.spatial.specifications.Canvas diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeFactory.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeFactory.kt index 6828cd7b..38d1bfb5 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeFactory.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeFactory.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.names.Name import hep.dataforge.names.startsWith import hep.dataforge.provider.Type -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_KEY import hep.dataforge.vis.spatial.three.ThreeFactory.Companion.TYPE diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeMaterials.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeMaterials.kt index 786c0efd..4ef25b5a 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeMaterials.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeMaterials.kt @@ -2,8 +2,8 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.meta.* import hep.dataforge.values.ValueType -import hep.dataforge.vis.common.Colors -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.Colors +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.Material3D import info.laht.threekt.materials.LineBasicMaterial import info.laht.threekt.materials.Material diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreePlugin.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreePlugin.kt index e5c99efe..6c6aabeb 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreePlugin.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreePlugin.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.context.* import hep.dataforge.meta.Meta import hep.dataforge.names.* -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.* import info.laht.threekt.core.Object3D import kotlin.collections.set diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt index 16b5b37d..6071b31e 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeVisualObject.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.meta.Config -import hep.dataforge.vis.common.AbstractVisualObject +import hep.dataforge.vis.AbstractVisualObject import hep.dataforge.vis.spatial.Point3D import hep.dataforge.vis.spatial.Point3DSerializer import hep.dataforge.vis.spatial.VisualObject3D diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/outputConfig.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/outputConfig.kt index 70afb07d..d6042d01 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/outputConfig.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/outputConfig.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.js.requireJS -import hep.dataforge.vis.js.editor.accordion +import hep.dataforge.vis.editor.accordion import hep.dataforge.vis.spatial.Visual3D import hep.dataforge.vis.spatial.VisualGroup3D import kotlinx.html.InputType diff --git a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXMaterials.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXMaterials.kt index bdaf52dc..1e78d8d5 100644 --- a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXMaterials.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXMaterials.kt @@ -5,7 +5,7 @@ import hep.dataforge.meta.double import hep.dataforge.meta.get import hep.dataforge.meta.int import hep.dataforge.values.ValueType -import hep.dataforge.vis.common.Colors +import hep.dataforge.vis.Colors import hep.dataforge.vis.spatial.Material3D import javafx.scene.paint.Color import javafx.scene.paint.Material diff --git a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXProxyFactory.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXProxyFactory.kt index 6052afcd..47900222 100644 --- a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXProxyFactory.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/FXProxyFactory.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial.fx import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.names.toName -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.Proxy import javafx.scene.Group import javafx.scene.Node diff --git a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/VisualObjectFXBinding.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/VisualObjectFXBinding.kt index faa7b843..2280723f 100644 --- a/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/VisualObjectFXBinding.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/fx/VisualObjectFXBinding.kt @@ -4,7 +4,7 @@ import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.startsWith import hep.dataforge.names.toName -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import javafx.application.Platform import javafx.beans.binding.ObjectBinding import tornadofx.* diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt index 6eba931a..c950bdca 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt @@ -7,10 +7,10 @@ import hep.dataforge.meta.Meta import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty -import hep.dataforge.vis.common.VisualGroup -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.js.editor.displayObjectTree -import hep.dataforge.vis.js.editor.displayPropertyEditor +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.editor.displayObjectTree +import hep.dataforge.vis.editor.displayPropertyEditor import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_WIREFRAME_KEY diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt index ff07ebc6..9de54bc5 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt @@ -1,8 +1,8 @@ package hep.dataforge.vis.spatial.gdml.demo import hep.dataforge.context.Global -import hep.dataforge.vis.fx.editor.VisualObjectEditorFragment -import hep.dataforge.vis.fx.editor.VisualObjectTreeFragment +import hep.dataforge.vis.editor.VisualObjectEditorFragment +import hep.dataforge.vis.editor.VisualObjectTreeFragment import hep.dataforge.vis.spatial.Material3D import hep.dataforge.vis.spatial.Visual3D import hep.dataforge.vis.spatial.VisualGroup3D diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index e2d6afb0..b76be164 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -1,6 +1,6 @@ package ru.mipt.npm.muon.monitor -import hep.dataforge.vis.common.removeAll +import hep.dataforge.vis.removeAll import hep.dataforge.vis.spatial.* import ru.mipt.npm.muon.monitor.Monitor.CENTRAL_LAYER_Z import ru.mipt.npm.muon.monitor.Monitor.LOWER_LAYER_Z diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 54f58f26..19d08623 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -7,11 +7,11 @@ import hep.dataforge.meta.Meta import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty -import hep.dataforge.vis.common.VisualGroup -import hep.dataforge.vis.common.VisualObject -import hep.dataforge.vis.js.editor.card -import hep.dataforge.vis.js.editor.displayObjectTree -import hep.dataforge.vis.js.editor.displayPropertyEditor +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.editor.card +import hep.dataforge.vis.editor.displayObjectTree +import hep.dataforge.vis.editor.displayPropertyEditor import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_WIREFRAME_KEY diff --git a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt index 9bc63834..ac716e82 100644 --- a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt +++ b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt @@ -4,8 +4,8 @@ import hep.dataforge.meta.Meta import hep.dataforge.meta.scheme.invoke import hep.dataforge.names.toName import hep.dataforge.output.OutputManager -import hep.dataforge.vis.common.Colors -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.Colors +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.specifications.Canvas import kotlinx.coroutines.* diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt index 0aee069d..e9f3cb8d 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoGrid.kt @@ -7,7 +7,7 @@ import hep.dataforge.meta.string import hep.dataforge.names.Name import hep.dataforge.output.OutputManager import hep.dataforge.output.Renderer -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.three.ThreeCanvas import hep.dataforge.vis.spatial.three.ThreePlugin import hep.dataforge.vis.spatial.three.output diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt index 334721a2..4dd23ac5 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt @@ -8,8 +8,8 @@ import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.plus import hep.dataforge.names.startsWith import hep.dataforge.values.asValue -import hep.dataforge.vis.common.getProperty -import hep.dataforge.vis.common.set +import hep.dataforge.vis.getProperty +import hep.dataforge.vis.set import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.VisualObject3D.Companion.GEOMETRY_KEY import hep.dataforge.vis.spatial.demo.VariableBoxThreeFactory.Z_SIZE_KEY diff --git a/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt b/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt index b608d100..8211f4fd 100644 --- a/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt +++ b/demo/spatial-showcase/src/jvmMain/kotlin/hep/dataforge/vis/spatial/demo/FXDemoGrid.kt @@ -6,7 +6,7 @@ import hep.dataforge.meta.buildMeta import hep.dataforge.names.Name import hep.dataforge.output.OutputManager import hep.dataforge.output.Renderer -import hep.dataforge.vis.common.VisualObject +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.fx.FX3DPlugin import hep.dataforge.vis.spatial.fx.FXCanvas3D import hep.dataforge.vis.spatial.specifications.Axes as AxesSpec -- 2.34.1 From d4dcd32b73fa62c159e5fa97ffacdc83fabadde2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 23 Mar 2020 22:19:52 +0300 Subject: [PATCH 04/11] Migration to 1.3.70 --- build.gradle.kts | 1 + dataforge-vis-common/build.gradle.kts | 35 ++-- .../hep/dataforge/vis/AbstractVisualObject.kt | 2 +- .../kotlin/hep/dataforge/vis/valueWidget.kt | 13 +- .../jsMain/kotlin/hep/dataforge/js/react.kt | 17 ++ .../vis/editor/ConfigEditorComponent.kt | 178 ++++++++++++++++++ .../vis/editor/MetaViewerComponent.kt | 81 ++++++++ .../vis/editor/ObjectTreeComponent.kt | 108 +++++++++++ .../hep/dataforge/vis/editor/bootstrap.kt | 12 ++ .../kotlin/hep/dataforge/vis/editor/jsTree.kt | 24 +-- .../dataforge/vis/editor/propertyEditor.kt | 139 ++++++++------ .../src/jsMain/resources/css/common.css | 17 ++ .../hep/dataforge/vis/editor/ValueChooser.kt | 3 +- dataforge-vis-spatial-gdml/build.gradle.kts | 2 +- .../kotlin/hep/dataforge/vis/spatial/Proxy.kt | 1 - .../vis/spatial/three/ThreeCanvas.kt | 6 +- .../vis/spatial/three/ThreeCanvasComponent.kt | 56 ++++++ .../vis/spatial/gdml/demo/GDMLDemoApp.kt | 37 ++-- demo/muon-monitor/build.gradle.kts | 17 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 43 +++-- demo/spatial-showcase/build.gradle.kts | 8 - .../vis/spatial/demo/ThreeDemoApp.kt | 1 - playground/build.gradle.kts | 27 +++ playground/src/jsMain/kotlin/PlayGroundApp.kt | 56 ++++++ .../src/jsMain/resources/css/common.css | 40 ++++ playground/src/jsMain/resources/index.html | 16 ++ settings.gradle.kts | 3 +- 27 files changed, 803 insertions(+), 140 deletions(-) create mode 100644 dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/js/react.kt create mode 100644 dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt create mode 100644 dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt create mode 100644 dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt create mode 100644 dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvasComponent.kt create mode 100644 playground/build.gradle.kts create mode 100644 playground/src/jsMain/kotlin/PlayGroundApp.kt create mode 100644 playground/src/jsMain/resources/css/common.css create mode 100644 playground/src/jsMain/resources/index.html diff --git a/build.gradle.kts b/build.gradle.kts index 82f0e8d5..8d9f1e05 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,7 @@ allprojects { maven("https://dl.bintray.com/pdvrieze/maven") maven("http://maven.jzy3d.org/releases") maven("https://kotlin.bintray.com/js-externals") + maven("https://kotlin.bintray.com/kotlin-js-wrappers/") // maven("https://dl.bintray.com/gbaldeck/kotlin") // maven("https://dl.bintray.com/rjaros/kotlin") } diff --git a/dataforge-vis-common/build.gradle.kts b/dataforge-vis-common/build.gradle.kts index f673dde2..cf2d60c8 100644 --- a/dataforge-vis-common/build.gradle.kts +++ b/dataforge-vis-common/build.gradle.kts @@ -1,5 +1,3 @@ -import scientifik.serialization - plugins { id("scientifik.mpp") } @@ -7,35 +5,44 @@ plugins { val dataforgeVersion: String by rootProject.extra //val kvisionVersion: String by rootProject.extra("2.0.0-M1") -serialization() -val fxVersion: String by rootProject.extra - kotlin { sourceSets { - commonMain{ + commonMain { dependencies { api("hep.dataforge:dataforge-output:$dataforgeVersion") } } - jvmMain{ + jvmMain { dependencies { api("no.tornado:tornadofx:1.7.20") //api("no.tornado:tornadofx-controlsfx:0.1.1") - api("de.jensd:fontawesomefx-fontawesome:4.7.0-11"){ + api("de.jensd:fontawesomefx-fontawesome:4.7.0-11") { exclude(group = "org.openjfx") } - api("de.jensd:fontawesomefx-commons:11.0"){ + api("de.jensd:fontawesomefx-commons:11.0") { exclude(group = "org.openjfx") } } } - jsMain{ + jsMain { dependencies { api("hep.dataforge:dataforge-output-html:$dataforgeVersion") - //api(npm("bootstrap","4.4.1")) - implementation(npm("uri-js","4.2.2")) - implementation(npm("jsoneditor","8.6.1")) - implementation(npm("file-saver")) + + //React, React DOM + Wrappers (chapter 3) + api("org.jetbrains:kotlin-react:16.13.0-pre.94-kotlin-1.3.70") + api("org.jetbrains:kotlin-react-dom:16.13.0-pre.94-kotlin-1.3.70") + api(npm("react", "16.13.0")) + api(npm("react-dom", "16.13.0")) + + //Kotlin Styled (chapter 3) + api("org.jetbrains:kotlin-styled:1.0.0-pre.94-kotlin-1.3.70") + api(npm("styled-components")) + api(npm("inline-style-prefixer")) + + + api(npm("bootstrap","4.3.1")) + //api(npm("jsoneditor", "8.6.1")) + api(npm("file-saver","2.0.2")) } } } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt index e13f6253..47d002d5 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt @@ -68,7 +68,7 @@ abstract class AbstractVisualObject : VisualObject { private var styleCache: Meta? = null /** - * Collect all styles for this object in a laminate + * Collect all styles for this object in a single cached meta */ protected val mergedStyles: Meta get() = styleCache ?: findAllStyles().merge().also { diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt index 809ad4ed..fd0f598d 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt @@ -1,16 +1,21 @@ package hep.dataforge.vis -import hep.dataforge.meta.* +import hep.dataforge.meta.EmptyMeta +import hep.dataforge.meta.Meta import hep.dataforge.meta.descriptors.ValueDescriptor +import hep.dataforge.meta.node import hep.dataforge.meta.scheme.getProperty +import hep.dataforge.meta.scheme.setProperty +import hep.dataforge.meta.string +import hep.dataforge.values.asValue /** * Extension property to access the "widget" key of [ValueDescriptor] */ var ValueDescriptor.widget: Meta - get() = this.config["widget"].node?: EmptyMeta + get() = getProperty("widget").node ?: EmptyMeta set(value) { - config["widget"] = value + setProperty("widget", value) } /** @@ -19,5 +24,5 @@ var ValueDescriptor.widget: Meta var ValueDescriptor.widgetType: String? get() = getProperty("widget.type").string set(value) { - config["widget.type"] = value + setProperty("widget.type", value?.asValue()) } \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/js/react.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/js/react.kt new file mode 100644 index 00000000..2611e7db --- /dev/null +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/js/react.kt @@ -0,0 +1,17 @@ +package hep.dataforge.js + +import react.RComponent +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +fun RComponent<*, *>.initState(init: () -> T): ReadWriteProperty, T> = + object : ReadWriteProperty, T> { + val pair = react.useState(init) + override fun getValue(thisRef: RComponent<*, *>, property: KProperty<*>): T { + return pair.first + } + + override fun setValue(thisRef: RComponent<*, *>, property: KProperty<*>, value: T) { + pair.second(value) + } + } \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt new file mode 100644 index 00000000..800e8090 --- /dev/null +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt @@ -0,0 +1,178 @@ +package hep.dataforge.vis.editor + +import hep.dataforge.js.initState +import hep.dataforge.meta.* +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.meta.descriptors.defaultItem +import hep.dataforge.meta.descriptors.get +import hep.dataforge.names.Name +import hep.dataforge.names.NameToken +import hep.dataforge.names.plus +import hep.dataforge.values.asValue +import kotlinx.html.InputType +import kotlinx.html.classes +import kotlinx.html.js.onChangeFunction +import kotlinx.html.js.onClickFunction +import org.w3c.dom.Element +import react.* +import react.dom.* + +interface ConfigEditorProps : RProps { + /** + * Root config object - always non null + */ + var root: Config + + /** + * Full path to the displayed node in [root]. Could be empty + */ + var name: Name + + /** + * Root default + */ + var default: Meta? + + /** + * Root descriptor + */ + var descriptor: NodeDescriptor? + + var listen: Boolean +} + +class ConfigEditorComponent : RComponent() { + + override fun TreeState.init() { + expanded = false + } + + override fun componentDidMount() { + if (props.listen) { + props.root.onChange(this) { name, _, _ -> + if (name == props.name) { + forceUpdate() + } + } + } + } + + override fun componentWillUnmount() { + props.root.removeListener(this) + } + + override fun RBuilder.render() { + val item = props.root[props.name] + val descriptorItem = props.descriptor?.get(props.name) + val defaultItem = props.default?.get(props.name) + val actualItem = item ?: defaultItem ?: descriptorItem?.defaultItem() + val token = props.name.last() + + div("d-inline-block text-truncate") { + when (actualItem) { + null -> { + } + is MetaItem.ValueItem -> { + i("tree-caret") { } + } + is MetaItem.NodeItem -> { + i("tree-caret fa fa-caret-right") { + attrs { + if (state.expanded) { + classes += "rotate" + } + onClickFunction = { + setState { + expanded = !expanded + } + } + } + } + } + } + label("tree-label") { + +token.toString() + attrs { + if (item == null) { + classes += "tree-label-inactive" + } + } + } + + if (actualItem is MetaItem.NodeItem && state.expanded) { + ul("tree") { + val keys = buildList { + item?.node?.items?.keys?.let { addAll(it) } + defaultItem?.node?.items?.keys?.let { addAll(it) } + (descriptorItem as? NodeDescriptor)?.items?.keys?.forEach { + add(NameToken(it)) + } + } + keys.forEach { token -> + li("tree-item") { + child(ConfigEditorComponent::class) { + attrs { + root = props.root + name = props.name + token + this.default = props.default + this.descriptor = props.descriptor + listen = false + } + } + } + } + } + } else if (actualItem is MetaItem.ValueItem) { + div("row") { + div("col") { + label("tree-label") { + +token.toString() + } + } + div("col") { + input(type = InputType.text) { + attrs { + value = actualItem.value.toString() + onChangeFunction = { + try { + props.root.setValue(props.name, value.asValue()) + } catch (ex: Exception) { + console.error("Can't set config property $name to $value") + } + } + } + } + //+actualItem.value.toString() + } + } + } + } + } + +} + +fun Element.configEditor(config: Config, descriptor: NodeDescriptor? = null, default: Meta? = null) { + render(this) { + child(ConfigEditorComponent::class) { + attrs { + root = config + name = Name.EMPTY + this.descriptor = descriptor + this.default = default + listen = true + } + } + } +} + +fun RBuilder.configEditor(config: Config, descriptor: NodeDescriptor? = null, default: Meta? = null) { + child(ConfigEditorComponent::class) { + attrs { + root = config + name = Name.EMPTY + this.descriptor = descriptor + this.default = default + listen = true + } + } +} diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt new file mode 100644 index 00000000..871d81d1 --- /dev/null +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt @@ -0,0 +1,81 @@ +package hep.dataforge.vis.editor + +import hep.dataforge.js.initState +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.names.NameToken +import kotlinx.html.classes +import kotlinx.html.js.onClickFunction +import react.* +import react.dom.* + +interface MetaViewerProps : RProps { + var name: NameToken + var meta: Meta + var descriptor: NodeDescriptor? +} + +class MetaViewerComponent : RComponent() { + + override fun TreeState.init() { + expanded = false + } + + override fun RBuilder.render() { + div("d-inline-block text-truncate") { + if (props.meta.items.isNotEmpty()) { + span("objTree-caret") { + attrs { + classes = if (state.expanded) { + setOf("objTree-caret", "objTree-caret-down") + } else { + setOf("objTree-caret") + } + onClickFunction = { + setState { + expanded = !expanded + } + } + } + } + } + label("tree-label") { + +props.name.toString() + } + ul("tree") { + props.meta.items.forEach { (token, item) -> + //val descriptor = props. + li { + when (item) { + is MetaItem.NodeItem -> { + child(MetaViewerComponent::class) { + attrs { + name = token + meta = item.node + descriptor = props.descriptor?.nodes?.get(token.body) + } + } + } + is MetaItem.ValueItem -> { + div("row") { + div("col") { + label("tree-label") { + +token.toString() + } + } + div("col") { + label { + +item.value.toString() + } + } + } + } + } + } + } + } + } + } + +} \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt new file mode 100644 index 00000000..102af649 --- /dev/null +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt @@ -0,0 +1,108 @@ +package hep.dataforge.vis.editor + +import hep.dataforge.names.Name +import hep.dataforge.names.plus +import hep.dataforge.vis.VisualGroup +import hep.dataforge.vis.VisualObject +import hep.dataforge.vis.isEmpty +import kotlinx.html.classes +import kotlinx.html.js.onClickFunction +import org.w3c.dom.Element +import react.* +import react.dom.* + +interface ObjectTreeProps : RProps { + var name: Name + var obj: VisualObject + var clickCallback: (Name) -> Unit +} + +interface TreeState : RState { + var expanded: Boolean +} + +class ObjectTreeComponent : RComponent() { + + override fun TreeState.init() { + expanded = false + } + + override fun RBuilder.render() { + val token = props.name.last()?.toString() ?: "World" + val obj = props.obj + + //display as node if any child is visible + if (obj is VisualGroup && obj.children.keys.any { !it.body.startsWith("@") }) { + div("d-inline-block text-truncate") { + span("objTree-caret") { + attrs { + classes = if (state.expanded) { + setOf("objTree-caret", "objTree-caret-down") + } else { + setOf("objTree-caret") + } + onClickFunction = { + setState { + expanded = !expanded + } + } + } + } + label("objTree-label") { + +token + attrs { + onClickFunction = { props.clickCallback(props.name) } + } + } + } + if (state.expanded) { + ul("objTree-subtree") { + obj.children.entries + .filter { !it.key.toString().startsWith("@") } // ignore statics and other hidden children + .sortedBy { (it.value as? VisualGroup)?.isEmpty ?: true } + .forEach { (childToken, child) -> + li { + child(ObjectTreeComponent::class) { + attrs { + name = props.name + childToken + this.obj = child + clickCallback = props.clickCallback + } + } + } + } + } + } + } else { + div("d-inline-block text-truncate") { + span("objTree-leaf") {} + label("objTree-label") { + +token + attrs { + onClickFunction = { props.clickCallback(props.name) } + } + } + } + } + } +} + +fun RBuilder.objectTree( + obj: VisualObject, + clickCallback: (Name) -> Unit = {} +) = child(ObjectTreeComponent::class) { + attrs { + name = Name.EMPTY + this.obj = obj + this.clickCallback = clickCallback + } +} + +fun Element.objectTree( + obj: VisualObject, + clickCallback: (Name) -> Unit = {} +) { + render(this) { + objectTree(obj, clickCallback) + } +} \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt index f002e29c..02149034 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/bootstrap.kt @@ -3,6 +3,10 @@ package hep.dataforge.vis.editor import kotlinx.html.* import kotlinx.html.js.div import org.w3c.dom.HTMLElement +import react.RBuilder +import react.ReactElement +import react.dom.div +import react.dom.h3 inline fun TagConsumer.card(title: String, crossinline block: TagConsumer.() -> Unit) { div("card w-100") { @@ -13,6 +17,14 @@ inline fun TagConsumer.card(title: String, crossinline block: TagCo } } +inline fun RBuilder.card(title: String, crossinline block: RBuilder.() -> Unit): ReactElement = div("card w-100") { + div("card-body") { + h3(classes = "card-title") { +title } + block() + } +} + + fun TagConsumer.accordion(id: String, elements: Map Unit>) { div("container-fluid") { div("accordion") { diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt index 393f1f58..a9c876ae 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/jsTree.kt @@ -13,18 +13,18 @@ import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLSpanElement import kotlin.dom.clear -fun Element.displayObjectTree( - obj: VisualObject, - clickCallback: (Name) -> Unit = {} -) { - clear() - append { - card("Object tree") { - subTree(Name.EMPTY, obj, clickCallback) - } - } -} - +//fun Element.displayObjectTree( +// obj: VisualObject, +// clickCallback: (Name) -> Unit = {} +//) { +// clear() +// append { +// card("Object tree") { +// subTree(Name.EMPTY, obj, clickCallback) +// } +// } +//} +// private fun TagConsumer.subTree( name: Name, obj: VisualObject, diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt index 3af199cf..f3876e58 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt @@ -1,73 +1,102 @@ package hep.dataforge.vis.editor -import hep.dataforge.js.jsObject -import hep.dataforge.meta.DynamicMeta import hep.dataforge.meta.Meta -import hep.dataforge.meta.toJson -import hep.dataforge.meta.update +import hep.dataforge.meta.MetaBuilder import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.vis.VisualObject -import hep.dataforge.vis.findStyle -import kotlinx.html.dom.append -import kotlinx.html.js.* import org.w3c.dom.Element +import react.RBuilder +import react.ReactElement +import react.dom.li +import react.dom.nav +import react.dom.ol +import react.dom.render import kotlin.collections.set -import kotlin.dom.clear -//FIXME something rotten in JS-Meta converter -fun Meta.toDynamic() = JSON.parse(toJson().toString()) +////FIXME something rotten in JS-Meta converter +//fun Meta.toDynamic() = JSON.parse(toJson().toString()) +// +////TODO add node descriptor instead of configuring property selector +//fun Element.displayPropertyEditor( +// name: Name, +// item: VisualObject, +// propertySelector: (VisualObject) -> Meta = { it.config } +//) { +// clear() +// +// append { +// card("Properties") { +// if (!name.isEmpty()) { +// nav { +// attributes["aria-label"] = "breadcrumb" +// ol("breadcrumb") { +// name.tokens.forEach { token -> +// li("breadcrumb-item") { +// +token.toString() +// } +// } +// } +// } +// } +// val dMeta: dynamic = propertySelector(item).toDynamic() +// val options: JSONEditorOptions = jsObject { +// mode = "form" +// onChangeJSON = { item.config.update(DynamicMeta(it.asDynamic())) } +// } +// JSONEditor(div(), options, dMeta) +// } +// +// val styles = item.styles +// if (styles.isNotEmpty()) { +// card("Styles") { +// item.styles.forEach { style -> +// val styleMeta = item.findStyle(style) +// h4("container") { +style } +// if (styleMeta != null) { +// div("container").apply { +// val options: JSONEditorOptions = jsObject { +// mode = "view" +// } +// JSONEditor( +// this, +// options, +// styleMeta.toDynamic() +// ) +// } +// } +// } +// } +// } +// } +//} -//TODO add node descriptor instead of configuring property selector -fun Element.displayPropertyEditor( - name: Name, +fun RBuilder.visualPropertyEditor( + path: Name, item: VisualObject, - propertySelector: (VisualObject) -> Meta = { it.config } -) { - clear() - - append { - card("Properties") { - if (!name.isEmpty()) { - nav { - attributes["aria-label"] = "breadcrumb" - ol("breadcrumb") { - name.tokens.forEach { token -> - li("breadcrumb-item") { - +token.toString() - } - } - } - } + default: MetaBuilder.() -> Unit = {} +): ReactElement = card("Properties") { + if (!path.isEmpty()) { + nav { + attrs { + attributes["aria-label"] = "breadcrumb" } - val dMeta: dynamic = propertySelector(item).toDynamic() - val options: JSONEditorOptions = jsObject { - mode = "form" - onChangeJSON = { item.config.update(DynamicMeta(it.asDynamic())) } - } - JSONEditor(div(), options, dMeta) - } - - val styles = item.styles - if (styles.isNotEmpty()) { - card("Styles") { - item.styles.forEach { style -> - val styleMeta = item.findStyle(style) - h4("container") { +style } - if (styleMeta != null) { - div("container").apply { - val options: JSONEditorOptions = jsObject { - mode = "view" - } - JSONEditor( - this, - options, - styleMeta.toDynamic() - ) - } + ol("breadcrumb") { + path.tokens.forEach { token -> + li("breadcrumb-item") { + +token.toString() } } } } } + configEditor(item.config, item.descriptor, Meta(default)) +} + +fun Element.visualPropertyEditor( + path: Name, + item: VisualObject, + default: MetaBuilder.() -> Unit = {} +) = render(this) { + visualPropertyEditor(path, item, default) } \ No newline at end of file diff --git a/dataforge-vis-common/src/jsMain/resources/css/common.css b/dataforge-vis-common/src/jsMain/resources/css/common.css index c5efcd40..4d1bac9d 100644 --- a/dataforge-vis-common/src/jsMain/resources/css/common.css +++ b/dataforge-vis-common/src/jsMain/resources/css/common.css @@ -21,3 +21,20 @@ ul, .objTree-subtree { .objTree-caret-down::before { transform: rotate(90deg); } + +ul, .tree { + list-style-type: none; +} + +i, .tree-caret{ + display: inline-block; + margin-right: 6px; +} + +.rotate { + transform: rotate(90deg); +} + +.tree-label-inactive { + color: gray; +} diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt index 596c3b29..7c5a0d1e 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt @@ -108,8 +108,7 @@ interface ValueChooser { descriptor: ValueDescriptor? = null, setter: (Value) -> Unit ): ValueChooser { - val chooser = - build(context, descriptor) + val chooser = build(context, descriptor) chooser.setDisplayValue(value.value ?: Null) value.onChange { chooser.setDisplayValue(it ?: Null) diff --git a/dataforge-vis-spatial-gdml/build.gradle.kts b/dataforge-vis-spatial-gdml/build.gradle.kts index c13e2e3f..a2a0bce8 100644 --- a/dataforge-vis-spatial-gdml/build.gradle.kts +++ b/dataforge-vis-spatial-gdml/build.gradle.kts @@ -7,7 +7,7 @@ kotlin { val commonMain by getting { dependencies { api(project(":dataforge-vis-spatial")) - api("scientifik:gdml:0.1.6") + api("scientifik:gdml:0.1.7") } } } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt index 0e962b72..4514a559 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt @@ -11,7 +11,6 @@ import hep.dataforge.names.NameToken import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.vis.* -import hep.dataforge.vis.common.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt index 6e3a9603..4de96ab5 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt @@ -212,4 +212,8 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val canvas: Canv } fun ThreePlugin.output(element: HTMLElement, spec: Canvas = Canvas.empty()): ThreeCanvas = - ThreeCanvas(element, this, spec) \ No newline at end of file + ThreeCanvas(element, this, spec) + +fun ThreePlugin.render(element: HTMLElement, obj: VisualObject3D, spec: Canvas = Canvas.empty()): Unit = + output(element, spec).render(obj) + diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvasComponent.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvasComponent.kt new file mode 100644 index 00000000..01f0a30f --- /dev/null +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvasComponent.kt @@ -0,0 +1,56 @@ +package hep.dataforge.vis.spatial.three + +import hep.dataforge.context.Global +import hep.dataforge.vis.spatial.VisualObject3D +import hep.dataforge.vis.spatial.specifications.Canvas +import kotlinx.html.id +import org.w3c.dom.HTMLElement +import react.RBuilder +import react.RComponent +import react.RProps +import react.RState +import react.dom.div +import kotlin.browser.document +import kotlin.dom.clear + +interface ThreeCanvasProps : RProps { + var obj: VisualObject3D + var canvasId: String + var options: Canvas +} + +class ThreeCanvasComponent : RComponent() { + + private val three: ThreePlugin = Global.plugins.fetch(ThreePlugin) + + override fun componentDidMount() { + val element = document.getElementById(props.canvasId) as? HTMLElement + ?: error("Element with id 'canvas' not found on page") + val output = three.output(element, props.options) + output.render(props.obj) + } + + override fun componentWillUnmount() { + val element = document.getElementById(props.canvasId) as? HTMLElement + ?: error("Element with id 'canvas' not found on page") + element.clear() + } + + override fun RBuilder.render() { + div { + attrs { + id = props.canvasId + } + } + } +} + +fun RBuilder.threeCanvas(object3D: VisualObject3D, id: String = "threeCanvas", options: Canvas.() -> Unit = {}) { + child(ThreeCanvasComponent::class) { + attrs { + this.obj = object3D + this.canvasId = id + this.options = Canvas.invoke(options) + } + } +} \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt index c950bdca..913c5583 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt @@ -9,8 +9,8 @@ import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.vis.VisualGroup import hep.dataforge.vis.VisualObject -import hep.dataforge.vis.editor.displayObjectTree -import hep.dataforge.vis.editor.displayPropertyEditor +import hep.dataforge.vis.editor.objectTree +import hep.dataforge.vis.editor.visualPropertyEditor import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_WIREFRAME_KEY @@ -163,26 +163,35 @@ private class GDMLDemoApp : Application { visual is VisualGroup -> visual[name] ?: return else -> return } - editorElement.displayPropertyEditor(name, child) { item -> - //val descriptorMeta = Material3D.descriptor - val properties = item.allProperties() - val bottom = Meta { - VISIBLE_KEY put (item.visible ?: true) - if (item is VisualObject3D) { - MATERIAL_COLOR_KEY put "#ffffff" - MATERIAL_OPACITY_KEY put 1.0 - MATERIAL_WIREFRAME_KEY put false - } + editorElement.visualPropertyEditor(name, child) { + VISIBLE_KEY put true + if (child is VisualObject3D) { + MATERIAL_COLOR_KEY put "#ffffff" + MATERIAL_OPACITY_KEY put 1.0 + MATERIAL_WIREFRAME_KEY put false } - properties.withBottom(bottom) } +// editorElement.displayPropertyEditor(name, child) { item -> +// //val descriptorMeta = Material3D.descriptor +// +// val properties = item.allProperties() +// val bottom = Meta { +// VISIBLE_KEY put (item.visible ?: true) +// if (item is VisualObject3D) { +// MATERIAL_COLOR_KEY put "#ffffff" +// MATERIAL_OPACITY_KEY put 1.0 +// MATERIAL_WIREFRAME_KEY put false +// } +// } +// properties.withBottom(bottom) +// } } // canvas.clickListener = ::selectElement //tree.visualObjectTree(visual, editor::propertyEditor) - treeElement.displayObjectTree(visual) { treeName -> + treeElement.objectTree(visual) { treeName -> selectElement(treeName) canvas.highlight(treeName) } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index b1f3126b..55f913ce 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -7,7 +7,7 @@ plugins { group = "ru.mipt.npm" -val ktor_version = "1.3.2" +val ktorVersion = "1.3.2" kotlin { @@ -34,23 +34,28 @@ kotlin { jvmMain { dependencies { implementation("org.apache.commons:commons-math3:3.6.1") - implementation("io.ktor:ktor-server-cio:$ktor_version") - implementation("io.ktor:ktor-serialization:$ktor_version") + implementation("io.ktor:ktor-server-cio:$ktorVersion") + implementation("io.ktor:ktor-serialization:$ktorVersion") } } jsMain { dependencies { - implementation("io.ktor:ktor-client-js:$ktor_version") - implementation("io.ktor:ktor-client-serialization-js:$ktor_version") + implementation("io.ktor:ktor-client-js:$ktorVersion") + implementation("io.ktor:ktor-client-serialization-js:$ktorVersion") implementation(npm("text-encoding")) implementation(npm("abort-controller")) + implementation(npm("bufferutil")) + implementation(npm("utf-8-validate")) +// implementation(npm("jquery")) +// implementation(npm("popper.js")) +// implementation(npm("react-is")) } } } } application { - mainClassName = "ru.mipt.npm.muon.monitor.server/MMServerKt" + mainClassName = "ru.mipt.npm.muon.monitor.server.MMServerKt" } //configure { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 19d08623..5a8ef3e6 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -3,15 +3,13 @@ package ru.mipt.npm.muon.monitor import hep.dataforge.context.Global import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.meta.Meta -import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.vis.VisualGroup import hep.dataforge.vis.VisualObject import hep.dataforge.vis.editor.card -import hep.dataforge.vis.editor.displayObjectTree -import hep.dataforge.vis.editor.displayPropertyEditor +import hep.dataforge.vis.editor.objectTree +import hep.dataforge.vis.editor.visualPropertyEditor import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_WIREFRAME_KEY @@ -21,7 +19,6 @@ import hep.dataforge.vis.spatial.VisualObject3D.Companion.VISIBLE_KEY import hep.dataforge.vis.spatial.three.ThreePlugin import hep.dataforge.vis.spatial.three.displayCanvasControls import hep.dataforge.vis.spatial.three.output -import hep.dataforge.vis.spatial.visible import info.laht.threekt.math.Vector3 import io.ktor.client.HttpClient import io.ktor.client.features.json.JsonFeature @@ -66,7 +63,7 @@ private class MMDemoApp : Application { canvas.camera.layers.set(0) canvas.camera.position.z = -2000.0 canvas.camera.position.y = 500.0 - canvas.camera.lookAt(Vector3(0,0,0)) + canvas.camera.lookAt(Vector3(0, 0, 0)) settingsElement.displayCanvasControls(canvas) { card("Events") { button { @@ -94,26 +91,34 @@ private class MMDemoApp : Application { visual is VisualGroup -> visual[name] ?: return else -> return } - editorElement.displayPropertyEditor(name, child) { item -> - //val descriptorMeta = Material3D.descriptor - - val properties = item.allProperties() - val bottom = Meta { - VISIBLE_KEY put (item.visible ?: true) - if (item is VisualObject3D) { - MATERIAL_COLOR_KEY put "#ffffff" - MATERIAL_OPACITY_KEY put 1.0 - MATERIAL_WIREFRAME_KEY put false - } + editorElement.visualPropertyEditor(name, child) { + VISIBLE_KEY put true + if (child is VisualObject3D) { + MATERIAL_COLOR_KEY put "#ffffff" + MATERIAL_OPACITY_KEY put 1.0 + MATERIAL_WIREFRAME_KEY put false } - properties.withBottom(bottom) } +// editorElement.displayPropertyEditor(name, child) { item -> +// //val descriptorMeta = Material3D.descriptor +// +// val properties = item.allProperties() +// val bottom = Meta { +// VISIBLE_KEY put (item.visible ?: true) +// if (item is VisualObject3D) { +// MATERIAL_COLOR_KEY put "#ffffff" +// MATERIAL_OPACITY_KEY put 1.0 +// MATERIAL_WIREFRAME_KEY put false +// } +// } +// properties.withBottom(bottom) +// } } // canvas.clickListener = ::selectElement //tree.visualObjectTree(visual, editor::propertyEditor) - treeElement.displayObjectTree(visual) { name -> + treeElement.objectTree(visual) { name -> selectElement(name) canvas.highlight(name) } diff --git a/demo/spatial-showcase/build.gradle.kts b/demo/spatial-showcase/build.gradle.kts index fef9057c..064f207d 100644 --- a/demo/spatial-showcase/build.gradle.kts +++ b/demo/spatial-showcase/build.gradle.kts @@ -16,14 +16,6 @@ kotlin { withJava() } - js { - browser { - webpackTask { - sourceMaps = false - } - } - } - sourceSets { commonMain { dependencies { diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt index 984a3bcf..c773f7f7 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/ThreeDemoApp.kt @@ -39,7 +39,6 @@ private class ThreeDemoApp : Application { } - override fun dispose() = emptyMap()//mapOf("lines" put presenter.dispose()) } fun main() { diff --git a/playground/build.gradle.kts b/playground/build.gradle.kts new file mode 100644 index 00000000..3ad5ff15 --- /dev/null +++ b/playground/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + kotlin("multiplatform") +} + +repositories{ + jcenter() + maven("https://kotlin.bintray.com/kotlinx") + maven("https://dl.bintray.com/kotlin/kotlin-eap") + maven("https://dl.bintray.com/mipt-npm/dataforge") + maven("https://dl.bintray.com/mipt-npm/scientifik") + maven("https://dl.bintray.com/mipt-npm/dev") +} + +kotlin { + js { + browser {} + } + + sourceSets { + commonMain { + dependencies { + api(project(":dataforge-vis-spatial")) + api(project(":dataforge-vis-spatial-gdml")) + } + } + } +} diff --git a/playground/src/jsMain/kotlin/PlayGroundApp.kt b/playground/src/jsMain/kotlin/PlayGroundApp.kt new file mode 100644 index 00000000..aa0b03d8 --- /dev/null +++ b/playground/src/jsMain/kotlin/PlayGroundApp.kt @@ -0,0 +1,56 @@ +import hep.dataforge.context.Global +import hep.dataforge.js.Application +import hep.dataforge.js.startApplication +import hep.dataforge.names.Name +import hep.dataforge.vis.editor.objectTree +import hep.dataforge.vis.editor.visualPropertyEditor +import hep.dataforge.vis.spatial.Point3D +import hep.dataforge.vis.spatial.VisualGroup3D +import hep.dataforge.vis.spatial.box +import hep.dataforge.vis.spatial.group +import hep.dataforge.vis.spatial.three.ThreePlugin +import hep.dataforge.vis.spatial.three.threeCanvas +import org.w3c.dom.HTMLElement +import react.dom.div +import react.dom.render +import kotlin.browser.document + +private class PlayGroundApp : Application { + + private val three = Global.plugins.fetch(ThreePlugin) + + override fun start(state: Map) { + + val element = + document.getElementById("app") as? HTMLElement ?: error("Element with id 'canvas' not found on page") + + val obj = VisualGroup3D().apply { + box(100, 100, 100) + group { + position = Point3D(120, 0, 0) + box(100, 100, 100) + } + } + + render(element) { + div("row") { + div("col-3") { + objectTree(obj) + } + div("col-6") { + threeCanvas(obj) + } + div("col-3") { + visualPropertyEditor(Name.EMPTY, obj) + } + } + } + + + } + +} + +fun main() { + startApplication(::PlayGroundApp) +} \ No newline at end of file diff --git a/playground/src/jsMain/resources/css/common.css b/playground/src/jsMain/resources/css/common.css new file mode 100644 index 00000000..4d1bac9d --- /dev/null +++ b/playground/src/jsMain/resources/css/common.css @@ -0,0 +1,40 @@ +/* Remove default bullets */ +ul, .objTree-subtree { + list-style-type: none; +} + +/* Style the caret/arrow */ +.objTree-caret { + cursor: pointer; + user-select: none; /* Prevent text selection */ +} + +/* Create the caret/arrow with a unicode, and style it */ +.objTree-caret::before { + content: "\25B6"; + color: black; + display: inline-block; + margin-right: 6px; +} + +/* Rotate the caret/arrow icon when clicked on (using JavaScript) */ +.objTree-caret-down::before { + transform: rotate(90deg); +} + +ul, .tree { + list-style-type: none; +} + +i, .tree-caret{ + display: inline-block; + margin-right: 6px; +} + +.rotate { + transform: rotate(90deg); +} + +.tree-label-inactive { + color: gray; +} diff --git a/playground/src/jsMain/resources/index.html b/playground/src/jsMain/resources/index.html new file mode 100644 index 00000000..c022a175 --- /dev/null +++ b/playground/src/jsMain/resources/index.html @@ -0,0 +1,16 @@ + + + + + Playground + + + + + +
+

Playground

+
+
+ + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 891155fd..b6673c37 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,7 +30,8 @@ include( ":dataforge-vis-spatial-gdml", ":demo:spatial-showcase", ":demo:gdml", - ":demo:muon-monitor" + ":demo:muon-monitor", + ":playground" ) //if(file("../dataforge-core").exists()) { -- 2.34.1 From 67082c9cd3870d2087e0727a646276e851e37bae Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 23 Mar 2020 22:37:02 +0300 Subject: [PATCH 05/11] Migration to 1.3.70 --- .../hep/dataforge/vis/editor/ObjectTreeComponent.kt | 12 +++++++----- .../hep/dataforge/vis/spatial/VisualGroup3D.kt | 6 +++--- playground/src/jsMain/kotlin/PlayGroundApp.kt | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt index 102af649..d41e103f 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt @@ -90,11 +90,13 @@ class ObjectTreeComponent : RComponent() { fun RBuilder.objectTree( obj: VisualObject, clickCallback: (Name) -> Unit = {} -) = child(ObjectTreeComponent::class) { - attrs { - name = Name.EMPTY - this.obj = obj - this.clickCallback = clickCallback +) = card("Object tree") { + child(ObjectTreeComponent::class) { + attrs { + name = Name.EMPTY + this.obj = obj + this.clickCallback = clickCallback + } } } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index aa804fad..7cf0578a 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -124,10 +124,10 @@ inline fun VisualGroup3D.prototypes(builder: VisualGroup3D.() -> Unit): Unit { } /** - * Define a group with given [key], attach it to this parent and return it. + * Define a group with given [name], attach it to this parent and return it. */ -fun VisualGroup3D.group(key: String = "", action: VisualGroup3D.() -> Unit = {}): VisualGroup3D = +fun VisualGroup3D.group(name: String = "", action: VisualGroup3D.() -> Unit = {}): VisualGroup3D = VisualGroup3D().apply(action).also { - set(key, it) + set(name, it) } diff --git a/playground/src/jsMain/kotlin/PlayGroundApp.kt b/playground/src/jsMain/kotlin/PlayGroundApp.kt index aa0b03d8..79efa165 100644 --- a/playground/src/jsMain/kotlin/PlayGroundApp.kt +++ b/playground/src/jsMain/kotlin/PlayGroundApp.kt @@ -25,10 +25,10 @@ private class PlayGroundApp : Application { document.getElementById("app") as? HTMLElement ?: error("Element with id 'canvas' not found on page") val obj = VisualGroup3D().apply { - box(100, 100, 100) - group { + box(100, 100, 100, name = "A") + group("B") { position = Point3D(120, 0, 0) - box(100, 100, 100) + box(100, 100, 100, name = "C") } } -- 2.34.1 From a8f6fa9dc660b40f1d36b242d904facf51f44b48 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 25 Mar 2020 08:52:09 +0300 Subject: [PATCH 06/11] Editors to react --- build.gradle.kts | 2 +- .../kotlin/hep/dataforge/vis/VisualObject.kt | 4 ++- .../vis/editor/ConfigEditorComponent.kt | 20 +++++++++------ .../vis/editor/MetaViewerComponent.kt | 25 +++++++++++-------- .../vis/editor/ObjectTreeComponent.kt | 19 +++++++------- .../dataforge/vis/editor/propertyEditor.kt | 11 +++++--- .../dataforge/vis/spatial/VisualObject3D.kt | 22 ++++++++++++++-- 7 files changed, 69 insertions(+), 34 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8d9f1e05..82e7bc0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import scientifik.fx import scientifik.serialization -val dataforgeVersion by extra("0.1.5") +val dataforgeVersion by extra("0.1.6-dev") plugins { val toolsVersion = "0.4.0" diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt index 8a67c524..ae7abe7f 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt @@ -3,11 +3,13 @@ package hep.dataforge.vis import hep.dataforge.meta.Laminate import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.meta.scheme.Configurable import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.toName import hep.dataforge.provider.Type +import hep.dataforge.values.ValueType import hep.dataforge.vis.VisualObject.Companion.TYPE import kotlinx.serialization.Transient @@ -64,7 +66,7 @@ interface VisualObject : Configurable { const val TYPE = "visual" val STYLE_KEY = "@style".asName() - //const val META_KEY = "@meta" + //const val META_KEY = "@meta" //const val TAGS_KEY = "@tags" } diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt index 800e8090..ff1e797f 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ConfigEditorComponent.kt @@ -1,6 +1,5 @@ package hep.dataforge.vis.editor -import hep.dataforge.js.initState import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.meta.descriptors.defaultItem @@ -14,8 +13,12 @@ import kotlinx.html.classes import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onClickFunction import org.w3c.dom.Element -import react.* +import org.w3c.dom.events.Event +import react.RBuilder +import react.RComponent +import react.RProps import react.dom.* +import react.setState interface ConfigEditorProps : RProps { /** @@ -61,6 +64,13 @@ class ConfigEditorComponent : RComponent() { props.root.removeListener(this) } + private val onClick: (Event) -> Unit = { + setState { + expanded = !expanded + } + } + + override fun RBuilder.render() { val item = props.root[props.name] val descriptorItem = props.descriptor?.get(props.name) @@ -81,11 +91,7 @@ class ConfigEditorComponent : RComponent() { if (state.expanded) { classes += "rotate" } - onClickFunction = { - setState { - expanded = !expanded - } - } + onClickFunction = onClick } } } diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt index 871d81d1..77a2d4b7 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/MetaViewerComponent.kt @@ -1,14 +1,17 @@ package hep.dataforge.vis.editor -import hep.dataforge.js.initState import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaItem import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.names.NameToken import kotlinx.html.classes import kotlinx.html.js.onClickFunction -import react.* +import org.w3c.dom.events.Event +import react.RBuilder +import react.RComponent +import react.RProps import react.dom.* +import react.setState interface MetaViewerProps : RProps { var name: NameToken @@ -22,21 +25,21 @@ class MetaViewerComponent : RComponent() { expanded = false } + private val onClick: (Event) -> Unit = { + setState { + expanded = !expanded + } + } + override fun RBuilder.render() { div("d-inline-block text-truncate") { if (props.meta.items.isNotEmpty()) { span("objTree-caret") { attrs { - classes = if (state.expanded) { - setOf("objTree-caret", "objTree-caret-down") - } else { - setOf("objTree-caret") - } - onClickFunction = { - setState { - expanded = !expanded - } + if (state.expanded) { + classes += "objTree-caret-down" } + onClickFunction = onClick } } } diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt index d41e103f..97047170 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/ObjectTreeComponent.kt @@ -8,6 +8,7 @@ import hep.dataforge.vis.isEmpty import kotlinx.html.classes import kotlinx.html.js.onClickFunction import org.w3c.dom.Element +import org.w3c.dom.events.Event import react.* import react.dom.* @@ -27,6 +28,12 @@ class ObjectTreeComponent : RComponent() { expanded = false } + private val onClick: (Event) -> Unit = { + setState { + expanded = !expanded + } + } + override fun RBuilder.render() { val token = props.name.last()?.toString() ?: "World" val obj = props.obj @@ -36,16 +43,10 @@ class ObjectTreeComponent : RComponent() { div("d-inline-block text-truncate") { span("objTree-caret") { attrs { - classes = if (state.expanded) { - setOf("objTree-caret", "objTree-caret-down") - } else { - setOf("objTree-caret") - } - onClickFunction = { - setState { - expanded = !expanded - } + if (state.expanded) { + classes += "objTree-caret-down" } + onClickFunction = onClick } } label("objTree-label") { diff --git a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt index f3876e58..14891a13 100644 --- a/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt +++ b/dataforge-vis-common/src/jsMain/kotlin/hep/dataforge/vis/editor/propertyEditor.kt @@ -2,6 +2,7 @@ package hep.dataforge.vis.editor import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder +import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.vis.VisualObject @@ -74,8 +75,10 @@ import kotlin.collections.set fun RBuilder.visualPropertyEditor( path: Name, item: VisualObject, + descriptor: NodeDescriptor? = item.descriptor, + title: String = "Properties", default: MetaBuilder.() -> Unit = {} -): ReactElement = card("Properties") { +): ReactElement = card(title) { if (!path.isEmpty()) { nav { attrs { @@ -90,13 +93,15 @@ fun RBuilder.visualPropertyEditor( } } } - configEditor(item.config, item.descriptor, Meta(default)) + configEditor(item.config, descriptor, Meta(default)) } fun Element.visualPropertyEditor( path: Name, item: VisualObject, + descriptor: NodeDescriptor? = item.descriptor, + title: String = "Properties", default: MetaBuilder.() -> Unit = {} ) = render(this) { - visualPropertyEditor(path, item, default) + visualPropertyEditor(path, item, descriptor, title, default) } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt index f42574d6..7320cce8 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt @@ -3,10 +3,13 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.* +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.meta.scheme.node import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.output.Renderer +import hep.dataforge.values.ValueType import hep.dataforge.values.asValue import hep.dataforge.vis.VisualObject import hep.dataforge.vis.spatial.VisualObject3D.Companion.DETAIL_KEY @@ -26,7 +29,8 @@ interface VisualObject3D : VisualObject { companion object { val VISIBLE_KEY = "visible".asName() -// val SELECTED_KEY = "selected".asName() + + // val SELECTED_KEY = "selected".asName() val DETAIL_KEY = "detail".asName() val LAYER_KEY = "layer".asName() val IGNORE_KEY = "ignore".asName() @@ -56,6 +60,20 @@ interface VisualObject3D : VisualObject { val xScale = scale + x val yScale = scale + y val zScale = scale + z + + val descriptor = NodeDescriptor { + defineValue(VISIBLE_KEY) { + type(ValueType.BOOLEAN) + default(true) + } + + defineItem(Material3D.MATERIAL_KEY, Material3D.descriptor) + +// Material3D.MATERIAL_COLOR_KEY put "#ffffff" +// Material3D.MATERIAL_OPACITY_KEY put 1.0 +// Material3D.MATERIAL_WIREFRAME_KEY put false + + } } } @@ -106,7 +124,7 @@ var VisualObject.visible: Boolean? * Property is not inherited. */ var VisualObject.ignore: Boolean? - get() = getProperty(IGNORE_KEY,false).boolean + get() = getProperty(IGNORE_KEY, false).boolean set(value) = setProperty(IGNORE_KEY, value?.asValue()) //var VisualObject.selected: Boolean? -- 2.34.1 From 54c42a6a56911a804a460e54e9eb4507db0deeff Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 10 Apr 2020 19:25:52 +0300 Subject: [PATCH 07/11] DF to 0.1.7 --- build.gradle.kts | 6 +-- .../hep/dataforge/vis/AbstractVisualObject.kt | 1 - .../kotlin/hep/dataforge/vis/VisualObject.kt | 6 +-- .../kotlin/hep/dataforge/vis/valueWidget.kt | 9 +--- .../kotlin/hep/dataforge/vis/FXPlugin.kt | 3 +- .../kotlin/hep/dataforge/vis/editor/FXMeta.kt | 8 ++-- .../hep/dataforge/vis/editor/ValueChooser.kt | 3 +- .../vis/spatial/gdml/TestConvertor.kt | 2 +- .../dataforge/vis/spatial/GeometryBuilder.kt | 5 +-- .../hep/dataforge/vis/spatial/Material3D.kt | 41 +++++++++---------- .../hep/dataforge/vis/spatial/PolyLine.kt | 2 +- .../hep/dataforge/vis/spatial/Visual3D.kt | 6 +-- .../dataforge/vis/spatial/VisualObject3D.kt | 18 ++++---- .../vis/spatial/specifications/Axes.kt | 6 +-- .../vis/spatial/specifications/Camera.kt | 8 ++-- .../vis/spatial/specifications/Canvas.kt | 8 ++-- .../vis/spatial/specifications/Controls.kt | 4 +- .../vis/spatial/three/ThreeCanvas.kt | 2 +- .../vis/spatial/gdml/GDMLVisualTest.kt | 2 +- .../vis/spatial/gdml/demo/readFile.kt | 2 +- .../vis/spatial/FileSerializationTest.kt | 2 +- demo/muon-monitor/build.gradle.kts | 1 + .../ru/mipt/npm/muon/monitor/GeometryTest.kt | 3 +- .../hep/dataforge/vis/spatial/demo/demo.kt | 2 +- .../dataforge/vis/spatial/demo/VariableBox.kt | 2 +- 25 files changed, 66 insertions(+), 86 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 82e7bc0c..b7ee4ffd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,10 @@ import scientifik.fx import scientifik.serialization -val dataforgeVersion by extra("0.1.6-dev") +val dataforgeVersion by extra("0.1.7") plugins { - val toolsVersion = "0.4.0" + val toolsVersion = "0.4.2" id("scientifik.mpp") version toolsVersion apply false id("scientifik.jvm") version toolsVersion apply false id("scientifik.js") version toolsVersion apply false @@ -24,7 +24,7 @@ allprojects { } group = "hep.dataforge" - version = "0.1.2-dev" + version = "0.1.3-dev" } val githubProject by extra("dataforge-vis") diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt index 47d002d5..cadac217 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt @@ -1,7 +1,6 @@ package hep.dataforge.vis import hep.dataforge.meta.* -import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.values.Value diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt index ae7abe7f..fc47ff10 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt @@ -1,15 +1,13 @@ package hep.dataforge.vis +import hep.dataforge.meta.Configurable import hep.dataforge.meta.Laminate import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaItem -import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.meta.scheme.Configurable import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.toName import hep.dataforge.provider.Type -import hep.dataforge.values.ValueType import hep.dataforge.vis.VisualObject.Companion.TYPE import kotlinx.serialization.Transient @@ -66,7 +64,7 @@ interface VisualObject : Configurable { const val TYPE = "visual" val STYLE_KEY = "@style".asName() - //const val META_KEY = "@meta" + //const val META_KEY = "@meta" //const val TAGS_KEY = "@tags" } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt index fd0f598d..80e44a35 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/valueWidget.kt @@ -1,19 +1,14 @@ package hep.dataforge.vis -import hep.dataforge.meta.EmptyMeta -import hep.dataforge.meta.Meta +import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.ValueDescriptor -import hep.dataforge.meta.node -import hep.dataforge.meta.scheme.getProperty -import hep.dataforge.meta.scheme.setProperty -import hep.dataforge.meta.string import hep.dataforge.values.asValue /** * Extension property to access the "widget" key of [ValueDescriptor] */ var ValueDescriptor.widget: Meta - get() = getProperty("widget").node ?: EmptyMeta + get() = getProperty("widget").node ?: Meta.EMPTY set(value) { setProperty("widget", value) } diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt index dcd5795c..ca5a7c24 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/FXPlugin.kt @@ -1,7 +1,6 @@ package hep.dataforge.vis import hep.dataforge.context.* -import hep.dataforge.meta.EmptyMeta import hep.dataforge.meta.Meta import hep.dataforge.meta.boolean import javafx.application.Application @@ -20,7 +19,7 @@ import kotlin.reflect.KClass /** * Plugin holding JavaFX application instance and its root stage */ -class FXPlugin(meta: Meta = EmptyMeta) : AbstractPlugin(meta) { +class FXPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(meta) { override val tag: PluginTag get() = Companion.tag private val stages: ObservableSet = FXCollections.observableSet() diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt index 10fe2ee3..e4ed11a8 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/FXMeta.kt @@ -174,10 +174,10 @@ private fun > M.createEmptyNode(token: NameToken, append: Boo val name = token.asName() val index = (getIndexed(name).keys.mapNotNull { it.toIntOrNull() }.max() ?: -1) + 1 val newName = name.withIndex(index.toString()) - set(newName, EmptyMeta) + set(newName, Meta.EMPTY) get(newName).node!! } else { - this.setNode(token.asName(), EmptyMeta) + this.setNode(token.asName(), Meta.EMPTY) //FIXME possible concurrency bug get(token).node!! } @@ -211,9 +211,9 @@ fun > FXMetaNode.addValue(key: String) { fun > FXMetaNode.addNode(key: String) { val parent = getOrCreateNode() if (descriptor?.multiple == true) { - parent.append(key, EmptyMeta) + parent.append(key, Meta.EMPTY) } else { - parent[key] = EmptyMeta + parent[key] = Meta.EMPTY } } diff --git a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt index 7c5a0d1e..56794fcb 100644 --- a/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt +++ b/dataforge-vis-common/src/jvmMain/kotlin/hep/dataforge/vis/editor/ValueChooser.kt @@ -7,7 +7,6 @@ package hep.dataforge.vis.editor import hep.dataforge.context.Context import hep.dataforge.context.Named -import hep.dataforge.meta.EmptyMeta import hep.dataforge.meta.Meta import hep.dataforge.meta.descriptors.ValueDescriptor import hep.dataforge.names.toName @@ -66,7 +65,7 @@ interface ValueChooser { @Type("hep.dataforge.vis.fx.valueChooserFactory") interface Factory : Named { - operator fun invoke(meta: Meta = EmptyMeta): ValueChooser + operator fun invoke(meta: Meta = Meta.EMPTY): ValueChooser } companion object { diff --git a/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt b/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt index f9cad99c..bdb48d7e 100644 --- a/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt +++ b/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial.gdml import nl.adaptivity.xmlutil.StAXReader -import org.junit.Test +import org.junit.jupiter.api.Test import scientifik.gdml.GDML import java.io.File import java.net.URL diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/GeometryBuilder.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/GeometryBuilder.kt index efc623d9..f189a007 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/GeometryBuilder.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/GeometryBuilder.kt @@ -1,6 +1,5 @@ package hep.dataforge.vis.spatial -import hep.dataforge.meta.EmptyMeta import hep.dataforge.meta.Meta /** @@ -14,7 +13,7 @@ interface GeometryBuilder { * @param normal optional external normal to the face * @param meta optional additional platform-specific parameters like color or texture index */ - fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D? = null, meta: Meta = EmptyMeta) + fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D? = null, meta: Meta = Meta.EMPTY) fun build(): T } @@ -25,7 +24,7 @@ fun GeometryBuilder<*>.face4( vertex3: Point3D, vertex4: Point3D, normal: Point3D? = null, - meta: Meta = EmptyMeta + meta: Meta = Meta.EMPTY ) { face(vertex1, vertex2, vertex3, normal, meta) face(vertex1, vertex3, vertex4, normal, meta) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt index 98ffe8b5..5e16fadf 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Material3D.kt @@ -1,11 +1,7 @@ package hep.dataforge.vis.spatial +import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.meta.double -import hep.dataforge.meta.get -import hep.dataforge.meta.node -import hep.dataforge.meta.scheme.* -import hep.dataforge.meta.set import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.values.ValueType @@ -48,23 +44,26 @@ class Material3D : Scheme() { internal val WIREFRAME_KEY = "wireframe".asName() val MATERIAL_WIREFRAME_KEY = MATERIAL_KEY + WIREFRAME_KEY - val descriptor = NodeDescriptor { - defineValue(VisualObject3D.VISIBLE_KEY) { - type(ValueType.BOOLEAN) - default(true) - } - defineNode(MATERIAL_KEY) { - defineValue(COLOR_KEY) { - type(ValueType.STRING, ValueType.NUMBER) - default("#ffffff") - } - defineValue(OPACITY_KEY) { - type(ValueType.NUMBER) - default(1.0) - } - defineValue(WIREFRAME_KEY) { + val descriptor by lazy { + //must be lazy to avoid initialization bug + NodeDescriptor { + defineValue(VisualObject3D.VISIBLE_KEY) { type(ValueType.BOOLEAN) - default(false) + default(true) + } + defineNode(MATERIAL_KEY) { + defineValue(COLOR_KEY) { + type(ValueType.STRING, ValueType.NUMBER) + default("#ffffff") + } + defineValue(OPACITY_KEY) { + type(ValueType.NUMBER) + default(1.0) + } + defineValue(WIREFRAME_KEY) { + type(ValueType.BOOLEAN) + default(false) + } } } } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt index 01176f46..b9f67f51 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt @@ -3,7 +3,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config -import hep.dataforge.meta.scheme.number +import hep.dataforge.meta.number import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.vis.AbstractVisualObject diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt index 22b8ea74..26cb67c5 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt @@ -4,11 +4,7 @@ import hep.dataforge.context.AbstractPlugin import hep.dataforge.context.Context import hep.dataforge.context.PluginFactory import hep.dataforge.context.PluginTag -import hep.dataforge.meta.Meta -import hep.dataforge.meta.float -import hep.dataforge.meta.get -import hep.dataforge.meta.node -import hep.dataforge.meta.scheme.configure +import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.toName import hep.dataforge.vis.Visual diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt index 7320cce8..463326f4 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualObject3D.kt @@ -4,8 +4,6 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.meta.scheme.node -import hep.dataforge.meta.scheme.setProperty import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.output.Renderer @@ -61,18 +59,20 @@ interface VisualObject3D : VisualObject { val yScale = scale + y val zScale = scale + z - val descriptor = NodeDescriptor { - defineValue(VISIBLE_KEY) { - type(ValueType.BOOLEAN) - default(true) - } + val descriptor by lazy { + NodeDescriptor { + defineValue(VISIBLE_KEY) { + type(ValueType.BOOLEAN) + default(true) + } - defineItem(Material3D.MATERIAL_KEY, Material3D.descriptor) + defineItem(Material3D.MATERIAL_KEY.toString(), Material3D.descriptor) // Material3D.MATERIAL_COLOR_KEY put "#ffffff" // Material3D.MATERIAL_OPACITY_KEY put 1.0 // Material3D.MATERIAL_WIREFRAME_KEY put false + } } } } @@ -86,7 +86,7 @@ var VisualObject3D.layer: Int setProperty(LAYER_KEY, value.asValue()) } -fun Renderer.render(meta: Meta = EmptyMeta, action: VisualGroup3D.() -> Unit) = +fun Renderer.render(meta: Meta = Meta.EMPTY, action: VisualGroup3D.() -> Unit) = render(VisualGroup3D().apply(action), meta) // Common properties diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt index cda776c1..eace3211 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Axes.kt @@ -1,10 +1,6 @@ package hep.dataforge.vis.spatial.specifications -import hep.dataforge.meta.isEmpty -import hep.dataforge.meta.scheme.Scheme -import hep.dataforge.meta.scheme.SchemeSpec -import hep.dataforge.meta.scheme.boolean -import hep.dataforge.meta.scheme.double +import hep.dataforge.meta.* class Axes : Scheme() { var visible by boolean(!config.isEmpty()) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt index fc131b4a..0ff4534b 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Camera.kt @@ -1,9 +1,9 @@ package hep.dataforge.vis.spatial.specifications -import hep.dataforge.meta.scheme.Scheme -import hep.dataforge.meta.scheme.SchemeSpec -import hep.dataforge.meta.scheme.double -import hep.dataforge.meta.scheme.int +import hep.dataforge.meta.Scheme +import hep.dataforge.meta.SchemeSpec +import hep.dataforge.meta.double +import hep.dataforge.meta.int import kotlin.math.PI class Camera : Scheme() { diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt index a10b3186..ba762d9a 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Canvas.kt @@ -1,9 +1,9 @@ package hep.dataforge.vis.spatial.specifications -import hep.dataforge.meta.scheme.Scheme -import hep.dataforge.meta.scheme.SchemeSpec -import hep.dataforge.meta.scheme.int -import hep.dataforge.meta.scheme.spec +import hep.dataforge.meta.Scheme +import hep.dataforge.meta.SchemeSpec +import hep.dataforge.meta.int +import hep.dataforge.meta.spec class Canvas : Scheme() { var axes by spec(Axes, Axes.empty()) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt index 7d142b67..6b7de59c 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/specifications/Controls.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial.specifications -import hep.dataforge.meta.scheme.Scheme -import hep.dataforge.meta.scheme.SchemeSpec +import hep.dataforge.meta.Scheme +import hep.dataforge.meta.SchemeSpec class Controls : Scheme() { diff --git a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt index 4de96ab5..71227c19 100644 --- a/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt +++ b/dataforge-vis-spatial/src/jsMain/kotlin/hep/dataforge/vis/spatial/three/ThreeCanvas.kt @@ -2,7 +2,7 @@ package hep.dataforge.vis.spatial.three import hep.dataforge.context.Context import hep.dataforge.meta.Meta -import hep.dataforge.meta.scheme.getProperty +import hep.dataforge.meta.getProperty import hep.dataforge.meta.string import hep.dataforge.names.Name import hep.dataforge.names.plus diff --git a/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt b/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt index cab81846..5b6b1231 100644 --- a/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt +++ b/demo/gdml/src/commonTest/kotlin/hep/dataforge/vis/spatial/gdml/GDMLVisualTest.kt @@ -1,6 +1,6 @@ package hep.dataforge.vis.spatial.gdml -import hep.dataforge.meta.scheme.setProperty +import hep.dataforge.meta.setProperty import hep.dataforge.meta.string import hep.dataforge.names.toName import hep.dataforge.values.asValue diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt index c89b1857..cfac3a21 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt @@ -1,6 +1,6 @@ package hep.dataforge.vis.spatial.gdml.demo -import hep.dataforge.meta.scheme.setProperty +import hep.dataforge.meta.setProperty import hep.dataforge.values.asValue import hep.dataforge.vis.spatial.Material3D import hep.dataforge.vis.spatial.Visual3D diff --git a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt index 273c25ba..b0a7ae7f 100644 --- a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt +++ b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.names.asName -import org.junit.Test +import org.junit.jupiter.api.Test import kotlin.test.Ignore class FileSerializationTest { diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 55f913ce..c5692be4 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -46,6 +46,7 @@ kotlin { implementation(npm("abort-controller")) implementation(npm("bufferutil")) implementation(npm("utf-8-validate")) + implementation(npm("fs")) // implementation(npm("jquery")) // implementation(npm("popper.js")) // implementation(npm("react-is")) diff --git a/demo/muon-monitor/src/jvmTest/kotlin/ru/mipt/npm/muon/monitor/GeometryTest.kt b/demo/muon-monitor/src/jvmTest/kotlin/ru/mipt/npm/muon/monitor/GeometryTest.kt index 7c718e23..6e1ec106 100644 --- a/demo/muon-monitor/src/jvmTest/kotlin/ru/mipt/npm/muon/monitor/GeometryTest.kt +++ b/demo/muon-monitor/src/jvmTest/kotlin/ru/mipt/npm/muon/monitor/GeometryTest.kt @@ -1,7 +1,6 @@ package ru.mipt.npm.muon.monitor -import org.junit.Test -import kotlin.test.assertTrue +import kotlin.test.* class GeometryTest { diff --git a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt index ac716e82..836e6c2e 100644 --- a/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt +++ b/demo/spatial-showcase/src/commonMain/kotlin/hep/dataforge/vis/spatial/demo/demo.kt @@ -1,7 +1,7 @@ package hep.dataforge.vis.spatial.demo import hep.dataforge.meta.Meta -import hep.dataforge.meta.scheme.invoke +import hep.dataforge.meta.invoke import hep.dataforge.names.toName import hep.dataforge.output.OutputManager import hep.dataforge.vis.Colors diff --git a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt index 4dd23ac5..b18ca2aa 100644 --- a/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt +++ b/demo/spatial-showcase/src/jsMain/kotlin/hep/dataforge/vis/spatial/demo/VariableBox.kt @@ -4,7 +4,7 @@ package hep.dataforge.vis.spatial.demo import hep.dataforge.meta.int import hep.dataforge.meta.number -import hep.dataforge.meta.scheme.setProperty +import hep.dataforge.meta.setProperty import hep.dataforge.names.plus import hep.dataforge.names.startsWith import hep.dataforge.values.asValue -- 2.34.1 From e19ec02ff3e5cba24393f8dd60a81ef0f28588e2 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 11 Apr 2020 21:28:52 +0300 Subject: [PATCH 08/11] Finalize serialization refactoring --- .../hep/dataforge/vis/AbstractVisualGroup.kt | 38 +- .../hep/dataforge/vis/AbstractVisualObject.kt | 2 +- .../kotlin/hep/dataforge/vis/StyleSheet.kt | 21 +- .../kotlin/hep/dataforge/vis/VisualObject.kt | 2 +- .../vis/spatial/gdml/GDMLTransformer.kt | 11 +- .../vis/spatial/gdml/generateSchema.kt | 3 +- .../vis/spatial/gdml/TestConvertor.kt | 40 +- .../src/jvmTest/resources/gdml/BM@N.gdml | 5601 +++++++++++++++++ .../src/jvmTest/resources/gdml/cubes.gdml | 254 + .../kotlin/hep/dataforge/vis/spatial/Box.kt | 7 +- .../hep/dataforge/vis/spatial/Composite.kt | 26 +- .../hep/dataforge/vis/spatial/ConeSegment.kt | 5 +- .../hep/dataforge/vis/spatial/Convex.kt | 3 +- .../hep/dataforge/vis/spatial/Extruded.kt | 3 +- .../hep/dataforge/vis/spatial/Label3D.kt | 3 +- .../hep/dataforge/vis/spatial/PolyLine.kt | 3 +- .../kotlin/hep/dataforge/vis/spatial/Proxy.kt | 18 +- .../hep/dataforge/vis/spatial/Sphere.kt | 3 +- .../kotlin/hep/dataforge/vis/spatial/Tube.kt | 3 +- .../dataforge/vis/spatial/VisualGroup3D.kt | 118 +- .../dataforge/vis/spatial/serialization.kt | 25 + .../dataforge/vis/spatial/transform/UnRef.kt | 1 - .../vis/spatial/SerializationTest.kt | 20 +- .../vis/spatial/gdml/demo/GDMLDemoApp.kt | 5 +- .../vis/spatial/gdml/demo/readFile.kt | 6 +- .../vis/spatial/FileSerializationTest.kt | 2 +- 26 files changed, 6086 insertions(+), 137 deletions(-) create mode 100644 dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/BM@N.gdml create mode 100644 dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/cubes.gdml diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt index 7ae5fb44..aa31387b 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt @@ -74,12 +74,41 @@ abstract class AbstractVisualGroup : AbstractVisualObject(), * Add a static child. Statics could not be found by name, removed or replaced */ protected open fun addStatic(child: VisualObject) = - setChild(NameToken("@static(${child.hashCode()})"), child) + set(NameToken("@static(${child.hashCode()})").asName(), child) + + protected abstract fun createGroup(): AbstractVisualGroup + + /** + * Set this node as parent for given node + */ + protected fun attach(child: VisualObject) { + if (child.parent == null) { + child.parent = this + } else if (child.parent !== this) { + error("Can't reassign existing parent for $child") + } + } /** * Recursively create a child group */ - protected abstract fun createGroup(name: Name): MutableVisualGroup + private fun createGroups(name: Name): AbstractVisualGroup { + return when { + name.isEmpty() -> error("Should be unreachable") + name.length == 1 -> { + val token = name.first()!! + when (val current = children[token]) { + null -> createGroup().also { child -> + attach(child) + setChild(token, child) + } + is AbstractVisualGroup -> current + else -> error("Can't create group with name $name because it exists and not a group") + } + } + else -> createGroups(name.first()!!.asName()).createGroups(name.cutFirst()) + } + } /** * Add named or unnamed child to the group. If key is null the child is considered unnamed. Both key and value are not @@ -97,16 +126,17 @@ abstract class AbstractVisualGroup : AbstractVisualObject(), if (child == null) { removeChild(token) } else { + attach(child) setChild(token, child) } } else -> { //TODO add safety check - val parent = (get(name.cutLast()) as? MutableVisualGroup) ?: createGroup(name.cutLast()) + val parent = (get(name.cutLast()) as? MutableVisualGroup) ?: createGroups(name.cutLast()) parent[name.last()!!.asName()] = child } } - structureChangeListeners.forEach { it.callback(name, child) } + childrenChanged(name, child) } } \ No newline at end of file diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt index cadac217..e355fa94 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualObject.kt @@ -15,7 +15,7 @@ internal data class PropertyListener( abstract class AbstractVisualObject : VisualObject { @Transient - override var parent: VisualObject? = null + override var parent: VisualGroup? = null protected abstract var properties: Config? diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt index be82d8c6..b244c410 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/StyleSheet.kt @@ -6,12 +6,14 @@ import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.asName import kotlinx.serialization.* +import kotlinx.serialization.builtins.MapSerializer +import kotlinx.serialization.builtins.serializer /** * A container for styles */ @Serializable -class StyleSheet() { +class StyleSheet private constructor(private val styleMap: MutableMap = LinkedHashMap()) { @Transient internal var owner: VisualObject? = null @@ -19,12 +21,10 @@ class StyleSheet() { this.owner = owner } - private val styleMap = HashMap() - val items: Map get() = styleMap operator fun get(key: String): Meta? { - return styleMap[key] ?: (owner?.parent as? VisualGroup)?.styleSheet?.get(key) + return styleMap[key] ?: owner?.parent?.styleSheet?.get(key) } /** @@ -49,16 +49,19 @@ class StyleSheet() { set(key, newStyle.seal()) } - companion object: KSerializer{ - override val descriptor: SerialDescriptor - get() = TODO("Not yet implemented") + @Serializer(StyleSheet::class) + companion object : KSerializer { + private val mapSerializer = MapSerializer(String.serializer(), MetaSerializer) + override val descriptor: SerialDescriptor get() = mapSerializer.descriptor + override fun deserialize(decoder: Decoder): StyleSheet { - TODO("Not yet implemented") + val map = mapSerializer.deserialize(decoder) + return StyleSheet(map as? MutableMap ?: LinkedHashMap(map)) } override fun serialize(encoder: Encoder, value: StyleSheet) { - TODO("Not yet implemented") + mapSerializer.serialize(encoder, value.items) } } diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt index fc47ff10..e5028b21 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt @@ -24,7 +24,7 @@ interface VisualObject : Configurable { * The parent object of this one. If null, this one is a root. */ @Transient - var parent: VisualObject? + var parent: VisualGroup? /** * All properties including styles and prototypes if present, but without inheritance diff --git a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt index 3fdc1946..1ee32597 100644 --- a/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt +++ b/dataforge-vis-spatial-gdml/src/commonMain/kotlin/hep/dataforge/vis/spatial/gdml/GDMLTransformer.kt @@ -3,10 +3,11 @@ package hep.dataforge.vis.spatial.gdml import hep.dataforge.meta.Meta import hep.dataforge.meta.MetaBuilder import hep.dataforge.names.Name +import hep.dataforge.names.asName import hep.dataforge.names.toName -import hep.dataforge.vis.useStyle import hep.dataforge.vis.spatial.* import hep.dataforge.vis.spatial.Material3D.Companion.MATERIAL_COLOR_KEY +import hep.dataforge.vis.useStyle import scientifik.gdml.* import kotlin.random.Random @@ -68,7 +69,13 @@ class GDMLTransformer(val root: GDML) { var onFinish: GDMLTransformer.() -> Unit = {} internal fun finalize(final: VisualGroup3D): VisualGroup3D { - final.prototypes = proto + //final.prototypes = proto + final.prototypes { + proto.children.forEach { (token, item) -> + item.parent = null + set(token.asName(), item) + } + } styleCache.forEach { final.styleSheet { define(it.key.toString(), it.value) diff --git a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt b/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt index 857cc4e6..b9d4fc48 100644 --- a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt +++ b/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt @@ -1,5 +1,6 @@ package hep.dataforge.vis.spatial.gdml +import hep.dataforge.meta.JSON_PRETTY import hep.dataforge.meta.Meta import hep.dataforge.vis.spatial.* import kotlinx.serialization.* @@ -157,7 +158,7 @@ fun main() { } println( - Json.indented.stringify( + JSON_PRETTY.stringify( JsonObjectSerializer, json { "definitions" to definitions diff --git a/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt b/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt index bdb48d7e..8d62967b 100644 --- a/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt +++ b/dataforge-vis-spatial-gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/gdml/TestConvertor.kt @@ -1,43 +1,29 @@ package hep.dataforge.vis.spatial.gdml +import hep.dataforge.vis.spatial.stringify import nl.adaptivity.xmlutil.StAXReader import org.junit.jupiter.api.Test import scientifik.gdml.GDML -import java.io.File -import java.net.URL -import kotlin.test.Ignore class TestConvertor { @Test - @Ignore fun testBMNGeometry() { - val url = URL("https://drive.google.com/open?id=1w5e7fILMN83JGgB8WANJUYm8OW2s0WVO") - val file = File("D:\\Work\\Projects\\gdml.kt\\gdml-source\\BM@N.gdml") - val stream = if (file.exists()) { - file.inputStream() - } else { - url.openStream() - } - - val xmlReader = StAXReader(stream, "UTF-8") - val xml = GDML.format.parse(GDML.serializer(), xmlReader) - xml.toVisual() - } - - @Test - @Ignore - fun testCubes() { - val file = File("D:\\Work\\Projects\\gdml.kt\\gdml-source\\cubes.gdml ") - val stream = if (file.exists()) { - file.inputStream() - } else { - return - } + val stream = javaClass.getResourceAsStream("/gdml/BM@N.gdml") val xmlReader = StAXReader(stream, "UTF-8") val xml = GDML.format.parse(GDML.serializer(), xmlReader) val visual = xml.toVisual() - println(visual) + println(visual.stringify()) + } + + @Test + fun testCubes() { + val stream = javaClass.getResourceAsStream("/gdml/cubes.gdml") + + val xmlReader = StAXReader(stream, "UTF-8") + val xml = GDML.format.parse(GDML.serializer(), xmlReader) + val visual = xml.toVisual() + // println(visual) } } \ No newline at end of file diff --git a/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/BM@N.gdml b/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/BM@N.gdml new file mode 100644 index 00000000..7336adf4 --- /dev/null +++ b/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/BM@N.gdml @@ -0,0 +1,5601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/cubes.gdml b/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/cubes.gdml new file mode 100644 index 00000000..bd656261 --- /dev/null +++ b/dataforge-vis-spatial-gdml/src/jvmTest/resources/gdml/cubes.gdml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt index 47610f06..58b10756 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Box.kt @@ -6,10 +6,7 @@ import hep.dataforge.meta.Config import hep.dataforge.meta.Meta import hep.dataforge.meta.float import hep.dataforge.meta.get -import hep.dataforge.vis.AbstractVisualObject -import hep.dataforge.vis.VisualFactory -import hep.dataforge.vis.VisualObject -import hep.dataforge.vis.set +import hep.dataforge.vis.* import hep.dataforge.vis.spatial.Box.Companion.TYPE_NAME import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -67,7 +64,7 @@ class Box( } } -inline fun VisualGroup3D.box( +inline fun MutableVisualGroup.box( xSize: Number, ySize: Number, zSize: Number, diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt index 55c8f227..a41cb12c 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Composite.kt @@ -4,8 +4,8 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.meta.update -import hep.dataforge.vis.AbstractVisualObject -import hep.dataforge.vis.set +import hep.dataforge.names.NameToken +import hep.dataforge.vis.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers @@ -22,7 +22,7 @@ class Composite( val compositeType: CompositeType, val first: VisualObject3D, val second: VisualObject3D -) : AbstractVisualObject(), VisualObject3D { +) : AbstractVisualObject(), VisualObject3D, VisualGroup { init { first.parent = this @@ -34,9 +34,15 @@ class Composite( override var scale: Point3D? = null override var properties: Config? = null + + override val children: Map + get() = mapOf(NameToken("first") to first, NameToken("second") to second) + + override val styleSheet: StyleSheet? + get() = null } -inline fun VisualGroup3D.composite( +inline fun MutableVisualGroup.composite( type: CompositeType, name: String = "", builder: VisualGroup3D.() -> Unit @@ -48,24 +54,24 @@ inline fun VisualGroup3D.composite( it.config.update(group.config) //it.material = group.material - if(group.position!=null) { + if (group.position != null) { it.position = group.position } - if(group.rotation!=null) { + if (group.rotation != null) { it.rotation = group.rotation } - if(group.scale!=null) { + if (group.scale != null) { it.scale = group.scale } set(name, it) } } -fun VisualGroup3D.union(name: String = "", builder: VisualGroup3D.() -> Unit) = +inline fun MutableVisualGroup.union(name: String = "", builder: VisualGroup3D.() -> Unit) = composite(CompositeType.UNION, name, builder = builder) -fun VisualGroup3D.subtract(name: String = "", builder: VisualGroup3D.() -> Unit) = +inline fun MutableVisualGroup.subtract(name: String = "", builder: VisualGroup3D.() -> Unit) = composite(CompositeType.SUBTRACT, name, builder = builder) -fun VisualGroup3D.intersect(name: String = "", builder: VisualGroup3D.() -> Unit) = +inline fun MutableVisualGroup.intersect(name: String = "", builder: VisualGroup3D.() -> Unit) = composite(CompositeType.INTERSECT, name, builder = builder) \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt index e4a99c96..6ed2cbdf 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/ConeSegment.kt @@ -4,6 +4,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -74,7 +75,7 @@ class ConeSegment( } -inline fun VisualGroup3D.cylinder( +inline fun MutableVisualGroup.cylinder( r: Number, height: Number, name: String = "", @@ -86,7 +87,7 @@ inline fun VisualGroup3D.cylinder( ).apply(block).also { set(name, it) } -inline fun VisualGroup3D.cone( +inline fun MutableVisualGroup.cone( bottomRadius: Number, height: Number, upperRadius: Number = 0.0, diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt index 9e4adc00..c75c2e4c 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Convex.kt @@ -4,6 +4,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -24,7 +25,7 @@ class Convex(val points: List) : AbstractVisualObject(), VisualObject3D } } -inline fun VisualGroup3D.convex(name: String = "", action: ConvexBuilder.() -> Unit = {}) = +inline fun MutableVisualGroup.convex(name: String = "", action: ConvexBuilder.() -> Unit = {}) = ConvexBuilder().apply(action).build().also { set(name, it) } class ConvexBuilder { diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt index c3440daf..46cd2a53 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Extruded.kt @@ -3,6 +3,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -111,5 +112,5 @@ class Extruded( } } -fun VisualGroup3D.extrude(name: String = "", action: Extruded.() -> Unit = {}) = +fun MutableVisualGroup.extrude(name: String = "", action: Extruded.() -> Unit = {}) = Extruded().apply(action).also { set(name, it) } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt index 0a0688d4..ac9184d3 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Label3D.kt @@ -4,6 +4,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -20,7 +21,7 @@ class Label3D(var text: String, var fontSize: Double, var fontFamily: String) : } -fun VisualGroup3D.label( +fun MutableVisualGroup.label( text: String, fontSize: Number = 20, fontFamily: String = "Arial", diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt index b9f67f51..220b0ada 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/PolyLine.kt @@ -7,6 +7,7 @@ import hep.dataforge.meta.number import hep.dataforge.names.asName import hep.dataforge.names.plus import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,5 +31,5 @@ class PolyLine(var points: List) : AbstractVisualObject(), VisualObject } -fun VisualGroup3D.polyline(vararg points: Point3D, name: String = "", action: PolyLine.() -> Unit = {}) = +fun MutableVisualGroup.polyline(vararg points: Point3D, name: String = "", action: PolyLine.() -> Unit = {}) = PolyLine(points.toList()).apply(action).also { set(name, it) } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt index 4514a559..8dca1fd1 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt @@ -6,10 +6,7 @@ import hep.dataforge.meta.Config import hep.dataforge.meta.Laminate import hep.dataforge.meta.MetaItem import hep.dataforge.meta.get -import hep.dataforge.names.Name -import hep.dataforge.names.NameToken -import hep.dataforge.names.asName -import hep.dataforge.names.plus +import hep.dataforge.names.* import hep.dataforge.vis.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -24,8 +21,9 @@ import kotlin.collections.set */ @Serializable @SerialName("3d.proxy") -class Proxy private constructor(val templateName: Name) : AbstractVisualObject(), - VisualGroup, VisualObject3D { +class Proxy private constructor( + val templateName: Name +) : AbstractVisualObject(), VisualGroup, VisualObject3D { constructor(parent: VisualGroup3D, templateName: Name) : this(templateName) { this.parent = parent @@ -42,10 +40,10 @@ class Proxy private constructor(val templateName: Name) : AbstractVisualObject() */ val prototype: VisualObject3D get() = (parent as? VisualGroup3D)?.getPrototype(templateName) - ?: error("Template with name $templateName not found in $parent") + ?: error("Prototype with name $templateName not found in $parent") override val styleSheet: StyleSheet - get() = (parent as? VisualGroup)?.styleSheet ?: StyleSheet( + get() = parent?.styleSheet ?: StyleSheet( this ) @@ -166,9 +164,9 @@ inline fun VisualGroup3D.ref( * Add new proxy wrapping given object and automatically adding it to the prototypes */ fun VisualGroup3D.proxy( - templateName: Name, + name: String, obj: VisualObject3D, - name: String = "", + templateName: Name = name.toName(), block: Proxy.() -> Unit = {} ): Proxy { val existing = getPrototype(templateName) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt index 459d144c..27b56397 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Sphere.kt @@ -4,6 +4,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -59,7 +60,7 @@ class Sphere( } } -inline fun VisualGroup3D.sphere( +inline fun MutableVisualGroup.sphere( radius: Number, phi: Number = 2 * PI, theta: Number = PI, diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt index 31514a4a..1f1de0f3 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Tube.kt @@ -3,6 +3,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Config import hep.dataforge.vis.AbstractVisualObject +import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -127,7 +128,7 @@ class Tube( } -inline fun VisualGroup3D.tube( +inline fun MutableVisualGroup.tube( r: Number, height: Number, innerRadius: Number = 0f, diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index 7cf0578a..a9162916 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -8,22 +8,23 @@ import hep.dataforge.meta.Config import hep.dataforge.names.Name import hep.dataforge.names.NameToken import hep.dataforge.names.asName -import hep.dataforge.names.isEmpty -import hep.dataforge.vis.AbstractVisualGroup -import hep.dataforge.vis.StyleSheet -import hep.dataforge.vis.VisualObject -import hep.dataforge.vis.set +import hep.dataforge.vis.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers import kotlin.collections.set +interface PrototypeHolder { + val parent: VisualGroup? + val prototypes: MutableVisualGroup? +} + /** * Represents 3-dimensional Visual Group */ @Serializable @SerialName("group.3d") -class VisualGroup3D : AbstractVisualGroup(), VisualObject3D { +class VisualGroup3D : AbstractVisualGroup(), VisualObject3D, PrototypeHolder { override var styleSheet: StyleSheet? = null private set @@ -31,11 +32,19 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D { /** * A container for templates visible inside this group */ - var prototypes: VisualGroup3D? = null - set(value) { - value?.parent = this - field = value - } + @Serializable(PrototypesSerializer::class) + override var prototypes: MutableVisualGroup? = null + private set + + /** + * Create or edit prototype node as a group + */ + fun prototypes(builder: MutableVisualGroup.() -> Unit): Unit { + (prototypes ?: Prototypes().also { + attach(it) + prototypes = it + }).run(builder) + } //FIXME to be lifted to AbstractVisualGroup after https://github.com/Kotlin/kotlinx.serialization/issues/378 is fixed override var properties: Config? = null @@ -48,11 +57,6 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D { private val _children = HashMap() override val children: Map get() = _children -// init { -// //Do after deserialization -// attachChildren() -// } - override fun attachChildren() { prototypes?.parent = this prototypes?.attachChildren() @@ -68,18 +72,11 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D { } override fun removeChild(token: NameToken) { - _children.remove(token)?.run { parent = null } - childrenChanged(token.asName(), null) + _children.remove(token)?.apply { parent = null } } override fun setChild(token: NameToken, child: VisualObject) { - if (child.parent == null) { - child.parent = this - } else if (child.parent !== this) { - error("Can't reassign existing parent for $child") - } _children[token] = child - childrenChanged(token.asName(), child) } // /** @@ -87,47 +84,72 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D { // */ // override fun addStatic(child: VisualObject) = setChild(NameToken("@static(${child.hashCode()})"), child) - override fun createGroup(name: Name): VisualGroup3D { - return when { - name.isEmpty() -> error("Should be unreachable") - name.length == 1 -> { - val token = name.first()!! - when (val current = children[token]) { - null -> VisualGroup3D().also { setChild(token, it) } - is VisualGroup3D -> current - else -> error("Can't create group with name $name because it exists and not a group") - } - } - else -> createGroup(name.first()!!.asName()).createGroup(name.cutFirst()) - } - } + override fun createGroup(): VisualGroup3D = VisualGroup3D() + +// return when { +// name.isEmpty() -> error("Should be unreachable") +// name.length == 1 -> { +// val token = name.first()!! +// when (val current = children[token]) { +// null -> VisualGroup3D().also { setChild(token, it) } +// is VisualGroup3D -> current +// else -> error("Can't create group with name $name because it exists and not a group") +// } +// } +// else -> createGroup(name.first()!!.asName()).createGroup(name.cutFirst()) +// } +// } + companion object { // val PROTOTYPES_KEY = NameToken("@prototypes") - fun fromJson(json: String): VisualGroup3D = + fun parseJson(json: String): VisualGroup3D = Visual3D.json.parse(serializer(), json).also { it.attachChildren() } } } +fun VisualGroup3D.stringify(): String = Visual3D.json.stringify(VisualGroup3D.serializer(),this) + /** * Ger a prototype redirecting the request to the parent if prototype is not found */ -tailrec fun VisualGroup3D.getPrototype(name: Name): VisualObject3D? = +tailrec fun PrototypeHolder.getPrototype(name: Name): VisualObject3D? = prototypes?.get(name) as? VisualObject3D ?: (parent as? VisualGroup3D)?.getPrototype(name) -/** - * Create or edit prototype node as a group - */ -inline fun VisualGroup3D.prototypes(builder: VisualGroup3D.() -> Unit): Unit { - (prototypes ?: VisualGroup3D().also { prototypes = it }).run(builder) -} - /** * Define a group with given [name], attach it to this parent and return it. */ -fun VisualGroup3D.group(name: String = "", action: VisualGroup3D.() -> Unit = {}): VisualGroup3D = +fun MutableVisualGroup.group(name: String = "", action: VisualGroup3D.() -> Unit = {}): VisualGroup3D = VisualGroup3D().apply(action).also { set(name, it) } +internal class Prototypes( + override var children: MutableMap = LinkedHashMap() +) : AbstractVisualGroup(), MutableVisualGroup, PrototypeHolder { + + override val styleSheet: StyleSheet? get() = null + + override fun removeChild(token: NameToken) { + children.remove(token) + childrenChanged(token.asName(), null) + } + + override fun setChild(token: NameToken, child: VisualObject) { + children[token] = child + } + + override fun createGroup(): Prototypes = Prototypes() + + override var properties: Config? = null + + override val prototypes: MutableVisualGroup get() = this + + override fun attachChildren() { + children.values.forEach { + it.parent = parent + (it as? VisualGroup)?.attachChildren() + } + } +} diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt index 5bb95aea..599c4136 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt @@ -1,7 +1,11 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.double +import hep.dataforge.names.NameToken +import hep.dataforge.vis.MutableVisualGroup +import hep.dataforge.vis.VisualObject import kotlinx.serialization.* +import kotlinx.serialization.builtins.MapSerializer import kotlinx.serialization.builtins.nullable import kotlinx.serialization.builtins.serializer @@ -90,4 +94,25 @@ object Point2DSerializer : KSerializer { if (value.y != 0.0) encodeDoubleElement(descriptor, 1, value.y) } } +} + +@Serializer(MutableVisualGroup::class) +internal object PrototypesSerializer : KSerializer { + private val mapSerializer: KSerializer> = + MapSerializer( + NameToken.serializer(), + PolymorphicSerializer(VisualObject::class) + ) + override val descriptor: SerialDescriptor get() = mapSerializer.descriptor + + override fun deserialize(decoder: Decoder): MutableVisualGroup { + val map = mapSerializer.deserialize(decoder) + return Prototypes(map as? MutableMap ?: LinkedHashMap(map)) + } + + override fun serialize(encoder: Encoder, value: MutableVisualGroup) { + mapSerializer.serialize(encoder, value.children) + } + + } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt index 32104b95..e619a8c5 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/transform/UnRef.kt @@ -6,7 +6,6 @@ import hep.dataforge.vis.MutableVisualGroup import hep.dataforge.vis.VisualGroup import hep.dataforge.vis.spatial.Proxy import hep.dataforge.vis.spatial.VisualGroup3D -import hep.dataforge.vis.spatial.prototypes object UnRef : VisualTreeTransform() { private fun VisualGroup.countRefs(): Map { diff --git a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt index ea242679..ff542650 100644 --- a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt +++ b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt @@ -1,12 +1,11 @@ package hep.dataforge.vis.spatial +import hep.dataforge.vis.get import hep.dataforge.vis.spatial.Visual3D.Companion.json -import kotlinx.serialization.ImplicitReflectionSerializer import kotlin.test.Test import kotlin.test.assertEquals class SerializationTest { - @ImplicitReflectionSerializer @Test fun testCubeSerialization() { val cube = Box(100f, 100f, 100f).apply { @@ -19,4 +18,21 @@ class SerializationTest { val newCube = json.parse(Box.serializer(), string) assertEquals(cube.config, newCube.config) } + + @Test + fun testProxySerialization() { + val cube = Box(100f, 100f, 100f).apply { + color(222) + x = 100 + z = -100 + } + + val group = VisualGroup3D().apply { + proxy("cube", cube) + } + val string = group.stringify() + println(string) + val reconstructed = VisualGroup3D.parseJson(string) + assertEquals(group["cube"]?.config, reconstructed["cube"]?.config) + } } \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt index 913c5583..08c4207e 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/GDMLDemoApp.kt @@ -3,8 +3,6 @@ package hep.dataforge.vis.spatial.gdml.demo import hep.dataforge.context.Global import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.meta.Meta -import hep.dataforge.meta.withBottom import hep.dataforge.names.Name import hep.dataforge.names.isEmpty import hep.dataforge.vis.VisualGroup @@ -23,7 +21,6 @@ import hep.dataforge.vis.spatial.gdml.toVisual import hep.dataforge.vis.spatial.three.ThreePlugin import hep.dataforge.vis.spatial.three.displayCanvasControls import hep.dataforge.vis.spatial.three.output -import hep.dataforge.vis.spatial.visible import org.w3c.dom.* import org.w3c.files.FileList import org.w3c.files.FileReader @@ -139,7 +136,7 @@ private class GDMLDemoApp : Application { message("Converting GDML into DF-VIS format") gdml.toVisual(gdmlConfiguration) } - name.endsWith(".json") -> VisualGroup3D.fromJson(data) + name.endsWith(".json") -> VisualGroup3D.parseJson(data) else -> { window.alert("File extension is not recognized: $name") error("File extension is not recognized: $name") diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt index cfac3a21..95e3cdb7 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt @@ -30,19 +30,19 @@ fun Visual3D.Companion.readFile(file: File): VisualGroup3D = when { } } } - file.extension == "json" -> VisualGroup3D.fromJson(file.readText()) + file.extension == "json" -> VisualGroup3D.parseJson(file.readText()) file.name.endsWith("json.zip") -> { file.inputStream().use { val unzip = ZipInputStream(it, Charsets.UTF_8) val text = unzip.readAllBytes().decodeToString() - VisualGroup3D.fromJson(text) + VisualGroup3D.parseJson(text) } } file.name.endsWith("json.gz") -> { file.inputStream().use { val unzip = GZIPInputStream(it) val text = unzip.readAllBytes().decodeToString() - VisualGroup3D.fromJson(text) + VisualGroup3D.parseJson(text) } } else -> error("Unknown extension ${file.extension}") diff --git a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt index b0a7ae7f..672b041f 100644 --- a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt +++ b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt @@ -9,7 +9,7 @@ class FileSerializationTest { @Ignore fun testFileRead(){ val text = this::class.java.getResourceAsStream("/cubes.json").readAllBytes().decodeToString() - val visual = VisualGroup3D.fromJson(text) + val visual = VisualGroup3D.parseJson(text) visual["composite_001".asName()] } } \ No newline at end of file -- 2.34.1 From ca985a6a66b4cb1b469f74a01792dbc64b6e8333 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 12 Apr 2020 10:44:35 +0300 Subject: [PATCH 09/11] Cleanup groups --- .../hep/dataforge/vis/AbstractVisualGroup.kt | 14 ++++++- .../hep/dataforge/vis/SimpleVisualGroup.kt | 31 +++++++++++++++ .../kotlin/hep/dataforge/vis/VisualObject.kt | 5 +++ .../kotlin/hep/dataforge/vis/spatial/Proxy.kt | 21 ++++++---- .../hep/dataforge/vis/spatial/Visual3D.kt | 22 ++++++----- .../dataforge/vis/spatial/VisualGroup3D.kt | 39 ++++++------------- .../dataforge/vis/spatial/serialization.kt | 11 +++++- .../vis/spatial/SerializationTest.kt | 13 +++++-- 8 files changed, 105 insertions(+), 51 deletions(-) create mode 100644 dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/SimpleVisualGroup.kt diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt index aa31387b..d130b5c7 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/AbstractVisualGroup.kt @@ -11,8 +11,7 @@ import kotlinx.serialization.Transient /** * Abstract implementation of mutable group of [VisualObject] */ -abstract class AbstractVisualGroup : AbstractVisualObject(), - MutableVisualGroup { +abstract class AbstractVisualGroup : AbstractVisualObject(), MutableVisualGroup { //protected abstract val _children: MutableMap @@ -21,6 +20,17 @@ abstract class AbstractVisualGroup : AbstractVisualObject(), */ abstract override val children: Map + abstract override var styleSheet: StyleSheet? + protected set + + /** + * Update or create stylesheet + */ + fun styleSheet(block: StyleSheet.() -> Unit) { + val res = styleSheet ?: StyleSheet(this).also { styleSheet = it } + res.block() + } + override fun propertyChanged(name: Name, before: MetaItem<*>?, after: MetaItem<*>?) { super.propertyChanged(name, before, after) forEach { diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/SimpleVisualGroup.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/SimpleVisualGroup.kt new file mode 100644 index 00000000..468a5264 --- /dev/null +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/SimpleVisualGroup.kt @@ -0,0 +1,31 @@ +package hep.dataforge.vis + +import hep.dataforge.meta.Config +import hep.dataforge.names.NameToken +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + + +@Serializable +@SerialName("group") +class SimpleVisualGroup : AbstractVisualGroup() { + + override var styleSheet: StyleSheet? = null + + //FIXME to be lifted to AbstractVisualGroup after https://github.com/Kotlin/kotlinx.serialization/issues/378 is fixed + override var properties: Config? = null + + @SerialName("children") + private val _children = HashMap() + override val children: Map get() = _children + + override fun removeChild(token: NameToken) { + _children.remove(token)?.apply { parent = null } + } + + override fun setChild(token: NameToken, child: VisualObject) { + _children[token] = child + } + + override fun createGroup(): SimpleVisualGroup = SimpleVisualGroup() +} \ No newline at end of file diff --git a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt index e5028b21..b757fcb3 100644 --- a/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt +++ b/dataforge-vis-common/src/commonMain/kotlin/hep/dataforge/vis/VisualObject.kt @@ -9,6 +9,7 @@ import hep.dataforge.names.asName import hep.dataforge.names.toName import hep.dataforge.provider.Type import hep.dataforge.vis.VisualObject.Companion.TYPE +import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.Transient //private fun Laminate.withTop(meta: Meta): Laminate = Laminate(listOf(meta) + layers) @@ -64,6 +65,10 @@ interface VisualObject : Configurable { const val TYPE = "visual" val STYLE_KEY = "@style".asName() + private val VISUAL_OBJECT_SERIALIZER = PolymorphicSerializer(VisualObject::class) + + fun serializer() = VISUAL_OBJECT_SERIALIZER + //const val META_KEY = "@meta" //const val TAGS_KEY = "@tags" diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt index 8dca1fd1..b60f8d42 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Proxy.kt @@ -154,11 +154,10 @@ val VisualObject.prototype: VisualObject /** * Create ref for existing prototype */ -inline fun VisualGroup3D.ref( +fun VisualGroup3D.ref( templateName: Name, - name: String = "", - block: Proxy.() -> Unit = {} -) = Proxy(this, templateName).apply(block).also { set(name, it) } + name: String = "" +): Proxy = Proxy(this, templateName).also { set(name, it) } /** * Add new proxy wrapping given object and automatically adding it to the prototypes @@ -166,8 +165,7 @@ inline fun VisualGroup3D.ref( fun VisualGroup3D.proxy( name: String, obj: VisualObject3D, - templateName: Name = name.toName(), - block: Proxy.() -> Unit = {} + templateName: Name = name.toName() ): Proxy { val existing = getPrototype(templateName) if (existing == null) { @@ -177,5 +175,14 @@ fun VisualGroup3D.proxy( } else if (existing != obj) { error("Can't add different prototype on top of existing one") } - return ref(templateName, name, block) + return ref(templateName, name) +} + +fun VisualGroup3D.proxyGroup( + name: String, + templateName: Name = name.toName(), + block: MutableVisualGroup.() -> Unit +): Proxy { + val group = VisualGroup3D().apply(block) + return proxy(name, group, templateName) } diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt index 26cb67c5..5e13b385 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/Visual3D.kt @@ -7,6 +7,7 @@ import hep.dataforge.context.PluginTag import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.toName +import hep.dataforge.vis.SimpleVisualGroup import hep.dataforge.vis.Visual import hep.dataforge.vis.VisualObject import kotlinx.serialization.json.Json @@ -38,23 +39,26 @@ class Visual3D(meta: Meta) : AbstractPlugin(meta) { contextual(Point2DSerializer) polymorphic(VisualObject::class, VisualObject3D::class) { - VisualGroup3D::class with VisualGroup3D.serializer() - Proxy::class with Proxy.serializer() - Composite::class with Composite.serializer() - Tube::class with Tube.serializer() - Box::class with Box.serializer() - Convex::class with Convex.serializer() - Extruded::class with Extruded.serializer() + subclass(SimpleVisualGroup.serializer()) + subclass(VisualGroup3D.serializer()) + subclass(Proxy.serializer()) + subclass(Composite.serializer()) + subclass(Tube.serializer()) + subclass(Box.serializer()) + subclass(Convex.serializer()) + subclass(Extruded.serializer()) subclass(PolyLine.serializer()) subclass(Label3D.serializer()) + subclass(Sphere.serializer()) } } - val json = Json( + internal val json = Json( JsonConfiguration( prettyPrint = true, useArrayPolymorphism = false, - encodeDefaults = false + encodeDefaults = false, + ignoreUnknownKeys = true ), context = serialModule ) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index a9162916..d7709464 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -27,7 +27,6 @@ interface PrototypeHolder { class VisualGroup3D : AbstractVisualGroup(), VisualObject3D, PrototypeHolder { override var styleSheet: StyleSheet? = null - private set /** * A container for templates visible inside this group @@ -63,14 +62,6 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D, PrototypeHolder { super.attachChildren() } - /** - * Update or create stylesheet - */ - fun styleSheet(block: StyleSheet.() -> Unit) { - val res = styleSheet ?: StyleSheet(this).also { styleSheet = it } - res.block() - } - override fun removeChild(token: NameToken) { _children.remove(token)?.apply { parent = null } } @@ -86,20 +77,6 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D, PrototypeHolder { override fun createGroup(): VisualGroup3D = VisualGroup3D() -// return when { -// name.isEmpty() -> error("Should be unreachable") -// name.length == 1 -> { -// val token = name.first()!! -// when (val current = children[token]) { -// null -> VisualGroup3D().also { setChild(token, it) } -// is VisualGroup3D -> current -// else -> error("Can't create group with name $name because it exists and not a group") -// } -// } -// else -> createGroup(name.first()!!.asName()).createGroup(name.cutFirst()) -// } -// } - companion object { // val PROTOTYPES_KEY = NameToken("@prototypes") @@ -109,8 +86,6 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D, PrototypeHolder { } } -fun VisualGroup3D.stringify(): String = Visual3D.json.stringify(VisualGroup3D.serializer(),this) - /** * Ger a prototype redirecting the request to the parent if prototype is not found */ @@ -129,7 +104,11 @@ internal class Prototypes( override var children: MutableMap = LinkedHashMap() ) : AbstractVisualGroup(), MutableVisualGroup, PrototypeHolder { - override val styleSheet: StyleSheet? get() = null + override var styleSheet: StyleSheet? + get() = null + set(value) { + error("Can't define stylesheet for prototypes block") + } override fun removeChild(token: NameToken) { children.remove(token) @@ -140,9 +119,13 @@ internal class Prototypes( children[token] = child } - override fun createGroup(): Prototypes = Prototypes() + override fun createGroup() = SimpleVisualGroup() - override var properties: Config? = null + override var properties: Config? + get() = null + set(value) { + error("Can't define properties for prototypes block") + } override val prototypes: MutableVisualGroup get() = this diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt index 599c4136..d4164529 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/serialization.kt @@ -3,6 +3,7 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.double import hep.dataforge.names.NameToken import hep.dataforge.vis.MutableVisualGroup +import hep.dataforge.vis.VisualGroup import hep.dataforge.vis.VisualObject import kotlinx.serialization.* import kotlinx.serialization.builtins.MapSerializer @@ -98,11 +99,13 @@ object Point2DSerializer : KSerializer { @Serializer(MutableVisualGroup::class) internal object PrototypesSerializer : KSerializer { + private val mapSerializer: KSerializer> = MapSerializer( NameToken.serializer(), - PolymorphicSerializer(VisualObject::class) + VisualObject.serializer() ) + override val descriptor: SerialDescriptor get() = mapSerializer.descriptor override fun deserialize(decoder: Decoder): MutableVisualGroup { @@ -113,6 +116,12 @@ internal object PrototypesSerializer : KSerializer { override fun serialize(encoder: Encoder, value: MutableVisualGroup) { mapSerializer.serialize(encoder, value.children) } +} +fun VisualObject.stringify(): String = Visual3D.json.stringify(VisualObject.serializer(), this) +fun VisualObject.Companion.parseJson(str: String) = Visual3D.json.parse(VisualObject.serializer(), str).also { + if(it is VisualGroup){ + it.attachChildren() + } } \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt index ff542650..6dd4cd5a 100644 --- a/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt +++ b/dataforge-vis-spatial/src/commonTest/kotlin/hep/dataforge/vis/spatial/SerializationTest.kt @@ -1,7 +1,8 @@ package hep.dataforge.vis.spatial +import hep.dataforge.names.toName +import hep.dataforge.vis.VisualObject import hep.dataforge.vis.get -import hep.dataforge.vis.spatial.Visual3D.Companion.json import kotlin.test.Test import kotlin.test.assertEquals @@ -13,9 +14,9 @@ class SerializationTest { x = 100 z = -100 } - val string = json.stringify(Box.serializer(), cube) + val string = cube.stringify() println(string) - val newCube = json.parse(Box.serializer(), string) + val newCube = VisualObject.parseJson(string) assertEquals(cube.config, newCube.config) } @@ -26,9 +27,13 @@ class SerializationTest { x = 100 z = -100 } - val group = VisualGroup3D().apply { proxy("cube", cube) + proxyGroup("pg", "pg.content".toName()){ + sphere(50){ + x = -100 + } + } } val string = group.stringify() println(string) -- 2.34.1 From 217f347c4bca2cf092e2d958d458c37874a14a37 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 12 Apr 2020 13:51:18 +0300 Subject: [PATCH 10/11] Fix Json schema generator --- .../kotlin/hep/dataforge/vis/spatial/World.kt | 10 -- .../hep/dataforge/vis/spatial/geometry.kt | 8 ++ .../dataforge/vis/spatial}/generateSchema.kt | 99 +++++++++++++------ 3 files changed, 75 insertions(+), 42 deletions(-) delete mode 100644 dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/World.kt rename {dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml => dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial}/generateSchema.kt (62%) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/World.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/World.kt deleted file mode 100644 index bc946987..00000000 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/World.kt +++ /dev/null @@ -1,10 +0,0 @@ -package hep.dataforge.vis.spatial - -import kotlin.math.PI - -object World { - val ZERO = Point3D(0.0, 0.0, 0.0) - val ONE = Point3D(1.0, 1.0, 1.0) -} - -const val PI2: Float = 2 * PI.toFloat() \ No newline at end of file diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt index 85d5466a..f88528bb 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/geometry.kt @@ -3,6 +3,14 @@ package hep.dataforge.vis.spatial import hep.dataforge.meta.Meta import hep.dataforge.meta.get import hep.dataforge.meta.number +import kotlin.math.PI + +object World { + val ZERO = Point3D(0.0, 0.0, 0.0) + val ONE = Point3D(1.0, 1.0, 1.0) +} + +const val PI2: Float = 2 * PI.toFloat() expect class Point2D(x: Number, y: Number) { var x: Double diff --git a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/generateSchema.kt similarity index 62% rename from dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt rename to dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/generateSchema.kt index b9d4fc48..54a2c08d 100644 --- a/dataforge-vis-spatial-gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/generateSchema.kt +++ b/dataforge-vis-spatial/src/jvmMain/kotlin/hep/dataforge/vis/spatial/generateSchema.kt @@ -1,24 +1,24 @@ -package hep.dataforge.vis.spatial.gdml +package hep.dataforge.vis.spatial import hep.dataforge.meta.JSON_PRETTY -import hep.dataforge.meta.Meta -import hep.dataforge.vis.spatial.* import kotlinx.serialization.* import kotlinx.serialization.json.* import kotlinx.serialization.modules.SerialModule import kotlinx.serialization.modules.SerialModuleCollector import kotlin.reflect.KClass -internal val SerialDescriptor.jsonType - get() = when (this.kind) { - StructureKind.LIST -> "array" - PrimitiveKind.BYTE, PrimitiveKind.SHORT, PrimitiveKind.INT, PrimitiveKind.LONG, - PrimitiveKind.FLOAT, PrimitiveKind.DOUBLE -> "number" - PrimitiveKind.STRING, PrimitiveKind.CHAR, UnionKind.ENUM_KIND -> "string" - PrimitiveKind.BOOLEAN -> "boolean" - else -> "object" - } +private fun SerialDescriptor.getJsonType() = when (this.kind) { + StructureKind.LIST -> "array" + PrimitiveKind.BYTE, PrimitiveKind.SHORT, PrimitiveKind.INT, PrimitiveKind.LONG, + PrimitiveKind.FLOAT, PrimitiveKind.DOUBLE -> "number" + PrimitiveKind.STRING, PrimitiveKind.CHAR, UnionKind.ENUM_KIND -> "string" + PrimitiveKind.BOOLEAN -> "boolean" + else -> "object" +} +private fun SerialDescriptor.isVisualObject() = serialName.startsWith("3d")||serialName.startsWith("group") + +private const val definitionNode = "\$defs" private fun SerialModule.enumerate(type: KClass<*>): Sequence { val list = ArrayList() @@ -63,11 +63,14 @@ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): Jso if (descriptor.serialName in arrayOf( "hep.dataforge.vis.spatial.Point3D", + "hep.dataforge.vis.spatial.Point3D?", "hep.dataforge.vis.spatial.Point2D", - Meta::class.qualifiedName + "hep.dataforge.vis.spatial.Point2D?", + "hep.dataforge.meta.Meta", + "hep.dataforge.meta.Meta?" ) ) return json { - "\$ref" to "#/definitions/${descriptor.serialName}" + "\$ref" to "#/$definitionNode/${descriptor.serialName.replace("?", "")}" } @@ -80,35 +83,33 @@ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): Jso if (!isEnum && !isPolymorphic) descriptor.elementDescriptors().forEachIndexed { index, child -> val elementName = descriptor.getElementName(index) - properties[elementName] = when (elementName) { - "templates" -> json { - "\$ref" to "#/definitions/hep.dataforge.vis.spatial.VisualGroup3D" + val elementSchema = when (elementName) { + "properties" -> json { + "\$ref" to "#/$definitionNode/hep.dataforge.meta.Meta" } - "properties" -> json { - "\$ref" to "#/definitions/${Meta::class.qualifiedName}" - } - "first", "second" -> json{ - "\$ref" to "#/definitions/children" + "first", "second" -> json { + "\$ref" to "#/$definitionNode/children" } "styleSheet" -> json { "type" to "object" "additionalProperties" to json { - "\$ref" to "#/definitions/${Meta::class.qualifiedName}" + "\$ref" to "#/$definitionNode/hep.dataforge.meta.Meta" } } - in arrayOf("children") -> json { + in arrayOf("children", "prototypes") -> json { "type" to "object" "additionalProperties" to json { - "\$ref" to "#/definitions/children" + "\$ref" to "#/$definitionNode/children" } } else -> jsonSchema(child, context) } + properties[elementName] = elementSchema if (!descriptor.isElementOptional(index)) requiredProperties.add(elementName) } - val jsonType = descriptor.jsonType + val jsonType = descriptor.getJsonType() val objectData: MutableMap = mutableMapOf( "description" to JsonLiteral(descriptor.serialName), "type" to JsonLiteral(jsonType) @@ -119,6 +120,11 @@ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): Jso } when (jsonType) { "object" -> { + if(descriptor.isVisualObject()) { + properties["type"] = json { + "const" to descriptor.serialName + } + } objectData["properties"] = JsonObject(properties) val required = requiredProperties.map { JsonLiteral(it) } if (required.isNotEmpty()) { @@ -143,7 +149,7 @@ fun main() { context.enumerate(VisualObject3D::class).forEach { if (it.serialName == "hep.dataforge.vis.spatial.VisualGroup3D") { +json { - "\$ref" to "#/definitions/${it.serialName}" + "\$ref" to "#/$definitionNode/${it.serialName}" } } else { +jsonSchema(it, context) @@ -151,9 +157,38 @@ fun main() { } } } - "hep.dataforge.vis.spatial.Point3D" to jsonSchema(Point3DSerializer.descriptor, context) - "hep.dataforge.vis.spatial.Point2D" to jsonSchema(Point2DSerializer.descriptor, context) - "hep.dataforge.vis.spatial.VisualGroup3D" to jsonSchema(VisualGroup3D.serializer().descriptor, context) + "hep.dataforge.meta.Meta" to json { + "type" to "object" + } + "hep.dataforge.vis.spatial.Point3D" to json { + "type" to "object" + "properties" to json { + "x" to json { + "type" to "number" + } + "y" to json { + "type" to "number" + } + "z" to json { + "type" to "number" + } + } + } + "hep.dataforge.vis.spatial.Point2D" to json { + "type" to "object" + "properties" to json { + "x" to json { + "type" to "number" + } + "y" to json { + "type" to "number" + } + } + } + "hep.dataforge.vis.spatial.VisualGroup3D" to jsonSchema( + VisualGroup3D.serializer().descriptor, + context + ) } @@ -161,8 +196,8 @@ fun main() { JSON_PRETTY.stringify( JsonObjectSerializer, json { - "definitions" to definitions - "\$ref" to "#/definitions/hep.dataforge.vis.spatial.VisualGroup3D" + "\$defs" to definitions + "\$ref" to "#/$definitionNode/hep.dataforge.vis.spatial.VisualGroup3D" } ) ) -- 2.34.1 From c7c1a8dd3cdbf5b2f465590d303d12319381adc3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 12 Apr 2020 15:32:36 +0300 Subject: [PATCH 11/11] Fix compillation and tests --- .../dataforge/vis/spatial/VisualGroup3D.kt | 4 ++-- .../vis/spatial/gdml/demo/readFile.kt | 4 ++-- .../vis/spatial/gdml/demo/saveToJson.kt | 3 ++- .../vis/spatial/FileSerializationTest.kt | 2 +- demo/muon-monitor/build.gradle.kts | 2 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 3 ++- .../ru/mipt/npm/muon/monitor/readResource.kt | 2 +- .../mipt/npm/muon/monitor/server/MMServer.kt | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 58702 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 3 +++ 11 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt index d7709464..ba12fef2 100644 --- a/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt +++ b/dataforge-vis-spatial/src/commonMain/kotlin/hep/dataforge/vis/spatial/VisualGroup3D.kt @@ -106,7 +106,7 @@ internal class Prototypes( override var styleSheet: StyleSheet? get() = null - set(value) { + set(_) { error("Can't define stylesheet for prototypes block") } @@ -123,7 +123,7 @@ internal class Prototypes( override var properties: Config? get() = null - set(value) { + set(_) { error("Can't define properties for prototypes block") } diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt index 95e3cdb7..be567114 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/readFile.kt @@ -34,14 +34,14 @@ fun Visual3D.Companion.readFile(file: File): VisualGroup3D = when { file.name.endsWith("json.zip") -> { file.inputStream().use { val unzip = ZipInputStream(it, Charsets.UTF_8) - val text = unzip.readAllBytes().decodeToString() + val text = unzip.readBytes().decodeToString() VisualGroup3D.parseJson(text) } } file.name.endsWith("json.gz") -> { file.inputStream().use { val unzip = GZIPInputStream(it) - val text = unzip.readAllBytes().decodeToString() + val text = unzip.readBytes().decodeToString() VisualGroup3D.parseJson(text) } } diff --git a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/saveToJson.kt b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/saveToJson.kt index f2491423..b069debe 100644 --- a/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/saveToJson.kt +++ b/demo/gdml/src/jvmMain/kotlin/hep/dataforge/vis/spatial/gdml/demo/saveToJson.kt @@ -5,6 +5,7 @@ import hep.dataforge.vis.spatial.VisualGroup3D import hep.dataforge.vis.spatial.gdml.LUnit import hep.dataforge.vis.spatial.gdml.readFile import hep.dataforge.vis.spatial.gdml.toVisual +import hep.dataforge.vis.spatial.stringify import scientifik.gdml.GDML import java.io.File import java.nio.file.Paths @@ -14,6 +15,6 @@ fun main() { val visual = gdml.toVisual { lUnit = LUnit.CM } - val json = Visual3D.json.stringify(VisualGroup3D.serializer(), visual) + val json = visual.stringify() File("D:\\Work\\Projects\\gdml.kt\\gdml-source\\cubes.json").writeText(json) } \ No newline at end of file diff --git a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt index 672b041f..af51354b 100644 --- a/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt +++ b/demo/gdml/src/jvmTest/kotlin/hep/dataforge/vis/spatial/FileSerializationTest.kt @@ -8,7 +8,7 @@ class FileSerializationTest { @Test @Ignore fun testFileRead(){ - val text = this::class.java.getResourceAsStream("/cubes.json").readAllBytes().decodeToString() + val text = this::class.java.getResourceAsStream("/cubes.json").readBytes().decodeToString() val visual = VisualGroup3D.parseJson(text) visual["composite_001".asName()] } diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index c5692be4..53a05cd7 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -15,7 +15,7 @@ kotlin { jvm { withJava() - compilations.findByName("main").apply { + compilations.findByName("jvmMain").apply { tasks.getByName("jvmProcessResources") { dependsOn(installJS) afterEvaluate { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 5a8ef3e6..72656f95 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.html.js.button import kotlinx.html.js.onClickFunction +import kotlinx.serialization.json.Json import org.w3c.dom.HTMLElement import kotlin.browser.document import kotlin.dom.clear @@ -38,7 +39,7 @@ private class MMDemoApp : Application { private val connection = HttpClient { install(JsonFeature) { - serializer = KotlinxSerializer(Visual3D.json) + serializer = KotlinxSerializer(Json(context = Visual3D.serialModule)) } } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/readResource.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/readResource.kt index 5cb275e1..4a12869f 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/readResource.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/readResource.kt @@ -1,7 +1,7 @@ package ru.mipt.npm.muon.monitor actual fun readResource(path: String): String { - return ClassLoader.getSystemClassLoader().getResourceAsStream(path)?.readAllBytes()?.decodeToString() + return ClassLoader.getSystemClassLoader().getResourceAsStream(path)?.readBytes()?.decodeToString() ?: error("Resource '$path' not found") } diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt index 955ff67c..0cf95aa1 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt @@ -35,7 +35,7 @@ fun Application.module() { install(DefaultHeaders) install(CallLogging) install(ContentNegotiation) { - json(json = Visual3D.json) + json(module = Visual3D.serialModule) } install(Routing) { get("/event") { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644 GIT binary patch delta 18348 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 H|2F2obH5>< delta 18428 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94920145..a4b44297 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew.bat b/gradlew.bat index 9618d8d9..62bd9b9c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" -- 2.34.1