Skip to content

Instantly share code, notes, and snippets.

@lad1337
Created February 7, 2024 21:18
Show Gist options
  • Save lad1337/5ffc1b070611db32b912b9bba02a189e to your computer and use it in GitHub Desktop.
Save lad1337/5ffc1b070611db32b912b9bba02a189e to your computer and use it in GitHub Desktop.
csv to resource godot
@tool
extends EditorPlugin
@export_file(".csv") var csv_path = "res://data/elements/elements.csv"
@export_dir var tres_dir = "res://resources/elements/"
const converter_path = preload("res://addons/elementimporter/ElementImporter.tscn")
var dockedScene
func _enter_tree():
dockedScene = converter_path.instantiate()
dockedScene.CSV_path = csv_path
dockedScene.tres_dir = tres_dir
add_control_to_dock(DOCK_SLOT_RIGHT_UR, dockedScene)
func _exit_tree():
remove_control_from_docks(dockedScene)
dockedScene.queue_free()
func read():
print("Loading...")
func _on_button_pressed():
read()
@tool
extends Control
@onready var e_list = $VBoxContainer/ScrollContainer/VBoxContainer
var CSV_path : String
var tres_dir : String
func main():
print('Reading CSV: %s' % CSV_path)
for old in e_list.get_children():
old.queue_free()
var csv = FileAccess.open(CSV_path, FileAccess.READ)
var elements : Array = read(csv)
for e in elements:
var e_label : Label = Label.new()
#print(e)
e = convert_to_element(e)
e_label.text = "%s %s" % [e.atomic_number, e.name]
e_list.add_child(e_label)
var location = "%s%s.tres" % [tres_dir, e.atomic_number]
print("Creating %s " % location)
ResourceSaver.save(e, location)
func convert_to_element(data : Dictionary) -> ElementResource:
printt(data["AtomicNumber"], data["Element"])
var e = ElementResource.new()
e.atomic_number = int(data["AtomicNumber"])
e.name = data["Element"]
e.symbol = data["Symbol"]
e.atomic_mass = float(data["AtomicMass"])
e.group = int(data["Group"])
e.period = int(data["Period"])
e.n_neutrons = int(data["NumberofNeutrons"])
e.n_protons = int(data["NumberofProtons"])
e.n_electrons = int(data["NumberofElectrons"])
e.radioactive = data["Radioactive"] == "True"
e.reactiveness = float(data["Reactiveness"])
e.electronegativity = float(data["Electronegativity"])
e.l = float(data["l"])
e.n = float(data["n"])
e.type = data["Type"]
match data["Phase"]:
"solid":
e.phase = ElementResource.PHASE.SOLID
"gas":
e.phase = ElementResource.PHASE.GAS
"liq":
e.phase = ElementResource.PHASE.LIQUID
"artificial":
e.phase = ElementResource.PHASE.ARTIFICIAL
match [data["Metal"], data["Nonmetal"], data["Metalloid"]]:
["True", ..]:
e.meatal_type = ElementResource.METAL_TYPE.METAL
["False", "True", ..]:
e.meatal_type = ElementResource.METAL_TYPE.NONE_METAL
["False", "False", "True"]:
e.meatal_type = ElementResource.METAL_TYPE.METALLOID
return e
func read(file : FileAccess) -> Array:
var out = []
var header : Array
while file.get_position() < file.get_length():
var row = file.get_csv_line()
if not header:
header = row
continue
#print(row)
var e = _create_dict(header, row)
#print(e)
out.append(e)
return out
func _create_dict(header : Array, data : Array) -> Dictionary:
var e : Dictionary
for i in header.size():
e[header[i]] = data[i]
return e
func _on_button_pressed():
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment