initial version of the tags switching

This commit is contained in:
guga kakhadze 2026-01-20 08:36:21 +04:00
parent d8801c5e4e
commit 65d98d3001

View File

@ -0,0 +1,139 @@
import json
import os
import shutil
from datetime import datetime
# =========================================================
# FIND INPUT JSON IN CURRENT DIRECTORY
# =========================================================
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
json_files = [
f for f in os.listdir(SCRIPT_DIR)
if f.lower().endswith(".json")
]
if len(json_files) == 0:
raise RuntimeError("No JSON file found in script directory.")
if len(json_files) > 1:
raise RuntimeError(
"Multiple JSON files found. Keep only ONE JSON file in the folder:\n"
+ "\n".join(json_files)
)
INPUT_JSON = os.path.join(SCRIPT_DIR, json_files[0])
# Output and backup paths (same folder)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
BACKUP_JSON = os.path.join(
SCRIPT_DIR,
"tag_export_backup_%s.json" % timestamp
)
OUTPUT_JSON = os.path.join(
SCRIPT_DIR,
"tag_export_modified_%s.json" % timestamp
)
# =========================================================
# USER SELECTION
# =========================================================
print("")
print("Select target tag source:")
print(" 1 = OPC")
print(" 2 = MEMORY")
print("")
choice = raw_input("Enter choice (1 or 2): ").strip()
if choice == "1":
TARGET_MODE = "OPC"
elif choice == "2":
TARGET_MODE = "MEMORY"
else:
raise ValueError("Invalid selection. Must be 1 or 2.")
print("Target mode:", TARGET_MODE)
# =========================================================
# BACKUP ORIGINAL FILE
# =========================================================
shutil.copy2(INPUT_JSON, BACKUP_JSON)
print("Backup created:")
print(" ", BACKUP_JSON)
# =========================================================
# JSON MODIFICATION LOGIC
# =========================================================
modified_count = 0
def process_node(node):
global modified_count
if not isinstance(node, dict):
return
tag_type = node.get("tagType")
value_source = node.get("valueSource")
# Modify ONLY atomic tags
if tag_type == "AtomicTag":
if TARGET_MODE == "MEMORY":
if value_source != "memory":
node["valueSource"] = "memory"
node["opcItemPath"] = ""
modified_count += 1
elif TARGET_MODE == "OPC":
if value_source != "opc":
node["valueSource"] = "opc"
# opcItemPath preserved if it exists
modified_count += 1
# Recurse into child tags
for key in ("tags", "children"):
children = node.get(key)
if isinstance(children, list):
for child in children:
process_node(child)
# =========================================================
# LOAD → PROCESS → WRITE
# =========================================================
with open(INPUT_JSON, "r") as f:
data = json.load(f)
if isinstance(data, list):
for root in data:
process_node(root)
else:
process_node(data)
with open(OUTPUT_JSON, "w") as f:
json.dump(data, f, indent=2)
# =========================================================
# SUMMARY
# =========================================================
print("")
print("======================================")
print(" Tag Source Update Complete")
print("======================================")
print(" Input File :", INPUT_JSON)
print(" Backup File :", BACKUP_JSON)
print(" Output File :", OUTPUT_JSON)
print(" Target Mode :", TARGET_MODE)
print(" Tags Modified :", modified_count)
print("======================================")
if modified_count == 0:
print("⚠ WARNING: No tags were modified.")