GetParticleParameters.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <template>
  2. <div class="row items-baseline">
  3. <div class="col-xs-12 col-sm-auto text-weight-bold text-center q-px-md q-py-sm">
  4. <div :style="flexRowTitleStyle">
  5. Spherical particle
  6. </div>
  7. </div>
  8. <div class="col-xs-grow col-sm q-px-xs">
  9. <div class="row justify-xs-center justify-sm-start items-baseline">
  10. <div class="col-auto" >
  11. <div class="q-gutter-x-md">
  12. <q-radio v-model="particleType" dense size='sm' val="bulk" label="bulk" />
  13. <q-radio v-model="particleType" dense size='sm' val="core-shell" label="core-shell" />
  14. </div>
  15. </div>
  16. <div class="col-auto q-px-md">
  17. <div class="row justify-xs-center justify-sm-start items-baseline">
  18. <div class="col-auto" >
  19. <q-radio v-model="particleType" dense size='sm' val="multilayer" label="multilayer" />
  20. </div>
  21. <div class="col-auto" >
  22. <q-input
  23. v-model.number="numberOfLayers"
  24. :disable="particleType!='multilayer'"
  25. :outlined="particleType=='multilayer'"
  26. :filled="particleType!='multilayer'"
  27. type="number"
  28. class="q-px-sm"
  29. min=1
  30. max=10
  31. step=1
  32. dense
  33. style="width: 6em"
  34. />
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. <div v-for="(layer, index) in layers" :key="index" class="row items-baseline q-py-xs">
  42. <div class="col-xs-12 col-sm-auto text-center q-px-md q-py-sm">
  43. <div :style="flexRowTitleStyle">
  44. {{getLayerTitle(particleType, index)}}
  45. </div>
  46. </div>
  47. <div class="col-xs-grow col-sm">
  48. <div class="row justify-xs-center justify-sm-start items-baseline">
  49. <div class="col-auto">
  50. <q-tooltip
  51. class="bg-primary shadow-4"
  52. anchor="center left"
  53. self="center middle">
  54. {{getTooltipText(index)}}
  55. </q-tooltip>
  56. <input-with-units
  57. v-model:is-showing-help="isShowingHelpForInputWithUnits"
  58. :initial-expression="toUnits(layer.layerWidth, units).toString()"
  59. :units="units"
  60. :title=" index==0 ? 'R' : 'h' "
  61. :input-result="toUnits(layer.layerWidth, units)"
  62. @update:input-result="layer.layerWidth = fromUnits(units,$event)"
  63. />
  64. </div>
  65. <div class="col-auto">
  66. <q-select
  67. v-model="layer.materialName"
  68. :options="activatedMaterials"
  69. style="width: 17.7em"
  70. class="q-px-xs"
  71. dense
  72. options-dense
  73. outlined
  74. options-value="value"
  75. options-label="label"
  76. />
  77. </div>
  78. </div>
  79. <div v-if="layer.materialName=='nk-constant'"
  80. class="row justify-xs-center justify-sm-start items-baseline">
  81. <div class="col-auto"> <input-with-units
  82. v-model:is-showing-help="isShowingHelpForInputWithUnits"
  83. v-model:input-result="layer.n"
  84. :initial-expression="layer.n.toString()"
  85. title="Re(n)"
  86. /></div>
  87. <div class="col-auto"> <input-with-units
  88. v-model:is-showing-help="isShowingHelpForInputWithUnits"
  89. v-model:input-result="layer.k"
  90. :initial-expression="layer.k.toString()"
  91. title="Im(n)"
  92. /></div>
  93. </div>
  94. </div>
  95. </div>
  96. </template>
  97. <script lang="ts">
  98. import {
  99. defineComponent,
  100. ref,
  101. reactive,
  102. computed,
  103. watch
  104. } from 'vue'
  105. import { useStore } from 'src/store'
  106. import { flexRowTitleStyle, fromUnits, toUnits } from 'components/utils'
  107. import {cloneDeep} from 'lodash'
  108. import InputWithUnits from 'components/InputWithUnits.vue';
  109. export default defineComponent({
  110. name: 'GetParticleParameters',
  111. components: {InputWithUnits},
  112. setup() {
  113. const $store = useStore()
  114. const particleType=ref('bulk')
  115. const numberOfLayers=ref(1)
  116. const isShowingHelpForInputWithUnits = computed({
  117. get: () => $store.state.guiRuntime.isShowingHelpForInputWithUnits,
  118. set: val => $store.commit('guiRuntime/setIsShowingHelpForInputWithUnits', val)
  119. })
  120. const units = computed({
  121. get: () => $store.state.guiRuntime.units,
  122. set: val => $store.commit('guiRuntime/setUnits', val)
  123. })
  124. const activatedMaterials = computed(() => $store.state.guiRuntime.activatedMaterials)
  125. function getReactiveLayers() {
  126. return reactive( cloneDeep($store.state.simulationSetup.gui.layers) )
  127. }
  128. let layers = getReactiveLayers()
  129. watch($store.state.simulationSetup.gui.layers, ()=>{
  130. layers = getReactiveLayers()
  131. })
  132. watch(layers, ()=>{
  133. $store.commit('simulationSetup/setLayers', layers)
  134. })
  135. watch(particleType, ()=>{
  136. if (particleType.value=='bulk') numberOfLayers.value = 1
  137. if (particleType.value=='core-shell') numberOfLayers.value = 2
  138. if (particleType.value=='multilayer') numberOfLayers.value = 3
  139. })
  140. watch(numberOfLayers, ()=>{
  141. numberOfLayers.value = parseInt(numberOfLayers.value.toString())
  142. if (isNaN(numberOfLayers.value)) numberOfLayers.value = 3
  143. if (numberOfLayers.value < 1) numberOfLayers.value = 1
  144. if (numberOfLayers.value > 10) numberOfLayers.value = 10
  145. while (numberOfLayers.value < layers.length) {
  146. layers.pop();
  147. }
  148. let coreR = layers[0].layerWidth;
  149. while (numberOfLayers.value > layers.length) {
  150. // r_prev = r_prev*1.1;
  151. layers.push(
  152. {
  153. layerWidth: coreR*0.1,
  154. materialName: 'nk-constant',
  155. n: 4.0,
  156. k: 0.01,
  157. nSpline: undefined,
  158. kSpline: undefined,
  159. }
  160. );
  161. }
  162. })
  163. function getLayerTitle (particleType:string, index:number) {
  164. if (particleType=='core-shell' && index == 0) return 'core'
  165. if (particleType=='core-shell' && index == 1) return 'shell'
  166. if (particleType=='multilayer') return 'layer '+ (index+1).toString()
  167. return 'bulk'
  168. }
  169. function getTooltipText(index:number) {
  170. if (index == 0) return 'radius'
  171. return 'thickness'
  172. }
  173. return { flexRowTitleStyle, particleType,
  174. numberOfLayers, layers, getLayerTitle, getTooltipText,
  175. units, toUnits, fromUnits, isShowingHelpForInputWithUnits,
  176. activatedMaterials
  177. }
  178. },
  179. })
  180. </script>