QGIS/scripts/symbol_xml2db.py
2024-11-29 15:38:02 +01:00

112 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""
/***************************************************************************
symbol_xml2db.py
-------------------
begin : 26-5-2012
copyright : (C) 2012 by Arunmozhi
email : aruntheguy at gmail dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
The script creates a sqlite3 Db for storing the symbols which will be
shipped with QGIS by default. It then converts symbols and colorramps
in the symbology_ng_style.xml to the database table entries.
"""
import sqlite3
from xml.dom.minidom import parse, parseString
xmlfile = "../resources/symbology-style.xml"
dbfile = "../resources/symbology-style.db"
_symbol = (
"CREATE TABLE symbol("
"id INTEGER PRIMARY KEY,"
"name TEXT UNIQUE,"
"xml TEXT,"
"favorite INTEGER)"
)
_colorramp = (
"CREATE TABLE colorramp("
"id INTEGER PRIMARY KEY,"
"name TEXT UNIQUE,"
"xml TEXT,"
"favorite INTEGER)"
)
_tag = "CREATE TABLE tag(" "id INTEGER PRIMARY KEY," "name TEXT)"
_tagmap = "CREATE TABLE tagmap(" "tag_id INTEGER NOT NULL," "symbol_id INTEGER)"
_ctagmap = "CREATE TABLE ctagmap(" "tag_id INTEGER NOT NULL," "colorramp_id INTEGER)"
_smartgroup = (
"CREATE TABLE smartgroup(" "id INTEGER PRIMARY KEY," "name TEXT," "xml TEXT)"
)
create_tables = [_symbol, _colorramp, _tag, _tagmap, _ctagmap, _smartgroup]
# Create the DB with required Schema
conn = sqlite3.connect(dbfile)
c = conn.cursor()
print("Creating tables in the Database\n")
for table in create_tables:
try:
c.execute(table)
print(table)
except sqlite3.OperationalError as e:
pass
conn.commit()
# parse the XML file & write symbol into DB
dom = parse(xmlfile)
symbols = dom.getElementsByTagName("symbol")
for symbol in symbols:
symbol_name = symbol.getAttribute("name")
symbol_favorite = symbol.getAttribute("favorite")
if not symbol_favorite:
symbol_favorite = 0
if "@" in symbol_name:
parts = symbol_name.split("@")
parent_name = parts[1]
layerno = int(parts[2])
c.execute("SELECT xml FROM symbol WHERE name=(?)", (parent_name,))
symdom = parseString(c.fetchone()[0]).getElementsByTagName("symbol")[0]
symdom.getElementsByTagName("layer")[layerno].appendChild(symbol)
c.execute("UPDATE symbol SET xml=? WHERE name=?", (symdom.toxml(), parent_name))
else:
c.execute(
"INSERT INTO symbol VALUES (?,?,?,?)",
(None, symbol_name, symbol.toxml(), symbol_favorite),
)
conn.commit()
# ColorRamps
colorramps = dom.getElementsByTagName("colorramp")
for ramp in colorramps:
ramp_name = ramp.getAttribute("name")
symbol_favorite = symbol.getAttribute("favorite")
if not symbol_favorite:
symbol_favorite = 0
c.execute(
"INSERT INTO colorramp VALUES (?,?,?,?)",
(None, ramp_name, ramp.toxml(), symbol_favorite),
)
conn.commit()
# Finally close the sqlite cursor
c.close()