Polyhedra shape
This commit is contained in:
parent
3f47167c9d
commit
8fecd7647b
@ -1,31 +0,0 @@
|
|||||||
//package hep.dataforge.vis.spatial.gdml
|
|
||||||
//
|
|
||||||
//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.names.Name
|
|
||||||
//import hep.dataforge.names.toName
|
|
||||||
//import hep.dataforge.vis.spatial.three.ThreeFactory
|
|
||||||
//import hep.dataforge.vis.spatial.three.ThreePlugin
|
|
||||||
//import kotlin.reflect.KClass
|
|
||||||
//
|
|
||||||
//class GDMLPlugin : AbstractPlugin() {
|
|
||||||
// override val tag: PluginTag get() = GDMLPlugin.tag
|
|
||||||
//
|
|
||||||
// override fun dependsOn() = listOf(ThreePlugin)
|
|
||||||
//
|
|
||||||
// override fun provideTop(target: String): Map<Name, Any> {
|
|
||||||
// return when(target){
|
|
||||||
// ThreeFactory.TYPE-> mapOf("gdml".toName() to ThreeGDMLFactory)
|
|
||||||
// else -> emptyMap()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// companion object : PluginFactory<GDMLPlugin> {
|
|
||||||
// override val tag = PluginTag("vis.gdml", "hep.dataforge")
|
|
||||||
// override val type: KClass<GDMLPlugin> = GDMLPlugin::class
|
|
||||||
// override fun invoke(meta: Meta) = GDMLPlugin()
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -0,0 +1,16 @@
|
|||||||
|
package hep.dataforge.vis.spatial.gdml
|
||||||
|
|
||||||
|
import hep.dataforge.meta.Meta
|
||||||
|
import hep.dataforge.vis.common.DisplayLeaf
|
||||||
|
import hep.dataforge.vis.common.VisualObject
|
||||||
|
import hep.dataforge.vis.spatial.GeometryBuilder
|
||||||
|
import hep.dataforge.vis.spatial.Shape
|
||||||
|
|
||||||
|
class Polyhedra(parent: VisualObject?, meta: Meta) : DisplayLeaf(parent, meta), Shape {
|
||||||
|
|
||||||
|
|
||||||
|
override fun <T : Any> toGeometry(geometryBuilder: GeometryBuilder<T>) {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,92 +0,0 @@
|
|||||||
//package hep.dataforge.vis.spatial.gdml
|
|
||||||
//
|
|
||||||
//import hep.dataforge.meta.Meta
|
|
||||||
//import hep.dataforge.meta.buildMeta
|
|
||||||
//import hep.dataforge.meta.toDynamic
|
|
||||||
//import hep.dataforge.meta.values
|
|
||||||
//import hep.dataforge.vis.common.DisplayLeaf
|
|
||||||
//import hep.dataforge.vis.common.VisualObject
|
|
||||||
//import hep.dataforge.vis.common.int
|
|
||||||
//import hep.dataforge.vis.spatial.three.MeshThreeFactory
|
|
||||||
////import hep.dataforge.vis.spatial.jsroot.createCubeBuffer
|
|
||||||
////import hep.dataforge.vis.spatial.jsroot.createGeometry
|
|
||||||
////import hep.dataforge.vis.spatial.jsroot.createTubeBuffer
|
|
||||||
////import hep.dataforge.vis.spatial.jsroot.createXtruBuffer
|
|
||||||
//import info.laht.threekt.core.BufferGeometry
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//class GDMLShape(parent: VisualObject?, meta: Meta, val shape: GDMLSolid) :
|
|
||||||
// DisplayLeaf(parent, meta) {
|
|
||||||
//
|
|
||||||
// var facesLimit by int(0)
|
|
||||||
//
|
|
||||||
// companion object {
|
|
||||||
// const val TYPE = "geometry.3d.gdml"
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//object ThreeGDMLFactory : MeshThreeFactory<GDMLShape>(GDMLShape::class) {
|
|
||||||
// //TODO fix ineffective conversion
|
|
||||||
// private fun Meta?.toJsRoot() = this?.let {
|
|
||||||
// buildMeta {
|
|
||||||
// values().forEach { (name, value) ->
|
|
||||||
// name.toString().replaceFirst("p", "f") to value
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// override fun buildGeometry(obj: GDMLShape): BufferGeometry {
|
|
||||||
// return when (obj.shape) {
|
|
||||||
// is GDMLBox -> createCubeBuffer(
|
|
||||||
// obj.shape.config.toJsRoot()?.toDynamic(),
|
|
||||||
// obj.facesLimit
|
|
||||||
// )
|
|
||||||
// is GDMLTube -> createTubeBuffer(
|
|
||||||
// obj.shape.config.toJsRoot()?.toDynamic(),
|
|
||||||
// obj.facesLimit
|
|
||||||
// )
|
|
||||||
// is GDMLXtru -> {
|
|
||||||
// val meta = buildMeta {
|
|
||||||
// val vertices = obj.shape.vertices
|
|
||||||
// val zs = obj.shape.sections.sortedBy { it.zOrder!! }
|
|
||||||
// "fNz" to zs.size
|
|
||||||
// "fNvert" to vertices.size
|
|
||||||
// "fX" to vertices.map { it.x }
|
|
||||||
// "fY" to vertices.map { it.y }
|
|
||||||
// "fX0" to zs.map { it.xOffsset }
|
|
||||||
// "fY0" to zs.map { it.yOffset }
|
|
||||||
// "fZ" to zs.map { it.zPosition!! }
|
|
||||||
// "fScale" to zs.map { it.scalingFactor }
|
|
||||||
// }
|
|
||||||
// createXtruBuffer(meta.toDynamic(), obj.facesLimit)
|
|
||||||
// }
|
|
||||||
// is GDMLUnion -> {
|
|
||||||
// val meta = buildMeta {
|
|
||||||
// "fNode.fLeft" to obj.shape.first()?.config.toJsRoot()
|
|
||||||
// "fNode.fRight" to obj.shape.second()?.config.toJsRoot()
|
|
||||||
// "fNode._typename" to "TGeoUnion"
|
|
||||||
// }
|
|
||||||
// createGeometry(meta.toDynamic(), obj.facesLimit)
|
|
||||||
// }
|
|
||||||
// is GDMLSubtraction -> {
|
|
||||||
// val meta = buildMeta {
|
|
||||||
// "fNode.fLeft" to obj.shape.first()?.config.toJsRoot()
|
|
||||||
// "fNode.fRight" to obj.shape.second()?.config.toJsRoot()
|
|
||||||
// "fNode._typename" to "TGeoSubtraction"
|
|
||||||
// }
|
|
||||||
// createGeometry(meta.toDynamic(), obj.facesLimit)
|
|
||||||
// }
|
|
||||||
// is GDMLIntersection -> {
|
|
||||||
// val meta = buildMeta {
|
|
||||||
// "fNode.fLeft" to obj.shape.first()?.config.toJsRoot()
|
|
||||||
// "fNode.fRight" to obj.shape.second()?.config.toJsRoot()
|
|
||||||
// "fNode._typename" to "TGeoIntersection"
|
|
||||||
// }
|
|
||||||
// createGeometry(meta.toDynamic(), obj.facesLimit)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -7,6 +7,8 @@ import hep.dataforge.vis.common.VisualObject
|
|||||||
import hep.dataforge.vis.common.color
|
import hep.dataforge.vis.common.color
|
||||||
import hep.dataforge.vis.spatial.*
|
import hep.dataforge.vis.spatial.*
|
||||||
import scientifik.gdml.*
|
import scientifik.gdml.*
|
||||||
|
import kotlin.math.cos
|
||||||
|
import kotlin.math.sin
|
||||||
|
|
||||||
|
|
||||||
private fun VisualObject.applyPosition(pos: GDMLPosition): VisualObject = apply {
|
private fun VisualObject.applyPosition(pos: GDMLPosition): VisualObject = apply {
|
||||||
@ -28,7 +30,14 @@ private fun VisualGroup.addSolid(root: GDML, solid: GDMLSolid, block: VisualObje
|
|||||||
is GDMLBox -> box(solid.x, solid.y, solid.z)
|
is GDMLBox -> box(solid.x, solid.y, solid.z)
|
||||||
is GDMLTube -> TODO()
|
is GDMLTube -> TODO()
|
||||||
is GDMLXtru -> extrude {
|
is GDMLXtru -> extrude {
|
||||||
TODO()
|
shape {
|
||||||
|
solid.vertices.forEach {
|
||||||
|
point(it.x, it.y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
solid.sections.sortedBy { it.zOrder }.forEach { section ->
|
||||||
|
layer(section.zPosition ?: 0f, section.xOffset, section.yOffset, section.scalingFactor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is GDMLScaledSolid -> {
|
is GDMLScaledSolid -> {
|
||||||
//Add solid with modified scale
|
//Add solid with modified scale
|
||||||
@ -46,7 +55,21 @@ private fun VisualGroup.addSolid(root: GDML, solid: GDMLSolid, block: VisualObje
|
|||||||
thetaStart = solid.starttheta.toDouble()
|
thetaStart = solid.starttheta.toDouble()
|
||||||
}
|
}
|
||||||
is GDMLOrb -> sphere(solid.r)
|
is GDMLOrb -> sphere(solid.r)
|
||||||
is GDMLPolyhedra -> TODO()
|
is GDMLPolyhedra -> extrude {
|
||||||
|
//getting the radius of first
|
||||||
|
require(solid.planes.size > 1) { "The polyhedron geometry requires at least two planes" }
|
||||||
|
val baseRadius = solid.planes.first().rmax.toDouble()
|
||||||
|
shape {
|
||||||
|
(0..solid.numsides).forEach {
|
||||||
|
val phi = solid.deltaphi.toDouble() / solid.numsides * it + solid.startphi.toDouble()
|
||||||
|
baseRadius * cos(phi) to baseRadius * sin(phi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
solid.planes.forEach { plane ->
|
||||||
|
//scaling all radii relative to first layer radius
|
||||||
|
layer(plane.z, scale = plane.rmax.toDouble() / baseRadius)
|
||||||
|
}
|
||||||
|
}
|
||||||
is GDMLBoolSolid -> {
|
is GDMLBoolSolid -> {
|
||||||
val first = solid.first.resolve(root) ?: error("")
|
val first = solid.first.resolve(root) ?: error("")
|
||||||
val second = solid.second.resolve(root) ?: error("")
|
val second = solid.second.resolve(root) ?: error("")
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package hep.dataforge.vis.spatial
|
package hep.dataforge.vis.spatial
|
||||||
|
|
||||||
import hep.dataforge.meta.*
|
import hep.dataforge.meta.*
|
||||||
import hep.dataforge.vis.common.VisualGroup
|
|
||||||
import hep.dataforge.vis.common.DisplayLeaf
|
import hep.dataforge.vis.common.DisplayLeaf
|
||||||
|
import hep.dataforge.vis.common.VisualGroup
|
||||||
import hep.dataforge.vis.common.VisualObject
|
import hep.dataforge.vis.common.VisualObject
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
import kotlin.math.cos
|
import kotlin.math.cos
|
||||||
@ -18,6 +18,8 @@ class Shape2DBuilder {
|
|||||||
list.add(Point2D(x, y))
|
list.add(Point2D(x, y))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
infix fun Number.to(y:Number) = point(this, y)
|
||||||
|
|
||||||
fun build(): Shape2D = list
|
fun build(): Shape2D = list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user