From 6435f717838bf54f413f393e5fde05fbadf70c69 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 16 Jul 2021 14:08:53 +0300 Subject: [PATCH 01/16] Update README.md --- demo/gdml/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/demo/gdml/README.md b/demo/gdml/README.md index 6ad546f1..5c2a5abe 100644 --- a/demo/gdml/README.md +++ b/demo/gdml/README.md @@ -1,12 +1,10 @@ - ### GDML Example Visualization example for geometry defined as GDML file. ##### Building project -To build the app, run `demo/gdml/Tasks/distribution/jsBrowserDistribution` Gradle task, then open -`demo/gdml/build/distribuions/gdml-js-0.1.3-dev/index.html` file in your browser, and +To build the app, run `demo/gdml/Tasks/kotlin browser/jsBrowserDistribution` Gradle task, then drag-and-drop GDML file to the window to see visualization. For an example file, you can use `demo/gdml/src/jsMain/resources/cubes.gdml`. -- 2.34.1 From bdb28eb338f8b4cfcd300b558c70456aa4afc118 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Fri, 16 Jul 2021 14:10:09 +0300 Subject: [PATCH 02/16] Update README.md --- demo/muon-monitor/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md index 87b3cf43..df95c968 100644 --- a/demo/muon-monitor/README.md +++ b/demo/muon-monitor/README.md @@ -26,9 +26,8 @@ with it. ##### Building project To run full-stack Muon Monitor Visualization application (both JVM server and Web browser front-end), -run `demo/muon-monitor/application/run` task. +run `demo/muon-monitor/Tasks/application/run` task. ##### Example view: ![](../../docs/images/muon-monitor.png) - -- 2.34.1 From a0d62c65d73a69abd8518e8e4415a8a287f5c882 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 22 Jul 2021 20:11:14 +0300 Subject: [PATCH 03/16] Fix FX ValueChooser crash --- ui/ring/build.gradle.kts | 1 - .../visionforge/editor/TextValueChooser.kt | 2 +- .../visionforge/editor/ValueChooser.kt | 7 +++---- .../visionforge/editor/ValueChooserBase.kt | 12 ++++++----- .../editor/VisualObjectEditorFragment.kt | 20 +++++++++---------- .../editor/VisualObjectTreeFragment.kt | 15 ++++++++------ .../kscience/visionforge/solid/FX3DPlugin.kt | 6 +++--- .../visionforge/solid/FXReferenceFactory.kt | 2 +- .../solid/VisualObjectFXBinding.kt | 12 +++++------ 9 files changed, 39 insertions(+), 38 deletions(-) diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts index 84d33b43..4469b8cf 100644 --- a/ui/ring/build.gradle.kts +++ b/ui/ring/build.gradle.kts @@ -22,7 +22,6 @@ dependencies{ implementation(npm("@jetbrains/icons", "3.14.1")) implementation(npm("@jetbrains/ring-ui", "4.0.7")) - implementation(npm("core-js","3.12.1")) implementation(npm("file-saver", "2.0.2")) compileOnly(npm("url-loader","4.1.1")) compileOnly(npm("postcss-loader","5.2.0")) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt index ea55fc83..e7beac2b 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/TextValueChooser.kt @@ -15,7 +15,7 @@ import space.kscience.dataforge.names.asName import space.kscience.dataforge.values.* import tornadofx.* -class TextValueChooser : ValueChooserBase() { +public class TextValueChooser : ValueChooserBase() { private val displayText: String get() = currentValue().let { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt index c3796fa0..8816a250 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooser.kt @@ -14,7 +14,6 @@ import space.kscience.dataforge.meta.descriptors.ValueDescriptor import space.kscience.dataforge.misc.Named import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.toName -import space.kscience.dataforge.provider.provideByType import space.kscience.dataforge.values.Null import space.kscience.dataforge.values.Value import space.kscience.visionforge.widget @@ -63,7 +62,7 @@ public interface ValueChooser { public fun setCallback(callback: ValueCallback) - @Type("space.kscience.dataforge.vis.fx.valueChooserFactory") + @Type("space.kscience..fx.valueChooserFactory") public interface Factory : Named { public operator fun invoke(meta: Meta = Meta.EMPTY): ValueChooser } @@ -75,7 +74,7 @@ public interface ValueChooser { TextValueChooser.name -> TextValueChooser ColorValueChooser.name -> ColorValueChooser ComboBoxValueChooser.name -> ComboBoxValueChooser - else -> context.provideByType(type)//Search for additional factories in the plugin + else -> null//context.provideByType(type)//Search for additional factories in the plugin } } @@ -101,7 +100,7 @@ public interface ValueChooser { } } - fun build( + public fun build( context: Context, value: ObservableValue, descriptor: ValueDescriptor? = null, diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt index 81dc42ac..98790f96 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/ValueChooserBase.kt @@ -18,16 +18,18 @@ import tornadofx.* * * @author Alexander Nozik */ -abstract class ValueChooserBase : ValueChooser { +public abstract class ValueChooserBase : ValueChooser { - override val node by lazy { buildNode() } - final override val valueProperty = SimpleObjectProperty(Null) - final override val descriptorProperty = SimpleObjectProperty() + override val node: T by lazy { buildNode() } + final override val valueProperty: SimpleObjectProperty = + SimpleObjectProperty(Null) + final override val descriptorProperty: SimpleObjectProperty = + SimpleObjectProperty() override var descriptor: ValueDescriptor? by descriptorProperty override var value: Value? by valueProperty - fun resetValue() { + public fun resetValue() { setDisplayValue(currentValue()) } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt index 929c7e85..a918a3a5 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectEditorFragment.kt @@ -13,13 +13,13 @@ import space.kscience.dataforge.meta.update import space.kscience.visionforge.* import tornadofx.* -class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { +public class VisualObjectEditorFragment(public val selector: (Vision) -> Meta) : Fragment() { - val itemProperty = SimpleObjectProperty() - var item: Vision? by itemProperty - val descriptorProperty = SimpleObjectProperty() + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty + public val descriptorProperty: SimpleObjectProperty = SimpleObjectProperty() - constructor( + public constructor( item: Vision?, descriptor: NodeDescriptor?, selector: (Vision) -> MutableItemProvider = { it.allProperties() }, @@ -30,13 +30,13 @@ class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { private var currentConfig: Config? = null - private val configProperty: Binding = itemProperty.objectBinding { visualObject -> - if (visualObject == null) return@objectBinding null - val meta = selector(visualObject) + private val configProperty: Binding = itemProperty.objectBinding { vision -> + if (vision == null) return@objectBinding null + val meta = selector(vision) val config = Config().apply { update(meta) onChange(this@VisualObjectEditorFragment) { key, _, after -> - visualObject.setProperty(key, after) + vision.setProperty(key, after) } } //remember old config reference to cleanup listeners @@ -51,7 +51,7 @@ class VisualObjectEditorFragment(val selector: (Vision) -> Meta) : Fragment() { } } - private val styleBoxProperty: Binding = configProperty.objectBinding() { + private val styleBoxProperty: Binding = configProperty.objectBinding { VBox().apply { item?.styles?.forEach { styleName -> val styleMeta = item?.getStyle(styleName) diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt index f1faaf1a..2fa6cee1 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/editor/VisualObjectTreeFragment.kt @@ -3,6 +3,7 @@ package space.kscience.visionforge.editor import javafx.beans.property.SimpleObjectProperty import javafx.scene.control.SelectionMode import javafx.scene.control.TreeItem +import javafx.scene.layout.VBox import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup import tornadofx.* @@ -29,13 +30,13 @@ private fun toTreeItem(vision: Vision, title: String): TreeItem() - var item: Vision? by itemProperty +public class VisualObjectTreeFragment : Fragment() { + public val itemProperty: SimpleObjectProperty = SimpleObjectProperty() + public var item: Vision? by itemProperty - val selectedProperty = SimpleObjectProperty() + public val selectedProperty: SimpleObjectProperty = SimpleObjectProperty() - override val root = vbox { + override val root: VBox = vbox { titledpane("Object tree", collapsible = false) { treeview> { cellFormat { @@ -47,7 +48,9 @@ class VisualObjectTreeFragment : Fragment() { } } selectionModel.selectionMode = SelectionMode.SINGLE - val selectedValue = selectionModel.selectedItemProperty().objectBinding { it?.value?.second } + val selectedValue = selectionModel.selectedItemProperty().objectBinding { + it?.value?.second + } selectedProperty.bind(selectedValue) } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt index f843e02c..d46bab32 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FX3DPlugin.kt @@ -23,7 +23,7 @@ import kotlin.collections.set import kotlin.math.PI import kotlin.reflect.KClass -class FX3DPlugin : AbstractPlugin() { +public class FX3DPlugin : AbstractPlugin() { override val tag: PluginTag get() = Companion.tag private val objectFactories = HashMap, FX3DFactory<*>>() @@ -42,7 +42,7 @@ class FX3DPlugin : AbstractPlugin() { as FX3DFactory? } - fun buildNode(obj: Solid): Node { + public fun buildNode(obj: Solid): Node { val binding = VisualObjectFXBinding(this, obj) return when (obj) { is SolidReferenceGroup -> referenceFactory(obj, binding) @@ -149,7 +149,7 @@ public interface FX3DFactory { public operator fun invoke(obj: T, binding: VisualObjectFXBinding): Node public companion object { - public const val TYPE = "fx3DFactory" + public const val TYPE: String = "fx3DFactory" } } diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt index dc72f7f1..022900df 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/FXReferenceFactory.kt @@ -7,7 +7,7 @@ import space.kscience.visionforge.Vision import space.kscience.visionforge.onPropertyChange import kotlin.reflect.KClass -class FXReferenceFactory(val plugin: FX3DPlugin) : FX3DFactory { +public class FXReferenceFactory(public val plugin: FX3DPlugin) : FX3DFactory { override val type: KClass get() = SolidReferenceGroup::class override fun invoke(obj: SolidReferenceGroup, binding: VisualObjectFXBinding): Node { diff --git a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt index 5045a375..a2f41fbe 100644 --- a/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt +++ b/visionforge-fx/src/main/kotlin/space/kscience/visionforge/solid/VisualObjectFXBinding.kt @@ -14,7 +14,7 @@ import tornadofx.* /** * A caching binding collection for [Vision] properties */ -public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vision) { +public class VisualObjectFXBinding(private val fx: FX3DPlugin, public val obj: Vision) { private val bindings = HashMap>() init { @@ -33,15 +33,13 @@ public class VisualObjectFXBinding(public val fx: FX3DPlugin, public val obj: Vi } } - public operator fun get(key: Name): ObjectBinding { - return bindings.getOrPut(key) { - object : ObjectBinding() { - override fun computeValue(): MetaItem? = obj.getProperty(key) - } + public operator fun get(key: Name): ObjectBinding = bindings.getOrPut(key) { + object : ObjectBinding() { + override fun computeValue(): MetaItem? = obj.getProperty(key) } } - public operator fun get(key: String) = get(key.toName()) + public operator fun get(key: String): ObjectBinding?> = get(key.toName()) } public fun ObjectBinding.value(): Binding = objectBinding { it.value } -- 2.34.1 From eb3786c5ca8ff2f9b084a8564a10e8037572e3f9 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:49:13 +0300 Subject: [PATCH 04/16] Add files via upload --- docs/images/all-solids.png | Bin 0 -> 8107 bytes docs/images/big rotated box.png | Bin 0 -> 2206 bytes docs/images/box.png | Bin 0 -> 1326 bytes docs/images/classic-hexagon.png | Bin 0 -> 2441 bytes docs/images/cone-1.png | Bin 0 -> 2768 bytes docs/images/cone-2.png | Bin 0 -> 2508 bytes docs/images/cone-surface-1.png | Bin 0 -> 9500 bytes docs/images/cone-surface-2.png | Bin 0 -> 4938 bytes docs/images/custom-hexagon.png | Bin 0 -> 2190 bytes docs/images/high-box.png | Bin 0 -> 1756 bytes docs/images/small box.png | Bin 0 -> 1503 bytes docs/images/sphere.png | Bin 0 -> 2446 bytes docs/images/two-boxes-1.png | Bin 0 -> 2353 bytes docs/images/two-boxes-2.png | Bin 0 -> 3021 bytes docs/images/wide-box.png | Bin 0 -> 1584 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/all-solids.png create mode 100644 docs/images/big rotated box.png create mode 100644 docs/images/box.png create mode 100644 docs/images/classic-hexagon.png create mode 100644 docs/images/cone-1.png create mode 100644 docs/images/cone-2.png create mode 100644 docs/images/cone-surface-1.png create mode 100644 docs/images/cone-surface-2.png create mode 100644 docs/images/custom-hexagon.png create mode 100644 docs/images/high-box.png create mode 100644 docs/images/small box.png create mode 100644 docs/images/sphere.png create mode 100644 docs/images/two-boxes-1.png create mode 100644 docs/images/two-boxes-2.png create mode 100644 docs/images/wide-box.png diff --git a/docs/images/all-solids.png b/docs/images/all-solids.png new file mode 100644 index 0000000000000000000000000000000000000000..9be7b40e27239d75efd5723cc819ad94fca8d636 GIT binary patch literal 8107 zcmeHMS6EYBvkr&~A|M^E1tPtdP*3pt&+}iLt8;Pg&c%NAvu3S#X3smb*P6X2`k9Uf)eY7g004kW6Rf5W z0FX)m03=%Eq(n&^X6N!o;-#zEnDJNNCPj!;{B&mLg

