diff --git a/pymvr/__init__.py b/pymvr/__init__.py index ecf28c9..61163bd 100644 --- a/pymvr/__init__.py +++ b/pymvr/__init__.py @@ -98,11 +98,11 @@ def write_mvr(self, path: Optional[str] = None): if path is not None: if sys.version_info >= (3, 9): ElementTree.indent(self.xml_root, space=" ", level=0) - xmlstr = ElementTree.tostring( - self.xml_root, encoding="UTF-8", xml_declaration=True - ) + xmlstr = ElementTree.tostring(self.xml_root, encoding="unicode") + dec = '\n' + initxml = dec + xmlstr with zipfile.ZipFile(path, "w", zipfile.ZIP_DEFLATED) as z: - z.writestr("GeneralSceneDescription.xml", xmlstr) + z.writestr("GeneralSceneDescription.xml", initxml) for file_path, file_name in self.files_list: try: z.write(file_path, arcname=file_name) @@ -419,11 +419,11 @@ def __init__( matrix: Optional[Matrix] = None, classing: Optional[str] = None, fixture_id: Optional[str] = None, - fixture_id_numeric: int = 0, - unit_number: int = 0, - custom_id: int = 0, - custom_id_type: int = 0, - cast_shadow: bool = False, + fixture_id_numeric: Optional[int] = 0, + unit_number: Optional[int] = 0, + custom_id: Optional[int] = None, + custom_id_type: Optional[int] = None, + cast_shadow: Optional[bool] = False, addresses: Optional["Addresses"] = None, alignments: Optional["Alignments"] = None, custom_commands: Optional["CustomCommands"] = None, @@ -572,12 +572,18 @@ def populate_xml(self, element: Element): if self.connections: self.connections.to_xml(element) - ElementTree.SubElement(element, "FixtureID").text = str(self.fixture_id) or "0" - ElementTree.SubElement(element, "FixtureIDNumeric").text = str( - self.fixture_id_numeric - ) - if self.unit_number is not None: + if self.fixture_id: + ElementTree.SubElement(element, "FixtureID").text = ( + str(self.fixture_id) or "0" + ) + + if self.fixture_id_numeric: + ElementTree.SubElement(element, "FixtureIDNumeric").text = str( + self.fixture_id_numeric + ) + if self.unit_number: ElementTree.SubElement(element, "UnitNumber").text = str(self.unit_number) + if self.custom_id_type is not None: ElementTree.SubElement(element, "CustomIdType").text = str( self.custom_id_type @@ -905,10 +911,14 @@ def __str__(self): return f"{self.name}" def to_xml(self): + check_mtx = any( + isinstance(i, float) for i in set().union(sum(self.matrix.matrix[:-1], [])) + ) element = ElementTree.Element( type(self).__name__, name=self.name, uuid=self.uuid ) - Matrix(self.matrix.matrix).to_xml(parent=element) + if self.matrix and check_mtx: + Matrix(self.matrix.matrix).to_xml(parent=element) if self.classing: ElementTree.SubElement(element, "Classing").text = self.classing if self.child_list: @@ -927,6 +937,7 @@ def __init__( trusses: Optional[List["Truss"]] = None, video_screens: Optional[List["VideoScreen"]] = None, projectors: Optional[List["Projector"]] = None, + geometry3d: Optional[List["Geometry3D"]] = None, xml_node: Optional["Element"] = None, *args, **kwargs, @@ -939,6 +950,7 @@ def __init__( self.video_screens = video_screens if video_screens is not None else [] self.trusses = trusses if trusses is not None else [] self.projectors = projectors if projectors is not None else [] + self.geometry3d = geometry3d if geometry3d is not None else [] super().__init__(xml_node, *args, **kwargs) @@ -965,6 +977,9 @@ def _read_xml(self, xml_node: "Element"): ] self.projectors = [Projector(xml_node=i) for i in xml_node.findall("Projector")] + self.geometry3d = [ + Geometry3D(xml_node=i) for i in xml_node.findall("Geometry3D") + ] def to_xml(self, parent: Element): element = ElementTree.SubElement(parent, type(self).__name__) @@ -984,6 +999,8 @@ def to_xml(self, parent: Element): element.append(video_screen.to_xml()) for projector in self.projectors: element.append(projector.to_xml()) + for geometry3d in self.geometry3d: + element.append(geometry3d.to_xml()) return element @@ -1022,10 +1039,14 @@ def _read_xml(self, xml_node: "Element"): self.matrix = Matrix(str_repr=matrix_node.text) def to_xml(self): + check_mtx = any( + isinstance(i, float) for i in set().union(sum(self.matrix.matrix[:-1], [])) + ) element = ElementTree.Element( type(self).__name__, name=self.name, uuid=self.uuid ) - Matrix(self.matrix.matrix).to_xml(parent=element) + if self.matrix and check_mtx: + Matrix(self.matrix.matrix).to_xml(parent=element) if self.child_list: self.child_list.to_xml(parent=element) return element @@ -1141,6 +1162,7 @@ def __init__( self, uuid: Optional[str] = None, name: Optional[str] = None, + child_list: Optional["ChildList"] = None, geometry3d: Optional[List["Geometry3D"]] = None, symbol: Optional[List["Symbol"]] = None, xml_node: Optional["Element"] = None, @@ -1149,6 +1171,7 @@ def __init__( ): self.uuid = uuid self.name = name + self.child_list = child_list self.geometry3d = geometry3d if geometry3d is not None else [] self.symbol = symbol if symbol is not None else [] super().__init__(xml_node, *args, **kwargs) @@ -1174,6 +1197,8 @@ def to_xml(self): element = ElementTree.Element( type(self).__name__, name=self.name, uuid=self.uuid ) + if self.child_list: + self.child_list.to_xml(element) for geo in self.geometry3d: element.append(geo.to_xml()) for sym in self.symbol: @@ -1218,8 +1243,12 @@ def __hash__(self): return hash((self.file_name, str(self.matrix))) def to_xml(self): + check_mtx = any( + isinstance(i, float) for i in set().union(sum(self.matrix.matrix[:-1], [])) + ) element = ElementTree.Element(type(self).__name__, fileName=self.file_name) - Matrix(self.matrix.matrix).to_xml(parent=element) + if self.matrix and check_mtx: + Matrix(self.matrix.matrix).to_xml(parent=element) return element @@ -1249,10 +1278,14 @@ def __str__(self): return f"{self.uuid}" def to_xml(self): + check_mtx = any( + isinstance(i, float) for i in set().union(sum(self.matrix.matrix[:-1], [])) + ) element = ElementTree.Element( type(self).__name__, uuid=self.uuid, symdef=self.symdef ) - Matrix(self.matrix.matrix).to_xml(parent=element) + if self.matrix and check_mtx: + Matrix(self.matrix.matrix).to_xml(parent=element) return element