-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implemented changes requested in #42
- Loading branch information
Showing
3 changed files
with
65 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
116 changes: 56 additions & 60 deletions
116
src/commonMain/kotlin/space/kscience/gdml/GdmlMaterialPostProcessor.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,72 +1,68 @@ | ||
package space.kscience.gdml | ||
|
||
public class GdmlMaterialPostProcessor { | ||
public companion object { | ||
public fun removeUnusedMaterials(gdml: Gdml): Gdml { | ||
public fun Gdml.removeUnusedMaterials(): Gdml { | ||
|
||
val materialsInUse: MutableSet<GdmlMaterial> = mutableSetOf() | ||
val elementsInUse: MutableSet<GdmlElement> = mutableSetOf() | ||
val isotopesInUse: MutableSet<GdmlIsotope> = mutableSetOf() | ||
val materialsInUse: MutableSet<GdmlMaterial> = mutableSetOf() | ||
val elementsInUse: MutableSet<GdmlElement> = mutableSetOf() | ||
val isotopesInUse: MutableSet<GdmlIsotope> = mutableSetOf() | ||
|
||
fun addMaterialsRecursively(composite: GdmlComposite?) { | ||
// composite may be composed of other composites | ||
composite?.fractions?.forEach { fraction -> | ||
val materialComponent = gdml.materials.get<GdmlComposite>(fraction.ref) | ||
if (materialComponent != null) { | ||
materialsInUse.add(materialComponent) | ||
addMaterialsRecursively(materialComponent) | ||
} else { | ||
val elementComponent = gdml.materials.get<GdmlElement>(fraction.ref) | ||
if (elementComponent != null) { | ||
elementsInUse.add(elementComponent) | ||
elementComponent.fractions.forEach { elementFraction -> | ||
val isotopeComponent = gdml.materials.get<GdmlIsotope>(elementFraction.ref) | ||
isotopesInUse.add(isotopeComponent!!) // element must be mode of isotopes | ||
} | ||
} else { | ||
val isotopeComponent = gdml.materials.get<GdmlIsotope>(fraction.ref) | ||
if (isotopeComponent != null) { | ||
isotopesInUse.add(isotopeComponent) | ||
} | ||
} | ||
fun addMaterialsRecursively(composite: GdmlComposite?) { | ||
// composite may be composed of other composites | ||
composite?.fractions?.forEach { fraction -> | ||
val materialComponent = this.materials.get<GdmlComposite>(fraction.ref) | ||
if (materialComponent != null) { | ||
materialsInUse.add(materialComponent) | ||
addMaterialsRecursively(materialComponent) | ||
} else { | ||
val elementComponent = this.materials.get<GdmlElement>(fraction.ref) | ||
if (elementComponent != null) { | ||
elementsInUse.add(elementComponent) | ||
elementComponent.fractions.forEach { elementFraction -> | ||
val isotopeComponent = this.materials.get<GdmlIsotope>(elementFraction.ref) | ||
isotopesInUse.add(isotopeComponent!!) // element must be mode of isotopes | ||
} | ||
} else { | ||
val isotopeComponent = this.materials.get<GdmlIsotope>(fraction.ref) | ||
if (isotopeComponent != null) { | ||
isotopesInUse.add(isotopeComponent) | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
gdml.structure.content.forEach { | ||
val volume = gdml.structure.get<GdmlVolume>(it.name) | ||
if (volume != null) { | ||
val material = volume.materialref.resolve(gdml)!! | ||
materialsInUse.add(material) | ||
val composite = gdml.materials.get<GdmlComposite>(material.name) | ||
addMaterialsRecursively(composite) | ||
} | ||
} | ||
this.structure.content.forEach { | ||
val volume = this.structure.get<GdmlVolume>(it.name) | ||
if (volume != null) { | ||
val material = volume.materialref.resolve(this)!! | ||
materialsInUse.add(material) | ||
val composite = this.materials.get<GdmlComposite>(material.name) | ||
addMaterialsRecursively(composite) | ||
} | ||
} | ||
|
||
|
||
// materialsInUse now contains all materials in use | ||
/* | ||
println(" - ISOTOPES:") | ||
isotopesInUse.forEach { println(it) } | ||
println(" - ELEMENTS:") | ||
elementsInUse.forEach { println(it) } | ||
println(" - MATERIALS:") | ||
materialsInUse.forEach { println(it) } | ||
*/ | ||
// materialsInUse now contains all materials in use | ||
/* | ||
println(" - ISOTOPES:") | ||
isotopesInUse.forEach { println(it) } | ||
println(" - ELEMENTS:") | ||
elementsInUse.forEach { println(it) } | ||
println(" - MATERIALS:") | ||
materialsInUse.forEach { println(it) } | ||
*/ | ||
|
||
gdml.materials.content.clear() | ||
// Refill materials only with used ones | ||
isotopesInUse.forEach { | ||
gdml.materials.content.add(it) | ||
} | ||
elementsInUse.forEach { | ||
gdml.materials.content.add(it) | ||
} | ||
materialsInUse.forEach { | ||
gdml.materials.content.add(it) | ||
} | ||
|
||
return gdml | ||
} | ||
this.materials.content.clear() | ||
// Refill materials only with used ones | ||
isotopesInUse.forEach { | ||
this.materials.content.add(it) | ||
} | ||
} | ||
elementsInUse.forEach { | ||
this.materials.content.add(it) | ||
} | ||
materialsInUse.forEach { | ||
this.materials.content.add(it) | ||
} | ||
|
||
return this | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters