Cleanup and fix ROOT bug

This commit is contained in:
Alexander Nozik 2023-05-16 21:12:24 +03:00
parent 4ec611eda3
commit c921d5541b
28 changed files with 93 additions and 130 deletions

1
.gitignore vendored
View File

@ -9,4 +9,3 @@ data/
!gradle-wrapper.jar !gradle-wrapper.jar
/kotlin-js-store/yarn.lock /kotlin-js-store/yarn.lock
.

View File

@ -1,3 +1,4 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile
import space.kscience.gradle.isInDevelopment import space.kscience.gradle.isInDevelopment
import space.kscience.gradle.useApache2Licence import space.kscience.gradle.useApache2Licence
import space.kscience.gradle.useSPCTeam import space.kscience.gradle.useSPCTeam
@ -30,6 +31,12 @@ subprojects {
freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers" freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers"
} }
} }
tasks.withType<KotlinJsCompile>{
kotlinOptions{
useEsClasses = true
}
}
} }
ksciencePublish { ksciencePublish {

View File

@ -1,10 +1,8 @@
package ru.mipt.npm.root package ru.mipt.npm.root
import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.*
import space.kscience.dataforge.meta.doubleArray
import space.kscience.dataforge.meta.get
import space.kscience.dataforge.meta.int
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.parseAsName
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.MutableVisionContainer
import space.kscience.visionforge.isEmpty import space.kscience.visionforge.isEmpty
@ -25,6 +23,8 @@ private data class RootToSolidContext(
val prototypeHolder: PrototypeHolder, val prototypeHolder: PrototypeHolder,
val currentLayer: Int = 0, val currentLayer: Int = 0,
val maxLayer: Int = 5, val maxLayer: Int = 5,
val ignoreRootColors: Boolean = false,
val colorCache: MutableMap<Meta, String> = mutableMapOf(),
) )
// converting to XYZ to TaitBryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix // converting to XYZ to TaitBryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
@ -300,7 +300,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid?
layer = context.currentLayer layer = context.currentLayer
val nodes = volume.fNodes val nodes = volume.fNodes
if (nodes.isEmpty() || context.currentLayer >= context.maxLayer) { if (volume.typename != "TGeoVolumeAssembly" && (nodes.isEmpty() || context.currentLayer >= context.maxLayer)) {
//TODO add smart filter //TODO add smart filter
volume.fShape?.let { shape -> volume.fShape?.let { shape ->
addShape(shape, context) addShape(shape, context)
@ -326,6 +326,16 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid?
group.items.values.first().apply { parent = null } group.items.values.first().apply { parent = null }
} else { } else {
group group
}.apply {
volume.fMedium?.let { medium ->
color.set(context.colorCache.getOrPut(medium.meta) { RootColors[11 + context.colorCache.size] })
}
if (!context.ignoreRootColors) {
volume.fFillColor?.let {
properties[MATERIAL_COLOR_KEY] = RootColors[it]
}
}
} }
} }
@ -338,6 +348,7 @@ private fun SolidGroup.addRootVolume(
cache: Boolean = true, cache: Boolean = true,
block: Solid.() -> Unit = {}, block: Solid.() -> Unit = {},
) { ) {
val combinedName = if (volume.fName.isEmpty()) { val combinedName = if (volume.fName.isEmpty()) {
name name
} else if (name == null) { } else if (name == null) {
@ -347,12 +358,7 @@ private fun SolidGroup.addRootVolume(
} }
if (!cache) { if (!cache) {
val group = buildVolume(volume, context)?.apply { val group = buildVolume(volume, context)?.apply(block)
volume.fFillColor?.let {
properties[MATERIAL_COLOR_KEY] = RootColors[it]
}
block()
}
setChild(combinedName?.let { Name.parse(it) }, group) setChild(combinedName?.let { Name.parse(it) }, group)
} else { } else {
val templateName = volumesName + volume.name val templateName = volumesName + volume.name
@ -364,17 +370,17 @@ private fun SolidGroup.addRootVolume(
} }
} }
ref(templateName, name).apply { ref(templateName, name).apply(block)
volume.fFillColor?.let {
properties[MATERIAL_COLOR_KEY] = RootColors[it]
}
block()
}
} }
} }
public fun MutableVisionContainer<Solid>.rootGeo(dGeoManager: DGeoManager): SolidGroup = solidGroup { public fun MutableVisionContainer<Solid>.rootGeo(
val context = RootToSolidContext(this) dGeoManager: DGeoManager,
name: String? = null,
maxLayer: Int = 5,
ignoreRootColors: Boolean = false,
): SolidGroup = solidGroup(name = name?.parseAsName()) {
val context = RootToSolidContext(this, maxLayer = maxLayer, ignoreRootColors = ignoreRootColors)
dGeoManager.fNodes.forEach { node -> dGeoManager.fNodes.forEach { node ->
addRootNode(node, context) addRootNode(node, context)
} }

View File

@ -1,7 +1,7 @@
package ru.mipt.npm.root package ru.mipt.npm.root
public object RootColors { public object RootColors {
private val colorMap = Array<String>(924) { "white" } private val colorMap = MutableList(924) { "white" }
//colorMap[110] = "white" //colorMap[110] = "white"

View File

@ -23,7 +23,7 @@ import ru.mipt.npm.muon.monitor.sim.Cos2TrackGenerator
import ru.mipt.npm.muon.monitor.sim.simulateOne import ru.mipt.npm.muon.monitor.sim.simulateOne
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.Global
import space.kscience.dataforge.context.fetch import space.kscience.dataforge.context.request
import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.misc.DFExperimental
import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.Solids
import java.awt.Desktop import java.awt.Desktop
@ -36,7 +36,7 @@ private val generator = Cos2TrackGenerator(JDKRandomGenerator(223))
fun Application.module(context: Context = Global) { fun Application.module(context: Context = Global) {
val currentDir = File(".").absoluteFile val currentDir = File(".").absoluteFile
environment.log.info("Current directory: $currentDir") environment.log.info("Current directory: $currentDir")
val solidManager = context.fetch(Solids) val solidManager = context.request(Solids)
install(ContentNegotiation) { install(ContentNegotiation) {
json() json()

View File

@ -7,9 +7,14 @@ 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
import space.kscience.dataforge.meta.string import space.kscience.dataforge.meta.string
import space.kscience.visionforge.Colors
import space.kscience.visionforge.html.ResourceLocation
import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.Solids
import java.nio.file.Paths import space.kscience.visionforge.solid.ambientLight
import space.kscience.visionforge.solid.set
import space.kscience.visionforge.solid.solid
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
import kotlin.io.path.Path
import kotlin.io.path.writeText import kotlin.io.path.writeText
@ -34,73 +39,17 @@ fun main() {
println(it) println(it)
} }
val solid = Solids.rootGeo(geo) makeVisionFile(path = Path("data/output.html"), resourceLocation = ResourceLocation.EMBED) {
Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid))
//println(Solids.encodeToString(solid))
makeVisionFile {
vision("canvas") { vision("canvas") {
requirePlugin(Solids) requirePlugin(Solids)
solid solid {
ambientLight {
color.set(Colors.white)
}
rootGeo(geo,"BM@N", maxLayer = 3, ignoreRootColors = true).also {
Path("data/BM@N.vf.json").writeText(Solids.encodeToString(it))
} }
} }
} }
/* SolidGroup {
set(
"Coil",
solid.getPrototype("Coil".asName())!!.apply {
parent = null
} }
)
*//* group("Shade") {
y = 200
color("red")
coneSurface(
bottomOuterRadius = 135,
bottomInnerRadius = 25,
height = 50,
topOuterRadius = 135,
topInnerRadius = 25,
angle = 1.5707964
) {
position = Point3D(79.6, 0, -122.1)
rotation = Point3D(-1.5707964, 0, 0)
} }
coneSurface(
bottomOuterRadius = 135,
bottomInnerRadius = 25,
height = 50,
topOuterRadius = 135,
topInnerRadius = 25,
angle = 1.5707964
) {
position = Point3D(-79.6, 0, -122.1)
rotation = Point3D(1.5707964, 0, -3.1415927)
}
coneSurface(
bottomOuterRadius = 135,
bottomInnerRadius = 25,
height = 50,
topOuterRadius = 135,
topInnerRadius = 25,
angle = 1.5707964
) {
position = Point3D(79.6, 0, 122.1)
rotation = Point3D(1.5707964, 0, 0)
}
coneSurface(
bottomOuterRadius = 135,
bottomInnerRadius = 25,
height = 50,
topOuterRadius = 135,
topInnerRadius = 25,
angle = 1.5707964
) {
position = Point3D(-79.6, 0, 122.1)
rotation = Point3D(-1.5707964, 0, -3.1415927)
}
}*//*
}*/

View File

@ -7,10 +7,11 @@ val dataforgeVersion: String by rootProject.extra
kscience{ kscience{
jvm() jvm()
js() js()
native()
dependencies { dependencies {
api("space.kscience:dataforge-context:$dataforgeVersion") api("space.kscience:dataforge-context:$dataforgeVersion")
api(spclibs.kotlinx.html) api(spclibs.kotlinx.html)
api("org.jetbrains.kotlin-wrappers:kotlin-css") // api("org.jetbrains.kotlin-wrappers:kotlin-css")
} }
testDependencies { testDependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}")

View File

@ -0,0 +1,5 @@
package space.kscience.visionforge
@OptIn(ExperimentalMultiplatform::class)
@OptionalExpectation
public expect annotation class JvmSynchronized()

View File

@ -13,7 +13,6 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.isEmpty import space.kscience.dataforge.names.isEmpty
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import kotlin.jvm.Synchronized
import kotlin.time.Duration import kotlin.time.Duration
/** /**
@ -59,11 +58,11 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty() public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty()
@Synchronized @JvmSynchronized
private fun getOrPutChild(visionName: Name): VisionChangeBuilder = private fun getOrPutChild(visionName: Name): VisionChangeBuilder =
children.getOrPut(visionName) { VisionChangeBuilder() } children.getOrPut(visionName) { VisionChangeBuilder() }
@Synchronized @JvmSynchronized
internal fun reset() { internal fun reset() {
vision = null vision = null
propertyChange = MutableMeta() propertyChange = MutableMeta()

View File

@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import space.kscience.dataforge.names.* import space.kscience.dataforge.names.*
import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY
import kotlin.jvm.Synchronized
@DslMarker @DslMarker
public annotation class VisionBuilder public annotation class VisionBuilder
@ -132,7 +131,7 @@ internal abstract class VisionChildrenImpl(
abstract var items: MutableMap<NameToken, Vision>? abstract var items: MutableMap<NameToken, Vision>?
@Synchronized @JvmSynchronized
private fun buildItems(): MutableMap<NameToken, Vision> { private fun buildItems(): MutableMap<NameToken, Vision> {
if (items == null) { if (items == null) {
items = LinkedHashMap() items = LinkedHashMap()

View File

@ -11,7 +11,6 @@ import space.kscience.dataforge.meta.*
import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.descriptors.get
import space.kscience.dataforge.names.* import space.kscience.dataforge.names.*
import kotlin.jvm.Synchronized
public interface VisionProperties { public interface VisionProperties {
@ -155,7 +154,7 @@ public abstract class AbstractVisionProperties(
override val own: Meta? get() = properties override val own: Meta? get() = properties
@Synchronized @JvmSynchronized
protected fun getOrCreateProperties(): MutableMeta { protected fun getOrCreateProperties(): MutableMeta {
if (properties == null) { if (properties == null) {
//TODO check performance issues //TODO check performance issues

View File

@ -0,0 +1,3 @@
package space.kscience.visionforge
public actual typealias JvmSynchronized = Synchronized

View File

@ -67,9 +67,7 @@ public fun VisionPage.makeFile(
path: Path?, path: Path?,
fileHeaders: ((Path) -> Map<String, HtmlFragment>)? = null, fileHeaders: ((Path) -> Map<String, HtmlFragment>)? = null,
): Path { ): Path {
val actualFile = path?.let { val actualFile = path ?: Files.createTempFile("tempPlot", ".html")
Path.of(System.getProperty("user.home")).resolve(path)
} ?: Files.createTempFile("tempPlot", ".html")
val actualDefaultHeaders = fileHeaders?.invoke(actualFile) val actualDefaultHeaders = fileHeaders?.invoke(actualFile)
val actualHeaders = if (actualDefaultHeaders == null) pageHeaders else actualDefaultHeaders + pageHeaders val actualHeaders = if (actualDefaultHeaders == null) pageHeaders else actualDefaultHeaders + pageHeaders

View File

@ -12,6 +12,6 @@ kscience {
api("space.kscience:gdml:0.4.0") api("space.kscience:gdml:0.4.0")
} }
dependencies(jvmTest) { dependencies(jvmTest) {
implementation("ch.qos.logback:logback-classic:1.2.11") implementation(spclibs.logback.classic)
} }
} }

View File

@ -2,7 +2,7 @@ plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.mpp")
} }
val markdownVersion = "0.2.4" val markdownVersion = "0.4.1"
kscience { kscience {
jvm() jvm()

View File

@ -5,6 +5,7 @@ plugins {
kscience { kscience {
jvm() jvm()
js() js()
native()
useSerialization { useSerialization {
json() json()
} }

View File

@ -6,7 +6,10 @@ 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.dataforge.names.parseAsName
import space.kscience.visionforge.* import space.kscience.visionforge.AbstractVisionGroup
import space.kscience.visionforge.MutableVisionContainer
import space.kscience.visionforge.MutableVisionGroup
import space.kscience.visionforge.VisionBuilder
/** /**
@ -53,7 +56,7 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable
/** /**
* Get a prototype redirecting the request to the parent if prototype is not found. * Get a prototype redirecting the request to the parent if prototype is not found.
* If prototype is a ref, then it is unfolded automatically. * If a prototype is a ref, then it is unfolded automatically.
*/ */
override fun getPrototype(name: Name): Solid? = override fun getPrototype(name: Name): Solid? =
prototypes?.get(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name) prototypes?.get(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name)

View File

@ -10,7 +10,6 @@ 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.request
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.dataforge.names.Name
@ -27,15 +26,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer<Sol
child?.setAsRoot(visionManager) child?.setAsRoot(visionManager)
} }
public companion object : PluginFactory<Solids>, MutableVisionContainer<Solid> { public companion object : PluginFactory<Solids> {
override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP) override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP)
public val default: Solids by lazy {
Context("@Solids") {
plugin(Solids)
}.request(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() {
@ -79,9 +72,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer<Sol
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?) { // override fun setChild(name: Name?, child: Solid?) {
default.setChild(name, child) // 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
Solids.solidGroup { testSolids.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 = Solids.solidGroup { val group = testSolids.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 = Solids.solidGroup{ val group = testSolids.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 = Solids.solidGroup { val group = testSolids.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 = Solids.solidGroup { val group = testSolids.solidGroup {
ambientLight { ambientLight {
color.set(Colors.white) color.set(Colors.white)
intensity = 100.0 intensity = 100.0

View File

@ -7,8 +7,10 @@ import space.kscience.visionforge.getChild
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
internal val testSolids = Global.request(Solids)
class SolidPluginTest { class SolidPluginTest {
val vision = Solids.solidGroup { val vision = testSolids.solidGroup {
box(100, 100, 100, name = "aBox") box(100, 100, 100, name = "aBox")
sphere(100, name = "aSphere") { sphere(100, name = "aSphere") {

View File

@ -62,7 +62,7 @@ class SolidPropertyTest {
@Test @Test
fun testStyleProperty() { fun testStyleProperty() {
var box: Box? = null var box: Box? = null
val group = Solids.solidGroup { val group = testSolids.solidGroup {
styleSheet { styleSheet {
update("testStyle") { update("testStyle") {
"test" put 22 "test" put 22
@ -98,7 +98,7 @@ class SolidPropertyTest {
@Test @Test
fun testReferenceStyleProperty() { fun testReferenceStyleProperty() {
var box: SolidReference? = null var box: SolidReference? = null
val group = Solids.solidGroup { val group = testSolids.solidGroup {
styleSheet { styleSheet {
update("testStyle") { update("testStyle") {
SolidMaterial.MATERIAL_COLOR_KEY put "#555555" SolidMaterial.MATERIAL_COLOR_KEY put "#555555"

View File

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

View File

@ -17,7 +17,7 @@ internal class VisionUpdateTest {
@Test @Test
fun testVisionUpdate() { fun testVisionUpdate() {
val targetVision = Solids.solidGroup { val targetVision = testSolids.solidGroup {
box(200, 200, 200, name = "origin") box(200, 200, 200, name = "origin")
} }
val dif = visionManager.VisionChange { val dif = visionManager.VisionChange {

View File

@ -3,8 +3,7 @@
"OVERRIDING_FINAL_MEMBER", "OVERRIDING_FINAL_MEMBER",
"RETURN_TYPE_MISMATCH_ON_OVERRIDE", "RETURN_TYPE_MISMATCH_ON_OVERRIDE",
"CONFLICTING_OVERLOADS", "CONFLICTING_OVERLOADS",
"EXTERNAL_DELEGATION", "EXTERNAL_DELEGATION"
"NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING"
) )
@file:JsModule("three-csg-ts") @file:JsModule("three-csg-ts")