Cleanup vision root rules

This commit is contained in:
Alexander Nozik 2022-08-14 12:52:18 +03:00
parent eeec89f0e6
commit 34fbb23c60
No known key found for this signature in database
GPG Key ID: F7FCF2DD25C71357
31 changed files with 119 additions and 87 deletions

View File

@ -6,6 +6,7 @@ import space.kscience.dataforge.meta.get
import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.int
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import space.kscience.visionforge.MutableVisionContainer
import space.kscience.visionforge.isEmpty import space.kscience.visionforge.isEmpty
import space.kscience.visionforge.set import space.kscience.visionforge.set
import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.*
@ -262,7 +263,7 @@ private fun SolidGroup.addShape(
val fShape by shape.dObject(::DGeoShape) val fShape by shape.dObject(::DGeoShape)
val fScale by shape.dObject(::DGeoScale) val fScale by shape.dObject(::DGeoScale)
fShape?.let { scaledShape -> fShape?.let { scaledShape ->
group(name?.let { Name.parse(it) }) { solidGroup(name?.let { Name.parse(it) }) {
scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0) scale = Point3D(fScale?.x ?: 1.0, fScale?.y ?: 1.0, fScale?.z ?: 1.0)
addShape(scaledShape, context) addShape(scaledShape, context)
apply(block) apply(block)
@ -294,7 +295,7 @@ private fun SolidGroup.addRootNode(obj: DGeoNode, context: RootToSolidContext) {
} }
private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? { private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? {
val group = SolidGroup { val group = SolidGroup().apply {
//set current layer //set current layer
layer = context.currentLayer layer = context.currentLayer
val nodes = volume.fNodes val nodes = volume.fNodes
@ -372,9 +373,9 @@ private fun SolidGroup.addRootVolume(
} }
} }
public fun DGeoManager.toSolid(): SolidGroup = SolidGroup { public fun MutableVisionContainer<Solid>.rootGeo(dGeoManager: DGeoManager): SolidGroup = solidGroup {
val context = RootToSolidContext(this) val context = RootToSolidContext(this)
fNodes.forEach { node -> dGeoManager.fNodes.forEach { node ->
addRootNode(node, context) addRootNode(node, context)
} }
} }

View File

@ -3,6 +3,7 @@ package ru.mipt.npm.root.serialization
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.asName
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import space.kscience.visionforge.MutableVisionContainer
import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.*
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.atan2 import kotlin.math.atan2
@ -132,7 +133,7 @@ private fun buildGroup(volume: TGeoVolume): SolidGroup {
return if (volume is TGeoVolumeAssemblyRef) { return if (volume is TGeoVolumeAssemblyRef) {
buildGroup(volume.value) buildGroup(volume.value)
} else { } else {
SolidGroup { SolidGroup().apply {
volume.fShape?.let { addShape(it) } volume.fShape?.let { addShape(it) }
volume.fNodes?.let { volume.fNodes?.let {
it.arr.forEach { obj -> it.arr.forEach { obj ->
@ -180,8 +181,8 @@ private fun SolidGroup.volume(volume: TGeoVolume, name: String? = null, cache: B
// } // }
public fun TGeoManager.toSolid(): SolidGroup = SolidGroup { public fun MutableVisionContainer<Solid>.rootGeo(tGeoManager: TGeoManager): SolidGroup = solidGroup {
fNodes.arr.forEach { tGeoManager.fNodes.arr.forEach {
node(it) node(it)
} }
} }

View File

@ -10,10 +10,7 @@ import org.w3c.files.get
import react.Props import react.Props
import react.dom.h2 import react.dom.h2
import react.fc import react.fc
import react.useMemo
import react.useState import react.useState
import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.gdml.Gdml import space.kscience.gdml.Gdml
import space.kscience.gdml.decodeFromString import space.kscience.gdml.decodeFromString
@ -31,14 +28,13 @@ import styled.css
import styled.styledDiv import styled.styledDiv
external interface GDMLAppProps : Props { external interface GDMLAppProps : Props {
var context: Context var solids: Solids
var vision: Solid? var vision: Solid?
var selected: Name? var selected: Name?
} }
@JsExport @JsExport
val GDMLApp = fc<GDMLAppProps>("GDMLApp") { props -> val GDMLApp = fc<GDMLAppProps>("GDMLApp") { props ->
val visionManager = useMemo(props.context) { props.context.fetch(Solids).visionManager }
var deferredVision: Deferred<Solid?> by useState { var deferredVision: Deferred<Solid?> by useState {
CompletableDeferred(props.vision) CompletableDeferred(props.vision)
} }
@ -53,7 +49,7 @@ val GDMLApp = fc<GDMLAppProps>("GDMLApp") { props ->
name.endsWith(".gdml") || name.endsWith(".xml") -> { name.endsWith(".gdml") || name.endsWith(".xml") -> {
val gdml = Gdml.decodeFromString(data) val gdml = Gdml.decodeFromString(data)
gdml.toVision().apply { gdml.toVision().apply {
setAsRoot(visionManager) setAsRoot(props.solids.visionManager)
console.info("Marking layers for file $name") console.info("Marking layers for file $name")
markLayers() markLayers()
ambientLight { ambientLight {
@ -61,7 +57,7 @@ val GDMLApp = fc<GDMLAppProps>("GDMLApp") { props ->
} }
} }
} }
name.endsWith(".json") -> visionManager.decodeFromString(data) name.endsWith(".json") -> props.solids.visionManager.decodeFromString(data)
else -> { else -> {
window.alert("File extension is not recognized: $name") window.alert("File extension is not recognized: $name")
error("File extension is not recognized: $name") error("File extension is not recognized: $name")
@ -82,7 +78,7 @@ val GDMLApp = fc<GDMLAppProps>("GDMLApp") { props ->
} }
child(ThreeCanvasWithControls) { child(ThreeCanvasWithControls) {
attrs { attrs {
this.context = props.context this.solids = props.solids
this.builderOfSolid = deferredVision this.builderOfSolid = deferredVision
this.selected = props.selected this.selected = props.selected
tab("Load") { tab("Load") {

View File

@ -4,11 +4,13 @@ import kotlinx.browser.document
import kotlinx.css.* import kotlinx.css.*
import react.dom.client.createRoot import react.dom.client.createRoot
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch
import space.kscience.gdml.GdmlShowCase import space.kscience.gdml.GdmlShowCase
import space.kscience.visionforge.Application import space.kscience.visionforge.Application
import space.kscience.visionforge.Colors import space.kscience.visionforge.Colors
import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.gdml.toVision
import space.kscience.visionforge.react.render import space.kscience.visionforge.react.render
import space.kscience.visionforge.solid.Solids
import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.ambientLight
import space.kscience.visionforge.solid.set import space.kscience.visionforge.solid.set
import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.solid.three.ThreePlugin
@ -52,7 +54,7 @@ private class GDMLDemoApp : Application {
} }
//println(context.plugins.fetch(VisionManager).encodeToString(vision)) //println(context.plugins.fetch(VisionManager).encodeToString(vision))
attrs { attrs {
this.context = context this.solids = context.fetch(Solids)
this.vision = vision this.vision = vision
} }
} }

View File

@ -4,6 +4,7 @@ import react.dom.client.createRoot
import ringui.SmartTabs import ringui.SmartTabs
import ringui.Tab import ringui.Tab
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch
import space.kscience.plotly.models.Trace import space.kscience.plotly.models.Trace
import space.kscience.plotly.scatter import space.kscience.plotly.scatter
import space.kscience.visionforge.Application import space.kscience.visionforge.Application
@ -51,7 +52,7 @@ private class JsPlaygroundApp : Application {
Tab("gravity") { Tab("gravity") {
GravityDemo { GravityDemo {
attrs { attrs {
this.context = playgroundContext this.solids = playgroundContext.fetch(Solids)
} }
} }
} }
@ -72,7 +73,7 @@ private class JsPlaygroundApp : Application {
child(ThreeCanvasWithControls) { child(ThreeCanvasWithControls) {
val random = Random(112233) val random = Random(112233)
attrs { attrs {
context = playgroundContext solids = playgroundContext.fetch(Solids)
solid { solid {
ambientLight { ambientLight {
color.set(Colors.white) color.set(Colors.white)

View File

@ -4,7 +4,6 @@ import kotlinx.coroutines.launch
import kotlinx.css.* import kotlinx.css.*
import react.Props import react.Props
import react.fc import react.fc
import space.kscience.dataforge.context.Context
import space.kscience.plotly.layout import space.kscience.plotly.layout
import space.kscience.plotly.models.Trace import space.kscience.plotly.models.Trace
import space.kscience.visionforge.Colors import space.kscience.visionforge.Colors
@ -18,7 +17,7 @@ import styled.styledDiv
import kotlin.math.sqrt import kotlin.math.sqrt
external interface DemoProps : Props { external interface DemoProps : Props {
var context: Context var solids: Solids
} }
val GravityDemo = fc<DemoProps> { props -> val GravityDemo = fc<DemoProps> { props ->
@ -40,7 +39,7 @@ val GravityDemo = fc<DemoProps> { props ->
} }
child(ThreeCanvasWithControls) { child(ThreeCanvasWithControls) {
attrs { attrs {
context = props.context solids = props.solids
solid { solid {
pointLight(200, 200, 200, name = "light"){ pointLight(200, 200, 200, name = "light"){
color.set(Colors.white) color.set(Colors.white)
@ -52,7 +51,7 @@ val GravityDemo = fc<DemoProps> { props ->
color.set("red") color.set("red")
val h = 100.0 val h = 100.0
y = h y = h
context.launch { solids.context.launch {
val g = 10.0 val g = 10.0
val dt = 0.1 val dt = 0.1
var time = 0.0 var time = 0.0

View File

@ -15,7 +15,7 @@ class Model(val manager: VisionManager) {
private val events = HashSet<Event>() private val events = HashSet<Event>()
private fun MutableVisionContainer<Solid>.pixel(pixel: SC1) { private fun MutableVisionContainer<Solid>.pixel(pixel: SC1) {
val group = group(pixel.name) { val group = solidGroup(pixel.name) {
position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z) position = Point3D(pixel.center.x, pixel.center.y, pixel.center.z)
box(pixel.xSize, pixel.ySize, pixel.zSize) box(pixel.xSize, pixel.ySize, pixel.zSize)
label(pixel.name) { label(pixel.name) {
@ -27,7 +27,7 @@ class Model(val manager: VisionManager) {
} }
private fun SolidGroup.detector(detector: SC16) { private fun SolidGroup.detector(detector: SC16) {
group(detector.name) { solidGroup(detector.name) {
detector.pixels.forEach { detector.pixels.forEach {
pixel(it) pixel(it)
} }
@ -42,24 +42,24 @@ class Model(val manager: VisionManager) {
color.set("darkgreen") color.set("darkgreen")
} }
rotationX = PI / 2 rotationX = PI / 2
group("bottom") { solidGroup("bottom") {
Monitor.detectors.filter { it.center.z == LOWER_LAYER_Z }.forEach { Monitor.detectors.filter { it.center.z == LOWER_LAYER_Z }.forEach {
detector(it) detector(it)
} }
} }
group("middle") { solidGroup("middle") {
Monitor.detectors.filter { it.center.z == CENTRAL_LAYER_Z }.forEach { Monitor.detectors.filter { it.center.z == CENTRAL_LAYER_Z }.forEach {
detector(it) detector(it)
} }
} }
group("top") { solidGroup("top") {
Monitor.detectors.filter { it.center.z == UPPER_LAYER_Z }.forEach { Monitor.detectors.filter { it.center.z == UPPER_LAYER_Z }.forEach {
detector(it) detector(it)
} }
} }
tracks = group("tracks") tracks = solidGroup("tracks")
} }
private fun highlight(pixel: String) { private fun highlight(pixel: String) {

View File

@ -49,7 +49,7 @@ fun main() {
} }
vision("form") { form } vision("form") { form }
form.onPropertyChange { _, _ -> form.onPropertyChange {
println(this) println(this)
} }
} }

View File

@ -1,8 +1,8 @@
package space.kscience.visionforge.examples package space.kscience.visionforge.examples
import ru.mipt.npm.root.DGeoManager import ru.mipt.npm.root.DGeoManager
import ru.mipt.npm.root.rootGeo
import ru.mipt.npm.root.serialization.TGeoManager import ru.mipt.npm.root.serialization.TGeoManager
import ru.mipt.npm.root.toSolid
import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.Meta
import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.get
import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.meta.isLeaf
@ -34,7 +34,7 @@ fun main() {
println(it) println(it)
} }
val solid = geo.toSolid() val solid = Solids.rootGeo(geo)
Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid)) Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid))
//println(Solids.encodeToString(solid)) //println(Solids.encodeToString(solid))

View File

@ -15,7 +15,7 @@ group = "ru.mipt.npm"
dependencies{ dependencies{
implementation(project(":visionforge-threejs:visionforge-threejs-server")) implementation(project(":visionforge-threejs:visionforge-threejs-server"))
implementation("ch.qos.logback:logback-classic:1.2.3") implementation("ch.qos.logback:logback-classic:1.2.11")
} }
application { application {

View File

@ -6,7 +6,7 @@ import space.kscience.visionforge.style
import space.kscience.visionforge.useStyle import space.kscience.visionforge.useStyle
import kotlin.math.PI import kotlin.math.PI
internal fun visionOfSatellite( internal fun Solids.visionOfSatellite(
layers: Int = 10, layers: Int = 10,
layerHeight: Number = 10, layerHeight: Number = 10,
xSegments: Int = 3, xSegments: Int = 3,
@ -14,7 +14,7 @@ internal fun visionOfSatellite(
xSegmentSize: Number = 30, xSegmentSize: Number = 30,
ySegmentSize: Number = xSegmentSize, ySegmentSize: Number = xSegmentSize,
fiberDiameter: Number = 1.0, fiberDiameter: Number = 1.0,
): SolidGroup = SolidGroup { ): SolidGroup = solidGroup {
color.set("darkgreen") color.set("darkgreen")
val transparent by style { val transparent by style {
this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3 this[SolidMaterial.MATERIAL_OPACITY_KEY] = 0.3
@ -31,7 +31,7 @@ internal fun visionOfSatellite(
val totalXSize = xSegments * xSegmentSize.toDouble() val totalXSize = xSegments * xSegmentSize.toDouble()
val totalYSize = ySegments * ySegmentSize.toDouble() val totalYSize = ySegments * ySegmentSize.toDouble()
for (layer in 1..layers) { for (layer in 1..layers) {
group("layer[$layer]") { solidGroup("layer[$layer]") {
for (i in 1..xSegments) { for (i in 1..xSegments) {
for (j in 1..ySegments) { for (j in 1..ySegments) {
box(xSegmentSize, ySegmentSize, layerHeight, name = "segment[$i,$j]") { box(xSegmentSize, ySegmentSize, layerHeight, name = "segment[$i,$j]") {
@ -42,7 +42,7 @@ internal fun visionOfSatellite(
} }
} }
} }
group("fibers") { solidGroup("fibers") {
for (i in 1..xSegments) { for (i in 1..xSegments) {
cylinder(fiberDiameter, totalYSize) { cylinder(fiberDiameter, totalYSize) {
useStyle(red) useStyle(red)

View File

@ -5,6 +5,8 @@ import kotlinx.coroutines.*
import kotlinx.html.div import kotlinx.html.div
import kotlinx.html.h1 import kotlinx.html.h1
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.fetch
import space.kscience.dataforge.misc.DFExperimental
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.visionforge.html.Page import space.kscience.visionforge.html.Page
import space.kscience.visionforge.html.plus import space.kscience.visionforge.html.plus
@ -17,13 +19,16 @@ import space.kscience.visionforge.visionManager
import kotlin.random.Random import kotlin.random.Random
@OptIn(DFExperimental::class)
fun main() { fun main() {
val satContext = Context("sat") { val satContext = Context("sat") {
plugin(Solids) plugin(Solids)
} }
val solids = satContext.fetch(Solids)
//Create a geometry //Create a geometry
val sat = visionOfSatellite(ySegments = 3) val sat = solids.visionOfSatellite(ySegments = 3)
val server = satContext.visionManager.serve { val server = satContext.visionManager.serve {
page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) { page(header = Page.threeJsHeader + Page.styleSheetHeader("css/styles.css")) {

View File

@ -5,7 +5,6 @@ import space.kscience.dataforge.meta.Meta
import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.meta.invoke
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.visionforge.Colors import space.kscience.visionforge.Colors
import space.kscience.visionforge.setAsRoot
import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.*
import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.specifications.Canvas3DOptions
import space.kscience.visionforge.visible import space.kscience.visionforge.visible
@ -19,11 +18,11 @@ fun VisionLayout<Solid>.demo(name: String, title: String = name, block: SolidGro
val meta = Meta { val meta = Meta {
"title" put title "title" put title
} }
val vision = SolidGroup(block).apply { val vision = solids.solidGroup {
block()
ambientLight{ ambientLight{
color.set(Colors.white) color.set(Colors.white)
} }
setAsRoot(solids.visionManager)
} }
render(Name.parse(name), vision, meta) render(Name.parse(name), vision, meta)
} }
@ -69,7 +68,7 @@ fun VisionLayout<Solid>.showcase() {
} }
demo("dynamic", "Dynamic properties") { demo("dynamic", "Dynamic properties") {
val group = group { val group = solidGroup {
box(100, 100, 100) { box(100, 100, 100) {
z = 110.0 z = 110.0
opacity = 0.5 opacity = 0.5
@ -101,7 +100,7 @@ fun VisionLayout<Solid>.showcase() {
demo("rotation", "Rotations") { demo("rotation", "Rotations") {
box(100, 100, 100) box(100, 100, 100)
group { solidGroup {
x = 200 x = 200
rotationY = PI / 4 rotationY = PI / 4
box(100, 100, 100) { box(100, 100, 100) {

View File

@ -1,7 +1,7 @@
kotlin.code.style=official kotlin.code.style=official
kotlin.mpp.stability.nowarn=true kotlin.mpp.stability.nowarn=true
kotlin.jupyter.add.scanner=false kotlin.jupyter.add.scanner=false
#kotlin.incremental.js.ir=true kotlin.incremental.js.ir=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4G org.gradle.jvmargs=-Xmx4G

View File

@ -10,7 +10,6 @@ import react.dom.div
import react.dom.p import react.dom.p
import react.dom.span import react.dom.span
import ringui.* import ringui.*
import space.kscience.dataforge.context.Context
import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.get
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.NameToken
@ -20,21 +19,25 @@ import space.kscience.visionforge.*
import space.kscience.visionforge.react.* import space.kscience.visionforge.react.*
import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solid
import space.kscience.visionforge.solid.SolidGroup import space.kscience.visionforge.solid.SolidGroup
import space.kscience.visionforge.solid.Solids
import space.kscience.visionforge.solid.solidGroup
import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.specifications.Canvas3DOptions
import styled.css import styled.css
import styled.styledDiv import styled.styledDiv
public external interface ThreeCanvasWithControlsProps : Props { public external interface ThreeCanvasWithControlsProps : Props {
public var context: Context public var solids: Solids
public var builderOfSolid: Deferred<Solid?> public var builderOfSolid: Deferred<Solid?>
public var selected: Name? public var selected: Name?
public var options: Canvas3DOptions? public var options: Canvas3DOptions?
public var additionalTabs: Map<String, RBuilder.() -> Unit>? public var additionalTabs: Map<String, RBuilder.() -> Unit>?
} }
private val ThreeCanvasWithControlsProps.context get() = solids.context
public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) {
builderOfSolid = context.async { builderOfSolid = context.async {
SolidGroup(block) solids.solidGroup(null, block)
} }
} }

View File

@ -29,7 +29,7 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer {
createRoot(element).render { createRoot(element).render {
child(ThreeCanvasWithControls) { child(ThreeCanvasWithControls) {
attrs { attrs {
this.context = this@ThreeWithControlsPlugin.context this.solids = three.solids
this.builderOfSolid = context.async { vision as Solid} this.builderOfSolid = context.async { vision as Solid}
} }
} }

View File

@ -8,6 +8,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.descriptors.value
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.NameToken
import space.kscience.dataforge.names.parseAsName
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import space.kscience.visionforge.Vision.Companion.STYLE_KEY import space.kscience.visionforge.Vision.Companion.STYLE_KEY
@ -95,19 +96,19 @@ public class SimpleVisionGroup : AbstractVisionGroup(), MutableVisionContainer<V
} }
@VisionBuilder @VisionBuilder
public fun MutableVisionContainer<Vision>.group( public inline fun MutableVisionContainer<Vision>.group(
name: Name? = null, name: Name? = null,
builder: SimpleVisionGroup.() -> Unit = {}, builder: SimpleVisionGroup.() -> Unit = {},
): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } ): SimpleVisionGroup = SimpleVisionGroup().also { setChild(name, it) }.apply(builder)
/** /**
* Define a group with given [name], attach it to this parent and return it. * Define a group with given [name], attach it to this parent and return it.
*/ */
@VisionBuilder @VisionBuilder
public fun MutableVisionContainer<Vision>.group( public inline fun MutableVisionContainer<Vision>.group(
name: String, name: String,
builder: SimpleVisionGroup.() -> Unit = {}, builder: SimpleVisionGroup.() -> Unit = {},
): SimpleVisionGroup = SimpleVisionGroup().apply(builder).also { setChild(name, it) } ): SimpleVisionGroup = group(name.parseAsName(), builder)
//fun VisualObject.findStyle(styleName: Name): Meta? { //fun VisualObject.findStyle(styleName: Name): Meta? {
// if (this is VisualGroup) { // if (this is VisualGroup) {

View File

@ -65,6 +65,7 @@ public class VisionClient : AbstractPlugin() {
private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) { private fun renderVision(name: String, element: Element, vision: Vision?, outputMeta: Meta) {
if (vision != null) { if (vision != null) {
vision.setAsRoot(visionManager)
val renderer = findRendererFor(vision) val renderer = findRendererFor(vision)
?: error("Could not find renderer for ${visionManager.encodeToString(vision)}") ?: error("Could not find renderer for ${visionManager.encodeToString(vision)}")
renderer.render(element, vision, outputMeta) renderer.render(element, vision, outputMeta)

View File

@ -29,7 +29,7 @@ private class GdmlLoader(val settings: GdmlLoaderOptions) {
*/ */
private val proto = SolidGroup() private val proto = SolidGroup()
private val solids = proto.group(solidsName) { private val solids = proto.solidGroup(solidsName) {
properties["edges.enabled"] = false properties["edges.enabled"] = false
} }

View File

@ -26,7 +26,7 @@ public inline fun MutableVisionContainer<Solid>.composite(
name: String? = null, name: String? = null,
@VisionBuilder builder: SolidGroup.() -> Unit, @VisionBuilder builder: SolidGroup.() -> Unit,
): Composite { ): Composite {
val group = SolidGroup(builder) val group = SolidGroup().apply(builder)
val children = group.items.values.toList() val children = group.items.values.toList()
if (children.size != 2) { if (children.size != 2) {
error("Composite requires exactly two children, but found ${children.size}") error("Composite requires exactly two children, but found ${children.size}")
@ -48,7 +48,7 @@ public fun SolidGroup.smartComposite(
name: String? = null, name: String? = null,
@VisionBuilder builder: SolidGroup.() -> Unit, @VisionBuilder builder: SolidGroup.() -> Unit,
): Solid = if (type == CompositeType.GROUP) { ): Solid = if (type == CompositeType.GROUP) {
val group = SolidGroup(builder) val group = SolidGroup().apply(builder)
if (name == null && group.properties.own == null) { if (name == null && group.properties.own == null) {
//append directly to group if no properties are defined //append directly to group if no properties are defined
group.items.forEach { (_, value) -> group.items.forEach { (_, value) ->

View File

@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable
import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.NameToken
import space.kscience.dataforge.names.parseAsName
import space.kscience.visionforge.* import space.kscience.visionforge.*
@ -30,7 +31,8 @@ public interface PrototypeHolder {
*/ */
@Serializable @Serializable
@SerialName("group.solid") @SerialName("group.solid")
public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, MutableVisionGroup, MutableVisionContainer<Solid> { public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, MutableVisionGroup,
MutableVisionContainer<Solid> {
public val items: Map<NameToken, Solid> public val items: Map<NameToken, Solid>
get() = children.keys.mapNotNull { get() = children.keys.mapNotNull {
@ -79,19 +81,18 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable
} }
} }
public inline fun SolidGroup(block: SolidGroup.() -> Unit): SolidGroup = SolidGroup().apply(block)
@VisionBuilder @VisionBuilder
public fun MutableVisionContainer<Solid>.group( public inline fun MutableVisionContainer<Solid>.solidGroup(
name: Name? = null, name: Name? = null,
builder: SolidGroup.() -> Unit = {}, builder: SolidGroup.() -> Unit = {},
): SolidGroup = SolidGroup(builder).also { setChild(name, it) } ): SolidGroup = SolidGroup().also { setChild(name, it) }.apply(builder)
//root first, update later
/** /**
* Define a group with given [name], attach it to this parent and return it. * Define a group with given [name], attach it to this parent and return it.
*/ */
@VisionBuilder @VisionBuilder
public fun MutableVisionContainer<Solid>.group( public inline fun MutableVisionContainer<Solid>.solidGroup(
name: String, name: String,
action: SolidGroup.() -> Unit = {}, action: SolidGroup.() -> Unit = {},
): SolidGroup = SolidGroup(action).also { setChild(name, it) } ): SolidGroup = solidGroup(name.parseAsName(), action)

View File

@ -71,24 +71,30 @@ public class SolidReference(
} }
}.distinct().asValue() }.distinct().asValue()
} }
//1. resolve own properties
properties?.getValue(name)?.let { return it } properties?.getValue(name)?.let { return it }
val descriptor = descriptor?.get(name) val descriptor = descriptor?.get(name)
val inheritFlag = inherit ?: descriptor?.inherited ?: false val inheritFlag = inherit ?: descriptor?.inherited ?: false
val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true
if (stylesFlag) { //2. Resolve prototype onw properties
getStyleProperty(name)?.value?.let { return it }
}
if (inheritFlag) {
parent?.properties?.getValue(name, inherit, includeStyles)?.let { return it }
}
prototype.properties.getValue(name, inheritFlag, stylesFlag)?.let { return it } prototype.properties.getValue(name, inheritFlag, stylesFlag)?.let { return it }
if (stylesFlag) {
//3. own styles
own?.getValue(Vision.STYLE_KEY)?.list?.forEach { styleName ->
getStyle(styleName.string)?.getValue(name)?.let { return it }
}
//4. prototype styles
prototype.getStyleProperty(name)?.value?.let { return it }
}
if(inheritFlag){ if(inheritFlag){
//5. own inheritance
parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it } parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it }
//6. prototype inheritance
prototype.parent?.properties?.getValue(name, inheritFlag, includeStyles)?.let { return it }
} }
return null return null

View File

@ -10,22 +10,34 @@ import kotlinx.serialization.serializer
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginFactory
import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.context.PluginTag
import space.kscience.dataforge.context.fetch
import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.Meta
import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.misc.DFExperimental
import space.kscience.dataforge.names.Name
import space.kscience.visionforge.* import space.kscience.visionforge.*
import space.kscience.visionforge.html.VisionOutput import space.kscience.visionforge.html.VisionOutput
import kotlin.reflect.KClass import kotlin.reflect.KClass
public class Solids(meta: Meta) : VisionPlugin(meta) { public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer<Solid> {
override val tag: PluginTag get() = Companion.tag override val tag: PluginTag get() = Companion.tag
override val visionSerializersModule: SerializersModule get() = serializersModuleForSolids override val visionSerializersModule: SerializersModule get() = serializersModuleForSolids
public companion object : PluginFactory<Solids> { override fun setChild(name: Name?, child: Solid?) {
child?.setAsRoot(visionManager)
}
public companion object : PluginFactory<Solids>, MutableVisionContainer<Solid> {
override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP)
override val type: KClass<out Solids> = Solids::class override val type: KClass<out Solids> = Solids::class
public val default: Solids by lazy {
Context("@Solids"){
plugin(Solids)
}.fetch(Solids)
}
override fun build(context: Context, meta: Meta): Solids = Solids(meta) override fun build(context: Context, meta: Meta): Solids = Solids(meta)
private fun PolymorphicModuleBuilder<Solid>.solids() { private fun PolymorphicModuleBuilder<Solid>.solids() {
@ -68,6 +80,10 @@ public class Solids(meta: Meta) : VisionPlugin(meta) {
public fun decodeFromString(str: String): Solid = public fun decodeFromString(str: String): Solid =
jsonForSolids.decodeFromString(PolymorphicSerializer(Solid::class), str) jsonForSolids.decodeFromString(PolymorphicSerializer(Solid::class), str)
override fun setChild(name: Name?, child: Solid?) {
default.setChild(name, child)
}
} }
} }

View File

@ -8,7 +8,7 @@ class CompositeTest {
@Test @Test
fun testCompositeBuilder(){ fun testCompositeBuilder(){
lateinit var composite: Composite lateinit var composite: Composite
SolidGroup { Solids.solidGroup {
composite = composite(CompositeType.INTERSECT) { composite = composite(CompositeType.INTERSECT) {
y = 300 y = 300
box(100, 100, 100) { box(100, 100, 100) {

View File

@ -11,7 +11,7 @@ class ConvexTest {
@Suppress("UNUSED_VARIABLE") @Suppress("UNUSED_VARIABLE")
@Test @Test
fun testConvexBuilder() { fun testConvexBuilder() {
val group = SolidGroup{ val group = Solids.solidGroup {
convex { convex {
point(50, 50, -50) point(50, 50, -50)
point(50, -50, -50) point(50, -50, -50)

View File

@ -9,7 +9,7 @@ import kotlin.test.assertEquals
class GroupTest { class GroupTest {
@Test @Test
fun testGroupWithComposite() { fun testGroupWithComposite() {
val group = SolidGroup{ val group = Solids.solidGroup{
union("union") { union("union") {
box(100, 100, 100) { box(100, 100, 100) {
z = 100 z = 100

View File

@ -41,7 +41,7 @@ class SerializationTest {
x = 100 x = 100
z = -100 z = -100
} }
val group = SolidGroup { val group = Solids.solidGroup {
newRef("cube", cube) newRef("cube", cube)
refGroup("pg", Name.parse("pg.content")) { refGroup("pg", Name.parse("pg.content")) {
sphere(50) { sphere(50) {
@ -57,7 +57,7 @@ class SerializationTest {
@Test @Test
fun lightSerialization(){ fun lightSerialization(){
val group = SolidGroup { val group = Solids.solidGroup {
ambientLight { ambientLight {
color.set(Colors.white) color.set(Colors.white)
intensity = 100.0 intensity = 100.0

View File

@ -8,7 +8,7 @@ import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
class SolidPluginTest { class SolidPluginTest {
val vision = SolidGroup { val vision = Solids.solidGroup {
box(100, 100, 100, name = "aBox") box(100, 100, 100, name = "aBox")
sphere(100, name = "aSphere") { sphere(100, name = "aSphere") {

View File

@ -52,7 +52,7 @@ class SolidPropertyTest {
var box: Box? = null var box: Box? = null
val group = SolidGroup().apply { val group = SolidGroup().apply {
properties["test"] = 22 properties["test"] = 22
group { solidGroup {
box = box(100, 100, 100) box = box(100, 100, 100)
} }
} }
@ -62,13 +62,13 @@ class SolidPropertyTest {
@Test @Test
fun testStyleProperty() { fun testStyleProperty() {
var box: Box? = null var box: Box? = null
val group = SolidGroup { val group = Solids.solidGroup {
styleSheet { styleSheet {
update("testStyle") { update("testStyle") {
"test" put 22 "test" put 22
} }
} }
group { solidGroup {
box = box(100, 100, 100) { box = box(100, 100, 100) {
useStyle("testStyle") useStyle("testStyle")
} }
@ -86,7 +86,7 @@ class SolidPropertyTest {
SolidMaterial.MATERIAL_COLOR_KEY put "#555555" SolidMaterial.MATERIAL_COLOR_KEY put "#555555"
} }
} }
group { solidGroup {
box = box(100, 100, 100) { box = box(100, 100, 100) {
useStyle("testStyle") useStyle("testStyle")
} }
@ -98,7 +98,7 @@ class SolidPropertyTest {
@Test @Test
fun testReferenceStyleProperty() { fun testReferenceStyleProperty() {
var box: SolidReference? = null var box: SolidReference? = null
val group = SolidGroup { val group = Solids.solidGroup {
styleSheet { styleSheet {
update("testStyle") { update("testStyle") {
SolidMaterial.MATERIAL_COLOR_KEY put "#555555" SolidMaterial.MATERIAL_COLOR_KEY put "#555555"
@ -109,7 +109,7 @@ class SolidPropertyTest {
styles = listOf("testStyle") styles = listOf("testStyle")
} }
} }
group { solidGroup {
box = ref("box".asName()) box = ref("box".asName())
} }
} }

View File

@ -11,7 +11,7 @@ import kotlin.test.assertEquals
@DFExperimental @DFExperimental
class SolidReferenceTest { class SolidReferenceTest {
val groupWithReference = SolidGroup { val groupWithReference = Solids.solidGroup {
val theStyle by style { val theStyle by style {
SolidMaterial.MATERIAL_COLOR_KEY put "red" SolidMaterial.MATERIAL_COLOR_KEY put "red"
} }

View File

@ -17,11 +17,11 @@ internal class VisionUpdateTest {
@Test @Test
fun testVisionUpdate(){ fun testVisionUpdate(){
val targetVision = SolidGroup { val targetVision = Solids.solidGroup {
box(200,200,200, name = "origin") box(200,200,200, name = "origin")
} }
val dif = visionManager.VisionChange{ val dif = visionManager.VisionChange{
group ("top") { solidGroup ("top") {
color.set(123) color.set(123)
box(100,100,100) box(100,100,100)
} }
@ -37,7 +37,7 @@ internal class VisionUpdateTest {
@Test @Test
fun testVisionChangeSerialization(){ fun testVisionChangeSerialization(){
val change = visionManager.VisionChange{ val change = visionManager.VisionChange{
group("top") { solidGroup("top") {
color.set(123) color.set(123)
box(100,100,100) box(100,100,100)
} }