Remove bootstrap from solid

This commit is contained in:
Alexander Nozik 2020-10-28 22:11:28 +03:00
parent 22c3521a9e
commit 3edb00b6bf
20 changed files with 75 additions and 92 deletions

View File

@ -4,7 +4,7 @@ plugins {
id("ru.mipt.npm.project") id("ru.mipt.npm.project")
} }
val dataforgeVersion by extra("0.2.0-dev-3") val dataforgeVersion by extra("0.2.0-dev-4")
val ktorVersion by extra("1.4.1") val ktorVersion by extra("1.4.1")
allprojects { allprojects {

View File

@ -14,11 +14,8 @@ kscience {
} }
kotlin { kotlin {
jvm { jvm {
afterEvaluate { withJava()
withJava()
}
} }
sourceSets { sourceSets {
commonMain { commonMain {
@ -37,7 +34,7 @@ kotlin {
} }
application { application {
mainClassName = "hep.dataforge.vision.gdml.demo.GdmlFxDemoAppKt" mainClass.set("hep.dataforge.vision.gdml.demo.GdmlFxDemoAppKt")
} }
val convertGdmlToJson by tasks.creating(JavaExec::class) { val convertGdmlToJson by tasks.creating(JavaExec::class) {

View File

@ -9,14 +9,10 @@ import hep.dataforge.vision.bootstrap.*
import hep.dataforge.vision.gdml.toVision import hep.dataforge.vision.gdml.toVision
import hep.dataforge.vision.react.component import hep.dataforge.vision.react.component
import hep.dataforge.vision.react.objectTree import hep.dataforge.vision.react.objectTree
import hep.dataforge.vision.react.state
import hep.dataforge.vision.solid.Solid import hep.dataforge.vision.solid.Solid
import hep.dataforge.vision.solid.SolidGroup import hep.dataforge.vision.solid.SolidGroup
import hep.dataforge.vision.solid.specifications.Camera
import hep.dataforge.vision.solid.specifications.Canvas3DOptions
import hep.dataforge.vision.solid.three.ThreeCanvas import hep.dataforge.vision.solid.three.ThreeCanvas
import hep.dataforge.vision.solid.three.ThreeCanvasComponent import hep.dataforge.vision.solid.three.ThreeCanvasComponent
import hep.dataforge.vision.solid.three.canvasControls
import kotlinx.browser.window import kotlinx.browser.window
import kotlinx.css.FlexBasis import kotlinx.css.FlexBasis
import kotlinx.css.Overflow import kotlinx.css.Overflow
@ -28,8 +24,10 @@ import org.w3c.files.FileReader
import org.w3c.files.get import org.w3c.files.get
import react.RProps import react.RProps
import react.dom.h1 import react.dom.h1
import react.getValue
import react.setValue
import react.useState
import styled.css import styled.css
import kotlin.math.PI
external interface GDMLAppProps : RProps { external interface GDMLAppProps : RProps {
var context: Context var context: Context
@ -37,18 +35,19 @@ external interface GDMLAppProps : RProps {
var selected: Name? var selected: Name?
} }
private val canvasConfig = Canvas3DOptions { //private val canvasConfig = Canvas3DOptions {
camera = Camera { // camera = Camera {
distance = 2100.0 // distance = 2100.0
latitude = PI / 6 // latitude = PI / 6
azimuth = PI + PI / 6 // azimuth = PI + PI / 6
} // }
} //}
@JsExport
val GDMLApp = component<GDMLAppProps> { props -> val GDMLApp = component<GDMLAppProps> { props ->
var selected by state { props.selected } var selected by useState { props.selected }
var canvas: ThreeCanvas? by state { null } var canvas: ThreeCanvas? by useState { null }
var vision: Vision? by state { props.rootObject } var vision: Vision? by useState { props.rootObject }
val select: (Name?) -> Unit = { val select: (Name?) -> Unit = {
selected = it selected = it

View File

@ -55,7 +55,7 @@ kotlin {
} }
application { application {
mainClassName = "ru.mipt.npm.muon.monitor.server.MMServerKt" mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt")
} }
distributions { distributions {

View File

@ -6,16 +6,15 @@ import hep.dataforge.names.NameToken
import hep.dataforge.names.isEmpty import hep.dataforge.names.isEmpty
import hep.dataforge.names.length import hep.dataforge.names.length
import hep.dataforge.vision.Vision import hep.dataforge.vision.Vision
import hep.dataforge.vision.bootstrap.canvasControls
import hep.dataforge.vision.bootstrap.card import hep.dataforge.vision.bootstrap.card
import hep.dataforge.vision.react.component import hep.dataforge.vision.react.component
import hep.dataforge.vision.react.configEditor import hep.dataforge.vision.react.configEditor
import hep.dataforge.vision.react.objectTree import hep.dataforge.vision.react.objectTree
import hep.dataforge.vision.react.state
import hep.dataforge.vision.solid.specifications.Camera import hep.dataforge.vision.solid.specifications.Camera
import hep.dataforge.vision.solid.specifications.Canvas3DOptions import hep.dataforge.vision.solid.specifications.Canvas3DOptions
import hep.dataforge.vision.solid.three.ThreeCanvas import hep.dataforge.vision.solid.three.ThreeCanvas
import hep.dataforge.vision.solid.three.ThreeCanvasComponent import hep.dataforge.vision.solid.three.ThreeCanvasComponent
import hep.dataforge.vision.solid.three.canvasControls
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.get import io.ktor.client.request.get
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@ -23,6 +22,9 @@ import kotlinx.coroutines.launch
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import react.RProps import react.RProps
import react.dom.* import react.dom.*
import react.getValue
import react.setValue
import react.useState
import kotlin.math.PI import kotlin.math.PI
external interface MMAppProps : RProps { external interface MMAppProps : RProps {
@ -42,14 +44,14 @@ private val canvasConfig = Canvas3DOptions {
@JsExport @JsExport
val MMApp = component<MMAppProps> { props -> val MMApp = component<MMAppProps> { props ->
var selected by state { props.selected } var selected by useState { props.selected }
var canvas: ThreeCanvas? by state { null } var canvas: ThreeCanvas? by useState { null }
val select: (Name?) -> Unit = { val select: (Name?) -> Unit = {
selected = it selected = it
} }
val visual = props.model.root val root = props.model.root
div("row") { div("row") {
h1("mx-auto") { h1("mx-auto") {
@ -60,7 +62,7 @@ val MMApp = component<MMAppProps> { props ->
div("col-lg-3 px-0 overflow-auto") { div("col-lg-3 px-0 overflow-auto") {
//tree //tree
card("Object tree") { card("Object tree") {
objectTree(visual, selected, select) objectTree(root, selected, select)
} }
} }
div("col-lg-6") { div("col-lg-6") {
@ -68,7 +70,7 @@ val MMApp = component<MMAppProps> { props ->
child(ThreeCanvasComponent::class) { child(ThreeCanvasComponent::class) {
attrs { attrs {
this.context = props.context this.context = props.context
this.obj = visual this.obj = root
this.options = canvasConfig this.options = canvasConfig
this.selected = selected this.selected = selected
this.clickCallback = select this.clickCallback = select
@ -153,8 +155,8 @@ val MMApp = component<MMAppProps> { props ->
selected.let { selected -> selected.let { selected ->
val selectedObject: Vision? = when { val selectedObject: Vision? = when {
selected == null -> null selected == null -> null
selected.isEmpty() -> visual selected.isEmpty() -> root
else -> visual[selected] else -> root[selected]
} }
if (selectedObject != null) { if (selectedObject != null) {
configEditor(selectedObject, default = selectedObject.getAllProperties(), key = selected) configEditor(selectedObject, default = selectedObject.getAllProperties(), key = selected)

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -1,9 +1,9 @@
pluginManagement { pluginManagement {
val kotlinVersion = "1.4.20-M1" val kotlinVersion = "1.4.20-M2"
val toolsVersion = "0.6.3-dev-1.4.20-M1" val toolsVersion = "0.6.4-dev-1.4.20-M2"
repositories { repositories {
mavenLocal() // mavenLocal()
jcenter() jcenter()
gradlePluginPortal() gradlePluginPortal()
maven("https://dl.bintray.com/kotlin/kotlin-eap") maven("https://dl.bintray.com/kotlin/kotlin-eap")

View File

@ -5,5 +5,6 @@ plugins {
val dataforgeVersion: String by rootProject.extra val dataforgeVersion: String by rootProject.extra
dependencies{ dependencies{
api(project(":visionforge-solid"))
api(project(":ui:react")) api(project(":ui:react"))
} }

View File

@ -1,11 +1,11 @@
package hep.dataforge.vision.solid.three package hep.dataforge.vision.bootstrap
import hep.dataforge.js.requireJS import hep.dataforge.js.requireJS
import hep.dataforge.meta.DFExperimental import hep.dataforge.meta.DFExperimental
import hep.dataforge.vision.bootstrap.accordion
import hep.dataforge.vision.bootstrap.entry
import hep.dataforge.vision.solid.SolidGroup import hep.dataforge.vision.solid.SolidGroup
import hep.dataforge.vision.solid.SolidManager import hep.dataforge.vision.solid.SolidManager
import hep.dataforge.vision.solid.three.ThreeCanvas
import kotlinx.dom.clear
import kotlinx.html.* import kotlinx.html.*
import kotlinx.html.dom.append import kotlinx.html.dom.append
import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onChangeFunction
@ -21,7 +21,6 @@ import react.dom.button
import react.dom.div import react.dom.div
import react.dom.input import react.dom.input
import react.dom.label import react.dom.label
import kotlin.dom.clear
private fun saveData(event: Event, fileName: String, mimeType: String = "text/plain", dataBuilder: () -> String) { private fun saveData(event: Event, fileName: String, mimeType: String = "text/plain", dataBuilder: () -> String) {
event.stopPropagation(); event.stopPropagation();

View File

@ -2,13 +2,13 @@ plugins {
id("ru.mipt.npm.js") id("ru.mipt.npm.js")
} }
val reactVersion by extra("16.13.1") val reactVersion by extra("17.0.0")
dependencies{ dependencies{
api(project(":visionforge-core")) api(project(":visionforge-core"))
//api("org.jetbrains:kotlin-react:16.13.1-pre.104-kotlin-1.3.72") //api("org.jetbrains:kotlin-react:16.13.1-pre.104-kotlin-1.3.72")
api("org.jetbrains:kotlin-react-dom:$reactVersion-pre.123-kotlin-1.4.10") api("org.jetbrains:kotlin-react-dom:$reactVersion-pre.126-kotlin-1.4.10")
api(npm("react", reactVersion)) api(npm("react", reactVersion))
api(npm("react-dom", reactVersion)) api(npm("react-dom", reactVersion))

View File

@ -42,11 +42,11 @@ private val ConfigEditorItem: FunctionalComponent<ConfigEditorItemProps> = compo
} }
private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) { private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) {
var expanded: Boolean by state { true } var expanded: Boolean by useState { true }
var item: MetaItem<Config>? by state { props.root[props.name] } var item: MetaItem<Config>? by useState { props.root[props.name] }
val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name) val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name)
val defaultItem = props.default?.get(props.name) val defaultItem = props.default?.get(props.name)
var actualItem: MetaItem<Meta>? by state { item ?: defaultItem ?: descriptorItem?.defaultItem() } var actualItem: MetaItem<Meta>? by useState { item ?: defaultItem ?: descriptorItem?.defaultItem() }
val token = props.name.lastOrNull()?.toString() ?: "Properties" val token = props.name.lastOrNull()?.toString() ?: "Properties"
@ -191,13 +191,14 @@ private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) {
} }
public external interface ConfigEditorProps : RProps { public external interface ConfigEditorProps : RProps {
var id: Name public var id: Name
var root: Config public var root: Config
var default: Meta? public var default: Meta?
var descriptor: NodeDescriptor? public var descriptor: NodeDescriptor?
} }
val ConfigEditor = component<ConfigEditorProps> { props -> @JsExport
public val ConfigEditor: FunctionalComponent<ConfigEditorProps> = component { props ->
child(ConfigEditorItem) { child(ConfigEditorItem) {
attrs { attrs {
this.key = "" this.key = ""
@ -209,7 +210,7 @@ val ConfigEditor = component<ConfigEditorProps> { props ->
} }
} }
fun Element.configEditor(config: Config, descriptor: NodeDescriptor? = null, default: Meta? = null, key: Any? = null) { public fun Element.configEditor(config: Config, descriptor: NodeDescriptor? = null, default: Meta? = null, key: Any? = null) {
render(this) { render(this) {
child(ConfigEditor) { child(ConfigEditor) {
attrs { attrs {

View File

@ -39,7 +39,7 @@ private val MetaViewerItem: FunctionalComponent<MetaViewerProps> = component { p
} }
private fun RFBuilder.metaViewerItem(props: MetaViewerProps) { private fun RFBuilder.metaViewerItem(props: MetaViewerProps) {
var expanded: Boolean by state { true } var expanded: Boolean by useState { true }
val item = props.root[props.name] val item = props.root[props.name]
val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name) val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name)
val actualItem = item ?: descriptorItem?.defaultItem() val actualItem = item ?: descriptorItem?.defaultItem()

View File

@ -13,10 +13,10 @@ import react.*
import styled.* import styled.*
public external interface ObjectTreeProps : RProps { public external interface ObjectTreeProps : RProps {
var name: Name public var name: Name
var selected: Name? public var selected: Name?
var obj: Vision public var obj: Vision
var clickCallback: (Name) -> Unit public var clickCallback: (Name) -> Unit
} }
private fun RFBuilder.objectTree(props: ObjectTreeProps): Unit { private fun RFBuilder.objectTree(props: ObjectTreeProps): Unit {

View File

@ -1,16 +1,14 @@
package hep.dataforge.vision.react package hep.dataforge.vision.react
import react.* import react.*
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class RFBuilder : RBuilder() public class RFBuilder : RBuilder()
/** /**
* Get functional component from [func] * Get functional component from [func]
*/ */
fun <P : RProps> component( public inline fun <P : RProps> component(
func: RFBuilder.(props: P) -> Unit crossinline func: RFBuilder.(props: P) -> Unit,
): FunctionalComponent<P> { ): FunctionalComponent<P> {
return { props: P -> return { props: P ->
val nodes = RFBuilder().apply { func(props) }.childList val nodes = RFBuilder().apply { func(props) }.childList
@ -21,18 +19,6 @@ fun <P : RProps> component(
} }
} }
} }
//
fun <T> RFBuilder.state(init: () -> T): ReadWriteProperty<Any?, T> = //public fun <T> RFBuilder.memoize(vararg deps: dynamic, builder: () -> T): T = useMemo(builder, deps)
object : ReadWriteProperty<Any?, T> {
val pair = react.useState(init)
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return pair.first
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
pair.second(value)
}
}
fun <T> RFBuilder.memoize(vararg deps: dynamic, builder: () -> T): T = useMemo(builder, deps)

View File

@ -31,7 +31,7 @@ kotlin {
//api("org.jetbrains:kotlin-extensions:1.0.1-pre.105-kotlin-1.3.72") //api("org.jetbrains:kotlin-extensions:1.0.1-pre.105-kotlin-1.3.72")
//api("org.jetbrains:kotlin-css-js:1.0.0-pre.105-kotlin-1.3.72") //api("org.jetbrains:kotlin-css-js:1.0.0-pre.105-kotlin-1.3.72")
api("org.jetbrains:kotlin-styled:5.2.0-pre.123-kotlin-1.4.10") api("org.jetbrains:kotlin-styled:5.2.0-pre.126-kotlin-1.4.10")
api(npm("core-js", "2.6.5")) api(npm("core-js", "2.6.5"))
api(npm("inline-style-prefixer", "5.1.0")) api(npm("inline-style-prefixer", "5.1.0"))

View File

@ -7,7 +7,7 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
api(project(":visionforge-solid")) api(project(":visionforge-solid"))
api("kscience.gdml:gdml:0.2.0-dev-2") api("kscience.gdml:gdml:0.2.0-dev-3")
} }
} }
} }

View File

@ -7,7 +7,6 @@ import hep.dataforge.names.Name
import hep.dataforge.names.asName import hep.dataforge.names.asName
import hep.dataforge.names.plus import hep.dataforge.names.plus
import hep.dataforge.names.toName import hep.dataforge.names.toName
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set import hep.dataforge.vision.set
import hep.dataforge.vision.solid.* import hep.dataforge.vision.solid.*
import hep.dataforge.vision.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import hep.dataforge.vision.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY
@ -20,21 +19,21 @@ import kotlin.random.Random
private val solidsName = "solids".asName() private val solidsName = "solids".asName()
private val volumesName = "volumes".asName() private val volumesName = "volumes".asName()
public class GDMLTransformer internal constructor(val root: GDML) { public class GDMLTransformer internal constructor(public val root: GDML) {
//private val materialCache = HashMap<GDMLMaterial, Meta>() //private val materialCache = HashMap<GDMLMaterial, Meta>()
private val random = Random(222) private val random = Random(222)
enum class Action { public enum class Action {
ADD, ADD,
REJECT, REJECT,
PROTOTYPE PROTOTYPE
} }
var lUnit: LUnit = LUnit.MM public var lUnit: LUnit = LUnit.MM
var aUnit: AUnit = AUnit.RADIAN public var aUnit: AUnit = AUnit.RADIAN
var solidAction: (GDMLSolid) -> Action = { Action.PROTOTYPE } public var solidAction: (GDMLSolid) -> Action = { Action.PROTOTYPE }
var volumeAction: (GDMLGroup) -> Action = { Action.PROTOTYPE } public var volumeAction: (GDMLGroup) -> Action = { Action.PROTOTYPE }
/** /**
* A special group for local templates * A special group for local templates
@ -71,7 +70,7 @@ public class GDMLTransformer internal constructor(val root: GDML) {
private val styleCache = HashMap<Name, Meta>() private val styleCache = HashMap<Name, Meta>()
var solidConfiguration: Solid.(parent: GDMLVolume, solid: GDMLSolid) -> Unit = { parent, _ -> public var solidConfiguration: Solid.(parent: GDMLVolume, solid: GDMLSolid) -> Unit = { parent, _ ->
lUnit = LUnit.CM lUnit = LUnit.CM
if (parent.physVolumes.isNotEmpty()) { if (parent.physVolumes.isNotEmpty()) {
useStyle("opaque") { useStyle("opaque") {
@ -101,7 +100,7 @@ public class GDMLTransformer internal constructor(val root: GDML) {
obj.solidConfiguration(parent, solid) obj.solidConfiguration(parent, solid)
} }
var onFinish: GDMLTransformer.() -> Unit = {} public var onFinish: GDMLTransformer.() -> Unit = {}
private fun <T : Solid> T.withPosition( private fun <T : Solid> T.withPosition(
@ -356,13 +355,13 @@ public class GDMLTransformer internal constructor(val root: GDML) {
return final return final
} }
val result by lazy { public val result: SolidGroup by lazy {
finalize(volume(root.world)) finalize(volume(root.world))
} }
} }
fun GDML.toVision(block: GDMLTransformer.() -> Unit = {}): SolidGroup { public fun GDML.toVision(block: GDMLTransformer.() -> Unit = {}): SolidGroup {
val context = GDMLTransformer(this).apply(block) val context = GDMLTransformer(this).apply(block)
return context.result return context.result
} }
@ -370,7 +369,7 @@ fun GDML.toVision(block: GDMLTransformer.() -> Unit = {}): SolidGroup {
/** /**
* Append gdml node to the group * Append gdml node to the group
*/ */
fun SolidGroup.gdml(gdml: GDML, key: String = "", transformer: GDMLTransformer.() -> Unit = {}) { public fun SolidGroup.gdml(gdml: GDML, key: String = "", transformer: GDMLTransformer.() -> Unit = {}) {
val visual = gdml.toVision(transformer) val visual = gdml.toVision(transformer)
//println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual)) //println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual))
set(key, visual) set(key, visual)

View File

@ -29,7 +29,6 @@ kotlin {
} }
jsMain { jsMain {
dependencies { dependencies {
implementation(project(":ui:bootstrap"))//to be removed later
implementation(npm("three", "0.114.0")) implementation(npm("three", "0.114.0"))
implementation(npm("three-csg-ts", "1.0.1")) implementation(npm("three-csg-ts", "1.0.1"))
api(npm("file-saver", "2.0.2")) api(npm("file-saver", "2.0.2"))

View File

@ -1,7 +1,7 @@
package hep.dataforge.vision.solid package hep.dataforge.vision.solid
import hep.dataforge.meta.* import hep.dataforge.meta.*
import kotlinx.serialization.json.toJson
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals

View File

@ -28,7 +28,7 @@ public external interface ThreeCanvasState : RState {
} }
@JsExport @JsExport
class ThreeCanvasComponent : RComponent<ThreeCanvasProps, ThreeCanvasState>() { public class ThreeCanvasComponent : RComponent<ThreeCanvasProps, ThreeCanvasState>() {
private var canvas: ThreeCanvas? = null private var canvas: ThreeCanvas? = null
@ -62,7 +62,7 @@ class ThreeCanvasComponent : RComponent<ThreeCanvasProps, ThreeCanvasState>() {
} }
} }
fun RBuilder.threeCanvas(object3D: Solid, options: Canvas3DOptions.() -> Unit = {}) { public fun RBuilder.threeCanvas(object3D: Solid, options: Canvas3DOptions.() -> Unit = {}) {
child(ThreeCanvasComponent::class) { child(ThreeCanvasComponent::class) {
attrs { attrs {
this.obj = object3D this.obj = object3D