74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Original code by (C) 2019 yorikvanhavre <yorik@uncreated.net>
|
|
# Copyright (C) 2023 Ilia Kurochkin <brothermechanic@gmail.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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
import xml.sax
|
|
|
|
|
|
class FreeCAD_xml_handler(xml.sax.ContentHandler):
|
|
|
|
"""A XML handler to process the FreeCAD GUI xml data"""
|
|
|
|
# this creates a dictionary where each key is a FC object name,
|
|
# and each value is a dictionary of property:value pairs
|
|
|
|
def __init__(self):
|
|
|
|
self.guidata = {}
|
|
self.current = None
|
|
self.properties = {}
|
|
self.currentprop = None
|
|
self.currentval = None
|
|
|
|
# Call when an element starts
|
|
|
|
def startElement(self, tag, attributes):
|
|
|
|
if tag == "ViewProvider":
|
|
self.current = attributes["name"]
|
|
elif tag == "Property":
|
|
name = attributes["name"]
|
|
if name in ["Visibility","ShapeColor","Transparency","DiffuseColor"]:
|
|
self.currentprop = name
|
|
elif tag == "Bool":
|
|
if attributes["value"] == "true":
|
|
self.currentval = True
|
|
else:
|
|
self.currentval = False
|
|
elif tag == "PropertyColor":
|
|
c = int(attributes["value"])
|
|
r = float((c>>24)&0xFF)/255.0
|
|
g = float((c>>16)&0xFF)/255.0
|
|
b = float((c>>8)&0xFF)/255.0
|
|
self.currentval = (r,g,b)
|
|
elif tag == "Integer":
|
|
self.currentval = int(attributes["value"])
|
|
elif tag == "Float":
|
|
self.currentval = float(attributes["value"])
|
|
elif tag == "ColorList":
|
|
self.currentval = attributes["file"]
|
|
|
|
# Call when an elements ends
|
|
|
|
def endElement(self, tag):
|
|
|
|
if tag == "ViewProvider":
|
|
if self.current and self.properties:
|
|
self.guidata[self.current] = self.properties
|
|
self.current = None
|
|
self.properties = {}
|
|
elif tag == "Property":
|
|
if self.currentprop and (self.currentval != None):
|
|
self.properties[self.currentprop] = self.currentval
|
|
self.currentprop = None
|
|
self.currentval = None
|