5EP-~cCAB_64ZGIsfF6J4xv5Mb9SG8p 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 literal 0 HcmV?d00001 diff --git a/docs/images/big rotated box.png b/docs/images/big rotated box.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4 GIT binary patch literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# literal 0 HcmV?d00001 diff --git a/docs/images/box.png b/docs/images/box.png new file mode 100644 index 0000000000000000000000000000000000000000..6824b2d3584dfcf81d66b99a22136f3fcbc5f5e0 GIT binary patch literal 1326 zcmeAS@N?(olHy`uVBq!ia0y~yVAKR+Mh+&R$ZD1&eL#w_ILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFKt5-IM`SSr1K(i~W;~w1A_b`Cu&0Y-NJZS+TaI1Q**vWm@6~Rb`m;Gl zrQ3tYw(`W&&ezlPQuyW+nm7Fp41KU(et#YF=Pm4#x0-q0I<|dNaIT)P(DuXyxs(ik zqv0cbZ_E1i_VsoD%I`mZ@1qr7F#p>!+p-v~sD&{HYj4dCGu!LBv+4I1^R+ou-9@b5 zGxM)p5MV!qs`a&8fyd1k)f z%uiNNW%4fFoA6eD4!_;cb3oRn$Guz1r+sUiBC8+T_lWPU?~exYbNNs8-d(uI^7f-o zweYE?@1IVVPxyAL_Kfp;$7=S>^>e@NShBY)b>Ho&uPbJMtE#=^{65-p!uHJd*B9@# zKK1TD>r;n&%l5{Z|NdFu{=ctC`TfPX^~Zy}{cdNz7kT^jlHB@?_1B+o4d;83d+YU5 z+qjEy`fopW0nLf1w)@6+DNg@9LM*dCe9Lw3>OG70#@%`>`gW`K?Yrw@j^EyLeO*rZ z?jqUz%W=Cm-FVYCp&Ng8URa^L^GWYY(6)HQ|@Cmg|1iF_)kcTaK%~-Fg`& zc&}yCgT1F>?=0NQnR>8#>h2xR;2_p2FKqv&Hih+l=sQp(XmH29I-P&2@6x>%qen|Y z5u`RnP=D#(&0EYD_Ec!Tox2pM{fKwwdmW%!FY?yx z4-vUHKe~a1wj4Kp>w7`&{1$V^YMaZ@n6+EHw@3t-EDo`6dA_iG&NsD+cc2JIQ=8Pk qM1AW2bH2knnXuIbq#@K9D}E;pUXO@geCy=go(BQ literal 0 HcmV?d00001 diff --git a/docs/images/classic-hexagon.png b/docs/images/classic-hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0053ae405957afb0c4b4ee6f356b34cdad147e8 GIT binary patch literal 2441 zcmeHJ`(G2+5)Y+R(I_gB3k4F{-XJRfdXTEdh%*>h3 znVAA%Ab-<_w>Qvev`v1#KEX7aiI$?6^>0uJZ(Kh?EheeK{6n<5e!Jf&=FJn{0p2uP zy?oC;lC;5h@(rBAI*T|$h@hb_1G5vhJkDQ8nq74Yw`da6T9=bmB|186+_u_cH z;u-S?gT-5PtEM9#{_py}6X!S%7R)>CMxU}{QP~Gfw)}EyF@)AsL(sSkn;p4;={2F` z3gUQ*Djm9K`*x6P!n!)b|dbDgy^gfTjN;${^-d(rfdS3>BoJW98|{{#I9fiMQs)Np8xOaK2HJ z^X4&;&z?`&D21MLA*W)EPzlWE zXc3D4g1h!zCoJGrGZ??hkcD_opReOW?^0*Z0rN#TeKlBT|1-Ns3f0yS%3p`EXnSOW z(_A=5N*sj}6vCp-kO^nFbsvoXz>qzlwA(?b_BdNiSt!Bj_9DrgHHXsHgN9c!^}6qb zI)|3Xp*XfUf30fhM8%pkT%)WYOp}FqNvI%B3XKIQx~J1kGz^;_9u~$|T!>{K-ia_3 z{L|ZUO>G5nJBHmE#E=Q4DToyMfD3KHHM>4gbnCYsqxeG5Ffit_0|f>t<8GkgAt@oK zgl&z3ZQ84e1oeF6-G8CvSuNr$h2%m>Q!Kml1WMv~L?KR&Gw=-N@AsM*Hgho6DhCz| zaJp@<3HYlj9@vHTQulf*j5z=FKptSJ5lDSeGLn>hbWq_J$A+26Oce8X z?~^ELI_9zg#*6}mM#_e_Au~K_O0*PWfsn<=_LMKtAe7K2m?;7pb8xyV2$haxDElOr z7DSlGJ0t5fHU-XHUe@Di>EG}dw5WT3lMTcbxsDSt6 z{|z`9NTvKcd0bZnDPR@@;;6!R@^F&Lg}$}!?Zq|K!4k)BJXC#>biU&2y6Mn~WM!Yu zfeSg`k;mP5!R&UMTe!q4p1m?WIeTS59sM#u+f;G51I_B(WPhOk_NmZ4&`q1($xLlm ziYH`?_m#|FLuO8Pz{V$-Up@{(woa+)hxJ6a)kYqR3u&ETl?U2jm3kh)s_usN%NwlV zUd$`lZeN=3TwwVh_Sv_8JE4q~ju7gwH1+xtO*$__EIH)t8RN4(tWb6tz&@S|4a{$_ zYRm_)r&BJ8p}N?7PB;mn0v6LF=C-^+Brrz>ZcN+WzN*?TWi|2X%tZZI1raWYM+MnW z?R%e7@K7c3Y;M+N7;LZ-W58fD>youuH3iRRiw2ty0~VuRx(3y+OXaTs_nJMncxj7F z9qNfqI=-jgT}?dhS>j*hSD#L(-!fQs!>q00MSk*1<7P%e*Zb1)x^9CU9(7@#DI)iK z?NU97i5Vdtk1bnv+*(5~0&vcwN%cSsz=f*!@{PWQnrl=i^&B<*r=$LDV+B1Z=(Xuj X;;z)pKD+-=;}gvf3G}Hubo|_(N0#&X literal 0 HcmV?d00001 diff --git a/docs/images/cone-1.png b/docs/images/cone-1.png new file mode 100644 index 0000000000000000000000000000000000000000..47272f2426381cb736f7d13fbafdf14cbb909c25 GIT binary patch literal 2768 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 Si|`*9;iS8dTb1kIQ~nEkMU{F0 literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-1.png b/docs/images/cone-surface-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dad20dda54bc82b5068da45f40c92764bf1beb1e GIT binary patch literal 9500 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 literal 0 HcmV?d00001 diff --git a/docs/images/high-box.png b/docs/images/high-box.png new file mode 100644 index 0000000000000000000000000000000000000000..a3da538425823ef7ad168954968732d62f42c170 GIT binary patch literal 1756 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 literal 0 HcmV?d00001 diff --git a/docs/images/two-boxes-2.png b/docs/images/two-boxes-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8acaaea5db1c38644075bca966177097715bc7c3 GIT binary patch literal 3021 zcmeHJ`B&2E8b_nl!KKB)HLS_Ba%nVCZ@IK+nrm5KKvYCaQb;o`l`NbKk=;u!dEJey zDNr`S2yM*ekdbFpv{E!Rwc|`W;ZlmEqTt2(AMUxo^uu%B_jx|gd7kGy=Y2ot^RLrk z0Y*Pq{s01jj7|mmMSws$g&U@?tBsh9KC03lI_VJs$3b;H)}OTw_~Nn9V<1p{0c0(1 zv(`6A4U9|&fsETXOsC^=?FA4B5`W6?*tsms?5H&F145VjcEGX4bjI`kUP6kM-9cg@%qrMCj`Hke~12u+ejRKG3Z;?s3GSr zO{k}QS2G{&jj0(UIelqfSz6aDt7~cs_+vSm%W9;TBZM}2l_PI&^r&tvJ|`oXf%Um>dghO?iEH2`>I3F`24nZ!2Xrq zg}5tL9SGUS_szozcyCJxjTh6vHg*-k@~D!Go;tR;m?-M%zrGa;jY6dYJ1^k9^~Lcq zgc|&5SlcRwXELrL%-!3wn@~XlSyyDktoOHlSi+AwKxm(m|E@DvPL;%~q5{o$Y;lPK zU&gwY1Ey_`zM&dv#0uC8zi4#lQ#`k)m5e;lF!zOXz1m6YZ9Ok1(qh=9m=n{~UW0jK z6e_xQ#L*^JJ)b0D-Fy&p_lF{bMU;Na7CQ{tOU#44CZ47;xvfER{1L2Xgo+8gtkLx)%L(0SdQ z7$!mprd8N!;h=(un$p4Aq`O%E>r1M#am;#zrm=0Tb5YyGSM+NoP`oZ=BF?UTO)rY5 zZBu3DWX&%=8?uQv#J)dPC6gcs>Axvl)u$3*rS)I!CUKjK6OR8Eh@! zt7r(Bi~0OHn_E~>o!j)K26>y)W#xYc)0D*2nb|?~EzMIGI52AQZK=9>CUy_lpzbhJ;5{3Mof?CPV}{I4wx)4 ztYY9#SHWGP%p3|XWBj)|8vo-e?1LvjQB^%iEF~&E!L)j{0z2wCQiC7-jEi}^*wY-e z8+G6HiM&C?#tTmlrSa8|^r6|U)p}JyvWGs^7o|-Lvdh+69_vGU`xRIUYgoyRM4Hxk z-659v3(Pqp`9U;Lb!~PwLvbJvJ0H^MdA#*50mupARdjRw$P(0wt8*8lEfGaW_U7jb z%aQ*C(>CFS&ai`4(*?Qd4|qiFKlkL`@NQdICJ3dLqb&!dl^&vQP6%1D-^qh8{t8!t z{0&Sy)P#d)1QXo&8KH+^mB@N9O)-&@L@!5A0&e2?qKu6@@VuZb@r?6 zj?Vo($;-l^&;4>AeJFBhrgR`d!9HSe{n*eORrb0NC6gz7@i>~dkO|65SLU_HI1?SW(GU~BRh}H5yuDxsNkU^gz2H>$W%Spt8=tkdovuE=OD_`T7Pp+TYpQk7Y0POomvSFI^`ecS9css{x8^t1#JKT literal 0 HcmV?d00001 diff --git a/docs/images/wide-box.png b/docs/images/wide-box.png new file mode 100644 index 0000000000000000000000000000000000000000..762a76ac171c1282778b4f99e83f0b6406c26369 GIT binary patch literal 1584 zcmeAS@N?(olHy`uVBq!ia0y~yUM1MG6B0>rqb^$B>G+w|8QLq^(6-1JmZ;OjVLR z!W+|lEN}tyva8FN?)6*Co>P}If6~6`Ax~c(KOgU4B-&7-#qctO;nGTmCBcjy%b6zl zu`0~vaw^DZzxiC*Q~ND1nP({z>#dppzvpa!WOn=T+nJ`%-t#YIS{~HM^mavk z_O{u@yKU|setrI*bXa5XN{7a>EAGDKySKI9HV*y#vwRU$p}0>u|L*qYXN}VXpsLoJ z-j1!k9{${V|8EdsyjZzp3jNm^yWjouI}ogI zt5(5mW&6PGdTyIPGHGqFzq?D~>@n^Y2mY13PBM|!U%>SH^4ji;IeQwo-uMrMBB{4~ z)*EXX7)r0dc<#4VaRTd~^5pd3Mya<4z`~*{F7o}cTFfL&nUKB_yV`@wkOw(h0gGjS zxVo`ETgGI1t1&($Bq5Jp})HKQ1`oNAD7Xhgp|_t_WAhzjBAg)*=gMIvkzFxGkCiCxvXJBb?r literal 0 HcmV?d00001 -- 2.34.1 From 5bd6f98c6eab38384f7a52c476c2900d4ae59b2a Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:49:52 +0300 Subject: [PATCH 05/16] Add files via upload --- docs/tutorial.md | 207 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..5d8bc1e3 --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,207 @@ +#Tutorial + +###The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) + +The simple visualization can be made with function `main`. (this part will be supplemented as well) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + } + } + } + } +} +``` +##Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +Basic properties: +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)` +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0` + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they are doing in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big rotated box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +###Basic Solids +Now, let's see which solids can be visualized: +1) PolyLine +2) Box + ```kotlin + box(50, 50, 50, name = "box") { + x = 0 + y = 0 + z = 0 + color("pink") + } + ``` + ![](../docs/images/box.png) + ```kotlin + box(10, 25, 10, name = "high_box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` + ![](../docs/images/high-box.png) + + ```kotlin + box(65, 40, 40, name = "wide_box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` + ![](../docs/images/wide-box.png) + +3) Sphere + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + color("blue") + } + ``` + ![](../docs/images/sphere.png) +4) Hexagon + ```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic_hexagon"){ + color("green") + } + ``` + ![](../docs/images/classic-hexagon.png) + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +5) Cone + ```kotlin + cone(60, 80, name = "cone") { + x = 0 + y = 0 + z = 0 + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) +6) Cone Surface + ```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone_surface") { + x = 0 + y = 0 + z = 0 + color("red") + rotation = Point3D(2, 50, -9) + } + ``` + ![](../docs/images/cone-surface-1.png) + ![](../docs/images/cone-surface-2.png) +7) Extruded + -- 2.34.1 From e37bc779883857d078712ced7500ec03b98e6658 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:37:59 +0300 Subject: [PATCH 06/16] Delete big rotated box.png --- docs/images/big rotated box.png | Bin 2206 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/big rotated box.png diff --git a/docs/images/big rotated box.png b/docs/images/big rotated box.png deleted file mode 100644 index 7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# -- 2.34.1 From 3a5da762d12c2099c407cc79e0cb9ac4fb59e5fb Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:38:14 +0300 Subject: [PATCH 07/16] Delete small box.png --- docs/images/small box.png | Bin 1503 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/small box.png diff --git a/docs/images/small box.png b/docs/images/small box.png deleted file mode 100644 index 4ebc0cb390e5e336b7ecefed54ab3c47d5666d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1503 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1&?5>FS$kczmscQ)o8HV|=eG%`*R%Ad}; zWvKv;O-=d;LBpNxuk(wgg7WCe{=Vu?dQ!oY62C-048T@R;yNee(o? T_j6r Date: Wed, 28 Jul 2021 15:38:56 +0300 Subject: [PATCH 08/16] Add files via upload --- docs/images/big-rotated-box.png | Bin 0 -> 2206 bytes docs/images/small-box.png | Bin 0 -> 1503 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/big-rotated-box.png create mode 100644 docs/images/small-box.png diff --git a/docs/images/big-rotated-box.png b/docs/images/big-rotated-box.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7cdc14dad92f2d151a2fbf735e3af14b4f54e4 GIT binary patch literal 2206 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kV^0^ykczmschBYqM@lq2Oqr%5Xu82I zq`^fr#6Wbz0w(=sOj--LRJ1xGE;D6J+dOafL!l4;Z;m`}`7LMPud~CPF;Q%f)$`9A zcgDol?q$&Uk^E0G;Uf$82>~4i=M4=!2bqjUIiq1fK|0t0OjvXE6(8L_o&NbM|LWEG zpGBR8b*80SyNT!TJ0ott=ile~KVR9)-?xw4TWfXSz~tbgiElJ6J_+b~m&A4LX!~=q z$mb3lEE<)kxvH1QuE`9~m{`ij(p@W;7g^%eRBFf4J%8QjEpm(RM=#nvBkSv5&$^ng zht?HT^qFo*`*r;P>*Rl0I?V|i)1sE23Ac=v4n3wE!IKol|8Cw6Ljh3g?k;`VJ2m#< z3m`*&-g$9WbA7=gHJ0u|iDX{?4HDh44==EEo36L7<(r?AP||dC+9#!>>k4w3SW`H} zqLuVT?)?&4Xn1W0OZUYaqI^D}9Fycy*4iwjV`h2tKoX}Iv(YiBsRRzhto(O5zhe2!uW*XJu35#ytrjsy*!|vPU<4ogQSe>5thKbs z_0ryB5y8dza-XMX6s>9Wz3skH?m4g3_tN4W4-?wzYX4o6-b!FZXM#Ot{J^Hrr2njqtkuZFjdvUY@*B-bYx+ zY;X0?H`hDfa9%qo;rq|OpHFB_v2sMtEskqXwi(!F^t^i%cW{%uOhYp7os(CVy*>VC z@BQ>uSEnre*=DQ|F^BiP)hnPGYuD|I+_u4|>1gB*xdh4W-#NwD-&9U5;OyCWt}9_< zcOiebO2iy?PPwK8M#(1Edj}1tb^bPB>6V?7lQ5H|+c=@Ylnb051>Z;}OD6QXY}nD7 zD*}pbze-3n8+Oc1)?r?AkV9;@W!F(APBCZW15(`}(~iE)Iz749a2n&a3UFzCEVaQ@ z=3tVBond88)6un;)TMbgv_Vpu2J;$0PO-&?$E0Q?Y@A-o<*gLabMi>7$Mn^!*MC;c zsr>%w=9kAz|DQiU>wEu~SHM~~)rdErcQs%txZJ>+-Opd^0I?5UNFgSAb=zitK XkKfnK-t`&SreN@N^>bP0l+XkK2=+1# literal 0 HcmV?d00001 diff --git a/docs/images/small-box.png b/docs/images/small-box.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebc0cb390e5e336b7ecefed54ab3c47d5666d84 GIT binary patch literal 1503 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1&?5>FS$kczmscQ)o8HV|=eG%`*R%Ad}; zWvKv;O-=d;LBpNxuk(wgg7WCe{=Vu?dQ!oY62C-048T@R;yNee(o? T_j6r Date: Wed, 28 Jul 2021 15:40:06 +0300 Subject: [PATCH 09/16] Update tutorial.md --- docs/tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 5d8bc1e3..2e695b7c 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -51,7 +51,7 @@ box(10, 10, 10, name = "small box"){ rotation = Point3D(0, 0, 0) } ``` -![](../docs/images/small box.png) +![](../docs/images/small-box.png) The `big box` will have properties with custom values. ```kotlin @@ -64,7 +64,7 @@ box(40, 40, 40, name = "big box"){ rotation = Point3D(60, 80, 0) } ``` -![](../docs/images/big rotated box.png) +![](../docs/images/big-rotated-box.png) If we compare these boxes, we will see all differences. Here is the function `main` with both boxes. -- 2.34.1 From 44da86d49641626c4436a874777a1c6c7b2fc277 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:40:25 +0300 Subject: [PATCH 10/16] Update tutorial.md --- docs/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial.md b/docs/tutorial.md index 2e695b7c..9dba5f3c 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -65,6 +65,7 @@ box(40, 40, 40, name = "big box"){ } ``` ![](../docs/images/big-rotated-box.png) + If we compare these boxes, we will see all differences. Here is the function `main` with both boxes. -- 2.34.1 From f611409208c1ed072b9069cd571049ab50875a2b Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:41:04 +0300 Subject: [PATCH 11/16] Update tutorial.md --- docs/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial.md b/docs/tutorial.md index 9dba5f3c..9de1432b 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -108,6 +108,7 @@ fun main(){ ![](../docs/images/two-boxes-2.png) ###Basic Solids + Now, let's see which solids can be visualized: 1) PolyLine 2) Box -- 2.34.1 From e818ecdcc3175f46e44a27534f40bbc3b08b508a Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 15:56:54 +0300 Subject: [PATCH 12/16] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c9312320..621f474f 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ * [visionforge-gdml](#visionforge-gdml) * [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Spatial Showcase](#simple-example---spatial-showcase) + * [Simple Example - Solid Showcase](#simple-example---solid-showcase) * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) * [GDML Example](#gdml-example) @@ -118,16 +118,16 @@ The `demo` module contains several example projects (demonstrations) of using th They are briefly described in this section, for more details please consult the corresponding per-project README file. -### Simple Example - Spatial Showcase +### Simple Example - Solid Showcase Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. Some shapes will also periodically change their color and visibility. -[More details](demo/spatial-showcase/README.md) +[More details](demo/solid-showcase/README.md) **Example view:** -![](docs/images/spatial-showcase.png) +![](docs/images/solid-showcase.png) ### Full-Stack Application Example - Muon Monitor Visualization @@ -156,4 +156,4 @@ Visualization example for geometry defined as GDML file. ## Thanks and references The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. -All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. \ No newline at end of file +All other libraries are explicitly shown as dependencies. We would like to express specific thanks to JetBrains Kotlin-JS team for consulting us during the work. -- 2.34.1 From 786b902fd9acdf21ab03d055eda54a13bfe95d99 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Wed, 28 Jul 2021 16:46:43 +0300 Subject: [PATCH 13/16] Update README.md --- demo/solid-showcase/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/solid-showcase/README.md b/demo/solid-showcase/README.md index 20866220..f8771e13 100644 --- a/demo/solid-showcase/README.md +++ b/demo/solid-showcase/README.md @@ -5,8 +5,8 @@ Some shapes will also periodically change their color and visibility. ##### Building project -To see the JS demo: run `demo/spatial-showcase/Tasks/distribution/jsBrowserDistribution` Gradle task, then open -`build/distribuions/spatial-showcase-js-0.1.3-dev/index.html` file in your browser. +To see the JS demo: run `demo/solid-showcase/Tasks/kotlin browser/jsBrowserRun` Gradle task, then open +`build/distribuions/solid-showcase-js-0.1.3-dev/index.html` file in your browser. To see Java FX demo, run `demo/spatial-showcase/Tasks/application/run` Gradle task, or `main()` from `FXDemoApp.kt`. -- 2.34.1 From 72d3503dc34d4fa298cdf63942f9ecd209244263 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:13:27 +0300 Subject: [PATCH 14/16] Add files via upload --- docs/images/cone-segment-1.png | Bin 0 -> 2691 bytes docs/images/cone-segment-2.png | Bin 0 -> 2754 bytes docs/images/cone-surface-fragment-2.png | Bin 0 -> 2169 bytes docs/images/cone-surface-fragment.png | Bin 0 -> 2410 bytes docs/images/cylinder-1.png | Bin 0 -> 2710 bytes docs/images/cylinder-2.png | Bin 0 -> 3225 bytes docs/images/cylinder.png | Bin 0 -> 2196 bytes docs/images/frustum-cone-segment.png | Bin 0 -> 2399 bytes docs/images/frustum-cone.png | Bin 0 -> 3016 bytes docs/images/scheme.png | Bin 0 -> 6981 bytes docs/images/tube-fragment.png | Bin 0 -> 2912 bytes docs/images/tube.png | Bin 0 -> 4630 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/cone-segment-1.png create mode 100644 docs/images/cone-segment-2.png create mode 100644 docs/images/cone-surface-fragment-2.png create mode 100644 docs/images/cone-surface-fragment.png create mode 100644 docs/images/cylinder-1.png create mode 100644 docs/images/cylinder-2.png create mode 100644 docs/images/cylinder.png create mode 100644 docs/images/frustum-cone-segment.png create mode 100644 docs/images/frustum-cone.png create mode 100644 docs/images/scheme.png create mode 100644 docs/images/tube-fragment.png create mode 100644 docs/images/tube.png diff --git a/docs/images/cone-segment-1.png b/docs/images/cone-segment-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b59005552588063eb38e7812efe3fb6719fa6908 GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-fragment-2.png b/docs/images/cone-surface-fragment-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8eaa991ca335cc221f73a2329e13b37c2c1a99 GIT binary patch literal 2169 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{lj11ZMhAa^H*b?0PW0y!+{j=qiz z3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4<6b1$kK2I0NkczmscLIy9SV=WpOu1%IuDmAi z9oG$6=|n+erK}Jw^ORNZnBShaV-NrAZRYP;yYwBy`}qB}^~@SSu0JksxGb!r;Jl%M z=OB|23-<|uQO?K;gU5egZ-3t}X!qyu)Ah%{e0z4gIap9fE^YZg>$==~_wOA)SMjy> zkYt7T3I4@l%0BH;yxHmYWd~Pth~@wP`RV=hkhjlb&pvv}^7@)vv)fv^ZvWailOM(` zulGH>ec(9rT7K{gX?K}K2i!I~Zi-4tu>$7c**+9A{hAw>`wKg#}IourB}Di^?0*tCu`8Eq}&bAkfq0p zH2pj_tb0FU-bNYQDjmBsb0t@n+P*tDljBIMdmoMLHym{-o%5ur`Hu;C< zt3*uSdOY=OhTi<$#%0Hht51BB^mE#v_inWf_$^T-bMLvchU@*-o_)EY#olMbx=gY3Z>jnh?Rx%NuDQO~ z{nioAz4d>;{WUC7{Jj5lwCAkP6|twAe?IwlhHKh;fpdpBUpIZ@-w;-QtVZLaQMPH@ zPph+$Yb}8BwPUa2W%Zl4+CQ!eo70;Rd*S`0E!B2DzRCBd7icw=D$iHRxpT|BRcZ~cB6;@XrDd-m6nzr~9K9?v>^>-5(11!hg9*`E_iE#i99D(z1IRhwFB z6nZw5n*M)tS))7Qy?tA6 YQMomwJ+p%m*j!-nboFyt=akR{02*#hU;qFB literal 0 HcmV?d00001 diff --git a/docs/images/cone-surface-fragment.png b/docs/images/cone-surface-fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..2d82835f702b02da61d672d6227c20da8f9b5f8f GIT binary patch literal 2410 zcmeHJ>sQhT82)KgYEEp;X?P*mTrE6UYAPa{sd;JYvQkJh9HvuC4H{lR>Ewz^%e5}% z1fbfy8?Udjr7J{2l6;tvYU) z8h|4KfC=|A^tw}?!~%eUHqh7mRC=^*Opo~HnEsIygHG?GzpWa<=%K95ZPNy2{o{4W zm#|`R+lJf*Suv29@Z{*y-R^rc(^Y-vJb|y&(+g!lhX<(d2-(qNYQM*);fnDl+0@{F z^ufx?g0i5>wxdw1R@7I$*0Of5bQ+3MVp}D7ULo_FOhzD=qi%-@yt&Y`;uL>*?V<$N9P%Oqll!)2zkg8rU zG)Uyc*80g2pYeSB5|heIjar&LNJBfbGp^MLq5jLDn{&H!ZrV3k3@v*j$t3)dXmT=f z6$GDp(r_A|sr0m-k>#BX-ltOdI~HX1=vDF%2C# z2R_DeP+;}i;%YCGi}G1lug)X*x$pI0CX6#|I!Iiu;Wj}K7Y-*CvgtqYUMf`=%F4`f zc4tPWs)OjOF(q%6IF2oth^Edb*bzc`B_84#Tul&LX;ylcd{D$YNhS0|?qqV7wyACI z)&wx($l0NZckJhs;xSi;m;=`=%L@ftGh8sFp$zoxlL9g8t!=KW zEf)HdgFx0l8dE=>S#Dm>(mtFFHW1}tQ~vr`=+Xz(!?qC+|tff@kNW!W9=-oI#2iw!{^of5> zvBTykXj{oDCTH-@Q~WtnThFkygeMd{BMw7lgcO1T1Chq?;jlVp9%y?getP~4Cr+Zf zE)+?HQ(RZM&rMY)eb+LAn+1_7YQuQsJej)a9{aFY=nc`QHtT(Y*j{(OSba6tIZez_(QdAGL z+q6H}XOFDaK3BXGj54}rjD&+90^ONb5}2#yL|{W(GtC_JjNn0N{=K<10UoNfceO|f zXlOf6>lw~D94Fwzd~c=MVMiOiVr%iWWA(>Fk^TC!% zUFy=5#mKZnT{?_vi;CN7TxyKa>699>)SVDjscz`{>_4#kTYq>y&w0-CIp;Z_bH3;M zoRkwTj%q3d6$paV7#Q6Rf)p|~m-0@zrZds;t$b66baOy5Psdt)FJVd>c&2jb6MMR^-aTXE$|56+|4=+r`h9x?eVKDE6XY~=|QnQ zKbJ2)u=k*t6Ill>e0)oN;=Z;-(Wu~Lxhnxq8TQqg-E?&=4~ChyFTM2=W(mFmV5&9n z*k4#XQS_wPvnF$WMJy3(rgpqf2cb7t?f&WgXNLnMkFhV&14^C(X1o>i4p{F#voi#Jb>a?QgkNss`iIa;p*zUy;_)fP*p z;8ugxCz<~hhPoKhI?}`f0J?dggJm+wz=m4kXlp6(1Axg(=m>P3w8x@zGv^=7s8N++ z^~j~YISoa-h@(W8$74S_)*K*Nx28nJN|QwZ4Dc>Yuqw|oFt2V#l&NzVu8%gdoGqax@5yt_up>u5lOm z6FD5?N{UL16M56N>VxfrySxBu!oNJF&n!{7Pv7ASh5vaF-zl3R*1~X9J(Bl9&BWNCVmB-Oz+`lNC7X(vye{|<_A%yD&8(Be!QyMJ_9k7V7oBFgn)_g&i}lp|)@scn|1D=G*Y z9@?AK@DBqb%L3m?nNgy`@U8k`!c{i;GJcbH&{mJ1b3%X|fo9>$(!g2mD_jkW8_OSr z$cBL=Hrau=%~e&Zo}bTpN6Hm5?dzm%xWLns2->o4E! z_|?34yW_&*-!CsNJ)OVm=N$9;L^&(mcy;>ZS? z;0^#k%rW;@lGQ~eyUqxELkO(D$$N;+<Q;DJ9V|LqH!44^YjsA0JuIy5F%HPGDWw z7|=Ryr2cBD+L~MGDlK`q;g>W2+4U|u`pxNzy1D0LS^me<=F4QaD{A-LP61QWcn#z4 zWz(4)lfjXerMOuJJ@-lqI3O)>@;j|NdAO;)R?ELKR*lHoc>u}3^Ul_Xe`OkGg%5I8 zmsUa%To6mYC~w?9{9Lv5oBmxJew^MC8JoPNCAbTy!e6+tFHiM%uhtNQcw$j~fqN%gsA!JbYVmPFV^k#n zQKJo^8N+FxI~Sm~g)Ga7jrT{`EvWz)`;5xE@=cA1MXCn#h2Hp}{iF+HiW@X`a~A+% zyeIF2$+>x3<$QR)G*B(Kkozp#XfOMT41l?wSpB1E5sGpS6Vv0{cZIIyG56_Q;hKUa zTXIwR!XNAmX@P6r_Ml|p1xMR$?Hh^xtp6P^-6?W>$QXhxzDfpQbU?<*{be^}ZN2Sk zNn~x?LeOLBp^>s_qaFcWkR{D`lkza<&v@A>z%b3SG}nf53=bz&t#q&5!*?R4ix6=% zLAPFd*^(rdw0#m!BI$_o4bL#;CJ}|)2$ed1Rt(WB?#UO!UrqecNki0V9O40{)P1sag}Z_;|$ AAOHXW literal 0 HcmV?d00001 diff --git a/docs/images/cylinder-2.png b/docs/images/cylinder-2.png new file mode 100644 index 0000000000000000000000000000000000000000..88c406bf915e4fb3b7f57ace8aac2caa20326168 GIT binary patch literal 3225 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 AzyJUM literal 0 HcmV?d00001 diff --git a/docs/images/frustum-cone-segment.png b/docs/images/frustum-cone-segment.png new file mode 100644 index 0000000000000000000000000000000000000000..96e4170feebebce4effc85ba48f84feb4c921adb GIT binary patch literal 2399 zcmeHJ`!`g36hG?R7(&QgDb0`&BYD3c;}M3q3vrU%L*7JQ-7)3SOeiCd-X&Cu%CLs6 z>2?W+PAJa^xuQl<88jC|X6T;!1MbiL&<}g9{n=}O_xkL;*Z%H(<~I*#X-Q>C005+2 zT^zjtK&$|ha}w(?i@hR%0YEI#%h?{N?%wth17J9L9~l5@@})#UzhD@5)a5`T0LZj{ z6S20qyCDD|vEb@R_MryOjFJ<$5Zpps7ZtK)T+pjA^(+qmL%J}+?p6rZ`$T|a1s(llQ=c80cniFh;r5 zXpS%(`dvRYv`1kt+`>&P*WI8Bb?!Xaa2@8~Y<;e>yB)8m4q4fAs5nG&$-kh*S}2`4yB{PLuVgsua!o)=DGecc5H}Owm<$_gAsE-Zt#Z5@z5{D zE2QLQuWKj`jJCC*^a!>^*2p8DQeZ*K8&$&9FL%mmQFu>HXq1x_STA!mjGshD4G5XM z$;CS_8A32Rz;krMrWSdap()Q=9e#7;(}AJ4`gAl$^f2A(GRz0N?+<6eXQ#{f?@n5f zEOwQW9;cm8EvQf+HBzn&=fX93amcC|)*o^{KhR~}H;gKSOgH~lHW(e@P!`wFU#N?@LqdD=S0E+~`_^ZzR9cpzK59ijLe zp-R_=v9!N-rtfR*%5mLVDNnL7Z3<>mv2)|b2juWZ%i=ue&<>QC@jOLk=7obLq^YuiLU3!c~xAD`mrvFHf(KiYqYp0_>@`*T0LmFmBAy z?}kvTJDW@M+|pFr+rjCo)R7&l!CG`hL8Q$k!TWyUKjJC62rYWa)Ny`unH*{IgH9DN+#_O;%H)B>^u-n4TZALK?~EZ@ENzGY_Zb^{qCC&i2~PoTzo3W*b& zSgX*VZ3kAg4_M+;r_ zZ4hp|P5UxfIn|)?M_y--t?`se?p#s28*^=$zeHtvBc z=I_lX9CG}WBy1{?&wWO@k|f#d?wuEAr97zJZs>E)iEmz_F)-|LG>At(@8<1J*(M2!B`3@&47@m#6Xlg=1o;>DI zU?CBji&gF)$dN>%gj`=U>rrKw)9_=xI<>ZO`AOZ?`j++4L?;bagE+^&PL0AIW9~Ti z0@R6H^P20;u|P%`<_F&zLH87su@bOO@)+<8Qry>ZQ}MVOWEr2RlN5n=OAN-|Qxr~Q zmI>q6B)y`E^&u@I`Tf3keR&t*nVcQR1YHz~kSjk|+mF85{`U@1OB2qdo4s+5IIU_Y Qg&jqJtCNRgwLMJ#4}kX4f&c&j literal 0 HcmV?d00001 diff --git a/docs/images/frustum-cone.png b/docs/images/frustum-cone.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f6786c138e1ccf6b7dfa0367b9f1767cc39ace GIT binary patch literal 3016 zcmeHJ`8$+t8=kf|$@0l-ZDHhjzXa% z?T=ZzqEPGZu7%ioQAW#3Ni?F?g}K^UqAFjbKZ(G`APXl86pE3$b@}Wj5#Dm~7#M~^ zNwL;qU0dj*02FGgkG-{pTcq#w;MS0Lp4)7CI-dr0v!Z0L#7;a^Yb&T$n^kAL=C7BJ zu})B%lqbY?7W`bE*EJXCtWU?ur&%L6_rja@_Gs@+fY#XqTaOik=G*=){ZDVhi zjf}b7rm+yC-HX2ZV|-q}Ynh)%D z*Ilhoh`djMlE-ddbCg=@P9WY-g(OGl%68;)#9_M=2R<~T#Y%cVmvmTnHF7hfoCHENcam}PRsQ$%JR^!C5L49@YsCNB`{!LB4)-9S zUu6Y)Uqh!pt4;&QbNnDpNAE8Jv|=H85xA$9CQ;BB0X_@8@wxEE+QOGRHvl>>-B+qE zj$nhuU^#PSu?V#4rlCmRl<(lO+E}}C{3G_)9TZUVhX{NwZDx|^LkhNLLGSBJiA{g% zy_{jQo4K@jAo!&1;9HJ7j%QVuT8Y*N0ctHX^aAEQ?*c!q-T!*D8hK|07*Z=biXSY{ zhAEDSup*BKVnv(SXVCOe)xGfaJ|-r(^%G@-IvK(|0P}FXdVpHaJa-h&Q!%J4LmTdQ ztSkxN5~(p0qaISLkH^}P8imKtXL->bTX`-Z9R;^g6}?P~xhZsR>gtRFpDe=yDmlo*);tXEPlTq;k+_Fob6>JUPX)M@BGY~E7G_)1Qagu8 zrPv_KJ+yN;?C%^x>5OaI1a!qT$=}n5=KW(IV}eVoZS!cg@Phko-WTTrRFA7_f#{k* zH=j&7_&6fYQNHg|`}q1ehB|mLJy2tz6x8WkN#K@&+cS&0GmL6aW~rw_vzlX08s=j~6;{xL0W@b*$=XuUk`% zX64%M+&n+ZK;7VKh^mAvjyD?)J`u9T2X23!!_NC04XK*atoasQV7~NICl~DlWEKiK}z0}GI6W*rI zMTO}$p8uIEXNhl+S#0m~yeKT_-aoX=BVu`~lkjPoWhMEEQC%R!;bx-@oszA|0 z*!J6iMJ-3N!iAjvHb2SoYaGspx}?}ANfn7In)9Uiu5;O;(=QIjLnH=i*4cwvb*R8s zY4ZgRwh z*?25t8Py?%b4EloB*y%ghR!~kS)RQ#;`fChXgc!&v)zfOf=HL4kF4Z^CV}N4y)+Xb z*c;-#9*XADOrV0ZM%RQ~S~xVFcg76(qS)~_w*Vr!xhKj&02OT_lSD76_N3&|a#dB_ zjKX&-df8Phh^tB%h(3%o`~YWQX532rY~4*unbFBRqeJ|*w}T;Tfxs187uWPA+MEB} z{w&dnvgxY2ht`l`4RN^iV8g>v{NZQ$rJGqEaDN}&iCXnF4NA5_gu(_$AO{IAUFJX9 z;vX4J!Ek8;Ab4loz(5^FmX`c<#~C9+jH0ifu|Rv(Kr0s#2;OMVzHP~#*S2%|4~IZM zu-$9ftd;mGK<^okUCl^~lZZ*^HjcMib`Su6wp2B?ip;`vi4 z*@m`?h38eMlvuU9`+xiTN4@k3vPiZhNGl$dBE6H)kM*L{hXRr<5&u55fCOUBsD8)Z zKlRv&~7QP+A^7ZmXJ`TaGy%&hesuXlPf4p}-8f z!(-braCWjc-^&QydaiYLh!9Q8AgzZnF-&IA=@jxVrFpR-Li42zk`#=&&3rz7O6m`n z+yz6nRDpw$_;1kQN5e0&#bqxIdT2#`fk)zrVo98)cw(!U&S6l!1S~1nGGopOl=AON zKRPdX&Q=(gaEvw&x?;KD7U=+E9y0&hqv@BMaq#=u=JyvQudql1Y>CD literal 0 HcmV?d00001 diff --git a/docs/images/scheme.png b/docs/images/scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..baa6a8770a2603c1f6024b4f5d701a1a50673add GIT binary patch literal 6981 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 literal 0 HcmV?d00001 diff --git a/docs/images/tube-fragment.png b/docs/images/tube-fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a20ebe67e0657fba74df58fd5f3354e49471d7 GIT binary patch literal 2912 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 T2mm$KEC*n2Vrg7!crWHZO*{K8 literal 0 HcmV?d00001 -- 2.34.1 From a474ad7b3b9217220b9379308745e066857c7073 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:19:29 +0300 Subject: [PATCH 15/16] Delete tutorial.md --- docs/tutorial.md | 209 ----------------------------------------------- 1 file changed, 209 deletions(-) delete mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index 9de1432b..00000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,209 +0,0 @@ -#Tutorial - -###The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) - -The simple visualization can be made with function `main`. (this part will be supplemented as well) -```kotlin -import kotlinx.html.div -import space.kscience.dataforge.context.Context -import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.solid.* -import java.nio.file.Paths - -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - } - } - } - } -} -``` -##Solids properties -**We will analyze which basic properties solids have using `box` solid.** - -Basic properties: -1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. -2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. -3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)` -4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0` - -Let's see how properties are set in solids. -The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. - -***You can see that `box` take four values. Later, we will discuss what they are doing in more detail. Now, it does not really matter.*** -```kotlin -box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) -} -``` -![](../docs/images/small-box.png) - -The `big box` will have properties with custom values. -```kotlin -box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //color in rgb - rotation = Point3D(60, 80, 0) -} -``` -![](../docs/images/big-rotated-box.png) - -If we compare these boxes, we will see all differences. - -Here is the function `main` with both boxes. -```kotlin -fun main(){ - val context = Context{ - plugin(Solids) - } - - context.makeVisionFile ( - Paths.get("customFile.html"), - resourceLocation = ResourceLocation.EMBED - ){ - div { - vision { - solid { - box(10, 10, 10, name = "small box"){ - x = 0 - y = 0 - z = 0 - opacity = 1 //100% opacity - color("red") //as string - rotation = Point3D(0, 0, 0) - } - box(40, 40, 40, name = "big box"){ - x = 20 - y = 10 - z = 60 - opacity = 0.5 //50% opacity - color(0u, 179u, 179u) //rgb - rotation = Point3D(60, 80, 0) - } - } - } - } - } -} -``` -![](../docs/images/two-boxes-1.png) -![](../docs/images/two-boxes-2.png) - -###Basic Solids - -Now, let's see which solids can be visualized: -1) PolyLine -2) Box - ```kotlin - box(50, 50, 50, name = "box") { - x = 0 - y = 0 - z = 0 - color("pink") - } - ``` - ![](../docs/images/box.png) - ```kotlin - box(10, 25, 10, name = "high_box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` - ![](../docs/images/high-box.png) - - ```kotlin - box(65, 40, 40, name = "wide_box") { - x = 0 - y = 0 - z = 0 - color("black") - } - ``` - ![](../docs/images/wide-box.png) - -3) Sphere - ```kotlin - sphere(50, name = "sphere") { - x = 0 - y = 0 - z = 0 - color("blue") - } - ``` - ![](../docs/images/sphere.png) -4) Hexagon - ```kotlin - hexagon( - Point3D(25, 30, 25), - Point3D(35, 30, 25), - Point3D(35, 30, 15), - Point3D(25, 30, 15), - Point3D(30, 18, 20), - Point3D(40, 18, 20), - Point3D(40, 18, 10), - Point3D(30, 18, 10), - name = "classic_hexagon"){ - color("green") - } - ``` - ![](../docs/images/classic-hexagon.png) - ```kotlin - hexagon( - Point3D(5, 30, 5), - Point3D(24, 30, 8), - Point3D(20, 30, -10), - Point3D(5, 30, -7), - Point3D(8, 16, 0), - Point3D(12, 16, 0), - Point3D(10, 16, -5), - Point3D(6.5, 12, -3), - name = "custom_hexagon"){ - color("brown") - } - ``` - ![](../docs/images/custom-hexagon.png) -5) Cone - ```kotlin - cone(60, 80, name = "cone") { - x = 0 - y = 0 - z = 0 - color("beige") - } - ``` - ![](../docs/images/cone-1.png) - ![](../docs/images/cone-2.png) -6) Cone Surface - ```kotlin - coneSurface(60, 50, 30, 10, 100, name = "cone_surface") { - x = 0 - y = 0 - z = 0 - color("red") - rotation = Point3D(2, 50, -9) - } - ``` - ![](../docs/images/cone-surface-1.png) - ![](../docs/images/cone-surface-2.png) -7) Extruded - -- 2.34.1 From d51a38eac41a0fe64cbf1a88809c877c96773ac0 Mon Sep 17 00:00:00 2001 From: kiruma524 <71787194+kiruma524@users.noreply.github.com> Date: Thu, 29 Jul 2021 14:20:15 +0300 Subject: [PATCH 16/16] Add files via upload Not final version of tutorial --- docs/tutorial.md | 333 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 docs/tutorial.md diff --git a/docs/tutorial.md b/docs/tutorial.md new file mode 100644 index 00000000..15b24b3c --- /dev/null +++ b/docs/tutorial.md @@ -0,0 +1,333 @@ +# Tutorial + +#### The main goal of this tutorial is to show all capabilities of ... (this part will be supplemented) + +The simple visualization can be made with function `main`. (this part will be supplemented as well) +```kotlin +import kotlinx.html.div +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.solid.* +import java.nio.file.Paths + +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + } + } + } + } +} +``` +## Solids properties +**We will analyze which basic properties solids have using `box` solid.** + +*Basic properties:* +1. `opacity` - It is set in `float`. It takes on values from 0 to 1, which represent percents of solid opacity. It's initial value is 1. +2. `color` - It can be specified as `Int`, `String`, or as three `Ubytes`, which represent color in `rgb`. Elementally, the solid will have `green` color. +3. `rotation` - it's the point, around which the solid will be rotated. Initially, the value is `Point3D(0, 0, 0)`. Changing `x` coordinate of the point, you make pivot around `x axis`. The same for other coordinates: changing `y` - pivot around `y axis`, changing `z` - pivot around `z axis`. +4. position, which is given by values `x`, `y`, `z`. Initial values are `x = 0`, `y = 0`, `z = 0`. The coordinate system is Cartesian. It's elemental position is this - vertical `y` axis and horizontal `Oxz` plane. + +Let's see how properties are set in solids. +The `small box` will have elemental values of properties. If you will not set properties, it will have the same `position`, `color`, `rotation`, and `opacity` values. + +***You can see that `box` take four values. Later, we will discuss what they do in more detail. Now, it does not really matter.*** +```kotlin +box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) +} +``` +![](../docs/images/small-box.png) + +The `big box` will have properties with custom values. +```kotlin +box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //color in rgb + rotation = Point3D(60, 80, 0) +} +``` +![](../docs/images/big-rotated-box.png) +If we compare these boxes, we will see all differences. + +Here is the function `main` with both boxes. +```kotlin +fun main(){ + val context = Context{ + plugin(Solids) + } + + context.makeVisionFile ( + Paths.get("customFile.html"), + resourceLocation = ResourceLocation.EMBED + ){ + div { + vision { + solid { + box(10, 10, 10, name = "small box"){ + x = 0 + y = 0 + z = 0 + opacity = 1 //100% opacity + color("red") //as string + rotation = Point3D(0, 0, 0) + } + box(40, 40, 40, name = "big box"){ + x = 20 + y = 10 + z = 60 + opacity = 0.5 //50% opacity + color(0u, 179u, 179u) //rgb + rotation = Point3D(60, 80, 0) + } + } + } + } + } +} +``` +![](../docs/images/two-boxes-1.png) +![](../docs/images/two-boxes-2.png) + +***There is plenty of other properties, especially of those, which you can create by yourself. Here we mention just small part.*** + +## Basic Solids +Now, let's see which solids can be visualized: +### 1) PolyLine +### 2) Box + +First thing which has to be mentioned is that `box` takes four values: `box(x, y, z, name)` +* `x` - x-axis length of the `box` +* `y` - y-axis length of the `box` +* `z` - z-axis length of the `box` + +These values have `Float` type. *`x`, `y`, and `z` are necessary values, which cannot be ignored. You have to set them.* + +* `name` - `box`'es identifier with `String` type. *It's an optional value, but without it you won't be able to control solid.* + +Let's create just usual `box` with equal ribs. + +```kotlin + box(50, 50, 50, name = "box") { + color("pink") + } +``` + ![](../docs/images/box.png) + +Now, let's make `box` with bigger `y` value. + ```kotlin + box(10, 25, 10, name = "high box") { + color("black") + } + ``` +As you can see, only rib of `y-axis` differs from other ribs. + + ![](../docs/images/high-box.png) + +For final trial, let's create `box` with bigger `x` value. + + ```kotlin + box(65, 40, 40, name = "wide box") { + x = 0 + y = 0 + z = 0 + color("black") + } + ``` +Predictably, only `x-axis` rib bigger than other ribs. + + ![](../docs/images/wide-box.png) + +### 3) Sphere + +It takes in two values: `radius`, and `name`. +Actually, `name` is general value for all solids, so do not wonder, since all solids need their own identifier. + +As for `radius`, it has `Float` type, and, as you can guess, it sets radius of the sphere, which will be created. + ```kotlin + sphere(50, name = "sphere") { + x = 0 + y = 0 + z = 0 + opacity = 0.9 + color("blue") + } + ``` + ![](../docs/images/sphere.png) + +### 4) Hexagon + +It is solid which has six edges. It is set by eight values: `node1`,..., `node8`. They all have `Point3D` type, so they are just points, vertices. + +*Six edges are these:* +1) Edge with vertices `node1`, `node4`, `node3`, `node2` +2) Edge with vertices `node1`, `node2`, `node6`, `node5` +3) Edge with vertices `node2`, `node3`, `node7`, `node6` +4) Edge with vertices `node4`, `node8`, `node7`, `node3` +5) Edge with vertices `node1`, `node5`, `node8`, `node4` +6) Edge with vertices `node8`, `node5`, `node6`, `node7` + +![](../docs/images/scheme.png) + +As hexagon takes in specific points, we understand that this solid cannot be moved, it fixed in space, and it can't make pivots. + +Let's make classic parallelepiped. +```kotlin + hexagon( + Point3D(25, 30, 25), + Point3D(35, 30, 25), + Point3D(35, 30, 15), + Point3D(25, 30, 15), + Point3D(30, 18, 20), + Point3D(40, 18, 20), + Point3D(40, 18, 10), + Point3D(30, 18, 10), + name = "classic hexagon"){ + color("green") + } +``` + ![](../docs/images/classic-hexagon.png) + +Now, let's make a custom hexagon. + + ```kotlin + hexagon( + Point3D(5, 30, 5), + Point3D(24, 30, 8), + Point3D(20, 30, -10), + Point3D(5, 30, -7), + Point3D(8, 16, 0), + Point3D(12, 16, 0), + Point3D(10, 16, -5), + Point3D(6.5, 12, -3), + name = "custom_hexagon"){ + color("brown") + } + ``` + ![](../docs/images/custom-hexagon.png) +### 3) Cone +It takes in six values: `bottomRadius`, `height`, `upperRadius`, `startAngle`, `angle`, and `name`. + +Obviously, `bottomRadius` is responsible for radius of a bottom base, and `height` sets height of a cone along the `z-axis`. + +As it takes such values as `upperRadius`, `startAngle`, `angle`, `cone` can build not only usual cones, but also cone segments. Initially, `upperRadius` will have `0.0` value, `startAngle` - `0f`, `angle` - `PI2`, so if you don't set them, you'll get just a simple cone. + +Setting `upperRadius`, you make a frustum cone, since it sets a radius of the upper base of a cone. Set `startAngle`, and `angle` let to cut off segments by planes perpendicular to the base. `startAngle` - an angle, starting with which segment will be left, `angle` - an angle of cone, which will be set from `startAngle`. + +Let's build a classic cone: +```kotlin + cone(60, 80, name = "cone") { + color("beige") + } + ``` + ![](../docs/images/cone-1.png) + ![](../docs/images/cone-2.png) + +First of all, we have to try to build a frustum cone: +```kotlin +cone(60, 80, name = "cone") { + color(0u, 40u, 0u) +} +``` +![](../docs/images/frustum-cone.png) + +Now, we need to make a try to build a cone segment: + +```kotlin +cone(60, 80, angle = PI, name = "cone") { + color(0u, 0u, 200u) +} +``` +![](../docs/images/cone-segment-1.png) +![](../docs/images/cone-segment-2.png) + +Finally, the segment of frustum cone is left for a try: +```kotlin +cone(60, 100, 20, PI*3/4, angle = PI/3, name = "cone") { + color(190u, 0u, 0u) +} +``` +![](../docs/images/frustum-cone-segment.png) + +### 4) Cone Surface +This solid is set by seven values:`bottomOuterRadius`, `bottomInnerRadius`, `height`, `topOuterRadius`, `topInnerRadius`, `startAngle`, and `angle`. + +In addition to `height`, `startAngle`, and `angle`, which work as they work in `cone`, there are some new values. +`bottomOuterRadius`, and `bottomInnerRadius` set properties of the bottom circle, `topOuterRadius`, `topInnerRadius` - of the upper circle. They have no initial value, so that means they have to be set. + +Generally, `cone`, and `coneSurface` buildings work in the same way, it's possible to make `coneSurface`'s fragments as in `cone` + +Let's build usual cone surface with almost all properties set: +```kotlin + coneSurface(60, 50, 30, 10, 100, name = "cone surface") { + color("red") + rotation = Point3D(2, 50, -9) + } + ``` +![](../docs/images/cone-surface-1.png) +![](../docs/images/cone-surface-2.png) + +Now, let's create a cone surface and set all it's properties: + +```kotlin +coneSurface(30, 25, 10, 10, 8,0f, pi*3/4, name = "cone surface") { + color("fuchsia") + rotation = Point3D(2, 50, -9) +} +``` +![](../docs/images/cone-surface-fragment.png) +![](../docs/images/cone-surface-fragment-2.png) + +### 5) Cylinder + +This solid is set by `radius`, and `height`. As you can see by accepting values, there's no option of building fragments of cylinders. + +Here's a demonstration of a cylinder: + +```kotlin +cylinder(40, 100, "cylinder"){ + rotation = Point3D(40, 0, 0) + color("indigo") +} +``` +![](../docs/images/cylinder-1.png) +![](../docs/images/cylinder-2.png) +### 6) Tube + +`tube` takes in `radius`, `height`, `innerRadius`, `startAngle`, `angle`, and `name`. *All values are familiar from `cone`, and `coneSurface` solids.* + +Here is an example of classic tube: +```kotlin +tube(50, 40, 20, name = "usual tube"){ + opacity = 0.4 +} +``` +![](../docs/images/tube.png) + +This is an example of tube fragment: + +```kotlin +tube(50, 40, 20, 0f, PI, name = "fragmented tube"){ + color("white") +} +``` +![](../docs/images/tube-fragment.png) +### 7) Extruded + -- 2.34.1