# -*- coding: utf-8 -*- # Original code by (C) 2019 yorikvanhavre # Copyright (C) 2023 Ilia Kurochkin # # 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