bl_info = {
  'name': 'Simplygon',
  'blender': (2, 90, 0),
  'version': (9, 2, 7000, 0),
  'location': 'View3D',
  'category': '3D Optimization',
  'author': 'Microsoft Corporation',
  'doc_url': 'https://documentation.simplygon.com/SimplygonSDK_9.2.7000.0/index.html',
  'tracker_url': 'https://aka.ms/simplygon/support/requests/new'
}

import gc
import os
import json
import bpy
import bpy.utils.previews
import uuid
import shutil
import threading

from simplygon9 import simplygon_loader
from simplygon9 import Simplygon

from enum import IntEnum
from bpy.props import (StringProperty, BoolProperty, IntProperty, FloatProperty, EnumProperty, PointerProperty, CollectionProperty)
from bpy.types import (Panel, Menu, Operator, PropertyGroup)

from io_scene_gltf2.blender.exp import gltf2_blender_gather_texture_info
from io_scene_gltf2.blender.exp import gltf2_blender_get

def GetSimplygonPipeline(id):
  return bpy.context.scene.Simplygon_Pipelines[bpy.context.scene.Simplygon_Pipelines.find(id)]

def RemoveSimplygonPipeline(pipeline):
  return bpy.context.scene.Simplygon_Pipelines.remove(bpy.context.scene.Simplygon_Pipelines.find(pipeline.name))

def GetSimplygonPipelines(ids):
  pipelines = []
  if ids != '':
    for id in ids.split(';'):
      if id != '':
        pipelines.append(GetSimplygonPipeline(id))



  return pipelines

def GetSimplygonMaterialCaster(id):
  return bpy.context.scene.Simplygon_MaterialCasters[bpy.context.scene.Simplygon_MaterialCasters.find(id)]

def RemoveSimplygonMaterialCaster(materialCaster):
  bpy.context.scene.Simplygon_MaterialCasters.remove(bpy.context.scene.Simplygon_MaterialCasters.find(materialCaster.name))

def GetSimplygonMaterialCasters(ids):
  materialCasters = []
  if ids != '':
    for id in ids.split(';'):
      if id != '':
        materialCasters.append(GetSimplygonMaterialCaster(id))



  return materialCasters

def SaveSimplygonPipeline(pipelines, filePath, serializeUIComponents):
  jsonData = {}
  if len(pipelines) == 1:
    jsonData = pipelines[0].SaveJson(serializeUIComponents)

  elif len(pipelines) > 1:
    jsonData['Pipeline'] = 'Passthrough'
    jsonData['Cascaded'] = []
    for pipeline in pipelines:
      jsonData['Cascaded'].append(pipeline.SaveJson(serializeUIComponents))



  jsonData['Version'] = '9.2'
  jsonData['Build'] = '9.2.7000.0'
  jsonData['Commit'] = 'b140eb10a65409d5f047e07a6e39846540d35c1d'

  with open(filePath, 'w') as outfile:
    json.dump(jsonData, outfile, indent=4)


supportedBsdfs = [bpy.types.ShaderNodeBsdfAnisotropic, \
                  bpy.types.ShaderNodeBsdfDiffuse, \
                  bpy.types.ShaderNodeBsdfGlass, \
                  bpy.types.ShaderNodeBsdfGlossy, \
                  bpy.types.ShaderNodeBsdfHair, \
                  bpy.types.ShaderNodeBsdfHairPrincipled, \
                  bpy.types.ShaderNodeBsdfPrincipled, \
                  bpy.types.ShaderNodeBsdfRefraction, \
                  bpy.types.ShaderNodeEeveeSpecular, \
                  bpy.types.ShaderNodeBsdfToon, \
                  bpy.types.ShaderNodeBsdfTranslucent, \
                  bpy.types.ShaderNodeBsdfTransparent, \
                  bpy.types.ShaderNodeBsdfVelvet]
supportedBsdfInputs = ['Base Color', \
                       'Color', \
                       'Metallic', \
                       'Specular', \
                       'Roughness', \
                       'Anisotropic', \
                       'Clearcoat', \
                       'Clear Coat', \
                       'Clearcoat Roughness', \
                       'Clear Coat Roughness', \
                       'Transmission', \
                       'Transmission Roughness', \
                       'Emission', \
                       'Emissive Color', \
                       'Normal', \
                       'Ambient Occlusion', \
                       'Clearcoat Normal', \
                       'Clear Coat Normal']
gltfInputs = ['Base Color', 'Metallic', 'Roughness', 'Clearcoat', 'Clearcoat Roughness', 'Transmission', 'Transmission Roughness', 'Emission', 'Normal']
class glTF2ExportUserExtension:
  def __init__(self):
    from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
    self.Extension = Extension

  def gather_material_hook(self, gltf2_material, blender_material, export_settings):
    input_extension = None
    for bsdfType in supportedBsdfs:
      nodes = [n for n in blender_material.node_tree.nodes if isinstance(n, bsdfType) and not n.mute]
      nodes = [node for node in nodes if gltf2_blender_get.check_if_is_linked_to_active_output(node.outputs[0])]
      inputs = sum([[input for input in node.inputs if (isinstance(node, bpy.types.ShaderNodeBsdfPrincipled) and input.name not in gltfInputs and input.name in supportedBsdfInputs) or (not isinstance(node, bpy.types.ShaderNodeBsdfPrincipled) and input.name in supportedBsdfInputs)] for node in nodes], [])
      for input in inputs:
        input_slots = (input,)
        if len(input_slots) > 0:
          input_texture = gltf2_blender_gather_texture_info.gather_texture_info(input, input_slots, export_settings)
          if input_texture is not None:
            if input_extension is None:
              input_extension = {}

            input_extension[ input.name.lower().replace(' ', '') + 'Texture'] = input_texture




    if input_extension is not None:
      if gltf2_material.extensions is None:
        gltf2_material.extensions = {}

      gltf2_material.extensions['EXT_materials_simplygon_blender'] = self.Extension('EXT_materials_simplygon_blender', input_extension, False)



class SimplygonVersion:
  Version = "9.2"
  Build = "9.2.7000.0"
  Commit = "b140eb10a65409d5f047e07a6e39846540d35c1d"

class SimplygonIntegrationType(IntEnum):
  Max = 1
  Max2021 = 2
  Maya = 3
  Unity = 4
  Blender = 5

class SimplygonIntegration:
  Type = SimplygonIntegrationType.Blender

class Simplygon_Operator_Process(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_process'
  bl_description = 'Run Simplygon'

  processingTimer = None
  processingState = 0
  sgPipeline = None

  def SavePipeline(self, context, tempDir):
    pipelineFilePath = os.path.join(tempDir, 'pipeline.json')
    SaveSimplygonPipeline(GetSimplygonPipelines(context.scene.Simplygon_PipelineIds), pipelineFilePath, False)
    return pipelineFilePath


  def exportScene(self, exportDir):
    exportSceneFilePath = os.path.join(exportDir, 'export.glb')

    (major_version, minor_version, _) = bpy.app.version
    # export_materials changed from boolean to enum in 2.91
    export_materials_value = True
    if (major_version == 2 and minor_version > 90) or major_version >= 3:
      export_materials_value = 'EXPORT'


    bpy.ops.export_scene.gltf(export_format = 'GLB', \
                              use_selection = True, \
                              filepath = exportSceneFilePath,
                              export_image_format = 'AUTO', \
                              export_texcoords  = True, \
                              export_normals   = True, \
                              export_draco_mesh_compression_enable = False, \
                              export_tangents = True, \
                              export_materials  = export_materials_value, \
                              export_colors = True, \
                              export_cameras = True, \
                              export_yup = True, \
                              export_def_bones = False, \
                              export_current_frame = False, \
                              export_skins = True)
    return exportSceneFilePath


  def getShadingNodeOfType(self, node, nodeType):
    if node is None:
      return None

    if node.IsA(nodeType):
      return node

    filterNode = Simplygon.spShadingFilterNode.SafeCast(node)
    if filterNode is None:
      return None

    for index in range(node.GetParameterCount()):
      inputNode = filterNode.GetInput(index)
      if inputNode is not None:
        shadingNode = self.getShadingNodeOfType(inputNode, nodeType)
        if shadingNode is not None:
          return shadingNode



    return None

  def importExtraTexture(self, sg, sgScene, sgMaterial, materialChannelName, tempDir):
    exitNode = sgMaterial.GetShadingNetwork( materialChannelName )
    if exitNode is not None:
      shadingNode = self.getShadingNodeOfType(exitNode,'IShadingTextureNode')
      if shadingNode is not None:
        textureNode = Simplygon.spShadingTextureNode.SafeCast(shadingNode)
        textureTable = sgScene.GetTextureTable()
        if textureNode is not None and textureTable is not None:
          texture = textureTable.FindTexture( textureNode.GetTextureName() )
          if texture is not None:
            if texture.GetFilePath() is not None:
              return texture.GetFilePath()

            else:
              textureData = texture.GetImageData()
              if textureData is not None:
                texturePath = os.path.join(tempDir, materialChannelName + '.png')
                imageExporter = sg.CreateImageDataExporter()
                imageExporter.SetImage(textureData)
                imageExporter.SetExportFilePath(texturePath)
                imageExporter.SetImageFileFormat(Simplygon.EImageOutputFormat_PNG)
                imageExporter.RunExport()
                return texturePath






    return None

  def importExtraMaterialChannel(self, materialSlot, sg, sgScene, sgMaterial, materialChannelName, nodeLocation, tempDir):
    textureCreated = False
    normalizedMaterialChannelName = materialChannelName.lower().replace(' ', '')
    if normalizedMaterialChannelName == 'normals':
      normalizedMaterialChannelName = 'normal'

    if normalizedMaterialChannelName == 'emissive':
      normalizedMaterialChannelName = 'emission'

    if normalizedMaterialChannelName == 'metalness':
      normalizedMaterialChannelName = 'metallic'

    bsdf = materialSlot.material.node_tree.nodes.get('Principled BSDF')
    if bsdf is not None:
      for input in bsdf.inputs:
        normalizedInputName = input.name.lower().replace(' ', '')
        if normalizedInputName == normalizedMaterialChannelName:
          if len(input.links) == 0:
            texturePath = self.importExtraTexture(sg, sgScene, sgMaterial, materialChannelName, tempDir)
            if texturePath is not None:
              textureCreated = True
              image = bpy.data.images.load(texturePath)
              image.pack()
              texImage = materialSlot.material.node_tree.nodes.new('ShaderNodeTexImage')
              texImage.image = image
              texImage.location = nodeLocation[0], nodeLocation[1]
              nodeLocation[1] += 300
              if 'normal' in normalizedInputName:
                image.colorspace_settings.name = 'Non-Color'
                normalMap = materialSlot.material.node_tree.nodes.new('ShaderNodeNormalMap')
                normalMap.location = nodeLocation[0]+350, nodeLocation[1]-350
                materialSlot.material.node_tree.links.new(normalMap.inputs['Color'], texImage.outputs['Color'])
                materialSlot.material.node_tree.links.new(input, normalMap.outputs['Normal'])

              else:
                materialSlot.material.node_tree.links.new(input, texImage.outputs['Color'])



          else:
            textureCreated = True




    if not textureCreated:
      texturePath = self.importExtraTexture(sg, sgScene, sgMaterial, materialChannelName, tempDir)
      if texturePath is not None:
        image = bpy.data.images.load(texturePath)
        image.pack()
        texImage = materialSlot.material.node_tree.nodes.new('ShaderNodeTexImage')
        texImage.image = image
        texImage.location = nodeLocation[0], nodeLocation[1]
        nodeLocation[1] += 300
        if 'normal' in normalizedMaterialChannelName:
          image.colorspace_settings.name = 'Non-Color'
          normalMap = materialSlot.material.node_tree.nodes.new('ShaderNodeNormalMap')
          normalMap.location = nodeLocation[0]+350, nodeLocation[1]-350
          materialSlot.material.node_tree.links.new(normalMap.inputs['Color'], texImage.outputs['Color'])




  def importExtraMaterials(self, sg, sgScene, imported_objects_dict, tempDir):
    sgMaterialTable = sgScene.GetMaterialTable()
    meshSetId = sgScene.SelectNodes('ISceneMesh')
    meshSet = sgScene.GetSelectionSetTable().GetSelectionSet(meshSetId)
    for meshIndex in range(meshSet.GetItemCount()):
      meshId = meshSet.GetItem(meshIndex)
      node = sgScene.GetNodeByGUID(meshId)
      if node is not None:
        name = node.GetName()
        baseName = name
        sIndex = name.rfind('.')
        if sIndex >= 0:
          baseName = name[:sIndex]

        result = [(value) for key, value in imported_objects_dict.items() if key.startswith(baseName) and value.type == 'MESH']
        if len(result) > 0:
          bObject = result[0]
          del imported_objects_dict[bObject.name]
          mesh = Simplygon.spSceneMesh.SafeCast(node)
          if mesh is not None:
            geometry = mesh.GetGeometry()
            if geometry is not None:
              materialIndices = geometry.GetMaterialIds()
              if materialIndices is not None:
                material_set = set()
                for index in range(materialIndices.GetItemCount()):
                  material_set.add(materialIndices.GetItem(index))

                slotIndex = 0
                for materialIndex in material_set:
                  if slotIndex < len(bObject.material_slots) and materialIndex < sgMaterialTable.GetMaterialsCount():
                    sgMaterial = sgMaterialTable.GetMaterial(materialIndex)
                    if sgMaterial is not None:
                      nodeLocation = [ -1300, 0 ]
                      for materialChannelIndex in range(sgMaterial.GetMaterialChannelCount()):
                        self.importExtraMaterialChannel(bObject.material_slots[slotIndex], sg, sgScene, sgMaterial, sgMaterial.GetMaterialChannelFromIndex(materialChannelIndex), nodeLocation, tempDir)




                slotIndex += 1







  def importScene(self, context, sg, importDir, sgPipeline):
    if not sgPipeline.GetPipelineSettings().GetIntermediateStep():
      importLODDir = os.path.join(importDir, 'LOD{}'.format(self.lodIndex))
      os.makedirs(importLODDir)
      importSceneFilePath = os.path.join(importLODDir, 'import.glb')
      if sgPipeline.GetProcessedScene():
        sgSceneExporter = sg.CreateSceneExporter()
        sgSceneExporter.SetScene(sgPipeline.GetProcessedScene())
        sgSceneExporter.SetExportFilePath( importSceneFilePath )
        sgSceneExporter.SetEmbedReferences( True )
        sgSceneExporter.RunExport()

        current_objects = set(context.scene.objects)
        bpy.ops.import_scene.gltf(filepath = importSceneFilePath)
        imported_objects = set(context.scene.objects) - current_objects
        imported_objects_dict = {}
        for node in imported_objects:
          imported_objects_dict[node.name] = node

        self.importExtraMaterials(sg, sgPipeline.GetProcessedScene(), imported_objects_dict, importLODDir)
        for node in imported_objects:
          node.name = node.name + '_LOD{}'.format(self.lodIndex)
          if node.data:
            node.data.name = node.data.name + '_LOD{}'.format(self.lodIndex)




      self.lodIndex = self.lodIndex + 1


    for i in range(sgPipeline.GetCascadedPipelineCount()):
      self.importScene(context, sg, importDir, sgPipeline.GetCascadedPipelineByIndex(i))



  def RunSimplygon(self, sg, pipelineFilePath, exportSceneFilePath):
    try:
      self.sg.SendTelemetry('IntegrationInit', 'Blender', bpy.app.version_string, '{}')

      sgPipelineSerializer = sg.CreatePipelineSerializer()
      self.sgPipeline = sgPipelineSerializer.LoadPipelineFromFile(pipelineFilePath)
      self.sgPipeline.RunSceneFromFile(exportSceneFilePath, None, Simplygon.EPipelineRunMode_RunInNewProcess)
      self.processingState = 30

    except Exception as e:
      self.report({'ERROR'}, str(e))
      self.processingState = -1
      bpy.context.scene.Simplygon_Process_Progress = -1




  @classmethod
  def poll(cls, context):
    for item in bpy.context.selected_objects:
      if item.type == 'MESH':
        return True


    return False


  def modal(self, context, event):
    if event.type == 'TIMER':
      if self.processingState == 0:
        self.exportSceneFilePath = self.exportScene(self.exportDir)
        self.processingState = 10

      if self.processingState == 10:
        bpy.context.window.cursor_set('WAIT')
        self.processThread = threading.Thread(target=self.RunSimplygon, args=(self.sg, self.pipelineFilePath, self.exportSceneFilePath))
        self.processThread.start()
        self.processingState = 20


      if self.processingState == 20:
        if self.sgPipeline is not None:
          bpy.context.scene.Simplygon_Process_Progress = int(self.sgPipeline.GetPercentDone())
          context.area.tag_redraw()


      elif self.processingState == 30:
        self.lodIndex = 1
        self.importScene(context, self.sg, self.importDir, self.sgPipeline)
        self.processingState = 40

      elif self.processingState == -1:
        self.processingState = 40


    if self.processingState == 40:
      bpy.context.scene.Simplygon_Process_Progress = -1
      context.window_manager.event_timer_remove(self.processingTimer)
      self.sgPipeline = None
      self.sg = None
      gc.collect()
      shutil.rmtree(self.tempDir)
      bpy.context.window.cursor_set('DEFAULT')
      self.processingState = -2
      return {'FINISHED'}

    return {'PASS_THROUGH'}


  def analyzeSelection(self, context):
    pass


  def execute(self, context):
    bpy.context.scene.Simplygon_Process_Progress = 0
    SIMPLYGON_TEMP = os.getenv('SIMPLYGON_9_TEMP')
    if not SIMPLYGON_TEMP:
      self.report({'ERROR'}, 'Simplygon initialization error: SIMPLYGON_9_TEMP not set')
      bpy.context.scene.Simplygon_Process_Progress = -1
      return {'CANCELLED'}

    else:
      SIMPLYGON_TEMP = os.path.expandvars(SIMPLYGON_TEMP)

    self.tempDir = os.path.join(SIMPLYGON_TEMP, str(uuid.uuid4()))
    os.makedirs(self.tempDir)

    self.pipelineFilePath = self.SavePipeline(context, self.tempDir)

    self.sg = simplygon_loader.init_simplygon()
    if self.sg is None:
      error = Simplygon.GetLastInitializationError()
      error_string = Simplygon.GetErrorString(error)
      self.report({'ERROR'}, 'Failed to initialize Simplygon: {} (error {})'.format(error_string, error))
      bpy.context.scene.Simplygon_Process_Progress = -1
      return {'CANCELLED'}


    self.importDir = os.path.join(self.tempDir, 'import')
    self.exportDir = os.path.join(self.tempDir, 'export')
    os.makedirs(self.importDir)
    os.makedirs(self.exportDir)

    self.analyzeSelection(context)
    self.processingState = 0
    bpy.context.window.cursor_set('WAIT')
    self.processingTimer = context.window_manager.event_timer_add(0.5, window=context.window)
    context.window_manager.modal_handler_add(self)
    return {'RUNNING_MODAL'}



class Simplygon_Operator_SettingsMenu(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_settings'
  bl_description = 'Settings'

  def execute(self, context):
    bpy.ops.wm.call_menu(name= 'SIMPLYGON_MT_settings')
    return {'FINISHED'}


class Simplygon_Operator_SavePipelineDialog(bpy.types.Operator):
  bl_label = 'Save'
  bl_idname = 'simplygon.operator_save_pipeline_dialog'
  bl_description = 'Save pipeline'

  filename_ext = '.json'
  filter_glob: bpy.props.StringProperty(default='*.json',options={'HIDDEN'},maxlen=255)
  filepath: bpy.props.StringProperty(name='File Path', maxlen=1024)
  save_pipeline_metadata: BoolProperty(name='Save metadata', description='Save UI specific metadata to the pipeline file', default=True)

  def invoke(self, context, event):
    self.filepath = 'MyPipeline.json'
    context.window_manager.fileselect_add(self)
    return {'RUNNING_MODAL'}

  def execute(self, context):
    if self.filepath.endswith('\\'):
      self.filepath += 'MyPipeline.json'

    if not self.filepath.endswith('.json'):
      self.filepath += '.json'

    SaveSimplygonPipeline(GetSimplygonPipelines(context.scene.Simplygon_PipelineIds), self.filepath, self.save_pipeline_metadata)
    return {'FINISHED'}


class Simplygon_Operator_SavePipeline(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_save_pipeline'
  bl_description = 'Save pipeline'

  def execute(self, context):
    bpy.ops.simplygon.operator_save_pipeline_dialog('INVOKE_DEFAULT')
    return {'FINISHED'}


class Simplygon_Operator_LoadPipelineDialog(bpy.types.Operator):
  bl_label = 'Load'
  bl_idname = 'simplygon.operator_load_pipeline_dialog'
  bl_description = 'Load pipeline'

  filename_ext = '.json'
  filter_glob: bpy.props.StringProperty(default='*.json',options={'HIDDEN'},maxlen=255)
  filepath: bpy.props.StringProperty(name='File Path',description='File path used for loading the pipeline', maxlen=1024)

  def invoke(self, context, event):
    context.window_manager.fileselect_add(self)
    return {'RUNNING_MODAL'}

  def execute(self, context):
    bpy.context.scene.Simplygon_Process_Progress = -1
    for pipeline in GetSimplygonPipelines(context.scene.Simplygon_PipelineIds):
      pipeline.Deinit()
      RemoveSimplygonPipeline(pipeline)

    with open(self.filepath) as inputFile:
      try:
        context.scene.Simplygon_PipelineIds = ''
        pipeline = context.scene.Simplygon_Pipelines.add()
        pipeline.InitJson('', json.load(inputFile))
        if pipeline.PipelineType == ESimplygonPipeline.Passthrough:
          for cascadedPipeline in GetSimplygonPipelines(pipeline.CascadedPipelineIds):
            context.scene.Simplygon_PipelineIds += cascadedPipeline.name + ';'


        else:
          context.scene.Simplygon_PipelineIds += pipeline.name + ';'


      except BaseException as error:
        print('Invalid pipeline file: {}'.format(error))


    context.area.tag_redraw()
    return {'FINISHED'}


class Simplygon_Operator_LoadPipeline(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_load_pipeline'
  bl_description = 'Load pipeline'

  def execute(self, context):
    bpy.ops.simplygon.operator_load_pipeline_dialog('INVOKE_DEFAULT')
    return {'FINISHED'}



class Simplygon_Operator_AddMaterialCasterMenu(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_add_material_caster_menu'
  bl_description = 'Add material caster'
  pipelineId: bpy.props.StringProperty()

  def execute(self, context):
    context.scene.Simplygon_Current_PipelineId = self.pipelineId
    bpy.ops.wm.call_menu(name= 'SIMPLYGON_MT_add_material_caster')
    return {'FINISHED'}



class Simplygon_Operator_RemoveAllMaterialCasterMenu(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_remove_all_material_caster_menu'
  bl_description = 'Remove all material casters'
  pipelineId: bpy.props.StringProperty()

  def execute(self, context):
    pipelineIndex = context.scene.Simplygon_Pipelines.find(self.pipelineId)
    context.scene.Simplygon_Pipelines[pipelineIndex].RemoveAllMaterialCaster()
    return {'FINISHED'}



class Simplygon_Operator_AddMaterialCaster(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_add_material_caster'
  bl_description = 'Add material caster'
  pipelineId: bpy.props.StringProperty()
  materialCasterType: bpy.props.IntProperty()
  materialChannelName: bpy.props.StringProperty()
  allowMaterialChannelOverride: bpy.props.BoolProperty()

  def execute(self, context):
    pipelineIndex = context.scene.Simplygon_Pipelines.find(self.pipelineId)
    context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(self.materialCasterType, self.materialChannelName, self.allowMaterialChannelOverride, True)
    context.scene.Simplygon_Current_PipelineId = ''
    context.area.tag_redraw()
    return { 'FINISHED'}



class Simplygon_Operator_AddAutomaticMaterialCasters(bpy.types.Operator):
  bl_label = 'Automatic'
  bl_idname = 'simplygon.operator_add_automatic_material_casters'
  bl_description = 'Add material casters automatically based on scene selection'
  pipelineId: bpy.props.StringProperty()

  @classmethod
  def poll(cls, context):
    return len(bpy.context.selected_objects) > 0

  def execute(self, context):
    pipelineIndex = context.scene.Simplygon_Pipelines.find(self.pipelineId)
    isMeshSelected = False
    isBaseColorAdded = False
    for item in bpy.context.selected_objects:
      if item.type == 'MESH':
        isMeshSelected = True
        for materialSlot in item.material_slots:
          for bsdfType in supportedBsdfs:
            nodes = [n for n in materialSlot.material.node_tree.nodes if isinstance(n, bsdfType) and not n.mute]
            inputs = sum([[input for input in node.inputs if input.name in supportedBsdfInputs] for node in nodes], [])
            for input in inputs:
              for link in input.links:
                if link.from_node is not None:
                  if link.from_node.type == 'TEX_IMAGE' or link.from_node.type == 'NORMAL_MAP':
                    if input.name == 'Base Color':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'Basecolor', False, False)
                      isBaseColorAdded = True

                    if input.name == 'Anisotropic':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'anisotropic', False, False)

                    if input.name == 'Color':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'color', False, False)

                    if input.name == 'Clearcoat' or input.name == 'Clear Coat':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'clearcoat', False, False)

                    if input.name == 'Clearcoat Normal' or input.name == 'Clear Coat Normal':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'clearcoatnormal', False, False)

                    if input.name == 'Clearcoat Roughness' or input.name == 'Clear Coat Roughness':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'clearcoatroughness', False, False)

                    if input.name == 'Roughness':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'Roughness', False, False)

                    if input.name == 'Metallic':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'Metalness', False, False)

                    if input.name == 'Emission':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'Emissive', False, False)

                    if input.name == 'Emissive Color':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'emissivecolor', False, False)

                    if input.name == 'Specular':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'specular', False, False)

                    if input.name == 'Transmission':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'transmission', False, False)

                    if input.name == 'Transmission Roughness':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'transmissionroughness', False, False)

                    if input.name == 'Occlusion':
                      context.scene.pipelSimplygon_Pipelinesines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.OcclusionCaster, 'Occlusion', False, False)

                    if input.name == 'Normal':
                      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.NormalCaster, 'Normals', False, False)
    if not isBaseColorAdded:
      context.scene.Simplygon_Pipelines[pipelineIndex].AddMaterialCaster(ESimplygonMaterialCaster.ColorCaster, 'Basecolor', False, False)

    context.scene.Simplygon_Current_PipelineId = ''
    return { 'FINISHED'}



class Simplygon_Operator_RemoveMaterialCaster(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_remove_material_caster'
  bl_description = 'Remove material caster'
  pipelineId: bpy.props.StringProperty()
  materialCasterId: bpy.props.StringProperty()

  def execute(self, context):
    pipelineIndex = context.scene.Simplygon_Pipelines.find(self.pipelineId)
    context.scene.Simplygon_Pipelines[pipelineIndex].RemoveMaterialCaster(self.materialCasterId)
    return { 'FINISHED'}



class Simplygon_Operator_AddLODComponentMenu(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_add_lod_component_menu'
  bl_description = 'Add LOD component'
  pipelineId: bpy.props.StringProperty()
  def execute(self, context):
    bpy.context.scene.Simplygon_Process_Progress = -1
    context.scene.Simplygon_Current_PipelineId = self.pipelineId
    bpy.ops.wm.call_menu(name= 'SIMPLYGON_MT_add_lod_component')
    return {'FINISHED'}



class Simplygon_Operator_AddLODComponent(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_add_lod_component'
  bl_description = 'Add LOD component'
  pipelineId: bpy.props.StringProperty()
  pipelineType: bpy.props.IntProperty()
  menuPath: bpy.props.StringProperty()
  automaticMaterialCastersFromSelection: bpy.props.BoolProperty()

  def init(self, _pipelineId, _pipelineTemplate):
    pipelineId = _pipelineId
    pipelineTemplate = _pipelineTemplate

  def execute(self, context):
    pipelineIndex = context.scene.Simplygon_Pipelines.find(self.pipelineId)
    if pipelineIndex < 0:
      pipeline = context.scene.Simplygon_Pipelines.add()
      pipeline.Init('', self.pipelineType, self.menuPath, self.automaticMaterialCastersFromSelection)
      context.scene.Simplygon_PipelineIds += pipeline.name + ';'
      if self.automaticMaterialCastersFromSelection and len(bpy.context.selected_objects) > 0:
        bpy.ops.simplygon.operator_add_automatic_material_casters(pipelineId = pipeline.name)


    else:
      pipeline = context.scene.Simplygon_Pipelines[pipelineIndex].AddCascadedPipeline(self.pipelineType, self.menuPath, self.automaticMaterialCastersFromSelection)
      if self.automaticMaterialCastersFromSelection and len(bpy.context.selected_objects) > 0:
        bpy.ops.simplygon.operator_add_automatic_material_casters(pipelineId = pipeline.name)


    context.scene.Simplygon_Current_PipelineId = ''
    context.area.tag_redraw()
    return {'FINISHED'}



class Simplygon_Operator_RemoveLODComponent(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_remove_lod_component'
  bl_description = 'Remove LOD component'
  pipelineId: bpy.props.StringProperty()

  def execute(self, context):
    pipeline = GetSimplygonPipeline(self.pipelineId)
    if pipeline.name in context.scene.Simplygon_PipelineIds:
      context.scene.Simplygon_PipelineIds = context.scene.Simplygon_PipelineIds.replace(pipeline.name + ';', '')
      pipeline.Deinit()
      RemoveSimplygonPipeline(pipeline)

    else:
      pipeline.Parent.RemoveCascadedPipeline(pipeline.name)

    context.area.tag_redraw()
    return {'FINISHED'}



class Simplygon_Menu_AdvancedMaterialCasters(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_advanced_material_casters'
  bl_label = 'Advanced'
  def draw(self, context):
    layout = self.layout
    layout = self.layout
    ColorCaster = layout.operator('simplygon.operator_add_material_caster', text='ColorCaster')
    ColorCaster.materialCasterType = ESimplygonMaterialCaster.ColorCaster
    ColorCaster.materialChannelName = 'Basecolor'
    ColorCaster.allowMaterialChannelOverride = True
    ColorCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    OpacityCaster = layout.operator('simplygon.operator_add_material_caster', text='OpacityCaster')
    OpacityCaster.materialCasterType = ESimplygonMaterialCaster.OpacityCaster
    OpacityCaster.materialChannelName = 'Basecolor'
    OpacityCaster.allowMaterialChannelOverride = True
    OpacityCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    NormalCaster = layout.operator('simplygon.operator_add_material_caster', text='NormalCaster')
    NormalCaster.materialCasterType = ESimplygonMaterialCaster.NormalCaster
    NormalCaster.materialChannelName = 'Normals'
    NormalCaster.allowMaterialChannelOverride = True
    NormalCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    DisplacementCaster = layout.operator('simplygon.operator_add_material_caster', text='DisplacementCaster')
    DisplacementCaster.materialCasterType = ESimplygonMaterialCaster.DisplacementCaster
    DisplacementCaster.materialChannelName = 'Basecolor'
    DisplacementCaster.allowMaterialChannelOverride = True
    DisplacementCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    AmbientOcclusionCaster = layout.operator('simplygon.operator_add_material_caster', text='AmbientOcclusionCaster')
    AmbientOcclusionCaster.materialCasterType = ESimplygonMaterialCaster.AmbientOcclusionCaster
    AmbientOcclusionCaster.materialChannelName = 'Occlusion'
    AmbientOcclusionCaster.allowMaterialChannelOverride = True
    AmbientOcclusionCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    GeometryDataCaster = layout.operator('simplygon.operator_add_material_caster', text='GeometryDataCaster')
    GeometryDataCaster.materialCasterType = ESimplygonMaterialCaster.GeometryDataCaster
    GeometryDataCaster.materialChannelName = 'Basecolor'
    GeometryDataCaster.allowMaterialChannelOverride = True
    GeometryDataCaster.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    VertexColorCaster = layout.operator('simplygon.operator_add_material_caster', text='VertexColorCaster')
    VertexColorCaster.materialCasterType = ESimplygonMaterialCaster.VertexColorCaster
    VertexColorCaster.materialChannelName = 'Basecolor'
    VertexColorCaster.allowMaterialChannelOverride = True
    VertexColorCaster.pipelineId = context.scene.Simplygon_Current_PipelineId


class Simplygon_Menu_AdvancedLODComponents(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_advanced_lod_component'
  bl_label = 'Advanced'
  def draw(self, context):
    layout = self.layout
    layout = self.layout
    Reduction = layout.operator('simplygon.operator_add_lod_component', text='Reduction')
    Reduction.pipelineType = ESimplygonPipeline.ReductionPipeline
    Reduction.menuPath = 'Template/Advanced/Reduction'
    Reduction.automaticMaterialCastersFromSelection = False
    Reduction.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Remeshing = layout.operator('simplygon.operator_add_lod_component', text='Remeshing')
    Remeshing.pipelineType = ESimplygonPipeline.RemeshingPipeline
    Remeshing.menuPath = 'Template/Advanced/Remeshing'
    Remeshing.automaticMaterialCastersFromSelection = True
    Remeshing.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Aggregation = layout.operator('simplygon.operator_add_lod_component', text='Aggregation')
    Aggregation.pipelineType = ESimplygonPipeline.AggregationPipeline
    Aggregation.menuPath = 'Template/Advanced/Aggregation'
    Aggregation.automaticMaterialCastersFromSelection = False
    Aggregation.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Billboard_cloud = layout.operator('simplygon.operator_add_lod_component', text='Billboard cloud')
    Billboard_cloud.pipelineType = ESimplygonPipeline.BillboardCloudPipeline
    Billboard_cloud.menuPath = 'Template/Advanced/Billboard cloud'
    Billboard_cloud.automaticMaterialCastersFromSelection = True
    Billboard_cloud.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Billboard_cloud_for_vegetation = layout.operator('simplygon.operator_add_lod_component', text='Billboard cloud for vegetation')
    Billboard_cloud_for_vegetation.pipelineType = ESimplygonPipeline.BillboardCloudVegetationPipeline
    Billboard_cloud_for_vegetation.menuPath = 'Template/Advanced/Billboard cloud for vegetation'
    Billboard_cloud_for_vegetation.automaticMaterialCastersFromSelection = True
    Billboard_cloud_for_vegetation.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Impostor_from_single_view = layout.operator('simplygon.operator_add_lod_component', text='Impostor from single view')
    Impostor_from_single_view.pipelineType = ESimplygonPipeline.ImpostorFromSingleViewPipeline
    Impostor_from_single_view.menuPath = 'Template/Advanced/Impostor from single view'
    Impostor_from_single_view.automaticMaterialCastersFromSelection = True
    Impostor_from_single_view.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Occlusion_mesh = layout.operator('simplygon.operator_add_lod_component', text='Occlusion mesh')
    Occlusion_mesh.pipelineType = ESimplygonPipeline.OcclusionMeshPipeline
    Occlusion_mesh.menuPath = 'Template/Advanced/Occlusion mesh'
    Occlusion_mesh.automaticMaterialCastersFromSelection = False
    Occlusion_mesh.pipelineId = context.scene.Simplygon_Current_PipelineId


class Simplygon_Menu_BasicLODComponents(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_basic_lod_component'
  bl_label = 'Basic'
  def draw(self, context):
    layout = self.layout
    layout = self.layout
    Reduction = layout.operator('simplygon.operator_add_lod_component', text='Reduction')
    Reduction.pipelineType = ESimplygonPipeline.ReductionPipeline
    Reduction.menuPath = 'Template/Basic/Reduction'
    Reduction.automaticMaterialCastersFromSelection = False
    Reduction.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Reduction_with_material_baking = layout.operator('simplygon.operator_add_lod_component', text='Reduction with material baking')
    Reduction_with_material_baking.pipelineType = ESimplygonPipeline.ReductionPipeline
    Reduction_with_material_baking.menuPath = 'Template/Basic/Reduction with material baking'
    Reduction_with_material_baking.automaticMaterialCastersFromSelection = True
    Reduction_with_material_baking.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Remeshing_with_material_baking = layout.operator('simplygon.operator_add_lod_component', text='Remeshing with material baking')
    Remeshing_with_material_baking.pipelineType = ESimplygonPipeline.RemeshingPipeline
    Remeshing_with_material_baking.menuPath = 'Template/Basic/Remeshing with material baking'
    Remeshing_with_material_baking.automaticMaterialCastersFromSelection = True
    Remeshing_with_material_baking.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Aggregation = layout.operator('simplygon.operator_add_lod_component', text='Aggregation')
    Aggregation.pipelineType = ESimplygonPipeline.AggregationPipeline
    Aggregation.menuPath = 'Template/Basic/Aggregation'
    Aggregation.automaticMaterialCastersFromSelection = False
    Aggregation.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Aggregation_with_material_baking = layout.operator('simplygon.operator_add_lod_component', text='Aggregation with material baking')
    Aggregation_with_material_baking.pipelineType = ESimplygonPipeline.AggregationPipeline
    Aggregation_with_material_baking.menuPath = 'Template/Basic/Aggregation with material baking'
    Aggregation_with_material_baking.automaticMaterialCastersFromSelection = True
    Aggregation_with_material_baking.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Billboard_cloud = layout.operator('simplygon.operator_add_lod_component', text='Billboard cloud')
    Billboard_cloud.pipelineType = ESimplygonPipeline.BillboardCloudPipeline
    Billboard_cloud.menuPath = 'Template/Basic/Billboard cloud'
    Billboard_cloud.automaticMaterialCastersFromSelection = True
    Billboard_cloud.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Billboard_cloud_for_vegetation = layout.operator('simplygon.operator_add_lod_component', text='Billboard cloud for vegetation')
    Billboard_cloud_for_vegetation.pipelineType = ESimplygonPipeline.BillboardCloudVegetationPipeline
    Billboard_cloud_for_vegetation.menuPath = 'Template/Basic/Billboard cloud for vegetation'
    Billboard_cloud_for_vegetation.automaticMaterialCastersFromSelection = True
    Billboard_cloud_for_vegetation.pipelineId = context.scene.Simplygon_Current_PipelineId
    layout = self.layout
    Impostor_from_single_view = layout.operator('simplygon.operator_add_lod_component', text='Impostor from single view')
    Impostor_from_single_view.pipelineType = ESimplygonPipeline.ImpostorFromSingleViewPipeline
    Impostor_from_single_view.menuPath = 'Template/Basic/Impostor from single view'
    Impostor_from_single_view.automaticMaterialCastersFromSelection = True
    Impostor_from_single_view.pipelineId = context.scene.Simplygon_Current_PipelineId


class Simplygon_Menu_AddMaterialCaster(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_add_material_caster'
  bl_label = 'Select material caster'

  def draw(self, context):
    layout = self.layout
    layout.menu('SIMPLYGON_MT_advanced_material_casters')
    layout.operator('simplygon.operator_add_automatic_material_casters')



class Simplygon_Menu_AddLODComponent(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_add_lod_component'
  bl_label = 'Select LOD component'

  def draw(self, context):
    layout = self.layout
    layout.menu('SIMPLYGON_MT_advanced_lod_component')
    layout.menu('SIMPLYGON_MT_basic_lod_component')



class Simplygon_Menu_Settings(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_settings'
  bl_label = 'Settings'

  def draw(self, context):
    layout = self.layout
    layout.operator('simplygon.operator_save_pipeline', text='Save pipeline')
    layout.operator('simplygon.operator_load_pipeline', text='Load pipeline')


class Simplygon_Operator_TemplateScript(bpy.types.Operator):
  bl_label = ''
  bl_idname = 'simplygon.operator_template_script'
  bl_description = 'Template for running a Simplygon reduction in Python'
  script_name: StringProperty()

  def execute(self, context):
    bpy.ops.text.open(filepath=os.path.join(os.path.dirname(__file__), self.script_name), internal=True)
    return {'FINISHED'}



class Simplygon_Menu_TemplateScripts(bpy.types.Menu):
  bl_idname = 'SIMPLYGON_MT_template_scripts'
  bl_label = 'Simplygon'
  def draw(self, context):
    layout = self.layout
    layout.operator('simplygon.operator_template_script', text='Aggregation').script_name = 'simplygon_aggregation.py'
    layout.operator('simplygon.operator_template_script', text='Reduction').script_name = 'simplygon_reduction.py'
    layout.operator('simplygon.operator_template_script', text='Remeshing').script_name = 'simplygon_remeshing.py'



class Simplygon_Panel(bpy.types.Panel):
  bl_idname = 'SIMPLYGON_PT_MAIN'
  bl_label = 'Simplygon'
  bl_space_type = 'VIEW_3D'
  bl_region_type = 'UI'
  bl_category= 'Simplygon'

  def draw(self, context):
    layout = self.layout
    row = layout.row()
    pipelines = GetSimplygonPipelines(context.scene.Simplygon_PipelineIds)
    if len(pipelines) > 0:
      row.label(text='Simplygon Pipeline')

    else:
      row.label(text='Simplygon Pipeline - Please add a LOD component to get started')

    row.operator('simplygon.operator_settings', text='', icon='SETTINGS')

    for pipeline in pipelines:
      pipeline.draw(layout.box())


    row = layout.row()
    button = row.operator('simplygon.operator_add_lod_component_menu', text='Add LOD component')

    if len(pipelines) > 0:
      layout.separator()
      box = layout.box()
      box.label(text= 'Selected meshes: ')
      for item in bpy.context.selected_objects:
        if item.type == 'MESH':
          box.label(text=item.name)



      row = layout.row()
      row.scale_x = 5.0
      row.scale_y = 2.0
      if bpy.context.scene.Simplygon_Process_Progress >= 0:
        row.prop(bpy.context.scene, 'Simplygon_Process_Progress', text='Progress', slider=True)
        row.enabled = False

      else:
        op = row.operator('simplygon.operator_process', text='Process')
        row.enabled = True


    row = layout.row()
    row.label(text='Simplygon version: 9.2.7000.0')



class SimplygonReductionSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.ReductionTargetTriangleRatioEnabledUI.Visible: return True
    if self.ReductionTargetTriangleRatioUI.Visible: return True
    if self.ReductionTargetTriangleCountEnabledUI.Visible: return True
    if self.ReductionTargetTriangleCountUI.Visible: return True
    if self.ReductionTargetMaxDeviationEnabledUI.Visible: return True
    if self.ReductionTargetMaxDeviationUI.Visible: return True
    if self.ReductionTargetOnScreenSizeEnabledUI.Visible: return True
    if self.ReductionTargetOnScreenSizeUI.Visible: return True
    if self.ReductionTargetStopConditionUI.Visible: return True
    if self.ReductionHeuristicsUI.Visible: return True
    if self.GeometryImportanceUI.Visible: return True
    if self.MaterialImportanceUI.Visible: return True
    if self.TextureImportanceUI.Visible: return True
    if self.ShadingImportanceUI.Visible: return True
    if self.GroupImportanceUI.Visible: return True
    if self.VertexColorImportanceUI.Visible: return True
    if self.EdgeSetImportanceUI.Visible: return True
    if self.SkinningImportanceUI.Visible: return True
    if self.CurvatureImportanceUI.Visible: return True
    if self.CreateGeomorphGeometryUI.Visible: return True
    if self.AllowDegenerateTexCoordsUI.Visible: return True
    if self.KeepSymmetryUI.Visible: return True
    if self.UseAutomaticSymmetryDetectionUI.Visible: return True
    if self.UseSymmetryQuadRetriangulatorUI.Visible: return True
    if self.SymmetryAxisUI.Visible: return True
    if self.SymmetryOffsetUI.Visible: return True
    if self.SymmetryDetectionToleranceUI.Visible: return True
    if self.DataCreationPreferencesUI.Visible: return True
    if self.OutwardMoveMultiplierUI.Visible: return True
    if self.InwardMoveMultiplierUI.Visible: return True
    if self.UseHighQualityNormalCalculationUI.Visible: return True
    if self.MergeGeometriesUI.Visible: return True
    if self.KeepUnprocessedSceneMeshesUI.Visible: return True
    if self.LockGeometricBorderUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def ReductionTargetTriangleRatioEnabledUI(self):
    index = bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List[index]

    return None

  ReductionTargetTriangleRatioEnabled: bpy.props.BoolProperty(default=True,description='Enable triangle ratio as a reduction target. The reducer will stop when the set triangle-ratio has been reached.')
  class SimplygonReductionTargetTriangleRatioEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetTriangleRatioEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetTriangleRatioEnabled = value
      self.Parent.ReductionTargetTriangleRatioUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReductionTargetTriangleRatioUI(self):
    index = bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List[index]

    return None

  ReductionTargetTriangleRatio: bpy.props.FloatProperty(default=0.5,min=0,max=1,description='The wanted reduction ratio. The range is 0->1.')
  class SimplygonReductionTargetTriangleRatioEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetTriangleRatio

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetTriangleRatio = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.ReductionTargetTriangleRatioEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.ReductionTargetTriangleRatioEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ReductionTargetTriangleRatio: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ReductionTargetTriangleRatio: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ReductionTargetTriangleCountEnabledUI(self):
    index = bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List[index]

    return None

  ReductionTargetTriangleCountEnabled: bpy.props.BoolProperty(default=False,description='Enable triangle count as a reduction target. The reducer will stop when the set triangle count has been reached.')
  class SimplygonReductionTargetTriangleCountEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetTriangleCountEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetTriangleCountEnabled = value
      self.Parent.ReductionTargetTriangleCountUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReductionTargetTriangleCountUI(self):
    index = bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List[index]

    return None

  ReductionTargetTriangleCount: bpy.props.IntProperty(default=10000,min=0,max=10000000,description='The wanted triangle count. The range is 0->inf.')
  class SimplygonReductionTargetTriangleCountEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetTriangleCount

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetTriangleCount = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.ReductionTargetTriangleCountEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.ReductionTargetTriangleCountEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10000000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10000000
      self.TicksFrequencyValue = 10000
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ReductionTargetTriangleCount: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000000
      self.DefaultMaxValue = 10000000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ReductionTargetTriangleCount: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10000

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ReductionTargetMaxDeviationEnabledUI(self):
    index = bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List[index]

    return None

  ReductionTargetMaxDeviationEnabled: bpy.props.BoolProperty(default=False,description='Enable max deviation as a reduction target. The reducer will stop when the set max deviation has been reached.')
  class SimplygonReductionTargetMaxDeviationEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetMaxDeviationEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetMaxDeviationEnabled = value
      self.Parent.ReductionTargetMaxDeviationUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReductionTargetMaxDeviationUI(self):
    index = bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List[index]

    return None

  ReductionTargetMaxDeviation: bpy.props.FloatProperty(default=1,min=0,max=10,description='The MaxDeviation value, the maximum surface-deviation between the reduced geometry and the original.')
  class SimplygonReductionTargetMaxDeviationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetMaxDeviation

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetMaxDeviation = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.ReductionTargetMaxDeviationEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.ReductionTargetMaxDeviationEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ReductionTargetMaxDeviation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ReductionTargetMaxDeviation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ReductionTargetOnScreenSizeEnabledUI(self):
    index = bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List[index]

    return None

  ReductionTargetOnScreenSizeEnabled: bpy.props.BoolProperty(default=False,description='Enable on screen size as a reduction target. The reducer will stop when the set on screen size has been reached.')
  class SimplygonReductionTargetOnScreenSizeEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetOnScreenSizeEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetOnScreenSizeEnabled = value
      self.Parent.ReductionTargetOnScreenSizeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReductionTargetOnScreenSizeUI(self):
    index = bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List[index]

    return None

  ReductionTargetOnScreenSize: bpy.props.IntProperty(default=300,min=20,max=100000,description='The OnScreenSize value, used to calculate the maximum surface-deviation allowed, by assuming errors less than 1 pixel onscreen will not be noticeable.')
  class SimplygonReductionTargetOnScreenSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetOnScreenSize

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetOnScreenSize = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.ReductionTargetOnScreenSizeEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.ReductionTargetOnScreenSizeEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 20
      self.MaxValue = 100000
      self.DefaultMinValue = 20
      self.DefaultMaxValue = 100000
      self.TicksFrequencyValue = 10
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 20
      self.DefaultMinValue = 20
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ReductionTargetOnScreenSize: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 100000
      self.DefaultMaxValue = 100000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ReductionTargetOnScreenSize: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ReductionTargetStopConditionUI(self):
    index = bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List[index]

    return None

  ReductionTargetStopCondition: bpy.props.EnumProperty(items=[('0','Any', ''),('1','All', ''),],default='1',description='The stop condition for the reducer.  Any -> the reducer will stop when any single one of the set reduction targets have been reached.  All -> the reducer will stop when all enabled reduction targets have been set.')
  class SimplygonReductionTargetStopConditionEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionTargetStopCondition

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionTargetStopCondition = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReductionHeuristicsUI(self):
    index = bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List[index]

    return None

  ReductionHeuristics: bpy.props.EnumProperty(items=[('0','Fast', ''),('1','Consistent', ''),],default='0',description='The flag that decides how precise the reducer will be during the mesh reduction. Fast -> Reducer will be faster, but onscreensize and trianglecount will not match perfectly.  Consistent -> Reducer will be slower, but onscreensize and trianglecount will consistently give matching results.')
  class SimplygonReductionHeuristicsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReductionHeuristics

    @Value.setter
    def Value(self, value):
      self.Parent.ReductionHeuristics = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GeometryImportanceUI(self):
    index = bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List[index]

    return None

  GeometryImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the position of the vertices and triangles of the Geometry, or the silhouette of the Geometry. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonGeometryImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GeometryImportance

    @Value.setter
    def Value(self, value):
      self.Parent.GeometryImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GeometryImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GeometryImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MaterialImportanceUI(self):
    index = bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List[index]

    return None

  MaterialImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the boundary between triangles with different materials. For example, if triangles with a metallic material are connected to triangles with a wood material, this setting will determine how important it is to keep the border between them intact. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonMaterialImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialImportance

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaterialImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaterialImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TextureImportanceUI(self):
    index = bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List[index]

    return None

  TextureImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the UV coordinates of the Geometry, both the boundary of the UV charts, as well as the UV stretch across the triangles. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonTextureImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureImportance

    @Value.setter
    def Value(self, value):
      self.Parent.TextureImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TextureImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TextureImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ShadingImportanceUI(self):
    index = bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List[index]

    return None

  ShadingImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the vertex-normals of the Geometry, both the sharp edges, as well as how the normals interpolate over the surface of the triangles. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonShadingImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ShadingImportance

    @Value.setter
    def Value(self, value):
      self.Parent.ShadingImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ShadingImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ShadingImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GroupImportanceUI(self):
    index = bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List[index]

    return None

  GroupImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the boundary between triangles from different sub-geometries. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonGroupImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GroupImportance

    @Value.setter
    def Value(self, value):
      self.Parent.GroupImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GroupImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GroupImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def VertexColorImportanceUI(self):
    index = bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List[index]

    return None

  VertexColorImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the vertex-colors of the Geometry, both the boundary between triangles with different colors, as well as how the colors interpolate over the surface of the triangles. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonVertexColorImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.VertexColorImportance

    @Value.setter
    def Value(self, value):
      self.Parent.VertexColorImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("VertexColorImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("VertexColorImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def EdgeSetImportanceUI(self):
    index = bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List[index]

    return None

  EdgeSetImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of user selected edges. Can be used when a Boolean UserCornerField with the name SgEdgeSelectionSet is added to the Geometry. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonEdgeSetImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.EdgeSetImportance

    @Value.setter
    def Value(self, value):
      self.Parent.EdgeSetImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("EdgeSetImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("EdgeSetImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SkinningImportanceUI(self):
    index = bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List[index]

    return None

  SkinningImportance: bpy.props.FloatProperty(default=1,min=0,max=10,description='The importance value of the bone-weights of the vertices. The more impact a vertex has on the skinning of the Geometry (for example, vertices close to joints), the more likely it is to be kept. The importance is relative to the values of the other mesh features (or disabling an importance entirely by setting it to 0). A higher number means higher importance. Default is 1.0')
  class SimplygonSkinningImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SkinningImportance

    @Value.setter
    def Value(self, value):
      self.Parent.SkinningImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SkinningImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SkinningImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def CurvatureImportanceUI(self):
    index = bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List[index]

    return None

  CurvatureImportance: bpy.props.FloatProperty(default=0,min=0,max=10,description='This importance is deprecated and disabled.')
  class SimplygonCurvatureImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CurvatureImportance

    @Value.setter
    def Value(self, value):
      self.Parent.CurvatureImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("CurvatureImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("CurvatureImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def CreateGeomorphGeometryUI(self):
    index = bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List[index]

    return None

  CreateGeomorphGeometry: bpy.props.BoolProperty(default=False,description='The CreateGeomorphGeometry value. If set, the reducer will create a GeometryData object that is a morphed version of the original GeometryData, that can be used to morph between the original geometry and the reduced geometry. Should not be used together with TJunctionRemover, NormalRecalculation or Material LOD.')
  class SimplygonCreateGeomorphGeometryEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CreateGeomorphGeometry

    @Value.setter
    def Value(self, value):
      self.Parent.CreateGeomorphGeometry = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def AllowDegenerateTexCoordsUI(self):
    index = bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List[index]

    return None

  AllowDegenerateTexCoords: bpy.props.BoolProperty(default=True,description='The AllowDegenerateTexCoords flag. If true, texture coordinates are allowed to become degenerate (triangles can have 0 area in texture space). This may sometimes look better, but if tangent space normals are used, tangent spaces may become degenerate.')
  class SimplygonAllowDegenerateTexCoordsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.AllowDegenerateTexCoords

    @Value.setter
    def Value(self, value):
      self.Parent.AllowDegenerateTexCoords = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def KeepSymmetryUI(self):
    index = bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List[index]

    return None

  KeepSymmetry: bpy.props.BoolProperty(default=False,description='The KeepSymmetry flag. If set, the reducer will detect symmetric features, and retain symmetry during processing. Please note that for a geometry to be considered symmetrical, also the texture coordinates must be mirrored.')
  class SimplygonKeepSymmetryEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.KeepSymmetry

    @Value.setter
    def Value(self, value):
      self.Parent.KeepSymmetry = value
      self.Parent.UseAutomaticSymmetryDetectionUI.Visible = Visible
      self.Parent.UseSymmetryQuadRetriangulatorUI.Visible = Visible
      self.Parent.SymmetryAxisUI.Visible = Visible
      self.Parent.SymmetryOffsetUI.Visible = Visible
      self.Parent.SymmetryDetectionToleranceUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseAutomaticSymmetryDetectionUI(self):
    index = bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List[index]

    return None

  UseAutomaticSymmetryDetection: bpy.props.BoolProperty(default=False,description='The AutomaticSymmetryDetection flag. If set, and KeepSymmetry is on, the reducer will detect any X,Y,Z symmetry plane and will override any user set symmetry plane with the detected one. If no symmetry is found, KeepSymmetry will be turned off before reduction.')
  class SimplygonUseAutomaticSymmetryDetectionEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseAutomaticSymmetryDetection

    @Value.setter
    def Value(self, value):
      self.Parent.UseAutomaticSymmetryDetection = value

    @property
    def Visible(self):
      if self.Parent.KeepSymmetryUI is not None:
        return self.Parent.KeepSymmetry and self.Parent.KeepSymmetryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseSymmetryQuadRetriangulatorUI(self):
    index = bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List[index]

    return None

  UseSymmetryQuadRetriangulator: bpy.props.BoolProperty(default=True,description='The UseSymmetryQuadRetriangulator flag. If true, and KeepSymmetry is on, any triangles that have been triangulated from symmetrical quads into unsymmetrical triangles are detected and fixed. The edges of said triangles are flipped across the old quad so that the mesh becomes symmetrical again.')
  class SimplygonUseSymmetryQuadRetriangulatorEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseSymmetryQuadRetriangulator

    @Value.setter
    def Value(self, value):
      self.Parent.UseSymmetryQuadRetriangulator = value

    @property
    def Visible(self):
      if self.Parent.KeepSymmetryUI is not None:
        return self.Parent.KeepSymmetry and self.Parent.KeepSymmetryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SymmetryAxisUI(self):
    index = bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List[index]

    return None

  SymmetryAxis: bpy.props.EnumProperty(items=[('0','X', ''),('1','Y', ''),('2','Z', ''),],default='0',description='Set what axis to be used for symmetry calculations.')
  class SimplygonSymmetryAxisEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SymmetryAxis

    @Value.setter
    def Value(self, value):
      self.Parent.SymmetryAxis = value

    @property
    def Visible(self):
      if self.Parent.KeepSymmetryUI is not None:
        return self.Parent.KeepSymmetry and self.Parent.KeepSymmetryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SymmetryOffsetUI(self):
    index = bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List[index]

    return None

  SymmetryOffset: bpy.props.FloatProperty(default=0,min=0,max=10,description='Set SymmetryOffset, the position on the symmetry axis where the symmetry plane is placed.')
  class SimplygonSymmetryOffsetEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SymmetryOffset

    @Value.setter
    def Value(self, value):
      self.Parent.SymmetryOffset = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.KeepSymmetryUI is not None:
        return self.Parent.KeepSymmetry and self.Parent.KeepSymmetryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SymmetryOffset: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SymmetryOffset: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SymmetryDetectionToleranceUI(self):
    index = bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List[index]

    return None

  SymmetryDetectionTolerance: bpy.props.FloatProperty(default=0.0001,min=0,max=1,description='The tolerance used when detecting symmetry. Values in the ranges 1e-5 to 1e-3 will usually produce good results. This specific tolerance corresponds to the off-plane tolerance, ie. the tolerance of the coordinate components that are not the symmetry axis. The in-plane tolerance is always 10 times the off-plane tolerance. This value is relative to the size of the Geometry, so 0.01 would mean 1% of the bounding box size of the Geometry.')
  class SimplygonSymmetryDetectionToleranceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SymmetryDetectionTolerance

    @Value.setter
    def Value(self, value):
      self.Parent.SymmetryDetectionTolerance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.KeepSymmetryUI is not None:
        return self.Parent.KeepSymmetry and self.Parent.KeepSymmetryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.0001
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SymmetryDetectionTolerance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SymmetryDetectionTolerance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.0001

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def DataCreationPreferencesUI(self):
    index = bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List[index]

    return None

  DataCreationPreferences: bpy.props.EnumProperty(items=[('0','OnlyUseOriginalData', ''),('1','PreferOriginalData', ''),('2','PreferOptimizedResult', ''),],default='2',description='The flag that specifies how big ´freedom´ Simplygon has when it comes to altering vertex/triangle data. Allowing more altered data means it will be easier to create good looking LODs, but without altered data it will be easier to keep the memory-usage in the LOD-chain more optimized. Note: When using OnlyUseOriginalData, the geometry being reduced can not have a node transformation matrix other than the identity matrix.')
  class SimplygonDataCreationPreferencesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DataCreationPreferences

    @Value.setter
    def Value(self, value):
      self.Parent.DataCreationPreferences = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutwardMoveMultiplierUI(self):
    index = bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List[index]

    return None

  OutwardMoveMultiplier: bpy.props.FloatProperty(default=1,min=0,max=10,description='The outward move multiplier, how much the mesh is allowed to grow its silhouette perimeter.')
  class SimplygonOutwardMoveMultiplierEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutwardMoveMultiplier

    @Value.setter
    def Value(self, value):
      self.Parent.OutwardMoveMultiplier = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OutwardMoveMultiplier: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OutwardMoveMultiplier: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def InwardMoveMultiplierUI(self):
    index = bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List[index]

    return None

  InwardMoveMultiplier: bpy.props.FloatProperty(default=1,min=0,max=10,description='The inward move multiplier, how much the mesh is allowed to shrink its silhouette perimeter.')
  class SimplygonInwardMoveMultiplierEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.InwardMoveMultiplier

    @Value.setter
    def Value(self, value):
      self.Parent.InwardMoveMultiplier = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("InwardMoveMultiplier: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("InwardMoveMultiplier: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UseHighQualityNormalCalculationUI(self):
    index = bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List[index]

    return None

  UseHighQualityNormalCalculation: bpy.props.BoolProperty(default=True,description='Set to true and the reducer will do a much more precise way of calculating the vertex normals. It will however be slower. Set to false and it will do a much more rough estimation of what the vertex normals will look like, but faster.')
  class SimplygonUseHighQualityNormalCalculationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseHighQualityNormalCalculation

    @Value.setter
    def Value(self, value):
      self.Parent.UseHighQualityNormalCalculation = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def MergeGeometriesUI(self):
    index = bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List[index]

    return None

  MergeGeometries: bpy.props.BoolProperty(default=False,description='The processor will merge all the geometries in the scene into a single geometry if MergeGeometries is enabled.')
  class SimplygonMergeGeometriesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MergeGeometries

    @Value.setter
    def Value(self, value):
      self.Parent.MergeGeometries = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def KeepUnprocessedSceneMeshesUI(self):
    index = bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List[index]

    return None

  KeepUnprocessedSceneMeshes: bpy.props.BoolProperty(default=False,description='If false, the processor will remove all geometry and scene meshes which were not selected for processing from the scene. If true, only the geometry in the ProcessSelectionSet will be replaced or updated, while the rest of the scene tree is kept intact. New geometry is always added as the last child of the scene root. If generating a mappingimage to cast materials, new materialIds will also be appended to the end of the old material table instead of replacing the old ones.')
  class SimplygonKeepUnprocessedSceneMeshesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.KeepUnprocessedSceneMeshes

    @Value.setter
    def Value(self, value):
      self.Parent.KeepUnprocessedSceneMeshes = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def LockGeometricBorderUI(self):
    index = bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List[index]

    return None

  LockGeometricBorder: bpy.props.BoolProperty(default=False,description='If set, will lock the geometric border of the geometry, and not reduce at all. This setting might be useful if the geometry needs to fit a neighbor geometry, but will reduce overall reduction quality (geometric quality over reduction ratio)')
  class SimplygonLockGeometricBorderEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LockGeometricBorder

    @Value.setter
    def Value(self, value):
      self.Parent.LockGeometricBorder = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ReductionSettings'
    ReductionTargetTriangleRatioEnabledUI = bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.add()
    ReductionTargetTriangleRatioEnabledUI.Init(self.name)
    ReductionTargetTriangleRatioEnabledUI.name = self.name
    ReductionTargetTriangleRatioUI = bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.add()
    ReductionTargetTriangleRatioUI.Init(self.name)
    ReductionTargetTriangleRatioUI.name = self.name
    ReductionTargetTriangleCountEnabledUI = bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.add()
    ReductionTargetTriangleCountEnabledUI.Init(self.name)
    ReductionTargetTriangleCountEnabledUI.name = self.name
    ReductionTargetTriangleCountUI = bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.add()
    ReductionTargetTriangleCountUI.Init(self.name)
    ReductionTargetTriangleCountUI.name = self.name
    ReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.add()
    ReductionTargetMaxDeviationEnabledUI.Init(self.name)
    ReductionTargetMaxDeviationEnabledUI.name = self.name
    ReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.add()
    ReductionTargetMaxDeviationUI.Init(self.name)
    ReductionTargetMaxDeviationUI.name = self.name
    ReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.add()
    ReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    ReductionTargetOnScreenSizeEnabledUI.name = self.name
    ReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.add()
    ReductionTargetOnScreenSizeUI.Init(self.name)
    ReductionTargetOnScreenSizeUI.name = self.name
    ReductionTargetStopConditionUI = bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.add()
    ReductionTargetStopConditionUI.Init(self.name)
    ReductionTargetStopConditionUI.name = self.name
    ReductionHeuristicsUI = bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.add()
    ReductionHeuristicsUI.Init(self.name)
    ReductionHeuristicsUI.name = self.name
    GeometryImportanceUI = bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.add()
    GeometryImportanceUI.Init(self.name)
    GeometryImportanceUI.name = self.name
    MaterialImportanceUI = bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.add()
    MaterialImportanceUI.Init(self.name)
    MaterialImportanceUI.name = self.name
    TextureImportanceUI = bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.add()
    TextureImportanceUI.Init(self.name)
    TextureImportanceUI.name = self.name
    ShadingImportanceUI = bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.add()
    ShadingImportanceUI.Init(self.name)
    ShadingImportanceUI.name = self.name
    GroupImportanceUI = bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.add()
    GroupImportanceUI.Init(self.name)
    GroupImportanceUI.name = self.name
    VertexColorImportanceUI = bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.add()
    VertexColorImportanceUI.Init(self.name)
    VertexColorImportanceUI.name = self.name
    EdgeSetImportanceUI = bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.add()
    EdgeSetImportanceUI.Init(self.name)
    EdgeSetImportanceUI.name = self.name
    SkinningImportanceUI = bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.add()
    SkinningImportanceUI.Init(self.name)
    SkinningImportanceUI.name = self.name
    CurvatureImportanceUI = bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.add()
    CurvatureImportanceUI.Init(self.name)
    CurvatureImportanceUI.name = self.name
    OutwardMoveMultiplierUI = bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.add()
    OutwardMoveMultiplierUI.Init(self.name)
    OutwardMoveMultiplierUI.name = self.name
    InwardMoveMultiplierUI = bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.add()
    InwardMoveMultiplierUI.Init(self.name)
    InwardMoveMultiplierUI.name = self.name
    KeepSymmetryUI = bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.add()
    KeepSymmetryUI.Init(self.name)
    KeepSymmetryUI.name = self.name
    UseSymmetryQuadRetriangulatorUI = bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.add()
    UseSymmetryQuadRetriangulatorUI.Init(self.name)
    UseSymmetryQuadRetriangulatorUI.name = self.name
    UseAutomaticSymmetryDetectionUI = bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.add()
    UseAutomaticSymmetryDetectionUI.Init(self.name)
    UseAutomaticSymmetryDetectionUI.name = self.name
    SymmetryDetectionToleranceUI = bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.add()
    SymmetryDetectionToleranceUI.Init(self.name)
    SymmetryDetectionToleranceUI.name = self.name
    SymmetryAxisUI = bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.add()
    SymmetryAxisUI.Init(self.name)
    SymmetryAxisUI.name = self.name
    SymmetryOffsetUI = bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.add()
    SymmetryOffsetUI.Init(self.name)
    SymmetryOffsetUI.name = self.name
    CreateGeomorphGeometryUI = bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.add()
    CreateGeomorphGeometryUI.Init(self.name)
    CreateGeomorphGeometryUI.name = self.name
    DataCreationPreferencesUI = bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.add()
    DataCreationPreferencesUI.Init(self.name)
    DataCreationPreferencesUI.name = self.name
    UseHighQualityNormalCalculationUI = bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.add()
    UseHighQualityNormalCalculationUI.Init(self.name)
    UseHighQualityNormalCalculationUI.name = self.name
    LockGeometricBorderUI = bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.add()
    LockGeometricBorderUI.Init(self.name)
    LockGeometricBorderUI.name = self.name
    MergeGeometriesUI = bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    AllowDegenerateTexCoordsUI = bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.add()
    AllowDegenerateTexCoordsUI.Init(self.name)
    AllowDegenerateTexCoordsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.add()
    KeepUnprocessedSceneMeshesUI.Init(self.name)
    KeepUnprocessedSceneMeshesUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ReductionSettings'
    ReductionTargetTriangleRatioEnabledUI = bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.add()
    ReductionTargetTriangleRatioEnabledUI.InitJson(self.name, jsonData['ReductionTargetTriangleRatioEnabledUI'] if jsonData is not None and 'ReductionTargetTriangleRatioEnabledUI' in jsonData else None)
    ReductionTargetTriangleRatioEnabledUI.name = self.name
    ReductionTargetTriangleRatioUI = bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.add()
    ReductionTargetTriangleRatioUI.InitJson(self.name, jsonData['ReductionTargetTriangleRatioUI'] if jsonData is not None and 'ReductionTargetTriangleRatioUI' in jsonData else None)
    ReductionTargetTriangleRatioUI.name = self.name
    ReductionTargetTriangleCountEnabledUI = bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.add()
    ReductionTargetTriangleCountEnabledUI.InitJson(self.name, jsonData['ReductionTargetTriangleCountEnabledUI'] if jsonData is not None and 'ReductionTargetTriangleCountEnabledUI' in jsonData else None)
    ReductionTargetTriangleCountEnabledUI.name = self.name
    ReductionTargetTriangleCountUI = bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.add()
    ReductionTargetTriangleCountUI.InitJson(self.name, jsonData['ReductionTargetTriangleCountUI'] if jsonData is not None and 'ReductionTargetTriangleCountUI' in jsonData else None)
    ReductionTargetTriangleCountUI.name = self.name
    ReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.add()
    ReductionTargetMaxDeviationEnabledUI.InitJson(self.name, jsonData['ReductionTargetMaxDeviationEnabledUI'] if jsonData is not None and 'ReductionTargetMaxDeviationEnabledUI' in jsonData else None)
    ReductionTargetMaxDeviationEnabledUI.name = self.name
    ReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.add()
    ReductionTargetMaxDeviationUI.InitJson(self.name, jsonData['ReductionTargetMaxDeviationUI'] if jsonData is not None and 'ReductionTargetMaxDeviationUI' in jsonData else None)
    ReductionTargetMaxDeviationUI.name = self.name
    ReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.add()
    ReductionTargetOnScreenSizeEnabledUI.InitJson(self.name, jsonData['ReductionTargetOnScreenSizeEnabledUI'] if jsonData is not None and 'ReductionTargetOnScreenSizeEnabledUI' in jsonData else None)
    ReductionTargetOnScreenSizeEnabledUI.name = self.name
    ReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.add()
    ReductionTargetOnScreenSizeUI.InitJson(self.name, jsonData['ReductionTargetOnScreenSizeUI'] if jsonData is not None and 'ReductionTargetOnScreenSizeUI' in jsonData else None)
    ReductionTargetOnScreenSizeUI.name = self.name
    ReductionTargetStopConditionUI = bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.add()
    ReductionTargetStopConditionUI.InitJson(self.name, jsonData['ReductionTargetStopConditionUI'] if jsonData is not None and 'ReductionTargetStopConditionUI' in jsonData else None)
    ReductionTargetStopConditionUI.name = self.name
    ReductionHeuristicsUI = bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.add()
    ReductionHeuristicsUI.InitJson(self.name, jsonData['ReductionHeuristicsUI'] if jsonData is not None and 'ReductionHeuristicsUI' in jsonData else None)
    ReductionHeuristicsUI.name = self.name
    GeometryImportanceUI = bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.add()
    GeometryImportanceUI.InitJson(self.name, jsonData['GeometryImportanceUI'] if jsonData is not None and 'GeometryImportanceUI' in jsonData else None)
    GeometryImportanceUI.name = self.name
    MaterialImportanceUI = bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.add()
    MaterialImportanceUI.InitJson(self.name, jsonData['MaterialImportanceUI'] if jsonData is not None and 'MaterialImportanceUI' in jsonData else None)
    MaterialImportanceUI.name = self.name
    TextureImportanceUI = bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.add()
    TextureImportanceUI.InitJson(self.name, jsonData['TextureImportanceUI'] if jsonData is not None and 'TextureImportanceUI' in jsonData else None)
    TextureImportanceUI.name = self.name
    ShadingImportanceUI = bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.add()
    ShadingImportanceUI.InitJson(self.name, jsonData['ShadingImportanceUI'] if jsonData is not None and 'ShadingImportanceUI' in jsonData else None)
    ShadingImportanceUI.name = self.name
    GroupImportanceUI = bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.add()
    GroupImportanceUI.InitJson(self.name, jsonData['GroupImportanceUI'] if jsonData is not None and 'GroupImportanceUI' in jsonData else None)
    GroupImportanceUI.name = self.name
    VertexColorImportanceUI = bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.add()
    VertexColorImportanceUI.InitJson(self.name, jsonData['VertexColorImportanceUI'] if jsonData is not None and 'VertexColorImportanceUI' in jsonData else None)
    VertexColorImportanceUI.name = self.name
    EdgeSetImportanceUI = bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.add()
    EdgeSetImportanceUI.InitJson(self.name, jsonData['EdgeSetImportanceUI'] if jsonData is not None and 'EdgeSetImportanceUI' in jsonData else None)
    EdgeSetImportanceUI.name = self.name
    SkinningImportanceUI = bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.add()
    SkinningImportanceUI.InitJson(self.name, jsonData['SkinningImportanceUI'] if jsonData is not None and 'SkinningImportanceUI' in jsonData else None)
    SkinningImportanceUI.name = self.name
    CurvatureImportanceUI = bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.add()
    CurvatureImportanceUI.InitJson(self.name, jsonData['CurvatureImportanceUI'] if jsonData is not None and 'CurvatureImportanceUI' in jsonData else None)
    CurvatureImportanceUI.name = self.name
    OutwardMoveMultiplierUI = bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.add()
    OutwardMoveMultiplierUI.InitJson(self.name, jsonData['OutwardMoveMultiplierUI'] if jsonData is not None and 'OutwardMoveMultiplierUI' in jsonData else None)
    OutwardMoveMultiplierUI.name = self.name
    InwardMoveMultiplierUI = bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.add()
    InwardMoveMultiplierUI.InitJson(self.name, jsonData['InwardMoveMultiplierUI'] if jsonData is not None and 'InwardMoveMultiplierUI' in jsonData else None)
    InwardMoveMultiplierUI.name = self.name
    KeepSymmetryUI = bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.add()
    KeepSymmetryUI.InitJson(self.name, jsonData['KeepSymmetryUI'] if jsonData is not None and 'KeepSymmetryUI' in jsonData else None)
    KeepSymmetryUI.name = self.name
    UseSymmetryQuadRetriangulatorUI = bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.add()
    UseSymmetryQuadRetriangulatorUI.InitJson(self.name, jsonData['UseSymmetryQuadRetriangulatorUI'] if jsonData is not None and 'UseSymmetryQuadRetriangulatorUI' in jsonData else None)
    UseSymmetryQuadRetriangulatorUI.name = self.name
    UseAutomaticSymmetryDetectionUI = bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.add()
    UseAutomaticSymmetryDetectionUI.InitJson(self.name, jsonData['UseAutomaticSymmetryDetectionUI'] if jsonData is not None and 'UseAutomaticSymmetryDetectionUI' in jsonData else None)
    UseAutomaticSymmetryDetectionUI.name = self.name
    SymmetryDetectionToleranceUI = bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.add()
    SymmetryDetectionToleranceUI.InitJson(self.name, jsonData['SymmetryDetectionToleranceUI'] if jsonData is not None and 'SymmetryDetectionToleranceUI' in jsonData else None)
    SymmetryDetectionToleranceUI.name = self.name
    SymmetryAxisUI = bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.add()
    SymmetryAxisUI.InitJson(self.name, jsonData['SymmetryAxisUI'] if jsonData is not None and 'SymmetryAxisUI' in jsonData else None)
    SymmetryAxisUI.name = self.name
    SymmetryOffsetUI = bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.add()
    SymmetryOffsetUI.InitJson(self.name, jsonData['SymmetryOffsetUI'] if jsonData is not None and 'SymmetryOffsetUI' in jsonData else None)
    SymmetryOffsetUI.name = self.name
    CreateGeomorphGeometryUI = bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.add()
    CreateGeomorphGeometryUI.InitJson(self.name, jsonData['CreateGeomorphGeometryUI'] if jsonData is not None and 'CreateGeomorphGeometryUI' in jsonData else None)
    CreateGeomorphGeometryUI.name = self.name
    DataCreationPreferencesUI = bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.add()
    DataCreationPreferencesUI.InitJson(self.name, jsonData['DataCreationPreferencesUI'] if jsonData is not None and 'DataCreationPreferencesUI' in jsonData else None)
    DataCreationPreferencesUI.name = self.name
    UseHighQualityNormalCalculationUI = bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.add()
    UseHighQualityNormalCalculationUI.InitJson(self.name, jsonData['UseHighQualityNormalCalculationUI'] if jsonData is not None and 'UseHighQualityNormalCalculationUI' in jsonData else None)
    UseHighQualityNormalCalculationUI.name = self.name
    LockGeometricBorderUI = bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.add()
    LockGeometricBorderUI.InitJson(self.name, jsonData['LockGeometricBorderUI'] if jsonData is not None and 'LockGeometricBorderUI' in jsonData else None)
    LockGeometricBorderUI.name = self.name
    MergeGeometriesUI = bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.add()
    MergeGeometriesUI.InitJson(self.name, jsonData['MergeGeometriesUI'] if jsonData is not None and 'MergeGeometriesUI' in jsonData else None)
    MergeGeometriesUI.name = self.name
    AllowDegenerateTexCoordsUI = bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.add()
    AllowDegenerateTexCoordsUI.InitJson(self.name, jsonData['AllowDegenerateTexCoordsUI'] if jsonData is not None and 'AllowDegenerateTexCoordsUI' in jsonData else None)
    AllowDegenerateTexCoordsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.add()
    KeepUnprocessedSceneMeshesUI.InitJson(self.name, jsonData['KeepUnprocessedSceneMeshesUI'] if jsonData is not None and 'KeepUnprocessedSceneMeshesUI' in jsonData else None)
    KeepUnprocessedSceneMeshesUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    ReductionTargetTriangleRatioEnabledUI_index = bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.find(self.name)
    bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.remove(ReductionTargetTriangleRatioEnabledUI_index)
    ReductionTargetTriangleRatioUI_index = bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.find(self.name)
    bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.remove(ReductionTargetTriangleRatioUI_index)
    ReductionTargetTriangleCountEnabledUI_index = bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.find(self.name)
    bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.remove(ReductionTargetTriangleCountEnabledUI_index)
    ReductionTargetTriangleCountUI_index = bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.find(self.name)
    bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.remove(ReductionTargetTriangleCountUI_index)
    ReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.find(self.name)
    bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.remove(ReductionTargetMaxDeviationEnabledUI_index)
    ReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.find(self.name)
    bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.remove(ReductionTargetMaxDeviationUI_index)
    ReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.find(self.name)
    bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.remove(ReductionTargetOnScreenSizeEnabledUI_index)
    ReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.find(self.name)
    bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.remove(ReductionTargetOnScreenSizeUI_index)
    ReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.find(self.name)
    bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.remove(ReductionTargetStopConditionUI_index)
    ReductionHeuristicsUI_index = bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.find(self.name)
    bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.remove(ReductionHeuristicsUI_index)
    GeometryImportanceUI_index = bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.find(self.name)
    bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.remove(GeometryImportanceUI_index)
    MaterialImportanceUI_index = bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.find(self.name)
    bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.remove(MaterialImportanceUI_index)
    TextureImportanceUI_index = bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.find(self.name)
    bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.remove(TextureImportanceUI_index)
    ShadingImportanceUI_index = bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.find(self.name)
    bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.remove(ShadingImportanceUI_index)
    GroupImportanceUI_index = bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.find(self.name)
    bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.remove(GroupImportanceUI_index)
    VertexColorImportanceUI_index = bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.find(self.name)
    bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.remove(VertexColorImportanceUI_index)
    EdgeSetImportanceUI_index = bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.find(self.name)
    bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.remove(EdgeSetImportanceUI_index)
    SkinningImportanceUI_index = bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.find(self.name)
    bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.remove(SkinningImportanceUI_index)
    CurvatureImportanceUI_index = bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.find(self.name)
    bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.remove(CurvatureImportanceUI_index)
    OutwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.find(self.name)
    bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.remove(OutwardMoveMultiplierUI_index)
    InwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.find(self.name)
    bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.remove(InwardMoveMultiplierUI_index)
    KeepSymmetryUI_index = bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.find(self.name)
    bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.remove(KeepSymmetryUI_index)
    UseSymmetryQuadRetriangulatorUI_index = bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.find(self.name)
    bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.remove(UseSymmetryQuadRetriangulatorUI_index)
    UseAutomaticSymmetryDetectionUI_index = bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.find(self.name)
    bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.remove(UseAutomaticSymmetryDetectionUI_index)
    SymmetryDetectionToleranceUI_index = bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.find(self.name)
    bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.remove(SymmetryDetectionToleranceUI_index)
    SymmetryAxisUI_index = bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.find(self.name)
    bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.remove(SymmetryAxisUI_index)
    SymmetryOffsetUI_index = bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.find(self.name)
    bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.remove(SymmetryOffsetUI_index)
    CreateGeomorphGeometryUI_index = bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.find(self.name)
    bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.remove(CreateGeomorphGeometryUI_index)
    DataCreationPreferencesUI_index = bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.find(self.name)
    bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.remove(DataCreationPreferencesUI_index)
    UseHighQualityNormalCalculationUI_index = bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.find(self.name)
    bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.remove(UseHighQualityNormalCalculationUI_index)
    LockGeometricBorderUI_index = bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.find(self.name)
    bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.remove(LockGeometricBorderUI_index)
    MergeGeometriesUI_index = bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.find(self.name)
    bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.remove(MergeGeometriesUI_index)
    AllowDegenerateTexCoordsUI_index = bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.find(self.name)
    bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.remove(AllowDegenerateTexCoordsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.find(self.name)
    bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.remove(KeepUnprocessedSceneMeshesUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['ReductionTargetTriangleRatioEnabled'] = self.ReductionTargetTriangleRatioEnabled
    if serializeUIComponents:
      jsonData['ReductionTargetTriangleRatioEnabledUI'] = self.ReductionTargetTriangleRatioEnabledUI.SaveJson()

    jsonData['ReductionTargetTriangleRatio'] = self.ReductionTargetTriangleRatio
    if serializeUIComponents:
      jsonData['ReductionTargetTriangleRatioUI'] = self.ReductionTargetTriangleRatioUI.SaveJson()

    jsonData['ReductionTargetTriangleCountEnabled'] = self.ReductionTargetTriangleCountEnabled
    if serializeUIComponents:
      jsonData['ReductionTargetTriangleCountEnabledUI'] = self.ReductionTargetTriangleCountEnabledUI.SaveJson()

    jsonData['ReductionTargetTriangleCount'] = self.ReductionTargetTriangleCount
    if serializeUIComponents:
      jsonData['ReductionTargetTriangleCountUI'] = self.ReductionTargetTriangleCountUI.SaveJson()

    jsonData['ReductionTargetMaxDeviationEnabled'] = self.ReductionTargetMaxDeviationEnabled
    if serializeUIComponents:
      jsonData['ReductionTargetMaxDeviationEnabledUI'] = self.ReductionTargetMaxDeviationEnabledUI.SaveJson()

    jsonData['ReductionTargetMaxDeviation'] = self.ReductionTargetMaxDeviation
    if serializeUIComponents:
      jsonData['ReductionTargetMaxDeviationUI'] = self.ReductionTargetMaxDeviationUI.SaveJson()

    jsonData['ReductionTargetOnScreenSizeEnabled'] = self.ReductionTargetOnScreenSizeEnabled
    if serializeUIComponents:
      jsonData['ReductionTargetOnScreenSizeEnabledUI'] = self.ReductionTargetOnScreenSizeEnabledUI.SaveJson()

    jsonData['ReductionTargetOnScreenSize'] = self.ReductionTargetOnScreenSize
    if serializeUIComponents:
      jsonData['ReductionTargetOnScreenSizeUI'] = self.ReductionTargetOnScreenSizeUI.SaveJson()

    jsonData['ReductionTargetStopCondition'] = int(self.ReductionTargetStopCondition)
    if serializeUIComponents:
      jsonData['ReductionTargetStopConditionUI'] = self.ReductionTargetStopConditionUI.SaveJson()

    jsonData['ReductionHeuristics'] = int(self.ReductionHeuristics)
    if serializeUIComponents:
      jsonData['ReductionHeuristicsUI'] = self.ReductionHeuristicsUI.SaveJson()

    jsonData['GeometryImportance'] = self.GeometryImportance
    if serializeUIComponents:
      jsonData['GeometryImportanceUI'] = self.GeometryImportanceUI.SaveJson()

    jsonData['MaterialImportance'] = self.MaterialImportance
    if serializeUIComponents:
      jsonData['MaterialImportanceUI'] = self.MaterialImportanceUI.SaveJson()

    jsonData['TextureImportance'] = self.TextureImportance
    if serializeUIComponents:
      jsonData['TextureImportanceUI'] = self.TextureImportanceUI.SaveJson()

    jsonData['ShadingImportance'] = self.ShadingImportance
    if serializeUIComponents:
      jsonData['ShadingImportanceUI'] = self.ShadingImportanceUI.SaveJson()

    jsonData['GroupImportance'] = self.GroupImportance
    if serializeUIComponents:
      jsonData['GroupImportanceUI'] = self.GroupImportanceUI.SaveJson()

    jsonData['VertexColorImportance'] = self.VertexColorImportance
    if serializeUIComponents:
      jsonData['VertexColorImportanceUI'] = self.VertexColorImportanceUI.SaveJson()

    jsonData['EdgeSetImportance'] = self.EdgeSetImportance
    if serializeUIComponents:
      jsonData['EdgeSetImportanceUI'] = self.EdgeSetImportanceUI.SaveJson()

    jsonData['SkinningImportance'] = self.SkinningImportance
    if serializeUIComponents:
      jsonData['SkinningImportanceUI'] = self.SkinningImportanceUI.SaveJson()

    jsonData['CurvatureImportance'] = self.CurvatureImportance
    if serializeUIComponents:
      jsonData['CurvatureImportanceUI'] = self.CurvatureImportanceUI.SaveJson()

    jsonData['CreateGeomorphGeometry'] = self.CreateGeomorphGeometry
    if serializeUIComponents:
      jsonData['CreateGeomorphGeometryUI'] = self.CreateGeomorphGeometryUI.SaveJson()

    jsonData['AllowDegenerateTexCoords'] = self.AllowDegenerateTexCoords
    if serializeUIComponents:
      jsonData['AllowDegenerateTexCoordsUI'] = self.AllowDegenerateTexCoordsUI.SaveJson()

    jsonData['KeepSymmetry'] = self.KeepSymmetry
    if serializeUIComponents:
      jsonData['KeepSymmetryUI'] = self.KeepSymmetryUI.SaveJson()

    jsonData['UseAutomaticSymmetryDetection'] = self.UseAutomaticSymmetryDetection
    if serializeUIComponents:
      jsonData['UseAutomaticSymmetryDetectionUI'] = self.UseAutomaticSymmetryDetectionUI.SaveJson()

    jsonData['UseSymmetryQuadRetriangulator'] = self.UseSymmetryQuadRetriangulator
    if serializeUIComponents:
      jsonData['UseSymmetryQuadRetriangulatorUI'] = self.UseSymmetryQuadRetriangulatorUI.SaveJson()

    jsonData['SymmetryAxis'] = int(self.SymmetryAxis)
    if serializeUIComponents:
      jsonData['SymmetryAxisUI'] = self.SymmetryAxisUI.SaveJson()

    jsonData['SymmetryOffset'] = self.SymmetryOffset
    if serializeUIComponents:
      jsonData['SymmetryOffsetUI'] = self.SymmetryOffsetUI.SaveJson()

    jsonData['SymmetryDetectionTolerance'] = self.SymmetryDetectionTolerance
    if serializeUIComponents:
      jsonData['SymmetryDetectionToleranceUI'] = self.SymmetryDetectionToleranceUI.SaveJson()

    jsonData['DataCreationPreferences'] = int(self.DataCreationPreferences)
    if serializeUIComponents:
      jsonData['DataCreationPreferencesUI'] = self.DataCreationPreferencesUI.SaveJson()

    jsonData['OutwardMoveMultiplier'] = self.OutwardMoveMultiplier
    if serializeUIComponents:
      jsonData['OutwardMoveMultiplierUI'] = self.OutwardMoveMultiplierUI.SaveJson()

    jsonData['InwardMoveMultiplier'] = self.InwardMoveMultiplier
    if serializeUIComponents:
      jsonData['InwardMoveMultiplierUI'] = self.InwardMoveMultiplierUI.SaveJson()

    jsonData['UseHighQualityNormalCalculation'] = self.UseHighQualityNormalCalculation
    if serializeUIComponents:
      jsonData['UseHighQualityNormalCalculationUI'] = self.UseHighQualityNormalCalculationUI.SaveJson()

    jsonData['MergeGeometries'] = self.MergeGeometries
    if serializeUIComponents:
      jsonData['MergeGeometriesUI'] = self.MergeGeometriesUI.SaveJson()

    jsonData['KeepUnprocessedSceneMeshes'] = self.KeepUnprocessedSceneMeshes
    if serializeUIComponents:
      jsonData['KeepUnprocessedSceneMeshesUI'] = self.KeepUnprocessedSceneMeshesUI.SaveJson()

    jsonData['LockGeometricBorder'] = self.LockGeometricBorder
    if serializeUIComponents:
      jsonData['LockGeometricBorderUI'] = self.LockGeometricBorderUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'ReductionTargetTriangleRatioEnabled' in jsonData and jsonData['ReductionTargetTriangleRatioEnabled'] is not None:
      self.ReductionTargetTriangleRatioEnabled = jsonData['ReductionTargetTriangleRatioEnabled']

    if 'ReductionTargetTriangleRatio' in jsonData and jsonData['ReductionTargetTriangleRatio'] is not None:
      newReductionTargetTriangleRatio = jsonData['ReductionTargetTriangleRatio']
      if newReductionTargetTriangleRatio >= self.ReductionTargetTriangleRatioUI.DefaultMinValue and newReductionTargetTriangleRatio <= self.ReductionTargetTriangleRatioUI.DefaultMaxValue:
        self.ReductionTargetTriangleRatio = newReductionTargetTriangleRatio

      else:
        print("ReductionTargetTriangleRatio: Invalid value", newReductionTargetTriangleRatio, "using default value", self.ReductionTargetTriangleRatio)


    if 'ReductionTargetTriangleCountEnabled' in jsonData and jsonData['ReductionTargetTriangleCountEnabled'] is not None:
      self.ReductionTargetTriangleCountEnabled = jsonData['ReductionTargetTriangleCountEnabled']

    if 'ReductionTargetTriangleCount' in jsonData and jsonData['ReductionTargetTriangleCount'] is not None:
      newReductionTargetTriangleCount = jsonData['ReductionTargetTriangleCount']
      if newReductionTargetTriangleCount >= self.ReductionTargetTriangleCountUI.DefaultMinValue and newReductionTargetTriangleCount <= self.ReductionTargetTriangleCountUI.DefaultMaxValue:
        self.ReductionTargetTriangleCount = newReductionTargetTriangleCount

      else:
        print("ReductionTargetTriangleCount: Invalid value", newReductionTargetTriangleCount, "using default value", self.ReductionTargetTriangleCount)


    if 'ReductionTargetMaxDeviationEnabled' in jsonData and jsonData['ReductionTargetMaxDeviationEnabled'] is not None:
      self.ReductionTargetMaxDeviationEnabled = jsonData['ReductionTargetMaxDeviationEnabled']

    if 'ReductionTargetMaxDeviation' in jsonData and jsonData['ReductionTargetMaxDeviation'] is not None:
      newReductionTargetMaxDeviation = jsonData['ReductionTargetMaxDeviation']
      if newReductionTargetMaxDeviation >= self.ReductionTargetMaxDeviationUI.DefaultMinValue and newReductionTargetMaxDeviation <= self.ReductionTargetMaxDeviationUI.DefaultMaxValue:
        self.ReductionTargetMaxDeviation = newReductionTargetMaxDeviation

      else:
        print("ReductionTargetMaxDeviation: Invalid value", newReductionTargetMaxDeviation, "using default value", self.ReductionTargetMaxDeviation)


    if 'ReductionTargetOnScreenSizeEnabled' in jsonData and jsonData['ReductionTargetOnScreenSizeEnabled'] is not None:
      self.ReductionTargetOnScreenSizeEnabled = jsonData['ReductionTargetOnScreenSizeEnabled']

    if 'ReductionTargetOnScreenSize' in jsonData and jsonData['ReductionTargetOnScreenSize'] is not None:
      newReductionTargetOnScreenSize = jsonData['ReductionTargetOnScreenSize']
      if newReductionTargetOnScreenSize >= self.ReductionTargetOnScreenSizeUI.DefaultMinValue and newReductionTargetOnScreenSize <= self.ReductionTargetOnScreenSizeUI.DefaultMaxValue:
        self.ReductionTargetOnScreenSize = newReductionTargetOnScreenSize

      else:
        print("ReductionTargetOnScreenSize: Invalid value", newReductionTargetOnScreenSize, "using default value", self.ReductionTargetOnScreenSize)


    if 'ReductionTargetStopCondition' in jsonData and jsonData['ReductionTargetStopCondition'] is not None:
      self.ReductionTargetStopCondition = str(jsonData['ReductionTargetStopCondition'])

    if 'ReductionHeuristics' in jsonData and jsonData['ReductionHeuristics'] is not None:
      self.ReductionHeuristics = str(jsonData['ReductionHeuristics'])

    if 'GeometryImportance' in jsonData and jsonData['GeometryImportance'] is not None:
      newGeometryImportance = jsonData['GeometryImportance']
      if newGeometryImportance >= self.GeometryImportanceUI.DefaultMinValue and newGeometryImportance <= self.GeometryImportanceUI.DefaultMaxValue:
        self.GeometryImportance = newGeometryImportance

      else:
        print("GeometryImportance: Invalid value", newGeometryImportance, "using default value", self.GeometryImportance)


    if 'MaterialImportance' in jsonData and jsonData['MaterialImportance'] is not None:
      newMaterialImportance = jsonData['MaterialImportance']
      if newMaterialImportance >= self.MaterialImportanceUI.DefaultMinValue and newMaterialImportance <= self.MaterialImportanceUI.DefaultMaxValue:
        self.MaterialImportance = newMaterialImportance

      else:
        print("MaterialImportance: Invalid value", newMaterialImportance, "using default value", self.MaterialImportance)


    if 'TextureImportance' in jsonData and jsonData['TextureImportance'] is not None:
      newTextureImportance = jsonData['TextureImportance']
      if newTextureImportance >= self.TextureImportanceUI.DefaultMinValue and newTextureImportance <= self.TextureImportanceUI.DefaultMaxValue:
        self.TextureImportance = newTextureImportance

      else:
        print("TextureImportance: Invalid value", newTextureImportance, "using default value", self.TextureImportance)


    if 'ShadingImportance' in jsonData and jsonData['ShadingImportance'] is not None:
      newShadingImportance = jsonData['ShadingImportance']
      if newShadingImportance >= self.ShadingImportanceUI.DefaultMinValue and newShadingImportance <= self.ShadingImportanceUI.DefaultMaxValue:
        self.ShadingImportance = newShadingImportance

      else:
        print("ShadingImportance: Invalid value", newShadingImportance, "using default value", self.ShadingImportance)


    if 'GroupImportance' in jsonData and jsonData['GroupImportance'] is not None:
      newGroupImportance = jsonData['GroupImportance']
      if newGroupImportance >= self.GroupImportanceUI.DefaultMinValue and newGroupImportance <= self.GroupImportanceUI.DefaultMaxValue:
        self.GroupImportance = newGroupImportance

      else:
        print("GroupImportance: Invalid value", newGroupImportance, "using default value", self.GroupImportance)


    if 'VertexColorImportance' in jsonData and jsonData['VertexColorImportance'] is not None:
      newVertexColorImportance = jsonData['VertexColorImportance']
      if newVertexColorImportance >= self.VertexColorImportanceUI.DefaultMinValue and newVertexColorImportance <= self.VertexColorImportanceUI.DefaultMaxValue:
        self.VertexColorImportance = newVertexColorImportance

      else:
        print("VertexColorImportance: Invalid value", newVertexColorImportance, "using default value", self.VertexColorImportance)


    if 'EdgeSetImportance' in jsonData and jsonData['EdgeSetImportance'] is not None:
      newEdgeSetImportance = jsonData['EdgeSetImportance']
      if newEdgeSetImportance >= self.EdgeSetImportanceUI.DefaultMinValue and newEdgeSetImportance <= self.EdgeSetImportanceUI.DefaultMaxValue:
        self.EdgeSetImportance = newEdgeSetImportance

      else:
        print("EdgeSetImportance: Invalid value", newEdgeSetImportance, "using default value", self.EdgeSetImportance)


    if 'SkinningImportance' in jsonData and jsonData['SkinningImportance'] is not None:
      newSkinningImportance = jsonData['SkinningImportance']
      if newSkinningImportance >= self.SkinningImportanceUI.DefaultMinValue and newSkinningImportance <= self.SkinningImportanceUI.DefaultMaxValue:
        self.SkinningImportance = newSkinningImportance

      else:
        print("SkinningImportance: Invalid value", newSkinningImportance, "using default value", self.SkinningImportance)


    if 'CurvatureImportance' in jsonData and jsonData['CurvatureImportance'] is not None:
      newCurvatureImportance = jsonData['CurvatureImportance']
      if newCurvatureImportance >= self.CurvatureImportanceUI.DefaultMinValue and newCurvatureImportance <= self.CurvatureImportanceUI.DefaultMaxValue:
        self.CurvatureImportance = newCurvatureImportance

      else:
        print("CurvatureImportance: Invalid value", newCurvatureImportance, "using default value", self.CurvatureImportance)


    if 'CreateGeomorphGeometry' in jsonData and jsonData['CreateGeomorphGeometry'] is not None:
      self.CreateGeomorphGeometry = jsonData['CreateGeomorphGeometry']

    if 'AllowDegenerateTexCoords' in jsonData and jsonData['AllowDegenerateTexCoords'] is not None:
      self.AllowDegenerateTexCoords = jsonData['AllowDegenerateTexCoords']

    if 'KeepSymmetry' in jsonData and jsonData['KeepSymmetry'] is not None:
      self.KeepSymmetry = jsonData['KeepSymmetry']

    if 'UseAutomaticSymmetryDetection' in jsonData and jsonData['UseAutomaticSymmetryDetection'] is not None:
      self.UseAutomaticSymmetryDetection = jsonData['UseAutomaticSymmetryDetection']

    if 'UseSymmetryQuadRetriangulator' in jsonData and jsonData['UseSymmetryQuadRetriangulator'] is not None:
      self.UseSymmetryQuadRetriangulator = jsonData['UseSymmetryQuadRetriangulator']

    if 'SymmetryAxis' in jsonData and jsonData['SymmetryAxis'] is not None:
      self.SymmetryAxis = str(jsonData['SymmetryAxis'])

    if 'SymmetryOffset' in jsonData and jsonData['SymmetryOffset'] is not None:
      newSymmetryOffset = jsonData['SymmetryOffset']
      if newSymmetryOffset >= self.SymmetryOffsetUI.DefaultMinValue and newSymmetryOffset <= self.SymmetryOffsetUI.DefaultMaxValue:
        self.SymmetryOffset = newSymmetryOffset

      else:
        print("SymmetryOffset: Invalid value", newSymmetryOffset, "using default value", self.SymmetryOffset)


    if 'SymmetryDetectionTolerance' in jsonData and jsonData['SymmetryDetectionTolerance'] is not None:
      newSymmetryDetectionTolerance = jsonData['SymmetryDetectionTolerance']
      if newSymmetryDetectionTolerance >= self.SymmetryDetectionToleranceUI.DefaultMinValue and newSymmetryDetectionTolerance <= self.SymmetryDetectionToleranceUI.DefaultMaxValue:
        self.SymmetryDetectionTolerance = newSymmetryDetectionTolerance

      else:
        print("SymmetryDetectionTolerance: Invalid value", newSymmetryDetectionTolerance, "using default value", self.SymmetryDetectionTolerance)


    if 'DataCreationPreferences' in jsonData and jsonData['DataCreationPreferences'] is not None:
      self.DataCreationPreferences = str(jsonData['DataCreationPreferences'])

    if 'OutwardMoveMultiplier' in jsonData and jsonData['OutwardMoveMultiplier'] is not None:
      newOutwardMoveMultiplier = jsonData['OutwardMoveMultiplier']
      if newOutwardMoveMultiplier >= self.OutwardMoveMultiplierUI.DefaultMinValue and newOutwardMoveMultiplier <= self.OutwardMoveMultiplierUI.DefaultMaxValue:
        self.OutwardMoveMultiplier = newOutwardMoveMultiplier

      else:
        print("OutwardMoveMultiplier: Invalid value", newOutwardMoveMultiplier, "using default value", self.OutwardMoveMultiplier)


    if 'InwardMoveMultiplier' in jsonData and jsonData['InwardMoveMultiplier'] is not None:
      newInwardMoveMultiplier = jsonData['InwardMoveMultiplier']
      if newInwardMoveMultiplier >= self.InwardMoveMultiplierUI.DefaultMinValue and newInwardMoveMultiplier <= self.InwardMoveMultiplierUI.DefaultMaxValue:
        self.InwardMoveMultiplier = newInwardMoveMultiplier

      else:
        print("InwardMoveMultiplier: Invalid value", newInwardMoveMultiplier, "using default value", self.InwardMoveMultiplier)


    if 'UseHighQualityNormalCalculation' in jsonData and jsonData['UseHighQualityNormalCalculation'] is not None:
      self.UseHighQualityNormalCalculation = jsonData['UseHighQualityNormalCalculation']

    if 'MergeGeometries' in jsonData and jsonData['MergeGeometries'] is not None:
      self.MergeGeometries = jsonData['MergeGeometries']

    if 'KeepUnprocessedSceneMeshes' in jsonData and jsonData['KeepUnprocessedSceneMeshes'] is not None:
      self.KeepUnprocessedSceneMeshes = jsonData['KeepUnprocessedSceneMeshes']

    if 'LockGeometricBorder' in jsonData and jsonData['LockGeometricBorder'] is not None:
      self.LockGeometricBorder = jsonData['LockGeometricBorder']


  def Reset(self):
    self.ReductionTargetTriangleRatioEnabledUI.Reset()
    self.ReductionTargetTriangleRatioUI.Reset()
    self.ReductionTargetTriangleCountEnabledUI.Reset()
    self.ReductionTargetTriangleCountUI.Reset()
    self.ReductionTargetMaxDeviationEnabledUI.Reset()
    self.ReductionTargetMaxDeviationUI.Reset()
    self.ReductionTargetOnScreenSizeEnabledUI.Reset()
    self.ReductionTargetOnScreenSizeUI.Reset()
    self.ReductionTargetStopConditionUI.Reset()
    self.ReductionHeuristicsUI.Reset()
    self.GeometryImportanceUI.Reset()
    self.MaterialImportanceUI.Reset()
    self.TextureImportanceUI.Reset()
    self.ShadingImportanceUI.Reset()
    self.GroupImportanceUI.Reset()
    self.VertexColorImportanceUI.Reset()
    self.EdgeSetImportanceUI.Reset()
    self.SkinningImportanceUI.Reset()
    self.CurvatureImportanceUI.Reset()
    self.CreateGeomorphGeometryUI.Reset()
    self.AllowDegenerateTexCoordsUI.Reset()
    self.KeepSymmetryUI.Reset()
    self.UseAutomaticSymmetryDetectionUI.Reset()
    self.UseSymmetryQuadRetriangulatorUI.Reset()
    self.SymmetryAxisUI.Reset()
    self.SymmetryOffsetUI.Reset()
    self.SymmetryDetectionToleranceUI.Reset()
    self.DataCreationPreferencesUI.Reset()
    self.OutwardMoveMultiplierUI.Reset()
    self.InwardMoveMultiplierUI.Reset()
    self.UseHighQualityNormalCalculationUI.Reset()
    self.MergeGeometriesUI.Reset()
    self.KeepUnprocessedSceneMeshesUI.Reset()
    self.LockGeometricBorderUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.ReductionTargetTriangleRatioEnabledUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetTriangleRatioUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetTriangleCountEnabledUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetTriangleCountUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetMaxDeviationEnabledUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetMaxDeviationUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetOnScreenSizeEnabledUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetOnScreenSizeUI.IsEditEnabled = isEditEnabled
    self.ReductionTargetStopConditionUI.IsEditEnabled = isEditEnabled
    self.ReductionHeuristicsUI.IsEditEnabled = isEditEnabled
    self.GeometryImportanceUI.IsEditEnabled = isEditEnabled
    self.MaterialImportanceUI.IsEditEnabled = isEditEnabled
    self.TextureImportanceUI.IsEditEnabled = isEditEnabled
    self.ShadingImportanceUI.IsEditEnabled = isEditEnabled
    self.GroupImportanceUI.IsEditEnabled = isEditEnabled
    self.VertexColorImportanceUI.IsEditEnabled = isEditEnabled
    self.EdgeSetImportanceUI.IsEditEnabled = isEditEnabled
    self.SkinningImportanceUI.IsEditEnabled = isEditEnabled
    self.CurvatureImportanceUI.IsEditEnabled = isEditEnabled
    self.CreateGeomorphGeometryUI.IsEditEnabled = isEditEnabled
    self.AllowDegenerateTexCoordsUI.IsEditEnabled = isEditEnabled
    self.KeepSymmetryUI.IsEditEnabled = isEditEnabled
    self.UseAutomaticSymmetryDetectionUI.IsEditEnabled = isEditEnabled
    self.UseSymmetryQuadRetriangulatorUI.IsEditEnabled = isEditEnabled
    self.SymmetryAxisUI.IsEditEnabled = isEditEnabled
    self.SymmetryOffsetUI.IsEditEnabled = isEditEnabled
    self.SymmetryDetectionToleranceUI.IsEditEnabled = isEditEnabled
    self.DataCreationPreferencesUI.IsEditEnabled = isEditEnabled
    self.OutwardMoveMultiplierUI.IsEditEnabled = isEditEnabled
    self.InwardMoveMultiplierUI.IsEditEnabled = isEditEnabled
    self.UseHighQualityNormalCalculationUI.IsEditEnabled = isEditEnabled
    self.MergeGeometriesUI.IsEditEnabled = isEditEnabled
    self.KeepUnprocessedSceneMeshesUI.IsEditEnabled = isEditEnabled
    self.LockGeometricBorderUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='ReductionSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='ReductionSettings', emboss=False)

        if self.ReductionTargetTriangleRatioEnabledUI.Visible:
          column.prop(self, 'ReductionTargetTriangleRatioEnabled')

        if self.ReductionTargetTriangleRatioUI.Visible:
          row = column.row()
          row.prop(self, 'ReductionTargetTriangleRatioEnabled', text='ReductionTargetTriangleRatio')
          if self.ReductionTargetTriangleRatioEnabled:
            row.prop(self, 'ReductionTargetTriangleRatio', text='')


        if self.ReductionTargetTriangleCountEnabledUI.Visible:
          column.prop(self, 'ReductionTargetTriangleCountEnabled')

        if self.ReductionTargetTriangleCountUI.Visible:
          row = column.row()
          row.prop(self, 'ReductionTargetTriangleCountEnabled', text='ReductionTargetTriangleCount')
          if self.ReductionTargetTriangleCountEnabled:
            row.prop(self, 'ReductionTargetTriangleCount', text='')


        if self.ReductionTargetMaxDeviationEnabledUI.Visible:
          column.prop(self, 'ReductionTargetMaxDeviationEnabled')

        if self.ReductionTargetMaxDeviationUI.Visible:
          row = column.row()
          row.prop(self, 'ReductionTargetMaxDeviationEnabled', text='ReductionTargetMaxDeviation')
          if self.ReductionTargetMaxDeviationEnabled:
            row.prop(self, 'ReductionTargetMaxDeviation', text='')


        if self.ReductionTargetOnScreenSizeEnabledUI.Visible:
          column.prop(self, 'ReductionTargetOnScreenSizeEnabled')

        if self.ReductionTargetOnScreenSizeUI.Visible:
          row = column.row()
          row.prop(self, 'ReductionTargetOnScreenSizeEnabled', text='ReductionTargetOnScreenSize')
          if self.ReductionTargetOnScreenSizeEnabled:
            row.prop(self, 'ReductionTargetOnScreenSize', text='')


        if self.ReductionTargetStopConditionUI.Visible:
          column.prop(self, 'ReductionTargetStopCondition')

        if self.ReductionHeuristicsUI.Visible:
          column.prop(self, 'ReductionHeuristics')

        if self.GeometryImportanceUI.Visible:
          column.prop(self, 'GeometryImportance')

        if self.MaterialImportanceUI.Visible:
          column.prop(self, 'MaterialImportance')

        if self.TextureImportanceUI.Visible:
          column.prop(self, 'TextureImportance')

        if self.ShadingImportanceUI.Visible:
          column.prop(self, 'ShadingImportance')

        if self.GroupImportanceUI.Visible:
          column.prop(self, 'GroupImportance')

        if self.VertexColorImportanceUI.Visible:
          column.prop(self, 'VertexColorImportance')

        if self.EdgeSetImportanceUI.Visible:
          column.prop(self, 'EdgeSetImportance')

        if self.SkinningImportanceUI.Visible:
          column.prop(self, 'SkinningImportance')

        if self.CurvatureImportanceUI.Visible:
          column.prop(self, 'CurvatureImportance')

        if self.OutwardMoveMultiplierUI.Visible:
          column.prop(self, 'OutwardMoveMultiplier')

        if self.InwardMoveMultiplierUI.Visible:
          column.prop(self, 'InwardMoveMultiplier')

        if self.KeepSymmetryUI.Visible:
          column.prop(self, 'KeepSymmetry')

        if self.UseSymmetryQuadRetriangulatorUI.Visible:
          column.prop(self, 'UseSymmetryQuadRetriangulator')

        if self.UseAutomaticSymmetryDetectionUI.Visible:
          column.prop(self, 'UseAutomaticSymmetryDetection')

        if self.SymmetryDetectionToleranceUI.Visible:
          column.prop(self, 'SymmetryDetectionTolerance')

        if self.SymmetryAxisUI.Visible:
          column.prop(self, 'SymmetryAxis')

        if self.SymmetryOffsetUI.Visible:
          column.prop(self, 'SymmetryOffset')

        if self.CreateGeomorphGeometryUI.Visible:
          column.prop(self, 'CreateGeomorphGeometry')

        if self.DataCreationPreferencesUI.Visible:
          column.prop(self, 'DataCreationPreferences')

        if self.UseHighQualityNormalCalculationUI.Visible:
          column.prop(self, 'UseHighQualityNormalCalculation')

        if self.LockGeometricBorderUI.Visible:
          column.prop(self, 'LockGeometricBorder')

        if self.MergeGeometriesUI.Visible:
          column.prop(self, 'MergeGeometries')

        if self.AllowDegenerateTexCoordsUI.Visible:
          column.prop(self, 'AllowDegenerateTexCoords')

        if self.KeepUnprocessedSceneMeshesUI.Visible:
          column.prop(self, 'KeepUnprocessedSceneMeshes')



    else :
      if self.ReductionTargetTriangleRatioEnabledUI.Visible:
        column.prop(self, 'ReductionTargetTriangleRatioEnabled')

      if self.ReductionTargetTriangleRatioUI.Visible:
        column.prop(self, 'ReductionTargetTriangleRatio')

      if self.ReductionTargetTriangleCountEnabledUI.Visible:
        column.prop(self, 'ReductionTargetTriangleCountEnabled')

      if self.ReductionTargetTriangleCountUI.Visible:
        column.prop(self, 'ReductionTargetTriangleCount')

      if self.ReductionTargetMaxDeviationEnabledUI.Visible:
        column.prop(self, 'ReductionTargetMaxDeviationEnabled')

      if self.ReductionTargetMaxDeviationUI.Visible:
        column.prop(self, 'ReductionTargetMaxDeviation')

      if self.ReductionTargetOnScreenSizeEnabledUI.Visible:
        column.prop(self, 'ReductionTargetOnScreenSizeEnabled')

      if self.ReductionTargetOnScreenSizeUI.Visible:
        column.prop(self, 'ReductionTargetOnScreenSize')

      if self.ReductionTargetStopConditionUI.Visible:
        column.prop(self, 'ReductionTargetStopCondition')

      if self.ReductionHeuristicsUI.Visible:
        column.prop(self, 'ReductionHeuristics')

      if self.GeometryImportanceUI.Visible:
        column.prop(self, 'GeometryImportance')

      if self.MaterialImportanceUI.Visible:
        column.prop(self, 'MaterialImportance')

      if self.TextureImportanceUI.Visible:
        column.prop(self, 'TextureImportance')

      if self.ShadingImportanceUI.Visible:
        column.prop(self, 'ShadingImportance')

      if self.GroupImportanceUI.Visible:
        column.prop(self, 'GroupImportance')

      if self.VertexColorImportanceUI.Visible:
        column.prop(self, 'VertexColorImportance')

      if self.EdgeSetImportanceUI.Visible:
        column.prop(self, 'EdgeSetImportance')

      if self.SkinningImportanceUI.Visible:
        column.prop(self, 'SkinningImportance')

      if self.CurvatureImportanceUI.Visible:
        column.prop(self, 'CurvatureImportance')

      if self.OutwardMoveMultiplierUI.Visible:
        column.prop(self, 'OutwardMoveMultiplier')

      if self.InwardMoveMultiplierUI.Visible:
        column.prop(self, 'InwardMoveMultiplier')

      if self.KeepSymmetryUI.Visible:
        column.prop(self, 'KeepSymmetry')

      if self.UseSymmetryQuadRetriangulatorUI.Visible:
        column.prop(self, 'UseSymmetryQuadRetriangulator')

      if self.UseAutomaticSymmetryDetectionUI.Visible:
        column.prop(self, 'UseAutomaticSymmetryDetection')

      if self.SymmetryDetectionToleranceUI.Visible:
        column.prop(self, 'SymmetryDetectionTolerance')

      if self.SymmetryAxisUI.Visible:
        column.prop(self, 'SymmetryAxis')

      if self.SymmetryOffsetUI.Visible:
        column.prop(self, 'SymmetryOffset')

      if self.CreateGeomorphGeometryUI.Visible:
        column.prop(self, 'CreateGeomorphGeometry')

      if self.DataCreationPreferencesUI.Visible:
        column.prop(self, 'DataCreationPreferences')

      if self.UseHighQualityNormalCalculationUI.Visible:
        column.prop(self, 'UseHighQualityNormalCalculation')

      if self.LockGeometricBorderUI.Visible:
        column.prop(self, 'LockGeometricBorder')

      if self.MergeGeometriesUI.Visible:
        column.prop(self, 'MergeGeometries')

      if self.AllowDegenerateTexCoordsUI.Visible:
        column.prop(self, 'AllowDegenerateTexCoords')

      if self.KeepUnprocessedSceneMeshesUI.Visible:
        column.prop(self, 'KeepUnprocessedSceneMeshes')




class SimplygonRepairSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseTJunctionRemoverUI.Visible: return True
    if self.TJuncDistUI.Visible: return True
    if self.WeldDistUI.Visible: return True
    if self.WeldOnlyBorderVerticesUI.Visible: return True
    if self.WeldOnlyWithinMaterialUI.Visible: return True
    if self.WeldOnlyWithinSceneNodeUI.Visible: return True
    if self.WeldOnlyBetweenSceneNodesUI.Visible: return True
    if self.UseWeldingUI.Visible: return True
    if self.ProgressivePassesUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseTJunctionRemoverUI(self):
    index = bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List[index]

    return None

  UseTJunctionRemover: bpy.props.BoolProperty(default=True,description='If set, t-junctions will be removed. If enabled, it also requires UseWelding to be on.')
  class SimplygonUseTJunctionRemoverEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseTJunctionRemover

    @Value.setter
    def Value(self, value):
      self.Parent.UseTJunctionRemover = value
      self.Parent.TJuncDistUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TJuncDistUI(self):
    index = bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List[index]

    return None

  TJuncDist: bpy.props.FloatProperty(default=0,min=0,max=10,description='The T-Junction distance, below which, the T-Junctions will be welded.')
  class SimplygonTJuncDistEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TJuncDist

    @Value.setter
    def Value(self, value):
      self.Parent.TJuncDist = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.UseTJunctionRemoverUI is not None:
        return self.Parent.UseTJunctionRemover and self.Parent.UseTJunctionRemoverUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TJuncDist: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TJuncDist: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def WeldDistUI(self):
    index = bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List[index]

    return None

  WeldDist: bpy.props.FloatProperty(default=0,min=0,max=10,description='The welding distance below which the vertices will be welded.')
  class SimplygonWeldDistEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeldDist

    @Value.setter
    def Value(self, value):
      self.Parent.WeldDist = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.UseWeldingUI is not None:
        return self.Parent.UseWelding and self.Parent.UseWeldingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("WeldDist: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("WeldDist: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def WeldOnlyBorderVerticesUI(self):
    index = bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List[index]

    return None

  WeldOnlyBorderVertices: bpy.props.BoolProperty(default=False,description='If set, only vertices that are on the border (as reported by the VertexBorder boolean field) are considered for the welding.')
  class SimplygonWeldOnlyBorderVerticesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeldOnlyBorderVertices

    @Value.setter
    def Value(self, value):
      self.Parent.WeldOnlyBorderVertices = value

    @property
    def Visible(self):
      if self.Parent.UseWeldingUI is not None:
        return self.Parent.UseWelding and self.Parent.UseWeldingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeldOnlyWithinMaterialUI(self):
    index = bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List[index]

    return None

  WeldOnlyWithinMaterial: bpy.props.BoolProperty(default=False,description='If set, only vertices that are within the same material are welded. Vertices on material borders are locked.')
  class SimplygonWeldOnlyWithinMaterialEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeldOnlyWithinMaterial

    @Value.setter
    def Value(self, value):
      self.Parent.WeldOnlyWithinMaterial = value

    @property
    def Visible(self):
      if self.Parent.UseWeldingUI is not None:
        return self.Parent.UseWelding and self.Parent.UseWeldingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeldOnlyWithinSceneNodeUI(self):
    index = bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List[index]

    return None

  WeldOnlyWithinSceneNode: bpy.props.BoolProperty(default=False,description='If set, only vertices that are within the same scene node are welded.')
  class SimplygonWeldOnlyWithinSceneNodeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeldOnlyWithinSceneNode

    @Value.setter
    def Value(self, value):
      self.Parent.WeldOnlyWithinSceneNode = value

    @property
    def Visible(self):
      if self.Parent.UseWeldingUI is not None:
        return self.Parent.UseWelding and self.Parent.UseWeldingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeldOnlyBetweenSceneNodesUI(self):
    index = bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List[index]

    return None

  WeldOnlyBetweenSceneNodes: bpy.props.BoolProperty(default=False,description='If set, only vertices that belong to different scene nodes are considered for the welding. Affects both welder and t-junction remover.')
  class SimplygonWeldOnlyBetweenSceneNodesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeldOnlyBetweenSceneNodes

    @Value.setter
    def Value(self, value):
      self.Parent.WeldOnlyBetweenSceneNodes = value

    @property
    def Visible(self):
      if self.Parent.UseWeldingUI is not None:
        return self.Parent.UseWelding and self.Parent.UseWeldingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseWeldingUI(self):
    index = bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List[index]

    return None

  UseWelding: bpy.props.BoolProperty(default=True,description='If set, vertices within each others welding distance will be welded together.')
  class SimplygonUseWeldingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseWelding

    @Value.setter
    def Value(self, value):
      self.Parent.UseWelding = value
      self.Parent.WeldDistUI.Visible = Visible
      self.Parent.WeldOnlyBorderVerticesUI.Visible = Visible
      self.Parent.WeldOnlyWithinMaterialUI.Visible = Visible
      self.Parent.WeldOnlyWithinSceneNodeUI.Visible = Visible
      self.Parent.WeldOnlyBetweenSceneNodesUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ProgressivePassesUI(self):
    index = bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List[index]

    return None

  ProgressivePasses: bpy.props.IntProperty(default=3,min=1,max=10,description='The number of progressive passes. Minimum is 1, but higher numbers give a better quality, at the expense of longer running time.')
  class SimplygonProgressivePassesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ProgressivePasses

    @Value.setter
    def Value(self, value):
      self.Parent.ProgressivePasses = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 1
      self.MaxValue = 10
      self.DefaultMinValue = 1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 1
      self.DefaultMinValue = 1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ProgressivePasses: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ProgressivePasses: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'RepairSettings'
    UseTJunctionRemoverUI = bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.add()
    UseTJunctionRemoverUI.Init(self.name)
    UseTJunctionRemoverUI.name = self.name
    TJuncDistUI = bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.add()
    TJuncDistUI.Init(self.name)
    TJuncDistUI.name = self.name
    UseWeldingUI = bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.add()
    UseWeldingUI.Init(self.name)
    UseWeldingUI.name = self.name
    WeldOnlyBorderVerticesUI = bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.add()
    WeldOnlyBorderVerticesUI.Init(self.name)
    WeldOnlyBorderVerticesUI.name = self.name
    WeldOnlyWithinMaterialUI = bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.add()
    WeldOnlyWithinMaterialUI.Init(self.name)
    WeldOnlyWithinMaterialUI.name = self.name
    WeldOnlyWithinSceneNodeUI = bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.add()
    WeldOnlyWithinSceneNodeUI.Init(self.name)
    WeldOnlyWithinSceneNodeUI.name = self.name
    WeldOnlyBetweenSceneNodesUI = bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.add()
    WeldOnlyBetweenSceneNodesUI.Init(self.name)
    WeldOnlyBetweenSceneNodesUI.name = self.name
    WeldDistUI = bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.add()
    WeldDistUI.Init(self.name)
    WeldDistUI.name = self.name
    ProgressivePassesUI = bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.add()
    ProgressivePassesUI.Init(self.name)
    ProgressivePassesUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'RepairSettings'
    UseTJunctionRemoverUI = bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.add()
    UseTJunctionRemoverUI.InitJson(self.name, jsonData['UseTJunctionRemoverUI'] if jsonData is not None and 'UseTJunctionRemoverUI' in jsonData else None)
    UseTJunctionRemoverUI.name = self.name
    TJuncDistUI = bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.add()
    TJuncDistUI.InitJson(self.name, jsonData['TJuncDistUI'] if jsonData is not None and 'TJuncDistUI' in jsonData else None)
    TJuncDistUI.name = self.name
    UseWeldingUI = bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.add()
    UseWeldingUI.InitJson(self.name, jsonData['UseWeldingUI'] if jsonData is not None and 'UseWeldingUI' in jsonData else None)
    UseWeldingUI.name = self.name
    WeldOnlyBorderVerticesUI = bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.add()
    WeldOnlyBorderVerticesUI.InitJson(self.name, jsonData['WeldOnlyBorderVerticesUI'] if jsonData is not None and 'WeldOnlyBorderVerticesUI' in jsonData else None)
    WeldOnlyBorderVerticesUI.name = self.name
    WeldOnlyWithinMaterialUI = bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.add()
    WeldOnlyWithinMaterialUI.InitJson(self.name, jsonData['WeldOnlyWithinMaterialUI'] if jsonData is not None and 'WeldOnlyWithinMaterialUI' in jsonData else None)
    WeldOnlyWithinMaterialUI.name = self.name
    WeldOnlyWithinSceneNodeUI = bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.add()
    WeldOnlyWithinSceneNodeUI.InitJson(self.name, jsonData['WeldOnlyWithinSceneNodeUI'] if jsonData is not None and 'WeldOnlyWithinSceneNodeUI' in jsonData else None)
    WeldOnlyWithinSceneNodeUI.name = self.name
    WeldOnlyBetweenSceneNodesUI = bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.add()
    WeldOnlyBetweenSceneNodesUI.InitJson(self.name, jsonData['WeldOnlyBetweenSceneNodesUI'] if jsonData is not None and 'WeldOnlyBetweenSceneNodesUI' in jsonData else None)
    WeldOnlyBetweenSceneNodesUI.name = self.name
    WeldDistUI = bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.add()
    WeldDistUI.InitJson(self.name, jsonData['WeldDistUI'] if jsonData is not None and 'WeldDistUI' in jsonData else None)
    WeldDistUI.name = self.name
    ProgressivePassesUI = bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.add()
    ProgressivePassesUI.InitJson(self.name, jsonData['ProgressivePassesUI'] if jsonData is not None and 'ProgressivePassesUI' in jsonData else None)
    ProgressivePassesUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseTJunctionRemoverUI_index = bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.find(self.name)
    bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.remove(UseTJunctionRemoverUI_index)
    TJuncDistUI_index = bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.find(self.name)
    bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.remove(TJuncDistUI_index)
    UseWeldingUI_index = bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.find(self.name)
    bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.remove(UseWeldingUI_index)
    WeldOnlyBorderVerticesUI_index = bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.find(self.name)
    bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.remove(WeldOnlyBorderVerticesUI_index)
    WeldOnlyWithinMaterialUI_index = bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.find(self.name)
    bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.remove(WeldOnlyWithinMaterialUI_index)
    WeldOnlyWithinSceneNodeUI_index = bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.find(self.name)
    bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.remove(WeldOnlyWithinSceneNodeUI_index)
    WeldOnlyBetweenSceneNodesUI_index = bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.find(self.name)
    bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.remove(WeldOnlyBetweenSceneNodesUI_index)
    WeldDistUI_index = bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.find(self.name)
    bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.remove(WeldDistUI_index)
    ProgressivePassesUI_index = bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.find(self.name)
    bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.remove(ProgressivePassesUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseTJunctionRemover'] = self.UseTJunctionRemover
    if serializeUIComponents:
      jsonData['UseTJunctionRemoverUI'] = self.UseTJunctionRemoverUI.SaveJson()

    jsonData['TJuncDist'] = self.TJuncDist
    if serializeUIComponents:
      jsonData['TJuncDistUI'] = self.TJuncDistUI.SaveJson()

    jsonData['WeldDist'] = self.WeldDist
    if serializeUIComponents:
      jsonData['WeldDistUI'] = self.WeldDistUI.SaveJson()

    jsonData['WeldOnlyBorderVertices'] = self.WeldOnlyBorderVertices
    if serializeUIComponents:
      jsonData['WeldOnlyBorderVerticesUI'] = self.WeldOnlyBorderVerticesUI.SaveJson()

    jsonData['WeldOnlyWithinMaterial'] = self.WeldOnlyWithinMaterial
    if serializeUIComponents:
      jsonData['WeldOnlyWithinMaterialUI'] = self.WeldOnlyWithinMaterialUI.SaveJson()

    jsonData['WeldOnlyWithinSceneNode'] = self.WeldOnlyWithinSceneNode
    if serializeUIComponents:
      jsonData['WeldOnlyWithinSceneNodeUI'] = self.WeldOnlyWithinSceneNodeUI.SaveJson()

    jsonData['WeldOnlyBetweenSceneNodes'] = self.WeldOnlyBetweenSceneNodes
    if serializeUIComponents:
      jsonData['WeldOnlyBetweenSceneNodesUI'] = self.WeldOnlyBetweenSceneNodesUI.SaveJson()

    jsonData['UseWelding'] = self.UseWelding
    if serializeUIComponents:
      jsonData['UseWeldingUI'] = self.UseWeldingUI.SaveJson()

    jsonData['ProgressivePasses'] = self.ProgressivePasses
    if serializeUIComponents:
      jsonData['ProgressivePassesUI'] = self.ProgressivePassesUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseTJunctionRemover' in jsonData and jsonData['UseTJunctionRemover'] is not None:
      self.UseTJunctionRemover = jsonData['UseTJunctionRemover']

    if 'TJuncDist' in jsonData and jsonData['TJuncDist'] is not None:
      newTJuncDist = jsonData['TJuncDist']
      if newTJuncDist >= self.TJuncDistUI.DefaultMinValue and newTJuncDist <= self.TJuncDistUI.DefaultMaxValue:
        self.TJuncDist = newTJuncDist

      else:
        print("TJuncDist: Invalid value", newTJuncDist, "using default value", self.TJuncDist)


    if 'WeldDist' in jsonData and jsonData['WeldDist'] is not None:
      newWeldDist = jsonData['WeldDist']
      if newWeldDist >= self.WeldDistUI.DefaultMinValue and newWeldDist <= self.WeldDistUI.DefaultMaxValue:
        self.WeldDist = newWeldDist

      else:
        print("WeldDist: Invalid value", newWeldDist, "using default value", self.WeldDist)


    if 'WeldOnlyBorderVertices' in jsonData and jsonData['WeldOnlyBorderVertices'] is not None:
      self.WeldOnlyBorderVertices = jsonData['WeldOnlyBorderVertices']

    if 'WeldOnlyWithinMaterial' in jsonData and jsonData['WeldOnlyWithinMaterial'] is not None:
      self.WeldOnlyWithinMaterial = jsonData['WeldOnlyWithinMaterial']

    if 'WeldOnlyWithinSceneNode' in jsonData and jsonData['WeldOnlyWithinSceneNode'] is not None:
      self.WeldOnlyWithinSceneNode = jsonData['WeldOnlyWithinSceneNode']

    if 'WeldOnlyBetweenSceneNodes' in jsonData and jsonData['WeldOnlyBetweenSceneNodes'] is not None:
      self.WeldOnlyBetweenSceneNodes = jsonData['WeldOnlyBetweenSceneNodes']

    if 'UseWelding' in jsonData and jsonData['UseWelding'] is not None:
      self.UseWelding = jsonData['UseWelding']

    if 'ProgressivePasses' in jsonData and jsonData['ProgressivePasses'] is not None:
      newProgressivePasses = jsonData['ProgressivePasses']
      if newProgressivePasses >= self.ProgressivePassesUI.DefaultMinValue and newProgressivePasses <= self.ProgressivePassesUI.DefaultMaxValue:
        self.ProgressivePasses = newProgressivePasses

      else:
        print("ProgressivePasses: Invalid value", newProgressivePasses, "using default value", self.ProgressivePasses)



  def Reset(self):
    self.UseTJunctionRemoverUI.Reset()
    self.TJuncDistUI.Reset()
    self.WeldDistUI.Reset()
    self.WeldOnlyBorderVerticesUI.Reset()
    self.WeldOnlyWithinMaterialUI.Reset()
    self.WeldOnlyWithinSceneNodeUI.Reset()
    self.WeldOnlyBetweenSceneNodesUI.Reset()
    self.UseWeldingUI.Reset()
    self.ProgressivePassesUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseTJunctionRemoverUI.IsEditEnabled = isEditEnabled
    self.TJuncDistUI.IsEditEnabled = isEditEnabled
    self.WeldDistUI.IsEditEnabled = isEditEnabled
    self.WeldOnlyBorderVerticesUI.IsEditEnabled = isEditEnabled
    self.WeldOnlyWithinMaterialUI.IsEditEnabled = isEditEnabled
    self.WeldOnlyWithinSceneNodeUI.IsEditEnabled = isEditEnabled
    self.WeldOnlyBetweenSceneNodesUI.IsEditEnabled = isEditEnabled
    self.UseWeldingUI.IsEditEnabled = isEditEnabled
    self.ProgressivePassesUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='RepairSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='RepairSettings', emboss=False)

        if self.UseTJunctionRemoverUI.Visible:
          column.prop(self, 'UseTJunctionRemover')

        if self.TJuncDistUI.Visible:
          column.prop(self, 'TJuncDist')

        if self.UseWeldingUI.Visible:
          column.prop(self, 'UseWelding')

        if self.WeldOnlyBorderVerticesUI.Visible:
          column.prop(self, 'WeldOnlyBorderVertices')

        if self.WeldOnlyWithinMaterialUI.Visible:
          column.prop(self, 'WeldOnlyWithinMaterial')

        if self.WeldOnlyWithinSceneNodeUI.Visible:
          column.prop(self, 'WeldOnlyWithinSceneNode')

        if self.WeldOnlyBetweenSceneNodesUI.Visible:
          column.prop(self, 'WeldOnlyBetweenSceneNodes')

        if self.WeldDistUI.Visible:
          column.prop(self, 'WeldDist')

        if self.ProgressivePassesUI.Visible:
          column.prop(self, 'ProgressivePasses')



    else :
      if self.UseTJunctionRemoverUI.Visible:
        column.prop(self, 'UseTJunctionRemover')

      if self.TJuncDistUI.Visible:
        column.prop(self, 'TJuncDist')

      if self.UseWeldingUI.Visible:
        column.prop(self, 'UseWelding')

      if self.WeldOnlyBorderVerticesUI.Visible:
        column.prop(self, 'WeldOnlyBorderVertices')

      if self.WeldOnlyWithinMaterialUI.Visible:
        column.prop(self, 'WeldOnlyWithinMaterial')

      if self.WeldOnlyWithinSceneNodeUI.Visible:
        column.prop(self, 'WeldOnlyWithinSceneNode')

      if self.WeldOnlyBetweenSceneNodesUI.Visible:
        column.prop(self, 'WeldOnlyBetweenSceneNodes')

      if self.WeldDistUI.Visible:
        column.prop(self, 'WeldDist')

      if self.ProgressivePassesUI.Visible:
        column.prop(self, 'ProgressivePasses')




class SimplygonNormalCalculationSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.ReplaceNormalsUI.Visible: return True
    if self.ReplaceTangentsUI.Visible: return True
    if self.HardEdgeAngleUI.Visible: return True
    if self.RepairInvalidNormalsUI.Visible: return True
    if self.ReorthogonalizeTangentSpaceUI.Visible: return True
    if self.ScaleByAreaUI.Visible: return True
    if self.ScaleByAngleUI.Visible: return True
    if self.SnapNormalsToFlatSurfacesUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def ReplaceNormalsUI(self):
    index = bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List[index]

    return None

  ReplaceNormals: bpy.props.BoolProperty(default=False,description='If set, it will generate new normals for the Geometry, and if not set, it will keep the normals from the original normal set (or not add normals at all if none were present). Please note that if the original geometry contains normals, the normal repairer will replace invalid normals even if ReplaceNormals is set to false.')
  class SimplygonReplaceNormalsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReplaceNormals

    @Value.setter
    def Value(self, value):
      self.Parent.ReplaceNormals = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReplaceTangentsUI(self):
    index = bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List[index]

    return None

  ReplaceTangents: bpy.props.BoolProperty(default=False,description='If set, it will generate new tangents and bitangents for the Geometry, and if not set, it will keep the new tangents and bitangents from the original normal set (or not add tangents and bitangents at all if none were present).')
  class SimplygonReplaceTangentsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReplaceTangents

    @Value.setter
    def Value(self, value):
      self.Parent.ReplaceTangents = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def HardEdgeAngleUI(self):
    index = bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List[index]

    return None

  HardEdgeAngle: bpy.props.FloatProperty(default=75,min=0,max=180,description='Set HardEdgeAngle in degrees. If the angle between two triangles are above this value, the normals will not be smooth over the edge between those two triangles.')
  class SimplygonHardEdgeAngleEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.HardEdgeAngle

    @Value.setter
    def Value(self, value):
      self.Parent.HardEdgeAngle = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 180
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 180
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("HardEdgeAngle: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 180
      self.DefaultMaxValue = 180
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("HardEdgeAngle: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def RepairInvalidNormalsUI(self):
    index = bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List[index]

    return None

  RepairInvalidNormals: bpy.props.BoolProperty(default=False,description='If set, normals that are invalid will be replaced. All others are left intact. Bad normals are those that are either zero length, or simply points away from the surface.')
  class SimplygonRepairInvalidNormalsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RepairInvalidNormals

    @Value.setter
    def Value(self, value):
      self.Parent.RepairInvalidNormals = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ReorthogonalizeTangentSpaceUI(self):
    index = bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List[index]

    return None

  ReorthogonalizeTangentSpace: bpy.props.BoolProperty(default=True,description='If set, the tangentspaces already existing in the scene will be readjusted so that the tangent and binormal are both orthogonal to the normal. Will be needed since most of the time the normals are changed in the reduction process.')
  class SimplygonReorthogonalizeTangentSpaceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ReorthogonalizeTangentSpace

    @Value.setter
    def Value(self, value):
      self.Parent.ReorthogonalizeTangentSpace = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ScaleByAreaUI(self):
    index = bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List[index]

    return None

  ScaleByArea: bpy.props.BoolProperty(default=True,description='If set, the influence of a triangle normal upon the vertex normals is scaled by the area of the triangle.')
  class SimplygonScaleByAreaEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ScaleByArea

    @Value.setter
    def Value(self, value):
      self.Parent.ScaleByArea = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ScaleByAngleUI(self):
    index = bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List[index]

    return None

  ScaleByAngle: bpy.props.BoolProperty(default=True,description='If set, the influence of a triangle normal upon the vertex normals is scaled by the angle of the corner at the vertex.')
  class SimplygonScaleByAngleEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ScaleByAngle

    @Value.setter
    def Value(self, value):
      self.Parent.ScaleByAngle = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SnapNormalsToFlatSurfacesUI(self):
    index = bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List[index]

    return None

  SnapNormalsToFlatSurfaces: bpy.props.BoolProperty(default=False,description='If set, perfectly flat shaded surfaces will be created, where possible. Normals adjacent to perfectly geometrically flat surfaces will be recalculated to have the same direction as for those of the adjacent flat surface.')
  class SimplygonSnapNormalsToFlatSurfacesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SnapNormalsToFlatSurfaces

    @Value.setter
    def Value(self, value):
      self.Parent.SnapNormalsToFlatSurfaces = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'NormalCalculationSettings'
    ReplaceNormalsUI = bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.add()
    ReplaceNormalsUI.Init(self.name)
    ReplaceNormalsUI.name = self.name
    RepairInvalidNormalsUI = bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.add()
    RepairInvalidNormalsUI.Init(self.name)
    RepairInvalidNormalsUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    ReplaceTangentsUI = bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.add()
    ReplaceTangentsUI.Init(self.name)
    ReplaceTangentsUI.name = self.name
    ReorthogonalizeTangentSpaceUI = bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.add()
    ReorthogonalizeTangentSpaceUI.Init(self.name)
    ReorthogonalizeTangentSpaceUI.name = self.name
    ScaleByAreaUI = bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.add()
    ScaleByAreaUI.Init(self.name)
    ScaleByAreaUI.name = self.name
    ScaleByAngleUI = bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.add()
    ScaleByAngleUI.Init(self.name)
    ScaleByAngleUI.name = self.name
    SnapNormalsToFlatSurfacesUI = bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.add()
    SnapNormalsToFlatSurfacesUI.Init(self.name)
    SnapNormalsToFlatSurfacesUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'NormalCalculationSettings'
    ReplaceNormalsUI = bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.add()
    ReplaceNormalsUI.InitJson(self.name, jsonData['ReplaceNormalsUI'] if jsonData is not None and 'ReplaceNormalsUI' in jsonData else None)
    ReplaceNormalsUI.name = self.name
    RepairInvalidNormalsUI = bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.add()
    RepairInvalidNormalsUI.InitJson(self.name, jsonData['RepairInvalidNormalsUI'] if jsonData is not None and 'RepairInvalidNormalsUI' in jsonData else None)
    RepairInvalidNormalsUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.add()
    HardEdgeAngleUI.InitJson(self.name, jsonData['HardEdgeAngleUI'] if jsonData is not None and 'HardEdgeAngleUI' in jsonData else None)
    HardEdgeAngleUI.name = self.name
    ReplaceTangentsUI = bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.add()
    ReplaceTangentsUI.InitJson(self.name, jsonData['ReplaceTangentsUI'] if jsonData is not None and 'ReplaceTangentsUI' in jsonData else None)
    ReplaceTangentsUI.name = self.name
    ReorthogonalizeTangentSpaceUI = bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.add()
    ReorthogonalizeTangentSpaceUI.InitJson(self.name, jsonData['ReorthogonalizeTangentSpaceUI'] if jsonData is not None and 'ReorthogonalizeTangentSpaceUI' in jsonData else None)
    ReorthogonalizeTangentSpaceUI.name = self.name
    ScaleByAreaUI = bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.add()
    ScaleByAreaUI.InitJson(self.name, jsonData['ScaleByAreaUI'] if jsonData is not None and 'ScaleByAreaUI' in jsonData else None)
    ScaleByAreaUI.name = self.name
    ScaleByAngleUI = bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.add()
    ScaleByAngleUI.InitJson(self.name, jsonData['ScaleByAngleUI'] if jsonData is not None and 'ScaleByAngleUI' in jsonData else None)
    ScaleByAngleUI.name = self.name
    SnapNormalsToFlatSurfacesUI = bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.add()
    SnapNormalsToFlatSurfacesUI.InitJson(self.name, jsonData['SnapNormalsToFlatSurfacesUI'] if jsonData is not None and 'SnapNormalsToFlatSurfacesUI' in jsonData else None)
    SnapNormalsToFlatSurfacesUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    ReplaceNormalsUI_index = bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.find(self.name)
    bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.remove(ReplaceNormalsUI_index)
    RepairInvalidNormalsUI_index = bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.find(self.name)
    bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.remove(RepairInvalidNormalsUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.find(self.name)
    bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.remove(HardEdgeAngleUI_index)
    ReplaceTangentsUI_index = bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.find(self.name)
    bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.remove(ReplaceTangentsUI_index)
    ReorthogonalizeTangentSpaceUI_index = bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.find(self.name)
    bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.remove(ReorthogonalizeTangentSpaceUI_index)
    ScaleByAreaUI_index = bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.find(self.name)
    bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.remove(ScaleByAreaUI_index)
    ScaleByAngleUI_index = bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.find(self.name)
    bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.remove(ScaleByAngleUI_index)
    SnapNormalsToFlatSurfacesUI_index = bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.find(self.name)
    bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.remove(SnapNormalsToFlatSurfacesUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['ReplaceNormals'] = self.ReplaceNormals
    if serializeUIComponents:
      jsonData['ReplaceNormalsUI'] = self.ReplaceNormalsUI.SaveJson()

    jsonData['ReplaceTangents'] = self.ReplaceTangents
    if serializeUIComponents:
      jsonData['ReplaceTangentsUI'] = self.ReplaceTangentsUI.SaveJson()

    jsonData['HardEdgeAngle'] = self.HardEdgeAngle
    if serializeUIComponents:
      jsonData['HardEdgeAngleUI'] = self.HardEdgeAngleUI.SaveJson()

    jsonData['RepairInvalidNormals'] = self.RepairInvalidNormals
    if serializeUIComponents:
      jsonData['RepairInvalidNormalsUI'] = self.RepairInvalidNormalsUI.SaveJson()

    jsonData['ReorthogonalizeTangentSpace'] = self.ReorthogonalizeTangentSpace
    if serializeUIComponents:
      jsonData['ReorthogonalizeTangentSpaceUI'] = self.ReorthogonalizeTangentSpaceUI.SaveJson()

    jsonData['ScaleByArea'] = self.ScaleByArea
    if serializeUIComponents:
      jsonData['ScaleByAreaUI'] = self.ScaleByAreaUI.SaveJson()

    jsonData['ScaleByAngle'] = self.ScaleByAngle
    if serializeUIComponents:
      jsonData['ScaleByAngleUI'] = self.ScaleByAngleUI.SaveJson()

    jsonData['SnapNormalsToFlatSurfaces'] = self.SnapNormalsToFlatSurfaces
    if serializeUIComponents:
      jsonData['SnapNormalsToFlatSurfacesUI'] = self.SnapNormalsToFlatSurfacesUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'ReplaceNormals' in jsonData and jsonData['ReplaceNormals'] is not None:
      self.ReplaceNormals = jsonData['ReplaceNormals']

    if 'ReplaceTangents' in jsonData and jsonData['ReplaceTangents'] is not None:
      self.ReplaceTangents = jsonData['ReplaceTangents']

    if 'HardEdgeAngle' in jsonData and jsonData['HardEdgeAngle'] is not None:
      newHardEdgeAngle = jsonData['HardEdgeAngle']
      if newHardEdgeAngle >= self.HardEdgeAngleUI.DefaultMinValue and newHardEdgeAngle <= self.HardEdgeAngleUI.DefaultMaxValue:
        self.HardEdgeAngle = newHardEdgeAngle

      else:
        print("HardEdgeAngle: Invalid value", newHardEdgeAngle, "using default value", self.HardEdgeAngle)


    if 'RepairInvalidNormals' in jsonData and jsonData['RepairInvalidNormals'] is not None:
      self.RepairInvalidNormals = jsonData['RepairInvalidNormals']

    if 'ReorthogonalizeTangentSpace' in jsonData and jsonData['ReorthogonalizeTangentSpace'] is not None:
      self.ReorthogonalizeTangentSpace = jsonData['ReorthogonalizeTangentSpace']

    if 'ScaleByArea' in jsonData and jsonData['ScaleByArea'] is not None:
      self.ScaleByArea = jsonData['ScaleByArea']

    if 'ScaleByAngle' in jsonData and jsonData['ScaleByAngle'] is not None:
      self.ScaleByAngle = jsonData['ScaleByAngle']

    if 'SnapNormalsToFlatSurfaces' in jsonData and jsonData['SnapNormalsToFlatSurfaces'] is not None:
      self.SnapNormalsToFlatSurfaces = jsonData['SnapNormalsToFlatSurfaces']


  def Reset(self):
    self.ReplaceNormalsUI.Reset()
    self.ReplaceTangentsUI.Reset()
    self.HardEdgeAngleUI.Reset()
    self.RepairInvalidNormalsUI.Reset()
    self.ReorthogonalizeTangentSpaceUI.Reset()
    self.ScaleByAreaUI.Reset()
    self.ScaleByAngleUI.Reset()
    self.SnapNormalsToFlatSurfacesUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.ReplaceNormalsUI.IsEditEnabled = isEditEnabled
    self.ReplaceTangentsUI.IsEditEnabled = isEditEnabled
    self.HardEdgeAngleUI.IsEditEnabled = isEditEnabled
    self.RepairInvalidNormalsUI.IsEditEnabled = isEditEnabled
    self.ReorthogonalizeTangentSpaceUI.IsEditEnabled = isEditEnabled
    self.ScaleByAreaUI.IsEditEnabled = isEditEnabled
    self.ScaleByAngleUI.IsEditEnabled = isEditEnabled
    self.SnapNormalsToFlatSurfacesUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='NormalCalculationSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='NormalCalculationSettings', emboss=False)

        if self.ReplaceNormalsUI.Visible:
          column.prop(self, 'ReplaceNormals')

        if self.RepairInvalidNormalsUI.Visible:
          column.prop(self, 'RepairInvalidNormals')

        if self.HardEdgeAngleUI.Visible:
          column.prop(self, 'HardEdgeAngle')

        if self.ReplaceTangentsUI.Visible:
          column.prop(self, 'ReplaceTangents')

        if self.ReorthogonalizeTangentSpaceUI.Visible:
          column.prop(self, 'ReorthogonalizeTangentSpace')

        if self.ScaleByAreaUI.Visible:
          column.prop(self, 'ScaleByArea')

        if self.ScaleByAngleUI.Visible:
          column.prop(self, 'ScaleByAngle')

        if self.SnapNormalsToFlatSurfacesUI.Visible:
          column.prop(self, 'SnapNormalsToFlatSurfaces')



    else :
      if self.ReplaceNormalsUI.Visible:
        column.prop(self, 'ReplaceNormals')

      if self.RepairInvalidNormalsUI.Visible:
        column.prop(self, 'RepairInvalidNormals')

      if self.HardEdgeAngleUI.Visible:
        column.prop(self, 'HardEdgeAngle')

      if self.ReplaceTangentsUI.Visible:
        column.prop(self, 'ReplaceTangents')

      if self.ReorthogonalizeTangentSpaceUI.Visible:
        column.prop(self, 'ReorthogonalizeTangentSpace')

      if self.ScaleByAreaUI.Visible:
        column.prop(self, 'ScaleByArea')

      if self.ScaleByAngleUI.Visible:
        column.prop(self, 'ScaleByAngle')

      if self.SnapNormalsToFlatSurfacesUI.Visible:
        column.prop(self, 'SnapNormalsToFlatSurfaces')




class SimplygonVisibilitySettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseVisibilityWeightsInReducerUI.Visible: return True
    if self.UseVisibilityWeightsInTexcoordGeneratorUI.Visible: return True
    if self.VisibilityWeightsPowerUI.Visible: return True
    if self.CullOccludedGeometryUI.Visible: return True
    if self.ForceVisibilityCalculationUI.Visible: return True
    if self.UseBackfaceCullingUI.Visible: return True
    if self.CameraSelectionSetNameUI.Visible: return True
    if self.OccluderSelectionSetNameUI.Visible: return True
    if self.FillNonVisibleAreaThresholdUI.Visible: return True
    if self.RemoveTrianglesNotOccludingOtherTrianglesUI.Visible: return True
    if self.ConservativeModeUI.Visible: return True
    if self.ComputeVisibilityModeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseVisibilityWeightsInReducerUI(self):
    index = bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List[index]

    return None

  UseVisibilityWeightsInReducer: bpy.props.BoolProperty(default=False,description='If set to true, visibility weights will be used in the reducer.')
  class SimplygonUseVisibilityWeightsInReducerEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseVisibilityWeightsInReducer

    @Value.setter
    def Value(self, value):
      self.Parent.UseVisibilityWeightsInReducer = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseVisibilityWeightsInTexcoordGeneratorUI(self):
    index = bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List[index]

    return None

  UseVisibilityWeightsInTexcoordGenerator: bpy.props.BoolProperty(default=False,description='If set to true, visibility weights will be used when generating new texture coordinates.')
  class SimplygonUseVisibilityWeightsInTexcoordGeneratorEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseVisibilityWeightsInTexcoordGenerator

    @Value.setter
    def Value(self, value):
      self.Parent.UseVisibilityWeightsInTexcoordGenerator = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def VisibilityWeightsPowerUI(self):
    index = bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List[index]

    return None

  VisibilityWeightsPower: bpy.props.FloatProperty(default=1,min=0,max=10,description='Set how aggressively reducer should handle low visibility weights.')
  class SimplygonVisibilityWeightsPowerEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.VisibilityWeightsPower

    @Value.setter
    def Value(self, value):
      self.Parent.VisibilityWeightsPower = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("VisibilityWeightsPower: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("VisibilityWeightsPower: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def CullOccludedGeometryUI(self):
    index = bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List[index]

    return None

  CullOccludedGeometry: bpy.props.BoolProperty(default=False,description='If set to true, geometry that is not visible will be removed.')
  class SimplygonCullOccludedGeometryEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CullOccludedGeometry

    @Value.setter
    def Value(self, value):
      self.Parent.CullOccludedGeometry = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ForceVisibilityCalculationUI(self):
    index = bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List[index]

    return None

  ForceVisibilityCalculation: bpy.props.BoolProperty(default=False,description='Set the ForceVisibilityCalculation if true, visibility weights will definitely be computed for the geometry, even if the visibility isn´t specifically being used for reduction/materialLOD/culling according to the VisibilitySettings.')
  class SimplygonForceVisibilityCalculationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ForceVisibilityCalculation

    @Value.setter
    def Value(self, value):
      self.Parent.ForceVisibilityCalculation = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseBackfaceCullingUI(self):
    index = bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List[index]

    return None

  UseBackfaceCulling: bpy.props.BoolProperty(default=True,description='Set whether triangles should be regarded visible when viewed from the back.')
  class SimplygonUseBackfaceCullingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseBackfaceCulling

    @Value.setter
    def Value(self, value):
      self.Parent.UseBackfaceCulling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def CameraSelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List[index]

    return None

  CameraSelectionSetName: bpy.props.StringProperty(default='',description='The name of the selection set containing all the scene cameras and scene meshes used when computing visibility. If scene meshes are added, all their vertices will be used as omni-directional cameras. If set to null, all cameras in the scene will be used. If both selection set name and ID are set, the name will be used.')
  class SimplygonCameraSelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CameraSelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.CameraSelectionSetName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OccluderSelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List[index]

    return None

  OccluderSelectionSetName: bpy.props.StringProperty(default='',description='The name of the selection set containing all the scene meshes used when computing visibility. If set to null, no occluders in the scene will be used. If both selection set name and ID are set, the name will be used.')
  class SimplygonOccluderSelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OccluderSelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.OccluderSelectionSetName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillNonVisibleAreaThresholdUI(self):
    index = bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List[index]

    return None

  FillNonVisibleAreaThreshold: bpy.props.FloatProperty(default=0,min=0,max=100,description='If a group of non-visible triangles (connected to visible triangles) has an area below the FillNonVisibleAreaThreshold - it will receive the same visibility as the neighboring visible triangles. Set to zero to skip filling nonvisible regions.')
  class SimplygonFillNonVisibleAreaThresholdEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillNonVisibleAreaThreshold

    @Value.setter
    def Value(self, value):
      self.Parent.FillNonVisibleAreaThreshold = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 100
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 100
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("FillNonVisibleAreaThreshold: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 100
      self.DefaultMaxValue = 100
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("FillNonVisibleAreaThreshold: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def RemoveTrianglesNotOccludingOtherTrianglesUI(self):
    index = bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List[index]

    return None

  RemoveTrianglesNotOccludingOtherTriangles: bpy.props.BoolProperty(default=False,description='If enabled, will remove all the visible triangles that are not occluding any other triangle. It will also remove all non-visible triangles.')
  class SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemoveTrianglesNotOccludingOtherTriangles

    @Value.setter
    def Value(self, value):
      self.Parent.RemoveTrianglesNotOccludingOtherTriangles = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ConservativeModeUI(self):
    index = bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List[index]

    return None

  ConservativeMode: bpy.props.BoolProperty(default=False,description='If enabled, will compute the visibility conservatively - meaning that triangles that are visible will be tagged as visible but some non-visible triangles might also be tagged as visible. If this is turned off, then it is no longer guaranteed that all visible triangles are found - but more non-visible triangles will be identified as non-visible.')
  class SimplygonConservativeModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ConservativeMode

    @Value.setter
    def Value(self, value):
      self.Parent.ConservativeMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ComputeVisibilityModeUI(self):
    index = bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List[index]

    return None

  ComputeVisibilityMode: bpy.props.EnumProperty(items=[('0','DirectX', ''),('1','Software', ''),],default='0',description='Specifies the renderer type when computing visibility.')
  class SimplygonComputeVisibilityModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ComputeVisibilityMode

    @Value.setter
    def Value(self, value):
      self.Parent.ComputeVisibilityMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VisibilitySettings'
    UseVisibilityWeightsInReducerUI = bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.add()
    UseVisibilityWeightsInReducerUI.Init(self.name)
    UseVisibilityWeightsInReducerUI.name = self.name
    UseVisibilityWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.add()
    UseVisibilityWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVisibilityWeightsInTexcoordGeneratorUI.name = self.name
    VisibilityWeightsPowerUI = bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.add()
    VisibilityWeightsPowerUI.Init(self.name)
    VisibilityWeightsPowerUI.name = self.name
    CullOccludedGeometryUI = bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.add()
    CullOccludedGeometryUI.Init(self.name)
    CullOccludedGeometryUI.name = self.name
    ForceVisibilityCalculationUI = bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.add()
    ForceVisibilityCalculationUI.Init(self.name)
    ForceVisibilityCalculationUI.name = self.name
    UseBackfaceCullingUI = bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.add()
    UseBackfaceCullingUI.Init(self.name)
    UseBackfaceCullingUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OccluderSelectionSetNameUI = bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.add()
    OccluderSelectionSetNameUI.Init(self.name)
    OccluderSelectionSetNameUI.name = self.name
    FillNonVisibleAreaThresholdUI = bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.add()
    FillNonVisibleAreaThresholdUI.Init(self.name)
    FillNonVisibleAreaThresholdUI.name = self.name
    RemoveTrianglesNotOccludingOtherTrianglesUI = bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.add()
    RemoveTrianglesNotOccludingOtherTrianglesUI.Init(self.name)
    RemoveTrianglesNotOccludingOtherTrianglesUI.name = self.name
    ConservativeModeUI = bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.add()
    ConservativeModeUI.Init(self.name)
    ConservativeModeUI.name = self.name
    ComputeVisibilityModeUI = bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.add()
    ComputeVisibilityModeUI.Init(self.name)
    ComputeVisibilityModeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VisibilitySettings'
    UseVisibilityWeightsInReducerUI = bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.add()
    UseVisibilityWeightsInReducerUI.InitJson(self.name, jsonData['UseVisibilityWeightsInReducerUI'] if jsonData is not None and 'UseVisibilityWeightsInReducerUI' in jsonData else None)
    UseVisibilityWeightsInReducerUI.name = self.name
    UseVisibilityWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.add()
    UseVisibilityWeightsInTexcoordGeneratorUI.InitJson(self.name, jsonData['UseVisibilityWeightsInTexcoordGeneratorUI'] if jsonData is not None and 'UseVisibilityWeightsInTexcoordGeneratorUI' in jsonData else None)
    UseVisibilityWeightsInTexcoordGeneratorUI.name = self.name
    VisibilityWeightsPowerUI = bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.add()
    VisibilityWeightsPowerUI.InitJson(self.name, jsonData['VisibilityWeightsPowerUI'] if jsonData is not None and 'VisibilityWeightsPowerUI' in jsonData else None)
    VisibilityWeightsPowerUI.name = self.name
    CullOccludedGeometryUI = bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.add()
    CullOccludedGeometryUI.InitJson(self.name, jsonData['CullOccludedGeometryUI'] if jsonData is not None and 'CullOccludedGeometryUI' in jsonData else None)
    CullOccludedGeometryUI.name = self.name
    ForceVisibilityCalculationUI = bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.add()
    ForceVisibilityCalculationUI.InitJson(self.name, jsonData['ForceVisibilityCalculationUI'] if jsonData is not None and 'ForceVisibilityCalculationUI' in jsonData else None)
    ForceVisibilityCalculationUI.name = self.name
    UseBackfaceCullingUI = bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.add()
    UseBackfaceCullingUI.InitJson(self.name, jsonData['UseBackfaceCullingUI'] if jsonData is not None and 'UseBackfaceCullingUI' in jsonData else None)
    UseBackfaceCullingUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.add()
    CameraSelectionSetNameUI.InitJson(self.name, jsonData['CameraSelectionSetNameUI'] if jsonData is not None and 'CameraSelectionSetNameUI' in jsonData else None)
    CameraSelectionSetNameUI.name = self.name
    OccluderSelectionSetNameUI = bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.add()
    OccluderSelectionSetNameUI.InitJson(self.name, jsonData['OccluderSelectionSetNameUI'] if jsonData is not None and 'OccluderSelectionSetNameUI' in jsonData else None)
    OccluderSelectionSetNameUI.name = self.name
    FillNonVisibleAreaThresholdUI = bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.add()
    FillNonVisibleAreaThresholdUI.InitJson(self.name, jsonData['FillNonVisibleAreaThresholdUI'] if jsonData is not None and 'FillNonVisibleAreaThresholdUI' in jsonData else None)
    FillNonVisibleAreaThresholdUI.name = self.name
    RemoveTrianglesNotOccludingOtherTrianglesUI = bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.add()
    RemoveTrianglesNotOccludingOtherTrianglesUI.InitJson(self.name, jsonData['RemoveTrianglesNotOccludingOtherTrianglesUI'] if jsonData is not None and 'RemoveTrianglesNotOccludingOtherTrianglesUI' in jsonData else None)
    RemoveTrianglesNotOccludingOtherTrianglesUI.name = self.name
    ConservativeModeUI = bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.add()
    ConservativeModeUI.InitJson(self.name, jsonData['ConservativeModeUI'] if jsonData is not None and 'ConservativeModeUI' in jsonData else None)
    ConservativeModeUI.name = self.name
    ComputeVisibilityModeUI = bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.add()
    ComputeVisibilityModeUI.InitJson(self.name, jsonData['ComputeVisibilityModeUI'] if jsonData is not None and 'ComputeVisibilityModeUI' in jsonData else None)
    ComputeVisibilityModeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseVisibilityWeightsInReducerUI_index = bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.find(self.name)
    bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.remove(UseVisibilityWeightsInReducerUI_index)
    UseVisibilityWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.find(self.name)
    bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.remove(UseVisibilityWeightsInTexcoordGeneratorUI_index)
    VisibilityWeightsPowerUI_index = bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.find(self.name)
    bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.remove(VisibilityWeightsPowerUI_index)
    CullOccludedGeometryUI_index = bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.find(self.name)
    bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.remove(CullOccludedGeometryUI_index)
    ForceVisibilityCalculationUI_index = bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.find(self.name)
    bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.remove(ForceVisibilityCalculationUI_index)
    UseBackfaceCullingUI_index = bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.find(self.name)
    bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.remove(UseBackfaceCullingUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.find(self.name)
    bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.remove(CameraSelectionSetNameUI_index)
    OccluderSelectionSetNameUI_index = bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.find(self.name)
    bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.remove(OccluderSelectionSetNameUI_index)
    FillNonVisibleAreaThresholdUI_index = bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.find(self.name)
    bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.remove(FillNonVisibleAreaThresholdUI_index)
    RemoveTrianglesNotOccludingOtherTrianglesUI_index = bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.find(self.name)
    bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.remove(RemoveTrianglesNotOccludingOtherTrianglesUI_index)
    ConservativeModeUI_index = bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.find(self.name)
    bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.remove(ConservativeModeUI_index)
    ComputeVisibilityModeUI_index = bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.find(self.name)
    bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.remove(ComputeVisibilityModeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseVisibilityWeightsInReducer'] = self.UseVisibilityWeightsInReducer
    if serializeUIComponents:
      jsonData['UseVisibilityWeightsInReducerUI'] = self.UseVisibilityWeightsInReducerUI.SaveJson()

    jsonData['UseVisibilityWeightsInTexcoordGenerator'] = self.UseVisibilityWeightsInTexcoordGenerator
    if serializeUIComponents:
      jsonData['UseVisibilityWeightsInTexcoordGeneratorUI'] = self.UseVisibilityWeightsInTexcoordGeneratorUI.SaveJson()

    jsonData['VisibilityWeightsPower'] = self.VisibilityWeightsPower
    if serializeUIComponents:
      jsonData['VisibilityWeightsPowerUI'] = self.VisibilityWeightsPowerUI.SaveJson()

    jsonData['CullOccludedGeometry'] = self.CullOccludedGeometry
    if serializeUIComponents:
      jsonData['CullOccludedGeometryUI'] = self.CullOccludedGeometryUI.SaveJson()

    jsonData['ForceVisibilityCalculation'] = self.ForceVisibilityCalculation
    if serializeUIComponents:
      jsonData['ForceVisibilityCalculationUI'] = self.ForceVisibilityCalculationUI.SaveJson()

    jsonData['UseBackfaceCulling'] = self.UseBackfaceCulling
    if serializeUIComponents:
      jsonData['UseBackfaceCullingUI'] = self.UseBackfaceCullingUI.SaveJson()

    jsonData['CameraSelectionSetName'] = self.CameraSelectionSetName
    if serializeUIComponents:
      jsonData['CameraSelectionSetNameUI'] = self.CameraSelectionSetNameUI.SaveJson()

    jsonData['OccluderSelectionSetName'] = self.OccluderSelectionSetName
    if serializeUIComponents:
      jsonData['OccluderSelectionSetNameUI'] = self.OccluderSelectionSetNameUI.SaveJson()

    jsonData['FillNonVisibleAreaThreshold'] = self.FillNonVisibleAreaThreshold
    if serializeUIComponents:
      jsonData['FillNonVisibleAreaThresholdUI'] = self.FillNonVisibleAreaThresholdUI.SaveJson()

    jsonData['RemoveTrianglesNotOccludingOtherTriangles'] = self.RemoveTrianglesNotOccludingOtherTriangles
    if serializeUIComponents:
      jsonData['RemoveTrianglesNotOccludingOtherTrianglesUI'] = self.RemoveTrianglesNotOccludingOtherTrianglesUI.SaveJson()

    jsonData['ConservativeMode'] = self.ConservativeMode
    if serializeUIComponents:
      jsonData['ConservativeModeUI'] = self.ConservativeModeUI.SaveJson()

    jsonData['ComputeVisibilityMode'] = int(self.ComputeVisibilityMode)
    if serializeUIComponents:
      jsonData['ComputeVisibilityModeUI'] = self.ComputeVisibilityModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseVisibilityWeightsInReducer' in jsonData and jsonData['UseVisibilityWeightsInReducer'] is not None:
      self.UseVisibilityWeightsInReducer = jsonData['UseVisibilityWeightsInReducer']

    if 'UseVisibilityWeightsInTexcoordGenerator' in jsonData and jsonData['UseVisibilityWeightsInTexcoordGenerator'] is not None:
      self.UseVisibilityWeightsInTexcoordGenerator = jsonData['UseVisibilityWeightsInTexcoordGenerator']

    if 'VisibilityWeightsPower' in jsonData and jsonData['VisibilityWeightsPower'] is not None:
      newVisibilityWeightsPower = jsonData['VisibilityWeightsPower']
      if newVisibilityWeightsPower >= self.VisibilityWeightsPowerUI.DefaultMinValue and newVisibilityWeightsPower <= self.VisibilityWeightsPowerUI.DefaultMaxValue:
        self.VisibilityWeightsPower = newVisibilityWeightsPower

      else:
        print("VisibilityWeightsPower: Invalid value", newVisibilityWeightsPower, "using default value", self.VisibilityWeightsPower)


    if 'CullOccludedGeometry' in jsonData and jsonData['CullOccludedGeometry'] is not None:
      self.CullOccludedGeometry = jsonData['CullOccludedGeometry']

    if 'ForceVisibilityCalculation' in jsonData and jsonData['ForceVisibilityCalculation'] is not None:
      self.ForceVisibilityCalculation = jsonData['ForceVisibilityCalculation']

    if 'UseBackfaceCulling' in jsonData and jsonData['UseBackfaceCulling'] is not None:
      self.UseBackfaceCulling = jsonData['UseBackfaceCulling']

    if 'CameraSelectionSetName' in jsonData and jsonData['CameraSelectionSetName'] is not None:
      self.CameraSelectionSetName = jsonData['CameraSelectionSetName']

    if 'OccluderSelectionSetName' in jsonData and jsonData['OccluderSelectionSetName'] is not None:
      self.OccluderSelectionSetName = jsonData['OccluderSelectionSetName']

    if 'FillNonVisibleAreaThreshold' in jsonData and jsonData['FillNonVisibleAreaThreshold'] is not None:
      newFillNonVisibleAreaThreshold = jsonData['FillNonVisibleAreaThreshold']
      if newFillNonVisibleAreaThreshold >= self.FillNonVisibleAreaThresholdUI.DefaultMinValue and newFillNonVisibleAreaThreshold <= self.FillNonVisibleAreaThresholdUI.DefaultMaxValue:
        self.FillNonVisibleAreaThreshold = newFillNonVisibleAreaThreshold

      else:
        print("FillNonVisibleAreaThreshold: Invalid value", newFillNonVisibleAreaThreshold, "using default value", self.FillNonVisibleAreaThreshold)


    if 'RemoveTrianglesNotOccludingOtherTriangles' in jsonData and jsonData['RemoveTrianglesNotOccludingOtherTriangles'] is not None:
      self.RemoveTrianglesNotOccludingOtherTriangles = jsonData['RemoveTrianglesNotOccludingOtherTriangles']

    if 'ConservativeMode' in jsonData and jsonData['ConservativeMode'] is not None:
      self.ConservativeMode = jsonData['ConservativeMode']

    if 'ComputeVisibilityMode' in jsonData and jsonData['ComputeVisibilityMode'] is not None:
      self.ComputeVisibilityMode = str(jsonData['ComputeVisibilityMode'])


  def Reset(self):
    self.UseVisibilityWeightsInReducerUI.Reset()
    self.UseVisibilityWeightsInTexcoordGeneratorUI.Reset()
    self.VisibilityWeightsPowerUI.Reset()
    self.CullOccludedGeometryUI.Reset()
    self.ForceVisibilityCalculationUI.Reset()
    self.UseBackfaceCullingUI.Reset()
    self.CameraSelectionSetNameUI.Reset()
    self.OccluderSelectionSetNameUI.Reset()
    self.FillNonVisibleAreaThresholdUI.Reset()
    self.RemoveTrianglesNotOccludingOtherTrianglesUI.Reset()
    self.ConservativeModeUI.Reset()
    self.ComputeVisibilityModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseVisibilityWeightsInReducerUI.IsEditEnabled = isEditEnabled
    self.UseVisibilityWeightsInTexcoordGeneratorUI.IsEditEnabled = isEditEnabled
    self.VisibilityWeightsPowerUI.IsEditEnabled = isEditEnabled
    self.CullOccludedGeometryUI.IsEditEnabled = isEditEnabled
    self.ForceVisibilityCalculationUI.IsEditEnabled = isEditEnabled
    self.UseBackfaceCullingUI.IsEditEnabled = isEditEnabled
    self.CameraSelectionSetNameUI.IsEditEnabled = isEditEnabled
    self.OccluderSelectionSetNameUI.IsEditEnabled = isEditEnabled
    self.FillNonVisibleAreaThresholdUI.IsEditEnabled = isEditEnabled
    self.RemoveTrianglesNotOccludingOtherTrianglesUI.IsEditEnabled = isEditEnabled
    self.ConservativeModeUI.IsEditEnabled = isEditEnabled
    self.ComputeVisibilityModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='VisibilitySettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='VisibilitySettings', emboss=False)

        if self.UseVisibilityWeightsInReducerUI.Visible:
          column.prop(self, 'UseVisibilityWeightsInReducer')

        if self.UseVisibilityWeightsInTexcoordGeneratorUI.Visible:
          column.prop(self, 'UseVisibilityWeightsInTexcoordGenerator')

        if self.VisibilityWeightsPowerUI.Visible:
          column.prop(self, 'VisibilityWeightsPower')

        if self.CullOccludedGeometryUI.Visible:
          column.prop(self, 'CullOccludedGeometry')

        if self.ForceVisibilityCalculationUI.Visible:
          column.prop(self, 'ForceVisibilityCalculation')

        if self.UseBackfaceCullingUI.Visible:
          column.prop(self, 'UseBackfaceCulling')

        if self.CameraSelectionSetNameUI.Visible:
          column.prop(self, 'CameraSelectionSetName')

        if self.OccluderSelectionSetNameUI.Visible:
          column.prop(self, 'OccluderSelectionSetName')

        if self.FillNonVisibleAreaThresholdUI.Visible:
          column.prop(self, 'FillNonVisibleAreaThreshold')

        if self.RemoveTrianglesNotOccludingOtherTrianglesUI.Visible:
          column.prop(self, 'RemoveTrianglesNotOccludingOtherTriangles')

        if self.ConservativeModeUI.Visible:
          column.prop(self, 'ConservativeMode')

        if self.ComputeVisibilityModeUI.Visible:
          column.prop(self, 'ComputeVisibilityMode')



    else :
      if self.UseVisibilityWeightsInReducerUI.Visible:
        column.prop(self, 'UseVisibilityWeightsInReducer')

      if self.UseVisibilityWeightsInTexcoordGeneratorUI.Visible:
        column.prop(self, 'UseVisibilityWeightsInTexcoordGenerator')

      if self.VisibilityWeightsPowerUI.Visible:
        column.prop(self, 'VisibilityWeightsPower')

      if self.CullOccludedGeometryUI.Visible:
        column.prop(self, 'CullOccludedGeometry')

      if self.ForceVisibilityCalculationUI.Visible:
        column.prop(self, 'ForceVisibilityCalculation')

      if self.UseBackfaceCullingUI.Visible:
        column.prop(self, 'UseBackfaceCulling')

      if self.CameraSelectionSetNameUI.Visible:
        column.prop(self, 'CameraSelectionSetName')

      if self.OccluderSelectionSetNameUI.Visible:
        column.prop(self, 'OccluderSelectionSetName')

      if self.FillNonVisibleAreaThresholdUI.Visible:
        column.prop(self, 'FillNonVisibleAreaThreshold')

      if self.RemoveTrianglesNotOccludingOtherTrianglesUI.Visible:
        column.prop(self, 'RemoveTrianglesNotOccludingOtherTriangles')

      if self.ConservativeModeUI.Visible:
        column.prop(self, 'ConservativeMode')

      if self.ComputeVisibilityModeUI.Visible:
        column.prop(self, 'ComputeVisibilityMode')




class SimplygonBoneSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseBoneReducerUI.Visible: return True
    if self.BoneReductionTargetBoneRatioEnabledUI.Visible: return True
    if self.RemoveUnusedBonesUI.Visible: return True
    if self.LimitBonesPerVertexUI.Visible: return True
    if self.BoneReductionTargetBoneCountEnabledUI.Visible: return True
    if self.BoneReductionTargetMaxDeviationEnabledUI.Visible: return True
    if self.MaxBonePerVertexUI.Visible: return True
    if self.BoneReductionTargetOnScreenSizeEnabledUI.Visible: return True
    if self.BoneReductionTargetStopConditionUI.Visible: return True
    if self.BoneReductionTargetBoneRatioUI.Visible: return True
    if self.BoneReductionTargetBoneCountUI.Visible: return True
    if self.BoneReductionTargetMaxDeviationUI.Visible: return True
    if self.BoneReductionTargetOnScreenSizeUI.Visible: return True
    if self.LockBoneSelectionSetNameUI.Visible: return True
    if self.RemoveBoneSelectionSetNameUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseBoneReducerUI(self):
    index = bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List[index]

    return None

  UseBoneReducer: bpy.props.BoolProperty(default=False,description='Enables or disables the bone reduction processing that actually removes bones. Even with this flag off, the bones per vertex can still be limited.')
  class SimplygonUseBoneReducerEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseBoneReducer

    @Value.setter
    def Value(self, value):
      self.Parent.UseBoneReducer = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BoneReductionTargetBoneRatioEnabledUI(self):
    index = bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List[index]

    return None

  BoneReductionTargetBoneRatioEnabled: bpy.props.BoolProperty(default=True,description='Enable bone ratio as a reduction target. The reducer will stop when the set bone-ratio has been reached.')
  class SimplygonBoneReductionTargetBoneRatioEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetBoneRatioEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetBoneRatioEnabled = value
      self.Parent.BoneReductionTargetBoneRatioUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def RemoveUnusedBonesUI(self):
    index = bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List[index]

    return None

  RemoveUnusedBones: bpy.props.BoolProperty(default=False,description='Decides whether unused bones should be removed.')
  class SimplygonRemoveUnusedBonesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemoveUnusedBones

    @Value.setter
    def Value(self, value):
      self.Parent.RemoveUnusedBones = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def LimitBonesPerVertexUI(self):
    index = bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List[index]

    return None

  LimitBonesPerVertex: bpy.props.BoolProperty(default=False,description='Decides whether unused bones should be removed.')
  class SimplygonLimitBonesPerVertexEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LimitBonesPerVertex

    @Value.setter
    def Value(self, value):
      self.Parent.LimitBonesPerVertex = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BoneReductionTargetBoneCountEnabledUI(self):
    index = bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List[index]

    return None

  BoneReductionTargetBoneCountEnabled: bpy.props.BoolProperty(default=False,description='Enable bone count as a reduction target. The reducer will stop when the set bone count has been reached.')
  class SimplygonBoneReductionTargetBoneCountEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetBoneCountEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetBoneCountEnabled = value
      self.Parent.BoneReductionTargetBoneCountUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BoneReductionTargetMaxDeviationEnabledUI(self):
    index = bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List[index]

    return None

  BoneReductionTargetMaxDeviationEnabled: bpy.props.BoolProperty(default=False,description='Enable max deviation as a reduction target. The reducer will stop when the set max deviation has been reached.')
  class SimplygonBoneReductionTargetMaxDeviationEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetMaxDeviationEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetMaxDeviationEnabled = value
      self.Parent.BoneReductionTargetMaxDeviationUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def MaxBonePerVertexUI(self):
    index = bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List[index]

    return None

  MaxBonePerVertex: bpy.props.IntProperty(default=16,min=0,max=16,description='Decides the maximum limit of how many bones can be connected to each vertex. If for example set to 1, then each vertex will only be linked to 1 bone.')
  class SimplygonMaxBonePerVertexEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaxBonePerVertex

    @Value.setter
    def Value(self, value):
      self.Parent.MaxBonePerVertex = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 16
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 16
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaxBonePerVertex: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 16
      self.DefaultMaxValue = 16
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaxBonePerVertex: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def BoneReductionTargetOnScreenSizeEnabledUI(self):
    index = bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List[index]

    return None

  BoneReductionTargetOnScreenSizeEnabled: bpy.props.BoolProperty(default=False,description='Enable on screen size as a reduction target. The reducer will stop when the set on screen size has been reached.')
  class SimplygonBoneReductionTargetOnScreenSizeEnabledEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetOnScreenSizeEnabled

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetOnScreenSizeEnabled = value
      self.Parent.BoneReductionTargetOnScreenSizeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    @property
    def Visible(self):
      return False

    @Visible.setter
    def Visible(self, value):
      pass

    @property
    def IsEditEnabled(self):
      return False

    @IsEditEnabled.setter
    def IsEditEnabled(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BoneReductionTargetStopConditionUI(self):
    index = bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List[index]

    return None

  BoneReductionTargetStopCondition: bpy.props.EnumProperty(items=[('0','Any', ''),('1','All', ''),],default='1',description='The stop condition for the bone reducer. Any: the reducer will stop when any single one of the set reduction targets have been reached. All: the reducer will stop when all enabled reduction targets have been set.')
  class SimplygonBoneReductionTargetStopConditionEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetStopCondition

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetStopCondition = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BoneReductionTargetBoneRatioUI(self):
    index = bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List[index]

    return None

  BoneReductionTargetBoneRatio: bpy.props.FloatProperty(default=0.5,min=0,max=1,description='The desired bone reduction ratio. The range is 0->1.')
  class SimplygonBoneReductionTargetBoneRatioEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetBoneRatio

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetBoneRatio = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.BoneReductionTargetBoneRatioEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.BoneReductionTargetBoneRatioEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("BoneReductionTargetBoneRatio: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("BoneReductionTargetBoneRatio: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def BoneReductionTargetBoneCountUI(self):
    index = bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List[index]

    return None

  BoneReductionTargetBoneCount: bpy.props.IntProperty(default=100,min=0,max=500,description='The desired bone count. The range is 0->inf.')
  class SimplygonBoneReductionTargetBoneCountEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetBoneCount

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetBoneCount = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.BoneReductionTargetBoneCountEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.BoneReductionTargetBoneCountEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 500
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 500
      self.TicksFrequencyValue = 1
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("BoneReductionTargetBoneCount: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 500
      self.DefaultMaxValue = 500
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("BoneReductionTargetBoneCount: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def BoneReductionTargetMaxDeviationUI(self):
    index = bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List[index]

    return None

  BoneReductionTargetMaxDeviation: bpy.props.FloatProperty(default=0,min=0,max=100,description='The MaxDeviation value, the maximum surface-deviation between the reduced geometry and the original.')
  class SimplygonBoneReductionTargetMaxDeviationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetMaxDeviation

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetMaxDeviation = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.BoneReductionTargetMaxDeviationEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.BoneReductionTargetMaxDeviationEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 100
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 100
      self.TicksFrequencyValue = 0.1
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("BoneReductionTargetMaxDeviation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 100
      self.DefaultMaxValue = 100
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("BoneReductionTargetMaxDeviation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def BoneReductionTargetOnScreenSizeUI(self):
    index = bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List[index]

    return None

  BoneReductionTargetOnScreenSize: bpy.props.IntProperty(default=300,min=20,max=4000,description='The OnScreenSize value, the maximum surface-deviation between the reduced geometry and the original.')
  class SimplygonBoneReductionTargetOnScreenSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BoneReductionTargetOnScreenSize

    @Value.setter
    def Value(self, value):
      self.Parent.BoneReductionTargetOnScreenSize = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def DependencyObject(self):
      return self.Parent.BoneReductionTargetOnScreenSizeEnabled

    @DependencyObject.setter
    def DependencyObject(self, value):
      self.Parent.BoneReductionTargetOnScreenSizeEnabled = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 20
      self.MaxValue = 4000
      self.DefaultMinValue = 20
      self.DefaultMaxValue = 4000
      self.TicksFrequencyValue = 10
      self.HasDependencyObject = True
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 20
      self.DefaultMinValue = 20
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("BoneReductionTargetOnScreenSize: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 4000
      self.DefaultMaxValue = 4000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("BoneReductionTargetOnScreenSize: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      self.HasDependencyObject = True
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def LockBoneSelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List[index]

    return None

  LockBoneSelectionSetName: bpy.props.StringProperty(default='',description='The name of the selection set that contains all of the bones that will be locked, and cannot be removed in the BoneLOD process. If a bone is locked, all its ancestors will be locked also. If both name and id are set for the locked selection set, the name will be used.')
  class SimplygonLockBoneSelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LockBoneSelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.LockBoneSelectionSetName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def RemoveBoneSelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List[index]

    return None

  RemoveBoneSelectionSetName: bpy.props.StringProperty(default='',description='The name of the selection set that contains all of the bones that will be forced to be removed in the BoneLOD process, UNLESS they are locked. If a bone is set to be removed, all its descendants will be removed also. If both name and id are set for the remove selection set, the name will be used.')
  class SimplygonRemoveBoneSelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemoveBoneSelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.RemoveBoneSelectionSetName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'BoneSettings'
    UseBoneReducerUI = bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.add()
    UseBoneReducerUI.Init(self.name)
    UseBoneReducerUI.name = self.name
    RemoveUnusedBonesUI = bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.add()
    RemoveUnusedBonesUI.Init(self.name)
    RemoveUnusedBonesUI.name = self.name
    LimitBonesPerVertexUI = bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.add()
    LimitBonesPerVertexUI.Init(self.name)
    LimitBonesPerVertexUI.name = self.name
    MaxBonePerVertexUI = bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.add()
    MaxBonePerVertexUI.Init(self.name)
    MaxBonePerVertexUI.name = self.name
    BoneReductionTargetBoneRatioEnabledUI = bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.add()
    BoneReductionTargetBoneRatioEnabledUI.Init(self.name)
    BoneReductionTargetBoneRatioEnabledUI.name = self.name
    BoneReductionTargetBoneRatioUI = bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.add()
    BoneReductionTargetBoneRatioUI.Init(self.name)
    BoneReductionTargetBoneRatioUI.name = self.name
    BoneReductionTargetBoneCountEnabledUI = bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.add()
    BoneReductionTargetBoneCountEnabledUI.Init(self.name)
    BoneReductionTargetBoneCountEnabledUI.name = self.name
    BoneReductionTargetBoneCountUI = bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.add()
    BoneReductionTargetBoneCountUI.Init(self.name)
    BoneReductionTargetBoneCountUI.name = self.name
    BoneReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.add()
    BoneReductionTargetMaxDeviationEnabledUI.Init(self.name)
    BoneReductionTargetMaxDeviationEnabledUI.name = self.name
    BoneReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.add()
    BoneReductionTargetMaxDeviationUI.Init(self.name)
    BoneReductionTargetMaxDeviationUI.name = self.name
    BoneReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.add()
    BoneReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    BoneReductionTargetOnScreenSizeEnabledUI.name = self.name
    BoneReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.add()
    BoneReductionTargetOnScreenSizeUI.Init(self.name)
    BoneReductionTargetOnScreenSizeUI.name = self.name
    BoneReductionTargetStopConditionUI = bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.add()
    BoneReductionTargetStopConditionUI.Init(self.name)
    BoneReductionTargetStopConditionUI.name = self.name
    LockBoneSelectionSetNameUI = bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.add()
    LockBoneSelectionSetNameUI.Init(self.name)
    LockBoneSelectionSetNameUI.name = self.name
    RemoveBoneSelectionSetNameUI = bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.add()
    RemoveBoneSelectionSetNameUI.Init(self.name)
    RemoveBoneSelectionSetNameUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'BoneSettings'
    UseBoneReducerUI = bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.add()
    UseBoneReducerUI.InitJson(self.name, jsonData['UseBoneReducerUI'] if jsonData is not None and 'UseBoneReducerUI' in jsonData else None)
    UseBoneReducerUI.name = self.name
    RemoveUnusedBonesUI = bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.add()
    RemoveUnusedBonesUI.InitJson(self.name, jsonData['RemoveUnusedBonesUI'] if jsonData is not None and 'RemoveUnusedBonesUI' in jsonData else None)
    RemoveUnusedBonesUI.name = self.name
    LimitBonesPerVertexUI = bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.add()
    LimitBonesPerVertexUI.InitJson(self.name, jsonData['LimitBonesPerVertexUI'] if jsonData is not None and 'LimitBonesPerVertexUI' in jsonData else None)
    LimitBonesPerVertexUI.name = self.name
    MaxBonePerVertexUI = bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.add()
    MaxBonePerVertexUI.InitJson(self.name, jsonData['MaxBonePerVertexUI'] if jsonData is not None and 'MaxBonePerVertexUI' in jsonData else None)
    MaxBonePerVertexUI.name = self.name
    BoneReductionTargetBoneRatioEnabledUI = bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.add()
    BoneReductionTargetBoneRatioEnabledUI.InitJson(self.name, jsonData['BoneReductionTargetBoneRatioEnabledUI'] if jsonData is not None and 'BoneReductionTargetBoneRatioEnabledUI' in jsonData else None)
    BoneReductionTargetBoneRatioEnabledUI.name = self.name
    BoneReductionTargetBoneRatioUI = bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.add()
    BoneReductionTargetBoneRatioUI.InitJson(self.name, jsonData['BoneReductionTargetBoneRatioUI'] if jsonData is not None and 'BoneReductionTargetBoneRatioUI' in jsonData else None)
    BoneReductionTargetBoneRatioUI.name = self.name
    BoneReductionTargetBoneCountEnabledUI = bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.add()
    BoneReductionTargetBoneCountEnabledUI.InitJson(self.name, jsonData['BoneReductionTargetBoneCountEnabledUI'] if jsonData is not None and 'BoneReductionTargetBoneCountEnabledUI' in jsonData else None)
    BoneReductionTargetBoneCountEnabledUI.name = self.name
    BoneReductionTargetBoneCountUI = bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.add()
    BoneReductionTargetBoneCountUI.InitJson(self.name, jsonData['BoneReductionTargetBoneCountUI'] if jsonData is not None and 'BoneReductionTargetBoneCountUI' in jsonData else None)
    BoneReductionTargetBoneCountUI.name = self.name
    BoneReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.add()
    BoneReductionTargetMaxDeviationEnabledUI.InitJson(self.name, jsonData['BoneReductionTargetMaxDeviationEnabledUI'] if jsonData is not None and 'BoneReductionTargetMaxDeviationEnabledUI' in jsonData else None)
    BoneReductionTargetMaxDeviationEnabledUI.name = self.name
    BoneReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.add()
    BoneReductionTargetMaxDeviationUI.InitJson(self.name, jsonData['BoneReductionTargetMaxDeviationUI'] if jsonData is not None and 'BoneReductionTargetMaxDeviationUI' in jsonData else None)
    BoneReductionTargetMaxDeviationUI.name = self.name
    BoneReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.add()
    BoneReductionTargetOnScreenSizeEnabledUI.InitJson(self.name, jsonData['BoneReductionTargetOnScreenSizeEnabledUI'] if jsonData is not None and 'BoneReductionTargetOnScreenSizeEnabledUI' in jsonData else None)
    BoneReductionTargetOnScreenSizeEnabledUI.name = self.name
    BoneReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.add()
    BoneReductionTargetOnScreenSizeUI.InitJson(self.name, jsonData['BoneReductionTargetOnScreenSizeUI'] if jsonData is not None and 'BoneReductionTargetOnScreenSizeUI' in jsonData else None)
    BoneReductionTargetOnScreenSizeUI.name = self.name
    BoneReductionTargetStopConditionUI = bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.add()
    BoneReductionTargetStopConditionUI.InitJson(self.name, jsonData['BoneReductionTargetStopConditionUI'] if jsonData is not None and 'BoneReductionTargetStopConditionUI' in jsonData else None)
    BoneReductionTargetStopConditionUI.name = self.name
    LockBoneSelectionSetNameUI = bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.add()
    LockBoneSelectionSetNameUI.InitJson(self.name, jsonData['LockBoneSelectionSetNameUI'] if jsonData is not None and 'LockBoneSelectionSetNameUI' in jsonData else None)
    LockBoneSelectionSetNameUI.name = self.name
    RemoveBoneSelectionSetNameUI = bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.add()
    RemoveBoneSelectionSetNameUI.InitJson(self.name, jsonData['RemoveBoneSelectionSetNameUI'] if jsonData is not None and 'RemoveBoneSelectionSetNameUI' in jsonData else None)
    RemoveBoneSelectionSetNameUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseBoneReducerUI_index = bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.find(self.name)
    bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.remove(UseBoneReducerUI_index)
    RemoveUnusedBonesUI_index = bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.find(self.name)
    bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.remove(RemoveUnusedBonesUI_index)
    LimitBonesPerVertexUI_index = bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.find(self.name)
    bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.remove(LimitBonesPerVertexUI_index)
    MaxBonePerVertexUI_index = bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.find(self.name)
    bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.remove(MaxBonePerVertexUI_index)
    BoneReductionTargetBoneRatioEnabledUI_index = bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.find(self.name)
    bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.remove(BoneReductionTargetBoneRatioEnabledUI_index)
    BoneReductionTargetBoneRatioUI_index = bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.find(self.name)
    bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.remove(BoneReductionTargetBoneRatioUI_index)
    BoneReductionTargetBoneCountEnabledUI_index = bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.find(self.name)
    bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.remove(BoneReductionTargetBoneCountEnabledUI_index)
    BoneReductionTargetBoneCountUI_index = bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.find(self.name)
    bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.remove(BoneReductionTargetBoneCountUI_index)
    BoneReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.find(self.name)
    bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.remove(BoneReductionTargetMaxDeviationEnabledUI_index)
    BoneReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.find(self.name)
    bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.remove(BoneReductionTargetMaxDeviationUI_index)
    BoneReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.find(self.name)
    bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.remove(BoneReductionTargetOnScreenSizeEnabledUI_index)
    BoneReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.find(self.name)
    bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.remove(BoneReductionTargetOnScreenSizeUI_index)
    BoneReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.find(self.name)
    bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.remove(BoneReductionTargetStopConditionUI_index)
    LockBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.find(self.name)
    bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.remove(LockBoneSelectionSetNameUI_index)
    RemoveBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.find(self.name)
    bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.remove(RemoveBoneSelectionSetNameUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseBoneReducer'] = self.UseBoneReducer
    if serializeUIComponents:
      jsonData['UseBoneReducerUI'] = self.UseBoneReducerUI.SaveJson()

    jsonData['BoneReductionTargetBoneRatioEnabled'] = self.BoneReductionTargetBoneRatioEnabled
    if serializeUIComponents:
      jsonData['BoneReductionTargetBoneRatioEnabledUI'] = self.BoneReductionTargetBoneRatioEnabledUI.SaveJson()

    jsonData['RemoveUnusedBones'] = self.RemoveUnusedBones
    if serializeUIComponents:
      jsonData['RemoveUnusedBonesUI'] = self.RemoveUnusedBonesUI.SaveJson()

    jsonData['LimitBonesPerVertex'] = self.LimitBonesPerVertex
    if serializeUIComponents:
      jsonData['LimitBonesPerVertexUI'] = self.LimitBonesPerVertexUI.SaveJson()

    jsonData['BoneReductionTargetBoneCountEnabled'] = self.BoneReductionTargetBoneCountEnabled
    if serializeUIComponents:
      jsonData['BoneReductionTargetBoneCountEnabledUI'] = self.BoneReductionTargetBoneCountEnabledUI.SaveJson()

    jsonData['BoneReductionTargetMaxDeviationEnabled'] = self.BoneReductionTargetMaxDeviationEnabled
    if serializeUIComponents:
      jsonData['BoneReductionTargetMaxDeviationEnabledUI'] = self.BoneReductionTargetMaxDeviationEnabledUI.SaveJson()

    jsonData['MaxBonePerVertex'] = self.MaxBonePerVertex
    if serializeUIComponents:
      jsonData['MaxBonePerVertexUI'] = self.MaxBonePerVertexUI.SaveJson()

    jsonData['BoneReductionTargetOnScreenSizeEnabled'] = self.BoneReductionTargetOnScreenSizeEnabled
    if serializeUIComponents:
      jsonData['BoneReductionTargetOnScreenSizeEnabledUI'] = self.BoneReductionTargetOnScreenSizeEnabledUI.SaveJson()

    jsonData['BoneReductionTargetStopCondition'] = int(self.BoneReductionTargetStopCondition)
    if serializeUIComponents:
      jsonData['BoneReductionTargetStopConditionUI'] = self.BoneReductionTargetStopConditionUI.SaveJson()

    jsonData['BoneReductionTargetBoneRatio'] = self.BoneReductionTargetBoneRatio
    if serializeUIComponents:
      jsonData['BoneReductionTargetBoneRatioUI'] = self.BoneReductionTargetBoneRatioUI.SaveJson()

    jsonData['BoneReductionTargetBoneCount'] = self.BoneReductionTargetBoneCount
    if serializeUIComponents:
      jsonData['BoneReductionTargetBoneCountUI'] = self.BoneReductionTargetBoneCountUI.SaveJson()

    jsonData['BoneReductionTargetMaxDeviation'] = self.BoneReductionTargetMaxDeviation
    if serializeUIComponents:
      jsonData['BoneReductionTargetMaxDeviationUI'] = self.BoneReductionTargetMaxDeviationUI.SaveJson()

    jsonData['BoneReductionTargetOnScreenSize'] = self.BoneReductionTargetOnScreenSize
    if serializeUIComponents:
      jsonData['BoneReductionTargetOnScreenSizeUI'] = self.BoneReductionTargetOnScreenSizeUI.SaveJson()

    jsonData['LockBoneSelectionSetName'] = self.LockBoneSelectionSetName
    if serializeUIComponents:
      jsonData['LockBoneSelectionSetNameUI'] = self.LockBoneSelectionSetNameUI.SaveJson()

    jsonData['RemoveBoneSelectionSetName'] = self.RemoveBoneSelectionSetName
    if serializeUIComponents:
      jsonData['RemoveBoneSelectionSetNameUI'] = self.RemoveBoneSelectionSetNameUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseBoneReducer' in jsonData and jsonData['UseBoneReducer'] is not None:
      self.UseBoneReducer = jsonData['UseBoneReducer']

    if 'BoneReductionTargetBoneRatioEnabled' in jsonData and jsonData['BoneReductionTargetBoneRatioEnabled'] is not None:
      self.BoneReductionTargetBoneRatioEnabled = jsonData['BoneReductionTargetBoneRatioEnabled']

    if 'RemoveUnusedBones' in jsonData and jsonData['RemoveUnusedBones'] is not None:
      self.RemoveUnusedBones = jsonData['RemoveUnusedBones']

    if 'LimitBonesPerVertex' in jsonData and jsonData['LimitBonesPerVertex'] is not None:
      self.LimitBonesPerVertex = jsonData['LimitBonesPerVertex']

    if 'BoneReductionTargetBoneCountEnabled' in jsonData and jsonData['BoneReductionTargetBoneCountEnabled'] is not None:
      self.BoneReductionTargetBoneCountEnabled = jsonData['BoneReductionTargetBoneCountEnabled']

    if 'BoneReductionTargetMaxDeviationEnabled' in jsonData and jsonData['BoneReductionTargetMaxDeviationEnabled'] is not None:
      self.BoneReductionTargetMaxDeviationEnabled = jsonData['BoneReductionTargetMaxDeviationEnabled']

    if 'MaxBonePerVertex' in jsonData and jsonData['MaxBonePerVertex'] is not None:
      newMaxBonePerVertex = jsonData['MaxBonePerVertex']
      if newMaxBonePerVertex >= self.MaxBonePerVertexUI.DefaultMinValue and newMaxBonePerVertex <= self.MaxBonePerVertexUI.DefaultMaxValue:
        self.MaxBonePerVertex = newMaxBonePerVertex

      else:
        print("MaxBonePerVertex: Invalid value", newMaxBonePerVertex, "using default value", self.MaxBonePerVertex)


    if 'BoneReductionTargetOnScreenSizeEnabled' in jsonData and jsonData['BoneReductionTargetOnScreenSizeEnabled'] is not None:
      self.BoneReductionTargetOnScreenSizeEnabled = jsonData['BoneReductionTargetOnScreenSizeEnabled']

    if 'BoneReductionTargetStopCondition' in jsonData and jsonData['BoneReductionTargetStopCondition'] is not None:
      self.BoneReductionTargetStopCondition = str(jsonData['BoneReductionTargetStopCondition'])

    if 'BoneReductionTargetBoneRatio' in jsonData and jsonData['BoneReductionTargetBoneRatio'] is not None:
      newBoneReductionTargetBoneRatio = jsonData['BoneReductionTargetBoneRatio']
      if newBoneReductionTargetBoneRatio >= self.BoneReductionTargetBoneRatioUI.DefaultMinValue and newBoneReductionTargetBoneRatio <= self.BoneReductionTargetBoneRatioUI.DefaultMaxValue:
        self.BoneReductionTargetBoneRatio = newBoneReductionTargetBoneRatio

      else:
        print("BoneReductionTargetBoneRatio: Invalid value", newBoneReductionTargetBoneRatio, "using default value", self.BoneReductionTargetBoneRatio)


    if 'BoneReductionTargetBoneCount' in jsonData and jsonData['BoneReductionTargetBoneCount'] is not None:
      newBoneReductionTargetBoneCount = jsonData['BoneReductionTargetBoneCount']
      if newBoneReductionTargetBoneCount >= self.BoneReductionTargetBoneCountUI.DefaultMinValue and newBoneReductionTargetBoneCount <= self.BoneReductionTargetBoneCountUI.DefaultMaxValue:
        self.BoneReductionTargetBoneCount = newBoneReductionTargetBoneCount

      else:
        print("BoneReductionTargetBoneCount: Invalid value", newBoneReductionTargetBoneCount, "using default value", self.BoneReductionTargetBoneCount)


    if 'BoneReductionTargetMaxDeviation' in jsonData and jsonData['BoneReductionTargetMaxDeviation'] is not None:
      newBoneReductionTargetMaxDeviation = jsonData['BoneReductionTargetMaxDeviation']
      if newBoneReductionTargetMaxDeviation >= self.BoneReductionTargetMaxDeviationUI.DefaultMinValue and newBoneReductionTargetMaxDeviation <= self.BoneReductionTargetMaxDeviationUI.DefaultMaxValue:
        self.BoneReductionTargetMaxDeviation = newBoneReductionTargetMaxDeviation

      else:
        print("BoneReductionTargetMaxDeviation: Invalid value", newBoneReductionTargetMaxDeviation, "using default value", self.BoneReductionTargetMaxDeviation)


    if 'BoneReductionTargetOnScreenSize' in jsonData and jsonData['BoneReductionTargetOnScreenSize'] is not None:
      newBoneReductionTargetOnScreenSize = jsonData['BoneReductionTargetOnScreenSize']
      if newBoneReductionTargetOnScreenSize >= self.BoneReductionTargetOnScreenSizeUI.DefaultMinValue and newBoneReductionTargetOnScreenSize <= self.BoneReductionTargetOnScreenSizeUI.DefaultMaxValue:
        self.BoneReductionTargetOnScreenSize = newBoneReductionTargetOnScreenSize

      else:
        print("BoneReductionTargetOnScreenSize: Invalid value", newBoneReductionTargetOnScreenSize, "using default value", self.BoneReductionTargetOnScreenSize)


    if 'LockBoneSelectionSetName' in jsonData and jsonData['LockBoneSelectionSetName'] is not None:
      self.LockBoneSelectionSetName = jsonData['LockBoneSelectionSetName']

    if 'RemoveBoneSelectionSetName' in jsonData and jsonData['RemoveBoneSelectionSetName'] is not None:
      self.RemoveBoneSelectionSetName = jsonData['RemoveBoneSelectionSetName']


  def Reset(self):
    self.UseBoneReducerUI.Reset()
    self.BoneReductionTargetBoneRatioEnabledUI.Reset()
    self.RemoveUnusedBonesUI.Reset()
    self.LimitBonesPerVertexUI.Reset()
    self.BoneReductionTargetBoneCountEnabledUI.Reset()
    self.BoneReductionTargetMaxDeviationEnabledUI.Reset()
    self.MaxBonePerVertexUI.Reset()
    self.BoneReductionTargetOnScreenSizeEnabledUI.Reset()
    self.BoneReductionTargetStopConditionUI.Reset()
    self.BoneReductionTargetBoneRatioUI.Reset()
    self.BoneReductionTargetBoneCountUI.Reset()
    self.BoneReductionTargetMaxDeviationUI.Reset()
    self.BoneReductionTargetOnScreenSizeUI.Reset()
    self.LockBoneSelectionSetNameUI.Reset()
    self.RemoveBoneSelectionSetNameUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseBoneReducerUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetBoneRatioEnabledUI.IsEditEnabled = isEditEnabled
    self.RemoveUnusedBonesUI.IsEditEnabled = isEditEnabled
    self.LimitBonesPerVertexUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetBoneCountEnabledUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetMaxDeviationEnabledUI.IsEditEnabled = isEditEnabled
    self.MaxBonePerVertexUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetOnScreenSizeEnabledUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetStopConditionUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetBoneRatioUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetBoneCountUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetMaxDeviationUI.IsEditEnabled = isEditEnabled
    self.BoneReductionTargetOnScreenSizeUI.IsEditEnabled = isEditEnabled
    self.LockBoneSelectionSetNameUI.IsEditEnabled = isEditEnabled
    self.RemoveBoneSelectionSetNameUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='BoneSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='BoneSettings', emboss=False)

        if self.UseBoneReducerUI.Visible:
          column.prop(self, 'UseBoneReducer')

        if self.RemoveUnusedBonesUI.Visible:
          column.prop(self, 'RemoveUnusedBones')

        if self.LimitBonesPerVertexUI.Visible:
          column.prop(self, 'LimitBonesPerVertex')

        if self.MaxBonePerVertexUI.Visible:
          column.prop(self, 'MaxBonePerVertex')

        if self.BoneReductionTargetBoneRatioEnabledUI.Visible:
          column.prop(self, 'BoneReductionTargetBoneRatioEnabled')

        if self.BoneReductionTargetBoneRatioUI.Visible:
          row = column.row()
          row.prop(self, 'BoneReductionTargetBoneRatioEnabled', text='BoneReductionTargetBoneRatio')
          if self.BoneReductionTargetBoneRatioEnabled:
            row.prop(self, 'BoneReductionTargetBoneRatio', text='')


        if self.BoneReductionTargetBoneCountEnabledUI.Visible:
          column.prop(self, 'BoneReductionTargetBoneCountEnabled')

        if self.BoneReductionTargetBoneCountUI.Visible:
          row = column.row()
          row.prop(self, 'BoneReductionTargetBoneCountEnabled', text='BoneReductionTargetBoneCount')
          if self.BoneReductionTargetBoneCountEnabled:
            row.prop(self, 'BoneReductionTargetBoneCount', text='')


        if self.BoneReductionTargetMaxDeviationEnabledUI.Visible:
          column.prop(self, 'BoneReductionTargetMaxDeviationEnabled')

        if self.BoneReductionTargetMaxDeviationUI.Visible:
          row = column.row()
          row.prop(self, 'BoneReductionTargetMaxDeviationEnabled', text='BoneReductionTargetMaxDeviation')
          if self.BoneReductionTargetMaxDeviationEnabled:
            row.prop(self, 'BoneReductionTargetMaxDeviation', text='')


        if self.BoneReductionTargetOnScreenSizeEnabledUI.Visible:
          column.prop(self, 'BoneReductionTargetOnScreenSizeEnabled')

        if self.BoneReductionTargetOnScreenSizeUI.Visible:
          row = column.row()
          row.prop(self, 'BoneReductionTargetOnScreenSizeEnabled', text='BoneReductionTargetOnScreenSize')
          if self.BoneReductionTargetOnScreenSizeEnabled:
            row.prop(self, 'BoneReductionTargetOnScreenSize', text='')


        if self.BoneReductionTargetStopConditionUI.Visible:
          column.prop(self, 'BoneReductionTargetStopCondition')

        if self.LockBoneSelectionSetNameUI.Visible:
          column.prop(self, 'LockBoneSelectionSetName')

        if self.RemoveBoneSelectionSetNameUI.Visible:
          column.prop(self, 'RemoveBoneSelectionSetName')



    else :
      if self.UseBoneReducerUI.Visible:
        column.prop(self, 'UseBoneReducer')

      if self.RemoveUnusedBonesUI.Visible:
        column.prop(self, 'RemoveUnusedBones')

      if self.LimitBonesPerVertexUI.Visible:
        column.prop(self, 'LimitBonesPerVertex')

      if self.MaxBonePerVertexUI.Visible:
        column.prop(self, 'MaxBonePerVertex')

      if self.BoneReductionTargetBoneRatioEnabledUI.Visible:
        column.prop(self, 'BoneReductionTargetBoneRatioEnabled')

      if self.BoneReductionTargetBoneRatioUI.Visible:
        column.prop(self, 'BoneReductionTargetBoneRatio')

      if self.BoneReductionTargetBoneCountEnabledUI.Visible:
        column.prop(self, 'BoneReductionTargetBoneCountEnabled')

      if self.BoneReductionTargetBoneCountUI.Visible:
        column.prop(self, 'BoneReductionTargetBoneCount')

      if self.BoneReductionTargetMaxDeviationEnabledUI.Visible:
        column.prop(self, 'BoneReductionTargetMaxDeviationEnabled')

      if self.BoneReductionTargetMaxDeviationUI.Visible:
        column.prop(self, 'BoneReductionTargetMaxDeviation')

      if self.BoneReductionTargetOnScreenSizeEnabledUI.Visible:
        column.prop(self, 'BoneReductionTargetOnScreenSizeEnabled')

      if self.BoneReductionTargetOnScreenSizeUI.Visible:
        column.prop(self, 'BoneReductionTargetOnScreenSize')

      if self.BoneReductionTargetStopConditionUI.Visible:
        column.prop(self, 'BoneReductionTargetStopCondition')

      if self.LockBoneSelectionSetNameUI.Visible:
        column.prop(self, 'LockBoneSelectionSetName')

      if self.RemoveBoneSelectionSetNameUI.Visible:
        column.prop(self, 'RemoveBoneSelectionSetName')




class SimplygonVertexWeightSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseVertexWeightsInReducerUI.Visible: return True
    if self.UseVertexWeightsInTexcoordGeneratorUI.Visible: return True
    if self.WeightsFromColorNameUI.Visible: return True
    if self.WeightsFromColorLevelUI.Visible: return True
    if self.WeightsFromColorComponentUI.Visible: return True
    if self.WeightsFromColorMultiplierUI.Visible: return True
    if self.WeightsFromColorModeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseVertexWeightsInReducerUI(self):
    index = bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List[index]

    return None

  UseVertexWeightsInReducer: bpy.props.BoolProperty(default=False,description='If set, and using the reduction processor, the reduction will be weighted based on the weights in the ´VertexWeights´ vertex field.')
  class SimplygonUseVertexWeightsInReducerEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseVertexWeightsInReducer

    @Value.setter
    def Value(self, value):
      self.Parent.UseVertexWeightsInReducer = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseVertexWeightsInTexcoordGeneratorUI(self):
    index = bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List[index]

    return None

  UseVertexWeightsInTexcoordGenerator: bpy.props.BoolProperty(default=False,description='If set, and generating new texcoords using either the parameterizeror the chart aggregator, the relative sizes of the output charts will be scaled using the weights in the ´VertexWeights´ vertex field.')
  class SimplygonUseVertexWeightsInTexcoordGeneratorEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseVertexWeightsInTexcoordGenerator

    @Value.setter
    def Value(self, value):
      self.Parent.UseVertexWeightsInTexcoordGenerator = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeightsFromColorNameUI(self):
    index = bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List[index]

    return None

  WeightsFromColorName: bpy.props.StringProperty(default='',description='If the name of an existing vertex color field in the input geometry is set here, the existing VertexWeights field will be overwritten by a set created by converting the selected color field according to the other WeightsFromColor settings in this settings object. If both ColorName and the corresponding ColorLevel is set, the processors will prioritize the name.')
  class SimplygonWeightsFromColorNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeightsFromColorName

    @Value.setter
    def Value(self, value):
      self.Parent.WeightsFromColorName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeightsFromColorLevelUI(self):
    index = bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List[index]

    return None

  WeightsFromColorLevel: bpy.props.IntProperty(default=-1,min=-1,max=10,description='If the index of an existing vertex color field in the input geometry is set here, the existing VertexWeights field will be overwritten by a set created by converting the selected color field according to the other WeightsFromColor settings in this settings object. If both this and the corresponding ColorName is set, the processors will prioritize the name.')
  class SimplygonWeightsFromColorLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeightsFromColorLevel

    @Value.setter
    def Value(self, value):
      self.Parent.WeightsFromColorLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("WeightsFromColorLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("WeightsFromColorLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def WeightsFromColorComponentUI(self):
    index = bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List[index]

    return None

  WeightsFromColorComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='If converting vertex colors to weights, this setting controls which color component is used to create the weights.')
  class SimplygonWeightsFromColorComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeightsFromColorComponent

    @Value.setter
    def Value(self, value):
      self.Parent.WeightsFromColorComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def WeightsFromColorMultiplierUI(self):
    index = bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List[index]

    return None

  WeightsFromColorMultiplier: bpy.props.FloatProperty(default=4,min=0,max=10,description='If converting vertex colors to weights, this setting controls the max and min resulting vertex weights generated by the input color.')
  class SimplygonWeightsFromColorMultiplierEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeightsFromColorMultiplier

    @Value.setter
    def Value(self, value):
      self.Parent.WeightsFromColorMultiplier = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("WeightsFromColorMultiplier: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("WeightsFromColorMultiplier: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def WeightsFromColorModeUI(self):
    index = bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List[index]

    return None

  WeightsFromColorMode: bpy.props.EnumProperty(items=[('0','Standard', ''),('1','High', ''),('2','Low', ''),],default='0',description='If converting vertex colors to weights, this setting along with WeightsFromColorMultiplier controls how to map the RGBA intensity between 0-1 to weights. Standard mode maps color intensity [0-1] to vertex weight [1/Multiplier - Multiplier]. High mode maps color intensity [0-1] to vertex weight [1 - Multiplier]. Low mode maps color intensity [0-1] to vertex weight [1/Multiplier - 1].')
  class SimplygonWeightsFromColorModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.WeightsFromColorMode

    @Value.setter
    def Value(self, value):
      self.Parent.WeightsFromColorMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VertexWeightSettings'
    UseVertexWeightsInReducerUI = bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.add()
    UseVertexWeightsInReducerUI.Init(self.name)
    UseVertexWeightsInReducerUI.name = self.name
    UseVertexWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.add()
    UseVertexWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVertexWeightsInTexcoordGeneratorUI.name = self.name
    WeightsFromColorLevelUI = bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.add()
    WeightsFromColorLevelUI.Init(self.name)
    WeightsFromColorLevelUI.name = self.name
    WeightsFromColorNameUI = bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.add()
    WeightsFromColorNameUI.Init(self.name)
    WeightsFromColorNameUI.name = self.name
    WeightsFromColorComponentUI = bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.add()
    WeightsFromColorComponentUI.Init(self.name)
    WeightsFromColorComponentUI.name = self.name
    WeightsFromColorMultiplierUI = bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.add()
    WeightsFromColorMultiplierUI.Init(self.name)
    WeightsFromColorMultiplierUI.name = self.name
    WeightsFromColorModeUI = bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.add()
    WeightsFromColorModeUI.Init(self.name)
    WeightsFromColorModeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VertexWeightSettings'
    UseVertexWeightsInReducerUI = bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.add()
    UseVertexWeightsInReducerUI.InitJson(self.name, jsonData['UseVertexWeightsInReducerUI'] if jsonData is not None and 'UseVertexWeightsInReducerUI' in jsonData else None)
    UseVertexWeightsInReducerUI.name = self.name
    UseVertexWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.add()
    UseVertexWeightsInTexcoordGeneratorUI.InitJson(self.name, jsonData['UseVertexWeightsInTexcoordGeneratorUI'] if jsonData is not None and 'UseVertexWeightsInTexcoordGeneratorUI' in jsonData else None)
    UseVertexWeightsInTexcoordGeneratorUI.name = self.name
    WeightsFromColorLevelUI = bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.add()
    WeightsFromColorLevelUI.InitJson(self.name, jsonData['WeightsFromColorLevelUI'] if jsonData is not None and 'WeightsFromColorLevelUI' in jsonData else None)
    WeightsFromColorLevelUI.name = self.name
    WeightsFromColorNameUI = bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.add()
    WeightsFromColorNameUI.InitJson(self.name, jsonData['WeightsFromColorNameUI'] if jsonData is not None and 'WeightsFromColorNameUI' in jsonData else None)
    WeightsFromColorNameUI.name = self.name
    WeightsFromColorComponentUI = bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.add()
    WeightsFromColorComponentUI.InitJson(self.name, jsonData['WeightsFromColorComponentUI'] if jsonData is not None and 'WeightsFromColorComponentUI' in jsonData else None)
    WeightsFromColorComponentUI.name = self.name
    WeightsFromColorMultiplierUI = bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.add()
    WeightsFromColorMultiplierUI.InitJson(self.name, jsonData['WeightsFromColorMultiplierUI'] if jsonData is not None and 'WeightsFromColorMultiplierUI' in jsonData else None)
    WeightsFromColorMultiplierUI.name = self.name
    WeightsFromColorModeUI = bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.add()
    WeightsFromColorModeUI.InitJson(self.name, jsonData['WeightsFromColorModeUI'] if jsonData is not None and 'WeightsFromColorModeUI' in jsonData else None)
    WeightsFromColorModeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseVertexWeightsInReducerUI_index = bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.find(self.name)
    bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.remove(UseVertexWeightsInReducerUI_index)
    UseVertexWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.find(self.name)
    bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.remove(UseVertexWeightsInTexcoordGeneratorUI_index)
    WeightsFromColorLevelUI_index = bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.find(self.name)
    bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.remove(WeightsFromColorLevelUI_index)
    WeightsFromColorNameUI_index = bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.find(self.name)
    bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.remove(WeightsFromColorNameUI_index)
    WeightsFromColorComponentUI_index = bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.find(self.name)
    bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.remove(WeightsFromColorComponentUI_index)
    WeightsFromColorMultiplierUI_index = bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.find(self.name)
    bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.remove(WeightsFromColorMultiplierUI_index)
    WeightsFromColorModeUI_index = bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.find(self.name)
    bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.remove(WeightsFromColorModeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseVertexWeightsInReducer'] = self.UseVertexWeightsInReducer
    if serializeUIComponents:
      jsonData['UseVertexWeightsInReducerUI'] = self.UseVertexWeightsInReducerUI.SaveJson()

    jsonData['UseVertexWeightsInTexcoordGenerator'] = self.UseVertexWeightsInTexcoordGenerator
    if serializeUIComponents:
      jsonData['UseVertexWeightsInTexcoordGeneratorUI'] = self.UseVertexWeightsInTexcoordGeneratorUI.SaveJson()

    jsonData['WeightsFromColorName'] = self.WeightsFromColorName
    if serializeUIComponents:
      jsonData['WeightsFromColorNameUI'] = self.WeightsFromColorNameUI.SaveJson()

    jsonData['WeightsFromColorLevel'] = self.WeightsFromColorLevel
    if serializeUIComponents:
      jsonData['WeightsFromColorLevelUI'] = self.WeightsFromColorLevelUI.SaveJson()

    jsonData['WeightsFromColorComponent'] = int(self.WeightsFromColorComponent)
    if serializeUIComponents:
      jsonData['WeightsFromColorComponentUI'] = self.WeightsFromColorComponentUI.SaveJson()

    jsonData['WeightsFromColorMultiplier'] = self.WeightsFromColorMultiplier
    if serializeUIComponents:
      jsonData['WeightsFromColorMultiplierUI'] = self.WeightsFromColorMultiplierUI.SaveJson()

    jsonData['WeightsFromColorMode'] = int(self.WeightsFromColorMode)
    if serializeUIComponents:
      jsonData['WeightsFromColorModeUI'] = self.WeightsFromColorModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseVertexWeightsInReducer' in jsonData and jsonData['UseVertexWeightsInReducer'] is not None:
      self.UseVertexWeightsInReducer = jsonData['UseVertexWeightsInReducer']

    if 'UseVertexWeightsInTexcoordGenerator' in jsonData and jsonData['UseVertexWeightsInTexcoordGenerator'] is not None:
      self.UseVertexWeightsInTexcoordGenerator = jsonData['UseVertexWeightsInTexcoordGenerator']

    if 'WeightsFromColorName' in jsonData and jsonData['WeightsFromColorName'] is not None:
      self.WeightsFromColorName = jsonData['WeightsFromColorName']

    if 'WeightsFromColorLevel' in jsonData and jsonData['WeightsFromColorLevel'] is not None:
      newWeightsFromColorLevel = jsonData['WeightsFromColorLevel']
      if newWeightsFromColorLevel >= self.WeightsFromColorLevelUI.DefaultMinValue and newWeightsFromColorLevel <= self.WeightsFromColorLevelUI.DefaultMaxValue:
        self.WeightsFromColorLevel = newWeightsFromColorLevel

      else:
        print("WeightsFromColorLevel: Invalid value", newWeightsFromColorLevel, "using default value", self.WeightsFromColorLevel)


    if 'WeightsFromColorComponent' in jsonData and jsonData['WeightsFromColorComponent'] is not None:
      self.WeightsFromColorComponent = str(jsonData['WeightsFromColorComponent'])

    if 'WeightsFromColorMultiplier' in jsonData and jsonData['WeightsFromColorMultiplier'] is not None:
      newWeightsFromColorMultiplier = jsonData['WeightsFromColorMultiplier']
      if newWeightsFromColorMultiplier >= self.WeightsFromColorMultiplierUI.DefaultMinValue and newWeightsFromColorMultiplier <= self.WeightsFromColorMultiplierUI.DefaultMaxValue:
        self.WeightsFromColorMultiplier = newWeightsFromColorMultiplier

      else:
        print("WeightsFromColorMultiplier: Invalid value", newWeightsFromColorMultiplier, "using default value", self.WeightsFromColorMultiplier)


    if 'WeightsFromColorMode' in jsonData and jsonData['WeightsFromColorMode'] is not None:
      self.WeightsFromColorMode = str(jsonData['WeightsFromColorMode'])


  def Reset(self):
    self.UseVertexWeightsInReducerUI.Reset()
    self.UseVertexWeightsInTexcoordGeneratorUI.Reset()
    self.WeightsFromColorNameUI.Reset()
    self.WeightsFromColorLevelUI.Reset()
    self.WeightsFromColorComponentUI.Reset()
    self.WeightsFromColorMultiplierUI.Reset()
    self.WeightsFromColorModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseVertexWeightsInReducerUI.IsEditEnabled = isEditEnabled
    self.UseVertexWeightsInTexcoordGeneratorUI.IsEditEnabled = isEditEnabled
    self.WeightsFromColorNameUI.IsEditEnabled = isEditEnabled
    self.WeightsFromColorLevelUI.IsEditEnabled = isEditEnabled
    self.WeightsFromColorComponentUI.IsEditEnabled = isEditEnabled
    self.WeightsFromColorMultiplierUI.IsEditEnabled = isEditEnabled
    self.WeightsFromColorModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='VertexWeightSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='VertexWeightSettings', emboss=False)

        if self.UseVertexWeightsInReducerUI.Visible:
          column.prop(self, 'UseVertexWeightsInReducer')

        if self.UseVertexWeightsInTexcoordGeneratorUI.Visible:
          column.prop(self, 'UseVertexWeightsInTexcoordGenerator')

        if self.WeightsFromColorLevelUI.Visible:
          column.prop(self, 'WeightsFromColorLevel')

        if self.WeightsFromColorNameUI.Visible:
          column.prop(self, 'WeightsFromColorName')

        if self.WeightsFromColorComponentUI.Visible:
          column.prop(self, 'WeightsFromColorComponent')

        if self.WeightsFromColorMultiplierUI.Visible:
          column.prop(self, 'WeightsFromColorMultiplier')

        if self.WeightsFromColorModeUI.Visible:
          column.prop(self, 'WeightsFromColorMode')



    else :
      if self.UseVertexWeightsInReducerUI.Visible:
        column.prop(self, 'UseVertexWeightsInReducer')

      if self.UseVertexWeightsInTexcoordGeneratorUI.Visible:
        column.prop(self, 'UseVertexWeightsInTexcoordGenerator')

      if self.WeightsFromColorLevelUI.Visible:
        column.prop(self, 'WeightsFromColorLevel')

      if self.WeightsFromColorNameUI.Visible:
        column.prop(self, 'WeightsFromColorName')

      if self.WeightsFromColorComponentUI.Visible:
        column.prop(self, 'WeightsFromColorComponent')

      if self.WeightsFromColorMultiplierUI.Visible:
        column.prop(self, 'WeightsFromColorMultiplier')

      if self.WeightsFromColorModeUI.Visible:
        column.prop(self, 'WeightsFromColorMode')




class SimplygonPipelineSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.TextureOutputPathUI.Visible: return True
    if self.SimplygonBatchPathUI.Visible: return True
    if self.OutputMaterialNameUI.Visible: return True
    if self.OutputUniqueMaterialNamesUI.Visible: return True
    if self.EmbedReferencesUI.Visible: return True
    if self.IntermediateStepUI.Visible: return True
    if self.CascadedRunModeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def TextureOutputPathUI(self):
    index = bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List[index]

    return None

  TextureOutputPath: bpy.props.StringProperty(default='',description='The path where the pipeline will save any created textures from material casters. A relative path will be treated as relative to the scene file output path if the pipeline is executed with scene file paths (RunSceneFromFile), or from the current working directory if the pipeline is executed with a scene object (RunScene). The directory must exist, it will not be created.')
  class SimplygonTextureOutputPathEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureOutputPath

    @Value.setter
    def Value(self, value):
      self.Parent.TextureOutputPath = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SimplygonBatchPathUI(self):
    index = bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List[index]

    return None

  SimplygonBatchPath: bpy.props.StringProperty(default='',description='The path for the batch tool used when executing pipelines in a new/distributed process. This should be the path to the directory where the SimplygonBatch executable is located. If the tool is in the system path this setting should be an empty string.')
  class SimplygonSimplygonBatchPathEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SimplygonBatchPath

    @Value.setter
    def Value(self, value):
      self.Parent.SimplygonBatchPath = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputMaterialNameUI(self):
    index = bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List[index]

    return None

  OutputMaterialName: bpy.props.StringProperty(default='SimplygonCastMaterial',description='The name of the output material. If the output material count is greater than one, an index separated with an underscore will be appended to the material names, such that MyMaterial becomes MyMaterial_0, MyMaterial_1 and so on.')
  class SimplygonOutputMaterialNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputMaterialName

    @Value.setter
    def Value(self, value):
      self.Parent.OutputMaterialName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputUniqueMaterialNamesUI(self):
    index = bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List[index]

    return None

  OutputUniqueMaterialNames: bpy.props.BoolProperty(default=False,description='Generate unique material names if set to true, by replacing the default scheme of appending a sequential material index to the name with appending a GUID. This will make the material names unique each time the pipeline is run, even on the same input scene.')
  class SimplygonOutputUniqueMaterialNamesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputUniqueMaterialNames

    @Value.setter
    def Value(self, value):
      self.Parent.OutputUniqueMaterialNames = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def EmbedReferencesUI(self):
    index = bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List[index]

    return None

  EmbedReferences: bpy.props.BoolProperty(default=False,description='Set flag to control if output file formats that support embedding referenced resources (like textures) should do so.')
  class SimplygonEmbedReferencesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.EmbedReferences

    @Value.setter
    def Value(self, value):
      self.Parent.EmbedReferences = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def IntermediateStepUI(self):
    index = bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List[index]

    return None

  IntermediateStep: bpy.props.BoolProperty(default=False,description='Set flag to control if this pipeline step is an intermediate step where the processed scene is only used as input to the next cascaded pipeline and not for export or further access. This will discard any processed data once all cascaded pipelines are done, and the scene will be ignored during export. Useful if you want to group two pipelines together for one output, for example an aggregation and a reduction pipeline where you only want the output from the combined aggregation + reduction.')
  class SimplygonIntermediateStepEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.IntermediateStep

    @Value.setter
    def Value(self, value):
      self.Parent.IntermediateStep = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def CascadedRunModeUI(self):
    index = bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List[index]

    return None

  CascadedRunMode: bpy.props.EnumProperty(items=[('0','RunInThisProcess', ''),('1','RunInNewProcess', ''),('2','RunDistributedUsingSimplygonGrid', ''),('3','RunDistributedUsingIncredibuild', ''),('4','RunDistributedUsingFastbuild', ''),],default='0',description='Set run mode to use for cascaded child pipelines.')
  class SimplygonCascadedRunModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CascadedRunMode

    @Value.setter
    def Value(self, value):
      self.Parent.CascadedRunMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'PipelineSettings'
    TextureOutputPathUI = bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.add()
    TextureOutputPathUI.Init(self.name)
    TextureOutputPathUI.name = self.name
    SimplygonBatchPathUI = bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.add()
    SimplygonBatchPathUI.Init(self.name)
    SimplygonBatchPathUI.name = self.name
    OutputMaterialNameUI = bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.add()
    OutputMaterialNameUI.Init(self.name)
    OutputMaterialNameUI.name = self.name
    OutputUniqueMaterialNamesUI = bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.add()
    OutputUniqueMaterialNamesUI.Init(self.name)
    OutputUniqueMaterialNamesUI.name = self.name
    EmbedReferencesUI = bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.add()
    EmbedReferencesUI.Init(self.name)
    EmbedReferencesUI.name = self.name
    IntermediateStepUI = bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.add()
    IntermediateStepUI.Init(self.name)
    IntermediateStepUI.name = self.name
    CascadedRunModeUI = bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.add()
    CascadedRunModeUI.Init(self.name)
    CascadedRunModeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'PipelineSettings'
    TextureOutputPathUI = bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.add()
    TextureOutputPathUI.InitJson(self.name, jsonData['TextureOutputPathUI'] if jsonData is not None and 'TextureOutputPathUI' in jsonData else None)
    TextureOutputPathUI.name = self.name
    SimplygonBatchPathUI = bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.add()
    SimplygonBatchPathUI.InitJson(self.name, jsonData['SimplygonBatchPathUI'] if jsonData is not None and 'SimplygonBatchPathUI' in jsonData else None)
    SimplygonBatchPathUI.name = self.name
    OutputMaterialNameUI = bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.add()
    OutputMaterialNameUI.InitJson(self.name, jsonData['OutputMaterialNameUI'] if jsonData is not None and 'OutputMaterialNameUI' in jsonData else None)
    OutputMaterialNameUI.name = self.name
    OutputUniqueMaterialNamesUI = bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.add()
    OutputUniqueMaterialNamesUI.InitJson(self.name, jsonData['OutputUniqueMaterialNamesUI'] if jsonData is not None and 'OutputUniqueMaterialNamesUI' in jsonData else None)
    OutputUniqueMaterialNamesUI.name = self.name
    EmbedReferencesUI = bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.add()
    EmbedReferencesUI.InitJson(self.name, jsonData['EmbedReferencesUI'] if jsonData is not None and 'EmbedReferencesUI' in jsonData else None)
    EmbedReferencesUI.name = self.name
    IntermediateStepUI = bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.add()
    IntermediateStepUI.InitJson(self.name, jsonData['IntermediateStepUI'] if jsonData is not None and 'IntermediateStepUI' in jsonData else None)
    IntermediateStepUI.name = self.name
    CascadedRunModeUI = bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.add()
    CascadedRunModeUI.InitJson(self.name, jsonData['CascadedRunModeUI'] if jsonData is not None and 'CascadedRunModeUI' in jsonData else None)
    CascadedRunModeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    TextureOutputPathUI_index = bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.find(self.name)
    bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.remove(TextureOutputPathUI_index)
    SimplygonBatchPathUI_index = bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.find(self.name)
    bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.remove(SimplygonBatchPathUI_index)
    OutputMaterialNameUI_index = bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.find(self.name)
    bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.remove(OutputMaterialNameUI_index)
    OutputUniqueMaterialNamesUI_index = bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.find(self.name)
    bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.remove(OutputUniqueMaterialNamesUI_index)
    EmbedReferencesUI_index = bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.find(self.name)
    bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.remove(EmbedReferencesUI_index)
    IntermediateStepUI_index = bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.find(self.name)
    bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.remove(IntermediateStepUI_index)
    CascadedRunModeUI_index = bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.find(self.name)
    bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.remove(CascadedRunModeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['TextureOutputPath'] = self.TextureOutputPath
    if serializeUIComponents:
      jsonData['TextureOutputPathUI'] = self.TextureOutputPathUI.SaveJson()

    jsonData['SimplygonBatchPath'] = self.SimplygonBatchPath
    if serializeUIComponents:
      jsonData['SimplygonBatchPathUI'] = self.SimplygonBatchPathUI.SaveJson()

    jsonData['OutputMaterialName'] = self.OutputMaterialName
    if serializeUIComponents:
      jsonData['OutputMaterialNameUI'] = self.OutputMaterialNameUI.SaveJson()

    jsonData['OutputUniqueMaterialNames'] = self.OutputUniqueMaterialNames
    if serializeUIComponents:
      jsonData['OutputUniqueMaterialNamesUI'] = self.OutputUniqueMaterialNamesUI.SaveJson()

    jsonData['EmbedReferences'] = self.EmbedReferences
    if serializeUIComponents:
      jsonData['EmbedReferencesUI'] = self.EmbedReferencesUI.SaveJson()

    jsonData['IntermediateStep'] = self.IntermediateStep
    if serializeUIComponents:
      jsonData['IntermediateStepUI'] = self.IntermediateStepUI.SaveJson()

    jsonData['CascadedRunMode'] = int(self.CascadedRunMode)
    if serializeUIComponents:
      jsonData['CascadedRunModeUI'] = self.CascadedRunModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'TextureOutputPath' in jsonData and jsonData['TextureOutputPath'] is not None:
      self.TextureOutputPath = jsonData['TextureOutputPath']

    if 'SimplygonBatchPath' in jsonData and jsonData['SimplygonBatchPath'] is not None:
      self.SimplygonBatchPath = jsonData['SimplygonBatchPath']

    if 'OutputMaterialName' in jsonData and jsonData['OutputMaterialName'] is not None:
      self.OutputMaterialName = jsonData['OutputMaterialName']

    if 'OutputUniqueMaterialNames' in jsonData and jsonData['OutputUniqueMaterialNames'] is not None:
      self.OutputUniqueMaterialNames = jsonData['OutputUniqueMaterialNames']

    if 'EmbedReferences' in jsonData and jsonData['EmbedReferences'] is not None:
      self.EmbedReferences = jsonData['EmbedReferences']

    if 'IntermediateStep' in jsonData and jsonData['IntermediateStep'] is not None:
      self.IntermediateStep = jsonData['IntermediateStep']

    if 'CascadedRunMode' in jsonData and jsonData['CascadedRunMode'] is not None:
      self.CascadedRunMode = str(jsonData['CascadedRunMode'])


  def Reset(self):
    self.TextureOutputPathUI.Reset()
    self.SimplygonBatchPathUI.Reset()
    self.OutputMaterialNameUI.Reset()
    self.OutputUniqueMaterialNamesUI.Reset()
    self.EmbedReferencesUI.Reset()
    self.IntermediateStepUI.Reset()
    self.CascadedRunModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.TextureOutputPathUI.IsEditEnabled = isEditEnabled
    self.SimplygonBatchPathUI.IsEditEnabled = isEditEnabled
    self.OutputMaterialNameUI.IsEditEnabled = isEditEnabled
    self.OutputUniqueMaterialNamesUI.IsEditEnabled = isEditEnabled
    self.EmbedReferencesUI.IsEditEnabled = isEditEnabled
    self.IntermediateStepUI.IsEditEnabled = isEditEnabled
    self.CascadedRunModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='PipelineSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='PipelineSettings', emboss=False)

        if self.TextureOutputPathUI.Visible:
          column.prop(self, 'TextureOutputPath')

        if self.SimplygonBatchPathUI.Visible:
          column.prop(self, 'SimplygonBatchPath')

        if self.OutputMaterialNameUI.Visible:
          column.prop(self, 'OutputMaterialName')

        if self.OutputUniqueMaterialNamesUI.Visible:
          column.prop(self, 'OutputUniqueMaterialNames')

        if self.EmbedReferencesUI.Visible:
          column.prop(self, 'EmbedReferences')

        if self.IntermediateStepUI.Visible:
          column.prop(self, 'IntermediateStep')

        if self.CascadedRunModeUI.Visible:
          column.prop(self, 'CascadedRunMode')



    else :
      if self.TextureOutputPathUI.Visible:
        column.prop(self, 'TextureOutputPath')

      if self.SimplygonBatchPathUI.Visible:
        column.prop(self, 'SimplygonBatchPath')

      if self.OutputMaterialNameUI.Visible:
        column.prop(self, 'OutputMaterialName')

      if self.OutputUniqueMaterialNamesUI.Visible:
        column.prop(self, 'OutputUniqueMaterialNames')

      if self.EmbedReferencesUI.Visible:
        column.prop(self, 'EmbedReferences')

      if self.IntermediateStepUI.Visible:
        column.prop(self, 'IntermediateStep')

      if self.CascadedRunModeUI.Visible:
        column.prop(self, 'CascadedRunMode')




class SimplygonMappingImageInputMaterialSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialMappingUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  Parent_id: bpy.props.StringProperty()
  @property
  def Parent(self):
    index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

    return None

  @property
  def MaterialMappingUI(self):
    index = bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List[index]

    return None

  MaterialMapping: bpy.props.IntProperty(default=-1,min=-1,max=10,description='The material mapping for the input material this setting object corresponds to, meaning what material of the generated LOD the corresponding input material will be baked into. Both InputMaterialCount and OutputMaterialCount need to be set for this mapping to work, and all original materials need to be mapped to an existing output id.')
  class SimplygonMaterialMappingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialMapping

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialMapping = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaterialMapping: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaterialMapping: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self, parentId):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'InputMaterialSettings'
    MaterialMappingUI = bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.add()
    MaterialMappingUI.Init(self.name)
    MaterialMappingUI.name = self.name

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'InputMaterialSettings'
    MaterialMappingUI = bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.add()
    MaterialMappingUI.InitJson(self.name, jsonData['MaterialMappingUI'] if jsonData is not None and 'MaterialMappingUI' in jsonData else None)
    MaterialMappingUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialMappingUI_index = bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.find(self.name)
    bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.remove(MaterialMappingUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialMapping'] = self.MaterialMapping
    if serializeUIComponents:
      jsonData['MaterialMappingUI'] = self.MaterialMappingUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialMapping' in jsonData and jsonData['MaterialMapping'] is not None:
      newMaterialMapping = jsonData['MaterialMapping']
      if newMaterialMapping >= self.MaterialMappingUI.DefaultMinValue and newMaterialMapping <= self.MaterialMappingUI.DefaultMaxValue:
        self.MaterialMapping = newMaterialMapping

      else:
        print("MaterialMapping: Invalid value", newMaterialMapping, "using default value", self.MaterialMapping)



  def Reset(self):
    self.MaterialMappingUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialMappingUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='InputMaterialSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='InputMaterialSettings', emboss=False)

        if self.MaterialMappingUI.Visible:
          column.prop(self, 'MaterialMapping')



    else :
      if self.MaterialMappingUI.Visible:
        column.prop(self, 'MaterialMapping')




class SimplygonMappingImageOutputMaterialSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.TextureWidthUI.Visible: return True
    if self.TextureHeightUI.Visible: return True
    if self.MultisamplingLevelUI.Visible: return True
    if self.GutterSpaceUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  Parent_id: bpy.props.StringProperty()
  @property
  def Parent(self):
    index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

    return None

  @property
  def TextureWidthUI(self):
    index = bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List[index]

    return None

  TextureWidth: bpy.props.IntProperty(default=1024,min=0,max=8192,description='The width of the texture of the output mapping image.')
  class SimplygonTextureWidthEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureWidth

    @Value.setter
    def Value(self, value):
      self.Parent.TextureWidth = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 8192
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 8192
      self.TicksFrequencyValue = 256
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TextureWidth: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 8192
      self.DefaultMaxValue = 8192
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TextureWidth: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 256

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TextureHeightUI(self):
    index = bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List[index]

    return None

  TextureHeight: bpy.props.IntProperty(default=1024,min=0,max=8192,description='The height of the texture of the output mapping image.')
  class SimplygonTextureHeightEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureHeight

    @Value.setter
    def Value(self, value):
      self.Parent.TextureHeight = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 8192
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 8192
      self.TicksFrequencyValue = 256
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TextureHeight: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 8192
      self.DefaultMaxValue = 8192
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TextureHeight: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 256

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MultisamplingLevelUI(self):
    index = bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List[index]

    return None

  MultisamplingLevel: bpy.props.IntProperty(default=2,min=1,max=8,description='The multi-sampling level of the output mapping image. Values 1-8 are accepted.')
  class SimplygonMultisamplingLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MultisamplingLevel

    @Value.setter
    def Value(self, value):
      self.Parent.MultisamplingLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 1
      self.MaxValue = 8
      self.DefaultMinValue = 1
      self.DefaultMaxValue = 8
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 1
      self.DefaultMinValue = 1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MultisamplingLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 8
      self.DefaultMaxValue = 8
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MultisamplingLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GutterSpaceUI(self):
    index = bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List[index]

    return None

  GutterSpace: bpy.props.IntProperty(default=4,min=1,max=10,description='The minimum number of pixels between charts of the output mapping image.')
  class SimplygonGutterSpaceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GutterSpace

    @Value.setter
    def Value(self, value):
      self.Parent.GutterSpace = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 1
      self.MaxValue = 10
      self.DefaultMinValue = 1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 1
      self.DefaultMinValue = 1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GutterSpace: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GutterSpace: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self, parentId):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OutputMaterialSettings'
    TextureWidthUI = bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    MultisamplingLevelUI = bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.add()
    MultisamplingLevelUI.Init(self.name)
    MultisamplingLevelUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.add()
    GutterSpaceUI.Init(self.name)
    GutterSpaceUI.name = self.name

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OutputMaterialSettings'
    TextureWidthUI = bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.add()
    TextureWidthUI.InitJson(self.name, jsonData['TextureWidthUI'] if jsonData is not None and 'TextureWidthUI' in jsonData else None)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.add()
    TextureHeightUI.InitJson(self.name, jsonData['TextureHeightUI'] if jsonData is not None and 'TextureHeightUI' in jsonData else None)
    TextureHeightUI.name = self.name
    MultisamplingLevelUI = bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.add()
    MultisamplingLevelUI.InitJson(self.name, jsonData['MultisamplingLevelUI'] if jsonData is not None and 'MultisamplingLevelUI' in jsonData else None)
    MultisamplingLevelUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.add()
    GutterSpaceUI.InitJson(self.name, jsonData['GutterSpaceUI'] if jsonData is not None and 'GutterSpaceUI' in jsonData else None)
    GutterSpaceUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    TextureWidthUI_index = bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.find(self.name)
    bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.find(self.name)
    bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.remove(TextureHeightUI_index)
    MultisamplingLevelUI_index = bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.find(self.name)
    bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.remove(MultisamplingLevelUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.find(self.name)
    bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.remove(GutterSpaceUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['TextureWidth'] = self.TextureWidth
    if serializeUIComponents:
      jsonData['TextureWidthUI'] = self.TextureWidthUI.SaveJson()

    jsonData['TextureHeight'] = self.TextureHeight
    if serializeUIComponents:
      jsonData['TextureHeightUI'] = self.TextureHeightUI.SaveJson()

    jsonData['MultisamplingLevel'] = self.MultisamplingLevel
    if serializeUIComponents:
      jsonData['MultisamplingLevelUI'] = self.MultisamplingLevelUI.SaveJson()

    jsonData['GutterSpace'] = self.GutterSpace
    if serializeUIComponents:
      jsonData['GutterSpaceUI'] = self.GutterSpaceUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'TextureWidth' in jsonData and jsonData['TextureWidth'] is not None:
      newTextureWidth = jsonData['TextureWidth']
      if newTextureWidth >= self.TextureWidthUI.DefaultMinValue and newTextureWidth <= self.TextureWidthUI.DefaultMaxValue:
        self.TextureWidth = newTextureWidth

      else:
        print("TextureWidth: Invalid value", newTextureWidth, "using default value", self.TextureWidth)


    if 'TextureHeight' in jsonData and jsonData['TextureHeight'] is not None:
      newTextureHeight = jsonData['TextureHeight']
      if newTextureHeight >= self.TextureHeightUI.DefaultMinValue and newTextureHeight <= self.TextureHeightUI.DefaultMaxValue:
        self.TextureHeight = newTextureHeight

      else:
        print("TextureHeight: Invalid value", newTextureHeight, "using default value", self.TextureHeight)


    if 'MultisamplingLevel' in jsonData and jsonData['MultisamplingLevel'] is not None:
      newMultisamplingLevel = jsonData['MultisamplingLevel']
      if newMultisamplingLevel >= self.MultisamplingLevelUI.DefaultMinValue and newMultisamplingLevel <= self.MultisamplingLevelUI.DefaultMaxValue:
        self.MultisamplingLevel = newMultisamplingLevel

      else:
        print("MultisamplingLevel: Invalid value", newMultisamplingLevel, "using default value", self.MultisamplingLevel)


    if 'GutterSpace' in jsonData and jsonData['GutterSpace'] is not None:
      newGutterSpace = jsonData['GutterSpace']
      if newGutterSpace >= self.GutterSpaceUI.DefaultMinValue and newGutterSpace <= self.GutterSpaceUI.DefaultMaxValue:
        self.GutterSpace = newGutterSpace

      else:
        print("GutterSpace: Invalid value", newGutterSpace, "using default value", self.GutterSpace)



  def Reset(self):
    self.TextureWidthUI.Reset()
    self.TextureHeightUI.Reset()
    self.MultisamplingLevelUI.Reset()
    self.GutterSpaceUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.TextureWidthUI.IsEditEnabled = isEditEnabled
    self.TextureHeightUI.IsEditEnabled = isEditEnabled
    self.MultisamplingLevelUI.IsEditEnabled = isEditEnabled
    self.GutterSpaceUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='OutputMaterialSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='OutputMaterialSettings', emboss=False)

        if self.TextureWidthUI.Visible:
          column.prop(self, 'TextureWidth')

        if self.TextureHeightUI.Visible:
          column.prop(self, 'TextureHeight')

        if self.MultisamplingLevelUI.Visible:
          column.prop(self, 'MultisamplingLevel')

        if self.GutterSpaceUI.Visible:
          column.prop(self, 'GutterSpace')



    else :
      if self.TextureWidthUI.Visible:
        column.prop(self, 'TextureWidth')

      if self.TextureHeightUI.Visible:
        column.prop(self, 'TextureHeight')

      if self.MultisamplingLevelUI.Visible:
        column.prop(self, 'MultisamplingLevel')

      if self.GutterSpaceUI.Visible:
        column.prop(self, 'GutterSpace')




class SimplygonChartAggregatorSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  @property
  def Visible(self):
    if self.Parent.TexCoordGeneratorTypeUI is not None:
      return self.Parent.TexCoordGeneratorType == str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator)) and self.Parent.TexCoordGeneratorTypeUI.Visible

    else:
      return self.visible


  @Visible.setter
  def Visible(self, value):
    pass

  Parent_id: bpy.props.StringProperty()
  @property
  def Parent(self):
    index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

    return None

  @property
  def ChartAggregatorModeUI(self):
    index = bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List[index]

    return None

  ChartAggregatorMode: bpy.props.EnumProperty(items=[('0','TextureSizeProportions', ''),('1','SurfaceArea', ''),('2','OriginalPixelDensity', ''),('3','UVSizeProportions', ''),],default='0',description='Determines which method to use when aggregating the UVs. TextureSizeProportions - Aggregated UV charts will be scaled to keep their relative pixel density relative to all other UV charts. The user can still set the size of the output texture maps. SurfaceArea - Aggregated UV charts will have their size set based on its actual geometrical size. OriginalPixelDensity - The combined atlas will be resized to fit each chart so that all charts retain the same amount of pixels as they originally had. This will override any manually set texture size. UVSizeProportions - Aggregated UV charts will have their size set based on its original UV size, disregarding the size of the texture they are used in.')
  class SimplygonChartAggregatorModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ChartAggregatorMode

    @Value.setter
    def Value(self, value):
      self.Parent.ChartAggregatorMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SurfaceAreaScaleUI(self):
    index = bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List[index]

    return None

  SurfaceAreaScale: bpy.props.EnumProperty(items=[('0','LargestInstance', ''),('1','SmallestInstance', ''),('2','Average', ''),],default='0',description='If multiple UV charts overlap and have the same material, SurfaceAreaScale specifies which of those instances determines the the output scale. It is only valid when the ChartAggregatorMode is SurfaceArea and SeparateOverlappingCharts is false.')
  class SimplygonSurfaceAreaScaleEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SurfaceAreaScale

    @Value.setter
    def Value(self, value):
      self.Parent.SurfaceAreaScale = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OriginalTexCoordLevelUI(self):
    index = bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List[index]

    return None

  OriginalTexCoordLevel: bpy.props.IntProperty(default=0,min=-1,max=10,description='Only used when the TexCoordGeneratorType is ChartAggregator. Set the texture coordinate level to get charts from. If the ChartAggregatorOriginalTexCoordName ha been set, the ChartAggregatorOriginalTexCoordLevel is not used.')
  class SimplygonOriginalTexCoordLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OriginalTexCoordLevel

    @Value.setter
    def Value(self, value):
      self.Parent.OriginalTexCoordLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OriginalTexCoordLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OriginalTexCoordLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OriginalTexCoordNameUI(self):
    index = bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List[index]

    return None

  OriginalTexCoordName: bpy.props.StringProperty(default='',description='Only used when the TexCoordGeneratorType is ChartAggregator. Set the name of the texture coordinate level to get charts from. If not set, it will use the ChartAggregatorOriginalTexCoordLevel (index) instead.')
  class SimplygonOriginalTexCoordNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OriginalTexCoordName

    @Value.setter
    def Value(self, value):
      self.Parent.OriginalTexCoordName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SeparateOverlappingChartsUI(self):
    index = bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List[index]

    return None

  SeparateOverlappingCharts: bpy.props.BoolProperty(default=False,description='Only used when the TexCoordGeneratorType is ChartAggregator. If set, charts that are overlapping in the original texture coords will be separated.')
  class SimplygonSeparateOverlappingChartsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateOverlappingCharts

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateOverlappingCharts = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OriginalChartProportionsChannelUI(self):
    index = bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List[index]

    return None

  OriginalChartProportionsChannel: bpy.props.StringProperty(default='Diffuse',description='Only used when the TexCoordGeneratorType is ChartAggregator. Set ChartAggregatorKeepOriginalChartProportionsFromChannel to an SG_MATERIAL_CHANNEL_[...]. This channel determines which texture channel to look at when determining which chart proportions to keep.')
  class SimplygonOriginalChartProportionsChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OriginalChartProportionsChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OriginalChartProportionsChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def LockUVRotationUI(self):
    index = bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List[index]

    return None

  LockUVRotation: bpy.props.BoolProperty(default=False,description='Only used when the TexCoordGeneratorType is ChartAggregator. If ChartAggregatorLockUVRotation is enabled, only the original UV rotation will be used. Otherwise 4 rotations are used (90 degree rotations).')
  class SimplygonLockUVRotationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LockUVRotation

    @Value.setter
    def Value(self, value):
      self.Parent.LockUVRotation = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self, parentId):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ChartAggregatorSettings'
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    SurfaceAreaScaleUI = bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.add()
    SurfaceAreaScaleUI.Init(self.name)
    SurfaceAreaScaleUI.name = self.name
    OriginalTexCoordLevelUI = bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.add()
    OriginalTexCoordLevelUI.Init(self.name)
    OriginalTexCoordLevelUI.name = self.name
    OriginalTexCoordNameUI = bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.add()
    OriginalTexCoordNameUI.Init(self.name)
    OriginalTexCoordNameUI.name = self.name
    SeparateOverlappingChartsUI = bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.add()
    SeparateOverlappingChartsUI.Init(self.name)
    SeparateOverlappingChartsUI.name = self.name
    OriginalChartProportionsChannelUI = bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.add()
    OriginalChartProportionsChannelUI.Init(self.name)
    OriginalChartProportionsChannelUI.name = self.name
    LockUVRotationUI = bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.add()
    LockUVRotationUI.Init(self.name)
    LockUVRotationUI.name = self.name

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ChartAggregatorSettings'
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.add()
    ChartAggregatorModeUI.InitJson(self.name, jsonData['ChartAggregatorModeUI'] if jsonData is not None and 'ChartAggregatorModeUI' in jsonData else None)
    ChartAggregatorModeUI.name = self.name
    SurfaceAreaScaleUI = bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.add()
    SurfaceAreaScaleUI.InitJson(self.name, jsonData['SurfaceAreaScaleUI'] if jsonData is not None and 'SurfaceAreaScaleUI' in jsonData else None)
    SurfaceAreaScaleUI.name = self.name
    OriginalTexCoordLevelUI = bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.add()
    OriginalTexCoordLevelUI.InitJson(self.name, jsonData['OriginalTexCoordLevelUI'] if jsonData is not None and 'OriginalTexCoordLevelUI' in jsonData else None)
    OriginalTexCoordLevelUI.name = self.name
    OriginalTexCoordNameUI = bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.add()
    OriginalTexCoordNameUI.InitJson(self.name, jsonData['OriginalTexCoordNameUI'] if jsonData is not None and 'OriginalTexCoordNameUI' in jsonData else None)
    OriginalTexCoordNameUI.name = self.name
    SeparateOverlappingChartsUI = bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.add()
    SeparateOverlappingChartsUI.InitJson(self.name, jsonData['SeparateOverlappingChartsUI'] if jsonData is not None and 'SeparateOverlappingChartsUI' in jsonData else None)
    SeparateOverlappingChartsUI.name = self.name
    OriginalChartProportionsChannelUI = bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.add()
    OriginalChartProportionsChannelUI.InitJson(self.name, jsonData['OriginalChartProportionsChannelUI'] if jsonData is not None and 'OriginalChartProportionsChannelUI' in jsonData else None)
    OriginalChartProportionsChannelUI.name = self.name
    LockUVRotationUI = bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.add()
    LockUVRotationUI.InitJson(self.name, jsonData['LockUVRotationUI'] if jsonData is not None and 'LockUVRotationUI' in jsonData else None)
    LockUVRotationUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    ChartAggregatorModeUI_index = bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.find(self.name)
    bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.remove(ChartAggregatorModeUI_index)
    SurfaceAreaScaleUI_index = bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.find(self.name)
    bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.remove(SurfaceAreaScaleUI_index)
    OriginalTexCoordLevelUI_index = bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.find(self.name)
    bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.remove(OriginalTexCoordLevelUI_index)
    OriginalTexCoordNameUI_index = bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.find(self.name)
    bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.remove(OriginalTexCoordNameUI_index)
    SeparateOverlappingChartsUI_index = bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.find(self.name)
    bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.remove(SeparateOverlappingChartsUI_index)
    OriginalChartProportionsChannelUI_index = bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.find(self.name)
    bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.remove(OriginalChartProportionsChannelUI_index)
    LockUVRotationUI_index = bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.find(self.name)
    bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.remove(LockUVRotationUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['ChartAggregatorMode'] = int(self.ChartAggregatorMode)
    if serializeUIComponents:
      jsonData['ChartAggregatorModeUI'] = self.ChartAggregatorModeUI.SaveJson()

    jsonData['SurfaceAreaScale'] = int(self.SurfaceAreaScale)
    if serializeUIComponents:
      jsonData['SurfaceAreaScaleUI'] = self.SurfaceAreaScaleUI.SaveJson()

    jsonData['OriginalTexCoordLevel'] = self.OriginalTexCoordLevel
    if serializeUIComponents:
      jsonData['OriginalTexCoordLevelUI'] = self.OriginalTexCoordLevelUI.SaveJson()

    jsonData['OriginalTexCoordName'] = self.OriginalTexCoordName
    if serializeUIComponents:
      jsonData['OriginalTexCoordNameUI'] = self.OriginalTexCoordNameUI.SaveJson()

    jsonData['SeparateOverlappingCharts'] = self.SeparateOverlappingCharts
    if serializeUIComponents:
      jsonData['SeparateOverlappingChartsUI'] = self.SeparateOverlappingChartsUI.SaveJson()

    jsonData['OriginalChartProportionsChannel'] = self.OriginalChartProportionsChannel
    if serializeUIComponents:
      jsonData['OriginalChartProportionsChannelUI'] = self.OriginalChartProportionsChannelUI.SaveJson()

    jsonData['LockUVRotation'] = self.LockUVRotation
    if serializeUIComponents:
      jsonData['LockUVRotationUI'] = self.LockUVRotationUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'ChartAggregatorMode' in jsonData and jsonData['ChartAggregatorMode'] is not None:
      self.ChartAggregatorMode = str(jsonData['ChartAggregatorMode'])

    if 'SurfaceAreaScale' in jsonData and jsonData['SurfaceAreaScale'] is not None:
      self.SurfaceAreaScale = str(jsonData['SurfaceAreaScale'])

    if 'OriginalTexCoordLevel' in jsonData and jsonData['OriginalTexCoordLevel'] is not None:
      newOriginalTexCoordLevel = jsonData['OriginalTexCoordLevel']
      if newOriginalTexCoordLevel >= self.OriginalTexCoordLevelUI.DefaultMinValue and newOriginalTexCoordLevel <= self.OriginalTexCoordLevelUI.DefaultMaxValue:
        self.OriginalTexCoordLevel = newOriginalTexCoordLevel

      else:
        print("OriginalTexCoordLevel: Invalid value", newOriginalTexCoordLevel, "using default value", self.OriginalTexCoordLevel)


    if 'OriginalTexCoordName' in jsonData and jsonData['OriginalTexCoordName'] is not None:
      self.OriginalTexCoordName = jsonData['OriginalTexCoordName']

    if 'SeparateOverlappingCharts' in jsonData and jsonData['SeparateOverlappingCharts'] is not None:
      self.SeparateOverlappingCharts = jsonData['SeparateOverlappingCharts']

    if 'OriginalChartProportionsChannel' in jsonData and jsonData['OriginalChartProportionsChannel'] is not None:
      self.OriginalChartProportionsChannel = jsonData['OriginalChartProportionsChannel']

    if 'LockUVRotation' in jsonData and jsonData['LockUVRotation'] is not None:
      self.LockUVRotation = jsonData['LockUVRotation']


  def Reset(self):
    self.ChartAggregatorModeUI.Reset()
    self.SurfaceAreaScaleUI.Reset()
    self.OriginalTexCoordLevelUI.Reset()
    self.OriginalTexCoordNameUI.Reset()
    self.SeparateOverlappingChartsUI.Reset()
    self.OriginalChartProportionsChannelUI.Reset()
    self.LockUVRotationUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.ChartAggregatorModeUI.IsEditEnabled = isEditEnabled
    self.SurfaceAreaScaleUI.IsEditEnabled = isEditEnabled
    self.OriginalTexCoordLevelUI.IsEditEnabled = isEditEnabled
    self.OriginalTexCoordNameUI.IsEditEnabled = isEditEnabled
    self.SeparateOverlappingChartsUI.IsEditEnabled = isEditEnabled
    self.OriginalChartProportionsChannelUI.IsEditEnabled = isEditEnabled
    self.LockUVRotationUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='ChartAggregatorSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='ChartAggregatorSettings', emboss=False)

        if self.ChartAggregatorModeUI.Visible:
          column.prop(self, 'ChartAggregatorMode')

        if self.SurfaceAreaScaleUI.Visible:
          column.prop(self, 'SurfaceAreaScale')

        if self.OriginalTexCoordLevelUI.Visible:
          column.prop(self, 'OriginalTexCoordLevel')

        if self.OriginalTexCoordNameUI.Visible:
          column.prop(self, 'OriginalTexCoordName')

        if self.SeparateOverlappingChartsUI.Visible:
          column.prop(self, 'SeparateOverlappingCharts')

        if self.OriginalChartProportionsChannelUI.Visible:
          column.prop(self, 'OriginalChartProportionsChannel')

        if self.LockUVRotationUI.Visible:
          column.prop(self, 'LockUVRotation')



    else :
      if self.ChartAggregatorModeUI.Visible:
        column.prop(self, 'ChartAggregatorMode')

      if self.SurfaceAreaScaleUI.Visible:
        column.prop(self, 'SurfaceAreaScale')

      if self.OriginalTexCoordLevelUI.Visible:
        column.prop(self, 'OriginalTexCoordLevel')

      if self.OriginalTexCoordNameUI.Visible:
        column.prop(self, 'OriginalTexCoordName')

      if self.SeparateOverlappingChartsUI.Visible:
        column.prop(self, 'SeparateOverlappingCharts')

      if self.OriginalChartProportionsChannelUI.Visible:
        column.prop(self, 'OriginalChartProportionsChannel')

      if self.LockUVRotationUI.Visible:
        column.prop(self, 'LockUVRotation')




class SimplygonParameterizerSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  @property
  def Visible(self):
    if self.Parent.TexCoordGeneratorTypeUI is not None:
      return self.Parent.TexCoordGeneratorType == str(int(Simplygon.ETexcoordGeneratorType_Parameterizer)) and self.Parent.TexCoordGeneratorTypeUI.Visible

    else:
      return self.visible


  @Visible.setter
  def Visible(self, value):
    pass

  Parent_id: bpy.props.StringProperty()
  @property
  def Parent(self):
    index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

    return None

  @property
  def MaxStretchUI(self):
    index = bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List[index]

    return None

  MaxStretch: bpy.props.FloatProperty(default=0.33,min=0,max=1,description='Only used when the TexCoordGeneratorType is Parameterizer. The maximum allowed texture stretch. Range 0->1.')
  class SimplygonMaxStretchEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaxStretch

    @Value.setter
    def Value(self, value):
      self.Parent.MaxStretch = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaxStretch: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaxStretch: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def LargeChartsImportanceUI(self):
    index = bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List[index]

    return None

  LargeChartsImportance: bpy.props.FloatProperty(default=0.2,min=0,max=1,description='Only used when the TexCoordGeneratorType is Parameterizer. The importance value for trying to have as large and few charts as possible. The closer the value is to 1, the slower it is. Having 0 means no extra focus will be put on reducing the number of charts. Having value 1 means maximum focus will be put on reducing the number of charts and thereby increasing the size of the charts.')
  class SimplygonLargeChartsImportanceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LargeChartsImportance

    @Value.setter
    def Value(self, value):
      self.Parent.LargeChartsImportance = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("LargeChartsImportance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("LargeChartsImportance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self, parentId):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ParameterizerSettings'
    MaxStretchUI = bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.add()
    MaxStretchUI.Init(self.name)
    MaxStretchUI.name = self.name
    LargeChartsImportanceUI = bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.add()
    LargeChartsImportanceUI.Init(self.name)
    LargeChartsImportanceUI.name = self.name

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ParameterizerSettings'
    MaxStretchUI = bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.add()
    MaxStretchUI.InitJson(self.name, jsonData['MaxStretchUI'] if jsonData is not None and 'MaxStretchUI' in jsonData else None)
    MaxStretchUI.name = self.name
    LargeChartsImportanceUI = bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.add()
    LargeChartsImportanceUI.InitJson(self.name, jsonData['LargeChartsImportanceUI'] if jsonData is not None and 'LargeChartsImportanceUI' in jsonData else None)
    LargeChartsImportanceUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaxStretchUI_index = bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.find(self.name)
    bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.remove(MaxStretchUI_index)
    LargeChartsImportanceUI_index = bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.find(self.name)
    bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.remove(LargeChartsImportanceUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaxStretch'] = self.MaxStretch
    if serializeUIComponents:
      jsonData['MaxStretchUI'] = self.MaxStretchUI.SaveJson()

    jsonData['LargeChartsImportance'] = self.LargeChartsImportance
    if serializeUIComponents:
      jsonData['LargeChartsImportanceUI'] = self.LargeChartsImportanceUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaxStretch' in jsonData and jsonData['MaxStretch'] is not None:
      newMaxStretch = jsonData['MaxStretch']
      if newMaxStretch >= self.MaxStretchUI.DefaultMinValue and newMaxStretch <= self.MaxStretchUI.DefaultMaxValue:
        self.MaxStretch = newMaxStretch

      else:
        print("MaxStretch: Invalid value", newMaxStretch, "using default value", self.MaxStretch)


    if 'LargeChartsImportance' in jsonData and jsonData['LargeChartsImportance'] is not None:
      newLargeChartsImportance = jsonData['LargeChartsImportance']
      if newLargeChartsImportance >= self.LargeChartsImportanceUI.DefaultMinValue and newLargeChartsImportance <= self.LargeChartsImportanceUI.DefaultMaxValue:
        self.LargeChartsImportance = newLargeChartsImportance

      else:
        print("LargeChartsImportance: Invalid value", newLargeChartsImportance, "using default value", self.LargeChartsImportance)



  def Reset(self):
    self.MaxStretchUI.Reset()
    self.LargeChartsImportanceUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaxStretchUI.IsEditEnabled = isEditEnabled
    self.LargeChartsImportanceUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='ParameterizerSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='ParameterizerSettings', emboss=False)

        if self.MaxStretchUI.Visible:
          column.prop(self, 'MaxStretch')

        if self.LargeChartsImportanceUI.Visible:
          column.prop(self, 'LargeChartsImportance')



    else :
      if self.MaxStretchUI.Visible:
        column.prop(self, 'MaxStretch')

      if self.LargeChartsImportanceUI.Visible:
        column.prop(self, 'LargeChartsImportance')




class SimplygonMappingImageSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.GenerateMappingImageUI.Visible: return True
    if self.GenerateTexCoordsUI.Visible: return True
    if self.GenerateTangentsUI.Visible: return True
    if self.MaximumLayersUI.Visible: return True
    if self.UseFullRetexturingUI.Visible: return True
    if self.ApplyNewMaterialIdsUI.Visible: return True
    if self.AllowTransparencyMappingUI.Visible: return True
    if self.TexCoordLevelUI.Visible: return True
    if self.TexCoordNameUI.Visible: return True
    if self.UseAutomaticTextureSizeUI.Visible: return True
    if self.AutomaticTextureSizeMultiplierUI.Visible: return True
    if self.ForcePower2TextureUI.Visible: return True
    if self.TexCoordGeneratorTypeUI.Visible: return True
    if self.OnlyParameterizeInvalidUVsUI.Visible: return True

    if self.InputMaterialSettings is not None and self.InputMaterialSettings.Visible: return True
    if self.OutputMaterialSettings is not None and self.OutputMaterialSettings.Visible: return True
    if self.ChartAggregatorSettings is not None and self.ChartAggregatorSettings.Visible: return True
    if self.ParameterizerSettings is not None and self.ParameterizerSettings.Visible: return True
    return False

  @Visible.setter
  def Visible(self, value):
    pass

  InputMaterialSettings_id: bpy.props.StringProperty()
  @property
  def InputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.find(self.InputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List[index]

    return None

  OutputMaterialSettings_id: bpy.props.StringProperty()
  @property
  def OutputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.OutputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

    return None

  ChartAggregatorSettings_id: bpy.props.StringProperty()
  @property
  def ChartAggregatorSettings(self):
    index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.ChartAggregatorSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

    return None

  ParameterizerSettings_id: bpy.props.StringProperty()
  @property
  def ParameterizerSettings(self):
    index = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.find(self.ParameterizerSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List[index]

    return None

  @property
  def GenerateMappingImageUI(self):
    index = bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List[index]

    return None

  GenerateMappingImage: bpy.props.BoolProperty(default=False,description='If set, the aggregation processor, reduction processor, or remeshing processor will create a mapping image that maps triangles on the reduced geometry back to triangles on the original geometry. The texture is insert into the MappingImage object. The image data will contain two fields: * RidArray, ´TriangleIds´, TupleSize:1, The id of the triangle  * UnsignedShortArray, ´BarycentricCoords´, TupleSize:2, Items A & B of the barycentric coordinate on the triangle. The user can control the size of the mapped texture using the values MappingTextureWidth and MappingTextureHeight.')
  class SimplygonGenerateMappingImageEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateMappingImage

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateMappingImage = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GenerateTexCoordsUI(self):
    index = bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List[index]

    return None

  GenerateTexCoords: bpy.props.BoolProperty(default=False,description='If true, generates a new texcoords field at the position specified by TexCoordLevel. Will be ignored and always generate texcoords if none are available in the Geometry if GenerateMappingImage is enabled.')
  class SimplygonGenerateTexCoordsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateTexCoords

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateTexCoords = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GenerateTangentsUI(self):
    index = bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List[index]

    return None

  GenerateTangents: bpy.props.BoolProperty(default=False,description='If true, generates a new tangent space fields at position specified by TexCoordLevel, based on the vertex normals and texture coordinates. Tangent space fields will always be created if missing, and GenerateMappingImage is enabled. If GenerateTexCoords is enabled, new tangents will always be generated.')
  class SimplygonGenerateTangentsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateTangents

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateTangents = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def MaximumLayersUI(self):
    index = bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List[index]

    return None

  MaximumLayers: bpy.props.IntProperty(default=3,min=0,max=10,description='The maximum number of layers in the mapping image. If a remeshed geometry has a lot of transparent triangles, use a higher number to be able to find intersections on the inside of parts of the geometry. This setting only has effect in the remeshing, when running reduction the number of layers is always 1.')
  class SimplygonMaximumLayersEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaximumLayers

    @Value.setter
    def Value(self, value):
      self.Parent.MaximumLayers = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaximumLayers: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaximumLayers: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UseFullRetexturingUI(self):
    index = bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List[index]

    return None

  UseFullRetexturing: bpy.props.BoolProperty(default=False,description='If set, all original texcoord sets are replaced by a single new one which will be used for the mapping image. This means the output scene will be temporarily invalid before the materialtable has been updated to reflect the new changes. This flag has no effect on the remeshing, which always does a full retexturing.')
  class SimplygonUseFullRetexturingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseFullRetexturing

    @Value.setter
    def Value(self, value):
      self.Parent.UseFullRetexturing = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ApplyNewMaterialIdsUI(self):
    index = bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List[index]

    return None

  ApplyNewMaterialIds: bpy.props.BoolProperty(default=True,description='If true, and also generating one or more mapping images for material casting, the material IDs in the process geometry will be updated to reflect the new, not yet cast output materials. This means the output scene will be temporarily invalid before the materialtable has been updated to reflect the new changes.')
  class SimplygonApplyNewMaterialIdsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ApplyNewMaterialIds

    @Value.setter
    def Value(self, value):
      self.Parent.ApplyNewMaterialIds = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def AllowTransparencyMappingUI(self):
    index = bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List[index]

    return None

  AllowTransparencyMapping: bpy.props.BoolProperty(default=False,description='If true, the remeshing processor will allow mapped transparency in the generated mapping image. This allows material casting where gaps filled by the remeshing processor will be cast as transparent.')
  class SimplygonAllowTransparencyMappingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.AllowTransparencyMapping

    @Value.setter
    def Value(self, value):
      self.Parent.AllowTransparencyMapping = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TexCoordLevelUI(self):
    index = bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List[index]

    return None

  TexCoordLevel: bpy.props.IntProperty(default=0,min=-1,max=10,description='The texture coordinate level used for mapping image and texture generation. If the TexCoordName has been set, the TexCoordLevel is not used.')
  class SimplygonTexCoordLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TexCoordLevel

    @Value.setter
    def Value(self, value):
      self.Parent.TexCoordLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TexCoordLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TexCoordLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TexCoordNameUI(self):
    index = bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List[index]

    return None

  TexCoordName: bpy.props.StringProperty(default='',description='The texture coordinate level name used for mapping image and texture generation. If new UVs are created, they will replace the old coordinates in the texture channel with the TexCoordName. If no texture level with this name exists. It will be created. If the TexCoordName is not set, the TexCoordLevel (index) will be used instead.')
  class SimplygonTexCoordNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TexCoordName

    @Value.setter
    def Value(self, value):
      self.Parent.TexCoordName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseAutomaticTextureSizeUI(self):
    index = bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List[index]

    return None

  UseAutomaticTextureSize: bpy.props.BoolProperty(default=False,description='The UseAutomaticTextureSize flag. If true, then texture sizes will be computed for the reduced mesh depending on its pixel size on screen.')
  class SimplygonUseAutomaticTextureSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseAutomaticTextureSize

    @Value.setter
    def Value(self, value):
      self.Parent.UseAutomaticTextureSize = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def AutomaticTextureSizeMultiplierUI(self):
    index = bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List[index]

    return None

  AutomaticTextureSizeMultiplier: bpy.props.FloatProperty(default=1,min=0,max=10,description='Texture dimension length multiplier for the automatic texture size.')
  class SimplygonAutomaticTextureSizeMultiplierEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.AutomaticTextureSizeMultiplier

    @Value.setter
    def Value(self, value):
      self.Parent.AutomaticTextureSizeMultiplier = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("AutomaticTextureSizeMultiplier: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("AutomaticTextureSizeMultiplier: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ForcePower2TextureUI(self):
    index = bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List[index]

    return None

  ForcePower2Texture: bpy.props.BoolProperty(default=False,description='If automatic_texture_size is enabled, then force the texture sizes to be a power of 2.')
  class SimplygonForcePower2TextureEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ForcePower2Texture

    @Value.setter
    def Value(self, value):
      self.Parent.ForcePower2Texture = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TexCoordGeneratorTypeUI(self):
    index = bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List[index]

    return None

  TexCoordGeneratorType: bpy.props.EnumProperty(items=[('0','Parameterizer', ''),('1','ChartAggregator', ''),],default='0',description='Determines which method to use when generating the texture coordinates. Parameterizer generate from scratch based on the geometry. ChartAggregator generate based on the original texture coordinates.')
  class SimplygonTexCoordGeneratorTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TexCoordGeneratorType

    @Value.setter
    def Value(self, value):
      self.Parent.TexCoordGeneratorType = value
      self.Parent.ChartAggregatorSettings.Visible = Visible
      self.Parent.ParameterizerSettings.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OnlyParameterizeInvalidUVsUI(self):
    index = bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List[index]

    return None

  OnlyParameterizeInvalidUVs: bpy.props.BoolProperty(default=False,description='If enabled, will aggregate all the valid original UVs. If there are invalid original UVs, those parts will receive new parameterized UVs.')
  class SimplygonOnlyParameterizeInvalidUVsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OnlyParameterizeInvalidUVs

    @Value.setter
    def Value(self, value):
      self.Parent.OnlyParameterizeInvalidUVs = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'MappingImageSettings'
    GenerateMappingImageUI = bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.add()
    GenerateMappingImageUI.Init(self.name)
    GenerateMappingImageUI.name = self.name
    GenerateTexCoordsUI = bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.add()
    GenerateTexCoordsUI.Init(self.name)
    GenerateTexCoordsUI.name = self.name
    GenerateTangentsUI = bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.add()
    GenerateTangentsUI.Init(self.name)
    GenerateTangentsUI.name = self.name
    UseFullRetexturingUI = bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.add()
    UseFullRetexturingUI.Init(self.name)
    UseFullRetexturingUI.name = self.name
    ApplyNewMaterialIdsUI = bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.add()
    ApplyNewMaterialIdsUI.Init(self.name)
    ApplyNewMaterialIdsUI.name = self.name
    UseAutomaticTextureSizeUI = bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.add()
    UseAutomaticTextureSizeUI.Init(self.name)
    UseAutomaticTextureSizeUI.name = self.name
    AutomaticTextureSizeMultiplierUI = bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.add()
    AutomaticTextureSizeMultiplierUI.Init(self.name)
    AutomaticTextureSizeMultiplierUI.name = self.name
    ForcePower2TextureUI = bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.add()
    ForcePower2TextureUI.Init(self.name)
    ForcePower2TextureUI.name = self.name
    OnlyParameterizeInvalidUVsUI = bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.add()
    OnlyParameterizeInvalidUVsUI.Init(self.name)
    OnlyParameterizeInvalidUVsUI.name = self.name
    AllowTransparencyMappingUI = bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.add()
    AllowTransparencyMappingUI.Init(self.name)
    AllowTransparencyMappingUI.name = self.name
    MaximumLayersUI = bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.add()
    MaximumLayersUI.Init(self.name)
    MaximumLayersUI.name = self.name
    TexCoordLevelUI = bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.add()
    TexCoordLevelUI.Init(self.name)
    TexCoordLevelUI.name = self.name
    TexCoordNameUI = bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.add()
    TexCoordNameUI.Init(self.name)
    TexCoordNameUI.name = self.name
    TexCoordGeneratorTypeUI = bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.add()
    TexCoordGeneratorTypeUI.Init(self.name)
    TexCoordGeneratorTypeUI.name = self.name
    ChartAggregatorSettings = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.add()
    ChartAggregatorSettings.Init(self.name)
    self.ChartAggregatorSettings_id = ChartAggregatorSettings.name
    ParameterizerSettings = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.add()
    ParameterizerSettings.Init(self.name)
    self.ParameterizerSettings_id = ParameterizerSettings.name
    InputMaterialSettings = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.add()
    InputMaterialSettings.Init(self.name)
    self.InputMaterialSettings_id = InputMaterialSettings.name
    OutputMaterialSettings = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.add()
    OutputMaterialSettings.Init(self.name)
    self.OutputMaterialSettings_id = OutputMaterialSettings.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'MappingImageSettings'
    GenerateMappingImageUI = bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.add()
    GenerateMappingImageUI.InitJson(self.name, jsonData['GenerateMappingImageUI'] if jsonData is not None and 'GenerateMappingImageUI' in jsonData else None)
    GenerateMappingImageUI.name = self.name
    GenerateTexCoordsUI = bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.add()
    GenerateTexCoordsUI.InitJson(self.name, jsonData['GenerateTexCoordsUI'] if jsonData is not None and 'GenerateTexCoordsUI' in jsonData else None)
    GenerateTexCoordsUI.name = self.name
    GenerateTangentsUI = bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.add()
    GenerateTangentsUI.InitJson(self.name, jsonData['GenerateTangentsUI'] if jsonData is not None and 'GenerateTangentsUI' in jsonData else None)
    GenerateTangentsUI.name = self.name
    UseFullRetexturingUI = bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.add()
    UseFullRetexturingUI.InitJson(self.name, jsonData['UseFullRetexturingUI'] if jsonData is not None and 'UseFullRetexturingUI' in jsonData else None)
    UseFullRetexturingUI.name = self.name
    ApplyNewMaterialIdsUI = bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.add()
    ApplyNewMaterialIdsUI.InitJson(self.name, jsonData['ApplyNewMaterialIdsUI'] if jsonData is not None and 'ApplyNewMaterialIdsUI' in jsonData else None)
    ApplyNewMaterialIdsUI.name = self.name
    UseAutomaticTextureSizeUI = bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.add()
    UseAutomaticTextureSizeUI.InitJson(self.name, jsonData['UseAutomaticTextureSizeUI'] if jsonData is not None and 'UseAutomaticTextureSizeUI' in jsonData else None)
    UseAutomaticTextureSizeUI.name = self.name
    AutomaticTextureSizeMultiplierUI = bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.add()
    AutomaticTextureSizeMultiplierUI.InitJson(self.name, jsonData['AutomaticTextureSizeMultiplierUI'] if jsonData is not None and 'AutomaticTextureSizeMultiplierUI' in jsonData else None)
    AutomaticTextureSizeMultiplierUI.name = self.name
    ForcePower2TextureUI = bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.add()
    ForcePower2TextureUI.InitJson(self.name, jsonData['ForcePower2TextureUI'] if jsonData is not None and 'ForcePower2TextureUI' in jsonData else None)
    ForcePower2TextureUI.name = self.name
    OnlyParameterizeInvalidUVsUI = bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.add()
    OnlyParameterizeInvalidUVsUI.InitJson(self.name, jsonData['OnlyParameterizeInvalidUVsUI'] if jsonData is not None and 'OnlyParameterizeInvalidUVsUI' in jsonData else None)
    OnlyParameterizeInvalidUVsUI.name = self.name
    AllowTransparencyMappingUI = bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.add()
    AllowTransparencyMappingUI.InitJson(self.name, jsonData['AllowTransparencyMappingUI'] if jsonData is not None and 'AllowTransparencyMappingUI' in jsonData else None)
    AllowTransparencyMappingUI.name = self.name
    MaximumLayersUI = bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.add()
    MaximumLayersUI.InitJson(self.name, jsonData['MaximumLayersUI'] if jsonData is not None and 'MaximumLayersUI' in jsonData else None)
    MaximumLayersUI.name = self.name
    TexCoordLevelUI = bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.add()
    TexCoordLevelUI.InitJson(self.name, jsonData['TexCoordLevelUI'] if jsonData is not None and 'TexCoordLevelUI' in jsonData else None)
    TexCoordLevelUI.name = self.name
    TexCoordNameUI = bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.add()
    TexCoordNameUI.InitJson(self.name, jsonData['TexCoordNameUI'] if jsonData is not None and 'TexCoordNameUI' in jsonData else None)
    TexCoordNameUI.name = self.name
    TexCoordGeneratorTypeUI = bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.add()
    TexCoordGeneratorTypeUI.InitJson(self.name, jsonData['TexCoordGeneratorTypeUI'] if jsonData is not None and 'TexCoordGeneratorTypeUI' in jsonData else None)
    TexCoordGeneratorTypeUI.name = self.name
    if jsonData['ChartAggregatorSettings'] is not None:
      ChartAggregatorSettings = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.add()
      ChartAggregatorSettings.InitJson(self.name, jsonData['ChartAggregatorSettings'])
      self.ChartAggregatorSettings_id = ChartAggregatorSettings.name

    if jsonData['ParameterizerSettings'] is not None:
      ParameterizerSettings = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.add()
      ParameterizerSettings.InitJson(self.name, jsonData['ParameterizerSettings'])
      self.ParameterizerSettings_id = ParameterizerSettings.name

    if 'InputMaterialSettings' in jsonData and jsonData['InputMaterialSettings'] is not None and len(jsonData['InputMaterialSettings']) > 0:
      InputMaterialSettings = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.add()
      InputMaterialSettings.InitJson(self.name, jsonData['InputMaterialSettings'][0])
      self.InputMaterialSettings_id = InputMaterialSettings.name

    if 'OutputMaterialSettings' in jsonData and jsonData['OutputMaterialSettings'] is not None and len(jsonData['OutputMaterialSettings']) > 0:
      OutputMaterialSettings = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.add()
      OutputMaterialSettings.InitJson(self.name, jsonData['OutputMaterialSettings'][0])
      self.OutputMaterialSettings_id = OutputMaterialSettings.name

    self.LoadJson(jsonData)

  def Deinit(self):
    GenerateMappingImageUI_index = bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.find(self.name)
    bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.remove(GenerateMappingImageUI_index)
    GenerateTexCoordsUI_index = bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.find(self.name)
    bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.remove(GenerateTexCoordsUI_index)
    GenerateTangentsUI_index = bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.find(self.name)
    bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.remove(GenerateTangentsUI_index)
    UseFullRetexturingUI_index = bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.find(self.name)
    bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.remove(UseFullRetexturingUI_index)
    ApplyNewMaterialIdsUI_index = bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.find(self.name)
    bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.remove(ApplyNewMaterialIdsUI_index)
    UseAutomaticTextureSizeUI_index = bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.find(self.name)
    bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.remove(UseAutomaticTextureSizeUI_index)
    AutomaticTextureSizeMultiplierUI_index = bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.find(self.name)
    bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.remove(AutomaticTextureSizeMultiplierUI_index)
    ForcePower2TextureUI_index = bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.find(self.name)
    bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.remove(ForcePower2TextureUI_index)
    OnlyParameterizeInvalidUVsUI_index = bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.find(self.name)
    bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.remove(OnlyParameterizeInvalidUVsUI_index)
    AllowTransparencyMappingUI_index = bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.find(self.name)
    bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.remove(AllowTransparencyMappingUI_index)
    MaximumLayersUI_index = bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.find(self.name)
    bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.remove(MaximumLayersUI_index)
    TexCoordLevelUI_index = bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.find(self.name)
    bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.remove(TexCoordLevelUI_index)
    TexCoordNameUI_index = bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.find(self.name)
    bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.remove(TexCoordNameUI_index)
    TexCoordGeneratorTypeUI_index = bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.find(self.name)
    bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.remove(TexCoordGeneratorTypeUI_index)
    ChartAggregatorSettings_index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.ChartAggregatorSettings_id)
    bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.remove(ChartAggregatorSettings_index)
    ParameterizerSettings_index = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.find(self.ParameterizerSettings_id)
    bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.remove(ParameterizerSettings_index)
    InputMaterialSettings_index = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.find(self.InputMaterialSettings_id)
    bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.remove(InputMaterialSettings_index)
    OutputMaterialSettings_index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.OutputMaterialSettings_id)
    bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.remove(OutputMaterialSettings_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['GenerateMappingImage'] = self.GenerateMappingImage
    if serializeUIComponents:
      jsonData['GenerateMappingImageUI'] = self.GenerateMappingImageUI.SaveJson()

    jsonData['GenerateTexCoords'] = self.GenerateTexCoords
    if serializeUIComponents:
      jsonData['GenerateTexCoordsUI'] = self.GenerateTexCoordsUI.SaveJson()

    jsonData['GenerateTangents'] = self.GenerateTangents
    if serializeUIComponents:
      jsonData['GenerateTangentsUI'] = self.GenerateTangentsUI.SaveJson()

    jsonData['MaximumLayers'] = self.MaximumLayers
    if serializeUIComponents:
      jsonData['MaximumLayersUI'] = self.MaximumLayersUI.SaveJson()

    jsonData['UseFullRetexturing'] = self.UseFullRetexturing
    if serializeUIComponents:
      jsonData['UseFullRetexturingUI'] = self.UseFullRetexturingUI.SaveJson()

    jsonData['ApplyNewMaterialIds'] = self.ApplyNewMaterialIds
    if serializeUIComponents:
      jsonData['ApplyNewMaterialIdsUI'] = self.ApplyNewMaterialIdsUI.SaveJson()

    jsonData['AllowTransparencyMapping'] = self.AllowTransparencyMapping
    if serializeUIComponents:
      jsonData['AllowTransparencyMappingUI'] = self.AllowTransparencyMappingUI.SaveJson()

    jsonData['TexCoordLevel'] = self.TexCoordLevel
    if serializeUIComponents:
      jsonData['TexCoordLevelUI'] = self.TexCoordLevelUI.SaveJson()

    jsonData['TexCoordName'] = self.TexCoordName
    if serializeUIComponents:
      jsonData['TexCoordNameUI'] = self.TexCoordNameUI.SaveJson()

    jsonData['UseAutomaticTextureSize'] = self.UseAutomaticTextureSize
    if serializeUIComponents:
      jsonData['UseAutomaticTextureSizeUI'] = self.UseAutomaticTextureSizeUI.SaveJson()

    jsonData['AutomaticTextureSizeMultiplier'] = self.AutomaticTextureSizeMultiplier
    if serializeUIComponents:
      jsonData['AutomaticTextureSizeMultiplierUI'] = self.AutomaticTextureSizeMultiplierUI.SaveJson()

    jsonData['ForcePower2Texture'] = self.ForcePower2Texture
    if serializeUIComponents:
      jsonData['ForcePower2TextureUI'] = self.ForcePower2TextureUI.SaveJson()

    jsonData['TexCoordGeneratorType'] = int(self.TexCoordGeneratorType)
    if serializeUIComponents:
      jsonData['TexCoordGeneratorTypeUI'] = self.TexCoordGeneratorTypeUI.SaveJson()

    jsonData['OnlyParameterizeInvalidUVs'] = self.OnlyParameterizeInvalidUVs
    if serializeUIComponents:
      jsonData['OnlyParameterizeInvalidUVsUI'] = self.OnlyParameterizeInvalidUVsUI.SaveJson()

    if self.InputMaterialSettings is not None:
      jsonData['InputMaterialSettings'] = []
      jsonData['InputMaterialSettings'].append(self.InputMaterialSettings.SaveJson(serializeUIComponents))

    if self.OutputMaterialSettings is not None:
      jsonData['OutputMaterialSettings'] = []
      jsonData['OutputMaterialSettings'].append(self.OutputMaterialSettings.SaveJson(serializeUIComponents))

    if self.ChartAggregatorSettings is not None:
      jsonData['ChartAggregatorSettings'] = self.ChartAggregatorSettings.SaveJson(serializeUIComponents)

    if self.ParameterizerSettings is not None:
      jsonData['ParameterizerSettings'] = self.ParameterizerSettings.SaveJson(serializeUIComponents)

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'GenerateMappingImage' in jsonData and jsonData['GenerateMappingImage'] is not None:
      self.GenerateMappingImage = jsonData['GenerateMappingImage']

    if 'GenerateTexCoords' in jsonData and jsonData['GenerateTexCoords'] is not None:
      self.GenerateTexCoords = jsonData['GenerateTexCoords']

    if 'GenerateTangents' in jsonData and jsonData['GenerateTangents'] is not None:
      self.GenerateTangents = jsonData['GenerateTangents']

    if 'MaximumLayers' in jsonData and jsonData['MaximumLayers'] is not None:
      newMaximumLayers = jsonData['MaximumLayers']
      if newMaximumLayers >= self.MaximumLayersUI.DefaultMinValue and newMaximumLayers <= self.MaximumLayersUI.DefaultMaxValue:
        self.MaximumLayers = newMaximumLayers

      else:
        print("MaximumLayers: Invalid value", newMaximumLayers, "using default value", self.MaximumLayers)


    if 'UseFullRetexturing' in jsonData and jsonData['UseFullRetexturing'] is not None:
      self.UseFullRetexturing = jsonData['UseFullRetexturing']

    if 'ApplyNewMaterialIds' in jsonData and jsonData['ApplyNewMaterialIds'] is not None:
      self.ApplyNewMaterialIds = jsonData['ApplyNewMaterialIds']

    if 'AllowTransparencyMapping' in jsonData and jsonData['AllowTransparencyMapping'] is not None:
      self.AllowTransparencyMapping = jsonData['AllowTransparencyMapping']

    if 'TexCoordLevel' in jsonData and jsonData['TexCoordLevel'] is not None:
      newTexCoordLevel = jsonData['TexCoordLevel']
      if newTexCoordLevel >= self.TexCoordLevelUI.DefaultMinValue and newTexCoordLevel <= self.TexCoordLevelUI.DefaultMaxValue:
        self.TexCoordLevel = newTexCoordLevel

      else:
        print("TexCoordLevel: Invalid value", newTexCoordLevel, "using default value", self.TexCoordLevel)


    if 'TexCoordName' in jsonData and jsonData['TexCoordName'] is not None:
      self.TexCoordName = jsonData['TexCoordName']

    if 'UseAutomaticTextureSize' in jsonData and jsonData['UseAutomaticTextureSize'] is not None:
      self.UseAutomaticTextureSize = jsonData['UseAutomaticTextureSize']

    if 'AutomaticTextureSizeMultiplier' in jsonData and jsonData['AutomaticTextureSizeMultiplier'] is not None:
      newAutomaticTextureSizeMultiplier = jsonData['AutomaticTextureSizeMultiplier']
      if newAutomaticTextureSizeMultiplier >= self.AutomaticTextureSizeMultiplierUI.DefaultMinValue and newAutomaticTextureSizeMultiplier <= self.AutomaticTextureSizeMultiplierUI.DefaultMaxValue:
        self.AutomaticTextureSizeMultiplier = newAutomaticTextureSizeMultiplier

      else:
        print("AutomaticTextureSizeMultiplier: Invalid value", newAutomaticTextureSizeMultiplier, "using default value", self.AutomaticTextureSizeMultiplier)


    if 'ForcePower2Texture' in jsonData and jsonData['ForcePower2Texture'] is not None:
      self.ForcePower2Texture = jsonData['ForcePower2Texture']

    if 'TexCoordGeneratorType' in jsonData and jsonData['TexCoordGeneratorType'] is not None:
      self.TexCoordGeneratorType = str(jsonData['TexCoordGeneratorType'])

    if 'OnlyParameterizeInvalidUVs' in jsonData and jsonData['OnlyParameterizeInvalidUVs'] is not None:
      self.OnlyParameterizeInvalidUVs = jsonData['OnlyParameterizeInvalidUVs']


  def Reset(self):
    self.GenerateMappingImageUI.Reset()
    self.GenerateTexCoordsUI.Reset()
    self.GenerateTangentsUI.Reset()
    self.MaximumLayersUI.Reset()
    self.UseFullRetexturingUI.Reset()
    self.ApplyNewMaterialIdsUI.Reset()
    self.AllowTransparencyMappingUI.Reset()
    self.TexCoordLevelUI.Reset()
    self.TexCoordNameUI.Reset()
    self.UseAutomaticTextureSizeUI.Reset()
    self.AutomaticTextureSizeMultiplierUI.Reset()
    self.ForcePower2TextureUI.Reset()
    self.TexCoordGeneratorTypeUI.Reset()
    self.OnlyParameterizeInvalidUVsUI.Reset()
    if self.InputMaterialSettings is not None:
      self.InputMaterialSettings.Reset()

    if self.OutputMaterialSettings is not None:
      self.OutputMaterialSettings.Reset()

    if self.ChartAggregatorSettings is not None:
      self.ChartAggregatorSettings.Reset()

    if self.ParameterizerSettings is not None:
      self.ParameterizerSettings.Reset()


  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.GenerateMappingImageUI.IsEditEnabled = isEditEnabled
    self.GenerateTexCoordsUI.IsEditEnabled = isEditEnabled
    self.GenerateTangentsUI.IsEditEnabled = isEditEnabled
    self.MaximumLayersUI.IsEditEnabled = isEditEnabled
    self.UseFullRetexturingUI.IsEditEnabled = isEditEnabled
    self.ApplyNewMaterialIdsUI.IsEditEnabled = isEditEnabled
    self.AllowTransparencyMappingUI.IsEditEnabled = isEditEnabled
    self.TexCoordLevelUI.IsEditEnabled = isEditEnabled
    self.TexCoordNameUI.IsEditEnabled = isEditEnabled
    self.UseAutomaticTextureSizeUI.IsEditEnabled = isEditEnabled
    self.AutomaticTextureSizeMultiplierUI.IsEditEnabled = isEditEnabled
    self.ForcePower2TextureUI.IsEditEnabled = isEditEnabled
    self.TexCoordGeneratorTypeUI.IsEditEnabled = isEditEnabled
    self.OnlyParameterizeInvalidUVsUI.IsEditEnabled = isEditEnabled
    if self.InputMaterialSettings is not None:
      self.InputMaterialSettings.SetEditMode(isEditEnabled)

    if self.OutputMaterialSettings is not None:
      self.OutputMaterialSettings.SetEditMode(isEditEnabled)

    if self.ChartAggregatorSettings is not None:
      self.ChartAggregatorSettings.SetEditMode(isEditEnabled)

    if self.ParameterizerSettings is not None:
      self.ParameterizerSettings.SetEditMode(isEditEnabled)


  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='MappingImageSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='MappingImageSettings', emboss=False)

        if self.GenerateMappingImageUI.Visible:
          column.prop(self, 'GenerateMappingImage')

        if self.GenerateTexCoordsUI.Visible:
          column.prop(self, 'GenerateTexCoords')

        if self.GenerateTangentsUI.Visible:
          column.prop(self, 'GenerateTangents')

        if self.UseFullRetexturingUI.Visible:
          column.prop(self, 'UseFullRetexturing')

        if self.ApplyNewMaterialIdsUI.Visible:
          column.prop(self, 'ApplyNewMaterialIds')

        if self.UseAutomaticTextureSizeUI.Visible:
          column.prop(self, 'UseAutomaticTextureSize')

        if self.AutomaticTextureSizeMultiplierUI.Visible:
          column.prop(self, 'AutomaticTextureSizeMultiplier')

        if self.ForcePower2TextureUI.Visible:
          column.prop(self, 'ForcePower2Texture')

        if self.OnlyParameterizeInvalidUVsUI.Visible:
          column.prop(self, 'OnlyParameterizeInvalidUVs')

        if self.AllowTransparencyMappingUI.Visible:
          column.prop(self, 'AllowTransparencyMapping')

        if self.MaximumLayersUI.Visible:
          column.prop(self, 'MaximumLayers')

        if self.TexCoordLevelUI.Visible:
          column.prop(self, 'TexCoordLevel')

        if self.TexCoordNameUI.Visible:
          column.prop(self, 'TexCoordName')

        if self.TexCoordGeneratorTypeUI.Visible:
          column.prop(self, 'TexCoordGeneratorType')

        if self.ChartAggregatorSettings.Visible:
          self.ChartAggregatorSettings.draw(layout.box(), createSubGroup)

        if self.ParameterizerSettings.Visible:
          self.ParameterizerSettings.draw(layout.box(), createSubGroup)

        if self.InputMaterialSettings.Visible:
          self.InputMaterialSettings.draw(layout.box(), createSubGroup)

        if self.OutputMaterialSettings.Visible:
          self.OutputMaterialSettings.draw(layout.box(), createSubGroup)



    else :
      if self.GenerateMappingImageUI.Visible:
        column.prop(self, 'GenerateMappingImage')

      if self.GenerateTexCoordsUI.Visible:
        column.prop(self, 'GenerateTexCoords')

      if self.GenerateTangentsUI.Visible:
        column.prop(self, 'GenerateTangents')

      if self.UseFullRetexturingUI.Visible:
        column.prop(self, 'UseFullRetexturing')

      if self.ApplyNewMaterialIdsUI.Visible:
        column.prop(self, 'ApplyNewMaterialIds')

      if self.UseAutomaticTextureSizeUI.Visible:
        column.prop(self, 'UseAutomaticTextureSize')

      if self.AutomaticTextureSizeMultiplierUI.Visible:
        column.prop(self, 'AutomaticTextureSizeMultiplier')

      if self.ForcePower2TextureUI.Visible:
        column.prop(self, 'ForcePower2Texture')

      if self.OnlyParameterizeInvalidUVsUI.Visible:
        column.prop(self, 'OnlyParameterizeInvalidUVs')

      if self.AllowTransparencyMappingUI.Visible:
        column.prop(self, 'AllowTransparencyMapping')

      if self.MaximumLayersUI.Visible:
        column.prop(self, 'MaximumLayers')

      if self.TexCoordLevelUI.Visible:
        column.prop(self, 'TexCoordLevel')

      if self.TexCoordNameUI.Visible:
        column.prop(self, 'TexCoordName')

      if self.TexCoordGeneratorTypeUI.Visible:
        column.prop(self, 'TexCoordGeneratorType')

      if self.ChartAggregatorSettingsUI.Visible:
        self.ChartAggregatorSettings.draw(layout.box(), createSubGroup)

      if self.ParameterizerSettingsUI.Visible:
        self.ParameterizerSettings.draw(layout.box(), createSubGroup)

      if self.InputMaterialSettingsUI.Visible:
        self.InputMaterialSettings.draw(layout.box(), createSubGroup)

      if self.OutputMaterialSettingsUI.Visible:
        self.OutputMaterialSettings.draw(layout.box(), createSubGroup)




class SimplygonGlobalSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.DefaultTangentCalculatorTypeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def DefaultTangentCalculatorTypeUI(self):
    index = bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List[index]

    return None

  DefaultTangentCalculatorType: bpy.props.EnumProperty(items=[('0','OrthonormalRightHanded', ''),('1','Autodesk3dsMax', ''),('2','OrthonormalLeftHanded', ''),('3','MikkTSpace', ''),],default='3',description='')
  class SimplygonDefaultTangentCalculatorTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DefaultTangentCalculatorType

    @Value.setter
    def Value(self, value):
      self.Parent.DefaultTangentCalculatorType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GlobalSettings'
    DefaultTangentCalculatorTypeUI = bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.add()
    DefaultTangentCalculatorTypeUI.Init(self.name)
    DefaultTangentCalculatorTypeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GlobalSettings'
    DefaultTangentCalculatorTypeUI = bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.add()
    DefaultTangentCalculatorTypeUI.InitJson(self.name, jsonData['DefaultTangentCalculatorTypeUI'] if jsonData is not None and 'DefaultTangentCalculatorTypeUI' in jsonData else None)
    DefaultTangentCalculatorTypeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    DefaultTangentCalculatorTypeUI_index = bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.find(self.name)
    bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.remove(DefaultTangentCalculatorTypeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['DefaultTangentCalculatorType'] = int(self.DefaultTangentCalculatorType)
    if serializeUIComponents:
      jsonData['DefaultTangentCalculatorTypeUI'] = self.DefaultTangentCalculatorTypeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'DefaultTangentCalculatorType' in jsonData and jsonData['DefaultTangentCalculatorType'] is not None:
      self.DefaultTangentCalculatorType = str(jsonData['DefaultTangentCalculatorType'])


  def Reset(self):
    self.DefaultTangentCalculatorTypeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.DefaultTangentCalculatorTypeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='GlobalSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='GlobalSettings', emboss=False)

        if self.DefaultTangentCalculatorTypeUI.Visible:
          column.prop(self, 'DefaultTangentCalculatorType')



    else :
      if self.DefaultTangentCalculatorTypeUI.Visible:
        column.prop(self, 'DefaultTangentCalculatorType')




class SimplygonRemeshingSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.RemeshingModeManualPositionZUI.Visible: return True
    if self.RemeshingModeManualPositionYUI.Visible: return True
    if self.RemeshingModeManualPositionXUI.Visible: return True
    if self.OnScreenSizeUI.Visible: return True
    if self.HoleFillingUI.Visible: return True
    if self.RemeshingModeUI.Visible: return True
    if self.SurfaceTransferModeUI.Visible: return True
    if self.HardEdgeAngleUI.Visible: return True
    if self.ForceSoftEdgesWithinTextureChartsUI.Visible: return True
    if self.TransferNormalsUI.Visible: return True
    if self.TransferColorsUI.Visible: return True
    if self.KeepUnprocessedSceneMeshesUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def RemeshingModeManualPositionZUI(self):
    index = bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List[index]

    return None

  RemeshingModeManualPositionZ: bpy.props.FloatProperty(default=0,min=-3.402823E+38,max=3.402823E+38,description='Z component was a 3-tuple real that acts as the marker designating remeshing processors starting position')
  class SimplygonRemeshingModeManualPositionZEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemeshingModeManualPositionZ

    @Value.setter
    def Value(self, value):
      self.Parent.RemeshingModeManualPositionZ = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -3.402823E+38
      self.MaxValue = 3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("RemeshingModeManualPositionZ: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("RemeshingModeManualPositionZ: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def RemeshingModeManualPositionYUI(self):
    index = bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List[index]

    return None

  RemeshingModeManualPositionY: bpy.props.FloatProperty(default=0,min=-3.402823E+38,max=3.402823E+38,description='Y component was a 3-tuple real that acts as the marker designating remeshing processors starting position')
  class SimplygonRemeshingModeManualPositionYEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemeshingModeManualPositionY

    @Value.setter
    def Value(self, value):
      self.Parent.RemeshingModeManualPositionY = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -3.402823E+38
      self.MaxValue = 3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("RemeshingModeManualPositionY: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("RemeshingModeManualPositionY: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def RemeshingModeManualPositionXUI(self):
    index = bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List[index]

    return None

  RemeshingModeManualPositionX: bpy.props.FloatProperty(default=0,min=-3.402823E+38,max=3.402823E+38,description='X component was a 3-tuple real that acts as the marker designating remeshing processors starting position')
  class SimplygonRemeshingModeManualPositionXEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemeshingModeManualPositionX

    @Value.setter
    def Value(self, value):
      self.Parent.RemeshingModeManualPositionX = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -3.402823E+38
      self.MaxValue = 3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -3.402823E+38
      self.DefaultMinValue = -3.402823E+38
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("RemeshingModeManualPositionX: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 3.402823E+38
      self.DefaultMaxValue = 3.402823E+38
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("RemeshingModeManualPositionX: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OnScreenSizeUI(self):
    index = bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List[index]

    return None

  OnScreenSize: bpy.props.IntProperty(default=300,min=20,max=10000,description='The on-screen rendering size of the geometry. Allowed values are in the range 20 to 10000 pixels.')
  class SimplygonOnScreenSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OnScreenSize

    @Value.setter
    def Value(self, value):
      self.Parent.OnScreenSize = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 20
      self.MaxValue = 10000
      self.DefaultMinValue = 20
      self.DefaultMaxValue = 10000
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 20
      self.DefaultMinValue = 20
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OnScreenSize: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000
      self.DefaultMaxValue = 10000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OnScreenSize: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def HoleFillingUI(self):
    index = bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List[index]

    return None

  HoleFilling: bpy.props.EnumProperty(items=[('0','Disabled', ''),('1','Low', ''),('2','Medium', ''),('3','High', ''),],default='1',description='HoleFilling defines how aggressively the remesher will fill holes and cavities. What this does is to measure the volume and hole opening sizes of concavities in the input geometry and fill them in in the remeshing if the concavity is large enough with a small enough opening. This removes a lot of unnecessary geometry and is recommended to be kept at it´s default rather than turning it off, it will in the vast majority of cases have a positive effect on the result.')
  class SimplygonHoleFillingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.HoleFilling

    @Value.setter
    def Value(self, value):
      self.Parent.HoleFilling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def RemeshingModeUI(self):
    index = bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List[index]

    return None

  RemeshingMode: bpy.props.EnumProperty(items=[('0','Outside', ''),('1','Inside', ''),('2','Manual', ''),],default='0',description='The remeshing mode, options are Outside, Inside and Manual. RemeshingMode defines if the remeshing processor remeshes the outside or the inside of the input geometry. Manual needs the user to define a position in space that will be considered as outside for the purposes of the remeshing. Position is set with RemeshingModeManualPosition. Hole filling only works with the mode Outside.')
  class SimplygonRemeshingModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RemeshingMode

    @Value.setter
    def Value(self, value):
      self.Parent.RemeshingMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SurfaceTransferModeUI(self):
    index = bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List[index]

    return None

  SurfaceTransferMode: bpy.props.EnumProperty(items=[('0','Fast', ''),('1','Accurate', ''),],default='1',description='The surface transfer mode.')
  class SimplygonSurfaceTransferModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SurfaceTransferMode

    @Value.setter
    def Value(self, value):
      self.Parent.SurfaceTransferMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def HardEdgeAngleUI(self):
    index = bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List[index]

    return None

  HardEdgeAngle: bpy.props.FloatProperty(default=75,min=0,max=180,description='The normal hard angle cutoff in degrees.')
  class SimplygonHardEdgeAngleEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.HardEdgeAngle

    @Value.setter
    def Value(self, value):
      self.Parent.HardEdgeAngle = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 180
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 180
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("HardEdgeAngle: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 180
      self.DefaultMaxValue = 180
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("HardEdgeAngle: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ForceSoftEdgesWithinTextureChartsUI(self):
    index = bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List[index]

    return None

  ForceSoftEdgesWithinTextureCharts: bpy.props.BoolProperty(default=False,description='If the flag is set, the normal calculation will only allow hard edges along texture borders. Any vertex normal within a texture chart (not along the border) will be forced soft. Caveat: If this is enabled, some normals might be highly interpolated, and deviate substantially from the triangle normal.')
  class SimplygonForceSoftEdgesWithinTextureChartsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ForceSoftEdgesWithinTextureCharts

    @Value.setter
    def Value(self, value):
      self.Parent.ForceSoftEdgesWithinTextureCharts = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TransferNormalsUI(self):
    index = bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List[index]

    return None

  TransferNormals: bpy.props.BoolProperty(default=False,description='If set, the vertex normals channel will be sampled from the original mesh.')
  class SimplygonTransferNormalsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TransferNormals

    @Value.setter
    def Value(self, value):
      self.Parent.TransferNormals = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TransferColorsUI(self):
    index = bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List[index]

    return None

  TransferColors: bpy.props.BoolProperty(default=False,description='If set, vertex color channels will be sampled from the original mesh.')
  class SimplygonTransferColorsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TransferColors

    @Value.setter
    def Value(self, value):
      self.Parent.TransferColors = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def KeepUnprocessedSceneMeshesUI(self):
    index = bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List[index]

    return None

  KeepUnprocessedSceneMeshes: bpy.props.BoolProperty(default=False,description='If false, the processor will remove all geometry and scene nodes which was not selected for processing from the scene. If true, only the geometry in the ProcessSelectionSet will be replaced or updated. If old nodes are kept and a new geometry is added to the scene, it will always be the last child of the scene root. If generating a mappingimage to cast materials, new materialIds will also be appended to the end of the old material table instead of replacing the old ones.')
  class SimplygonKeepUnprocessedSceneMeshesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.KeepUnprocessedSceneMeshes

    @Value.setter
    def Value(self, value):
      self.Parent.KeepUnprocessedSceneMeshes = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'RemeshingSettings'
    RemeshingModeManualPositionZUI = bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.add()
    RemeshingModeManualPositionZUI.Init(self.name)
    RemeshingModeManualPositionZUI.name = self.name
    RemeshingModeManualPositionYUI = bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.add()
    RemeshingModeManualPositionYUI.Init(self.name)
    RemeshingModeManualPositionYUI.name = self.name
    RemeshingModeManualPositionXUI = bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.add()
    RemeshingModeManualPositionXUI.Init(self.name)
    RemeshingModeManualPositionXUI.name = self.name
    OnScreenSizeUI = bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    HoleFillingUI = bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.add()
    HoleFillingUI.Init(self.name)
    HoleFillingUI.name = self.name
    RemeshingModeUI = bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.add()
    RemeshingModeUI.Init(self.name)
    RemeshingModeUI.name = self.name
    SurfaceTransferModeUI = bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.add()
    SurfaceTransferModeUI.Init(self.name)
    SurfaceTransferModeUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    TransferNormalsUI = bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.add()
    TransferNormalsUI.Init(self.name)
    TransferNormalsUI.name = self.name
    TransferColorsUI = bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.add()
    TransferColorsUI.Init(self.name)
    TransferColorsUI.name = self.name
    ForceSoftEdgesWithinTextureChartsUI = bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.add()
    ForceSoftEdgesWithinTextureChartsUI.Init(self.name)
    ForceSoftEdgesWithinTextureChartsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.add()
    KeepUnprocessedSceneMeshesUI.Init(self.name)
    KeepUnprocessedSceneMeshesUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'RemeshingSettings'
    RemeshingModeManualPositionZUI = bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.add()
    RemeshingModeManualPositionZUI.InitJson(self.name, jsonData['RemeshingModeManualPositionZUI'] if jsonData is not None and 'RemeshingModeManualPositionZUI' in jsonData else None)
    RemeshingModeManualPositionZUI.name = self.name
    RemeshingModeManualPositionYUI = bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.add()
    RemeshingModeManualPositionYUI.InitJson(self.name, jsonData['RemeshingModeManualPositionYUI'] if jsonData is not None and 'RemeshingModeManualPositionYUI' in jsonData else None)
    RemeshingModeManualPositionYUI.name = self.name
    RemeshingModeManualPositionXUI = bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.add()
    RemeshingModeManualPositionXUI.InitJson(self.name, jsonData['RemeshingModeManualPositionXUI'] if jsonData is not None and 'RemeshingModeManualPositionXUI' in jsonData else None)
    RemeshingModeManualPositionXUI.name = self.name
    OnScreenSizeUI = bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.add()
    OnScreenSizeUI.InitJson(self.name, jsonData['OnScreenSizeUI'] if jsonData is not None and 'OnScreenSizeUI' in jsonData else None)
    OnScreenSizeUI.name = self.name
    HoleFillingUI = bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.add()
    HoleFillingUI.InitJson(self.name, jsonData['HoleFillingUI'] if jsonData is not None and 'HoleFillingUI' in jsonData else None)
    HoleFillingUI.name = self.name
    RemeshingModeUI = bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.add()
    RemeshingModeUI.InitJson(self.name, jsonData['RemeshingModeUI'] if jsonData is not None and 'RemeshingModeUI' in jsonData else None)
    RemeshingModeUI.name = self.name
    SurfaceTransferModeUI = bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.add()
    SurfaceTransferModeUI.InitJson(self.name, jsonData['SurfaceTransferModeUI'] if jsonData is not None and 'SurfaceTransferModeUI' in jsonData else None)
    SurfaceTransferModeUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.add()
    HardEdgeAngleUI.InitJson(self.name, jsonData['HardEdgeAngleUI'] if jsonData is not None and 'HardEdgeAngleUI' in jsonData else None)
    HardEdgeAngleUI.name = self.name
    TransferNormalsUI = bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.add()
    TransferNormalsUI.InitJson(self.name, jsonData['TransferNormalsUI'] if jsonData is not None and 'TransferNormalsUI' in jsonData else None)
    TransferNormalsUI.name = self.name
    TransferColorsUI = bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.add()
    TransferColorsUI.InitJson(self.name, jsonData['TransferColorsUI'] if jsonData is not None and 'TransferColorsUI' in jsonData else None)
    TransferColorsUI.name = self.name
    ForceSoftEdgesWithinTextureChartsUI = bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.add()
    ForceSoftEdgesWithinTextureChartsUI.InitJson(self.name, jsonData['ForceSoftEdgesWithinTextureChartsUI'] if jsonData is not None and 'ForceSoftEdgesWithinTextureChartsUI' in jsonData else None)
    ForceSoftEdgesWithinTextureChartsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.add()
    KeepUnprocessedSceneMeshesUI.InitJson(self.name, jsonData['KeepUnprocessedSceneMeshesUI'] if jsonData is not None and 'KeepUnprocessedSceneMeshesUI' in jsonData else None)
    KeepUnprocessedSceneMeshesUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    RemeshingModeManualPositionZUI_index = bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.find(self.name)
    bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.remove(RemeshingModeManualPositionZUI_index)
    RemeshingModeManualPositionYUI_index = bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.find(self.name)
    bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.remove(RemeshingModeManualPositionYUI_index)
    RemeshingModeManualPositionXUI_index = bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.find(self.name)
    bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.remove(RemeshingModeManualPositionXUI_index)
    OnScreenSizeUI_index = bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.find(self.name)
    bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.remove(OnScreenSizeUI_index)
    HoleFillingUI_index = bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.find(self.name)
    bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.remove(HoleFillingUI_index)
    RemeshingModeUI_index = bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.find(self.name)
    bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.remove(RemeshingModeUI_index)
    SurfaceTransferModeUI_index = bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.find(self.name)
    bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.remove(SurfaceTransferModeUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.find(self.name)
    bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.remove(HardEdgeAngleUI_index)
    TransferNormalsUI_index = bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.find(self.name)
    bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.remove(TransferNormalsUI_index)
    TransferColorsUI_index = bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.find(self.name)
    bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.remove(TransferColorsUI_index)
    ForceSoftEdgesWithinTextureChartsUI_index = bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.find(self.name)
    bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.remove(ForceSoftEdgesWithinTextureChartsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.find(self.name)
    bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.remove(KeepUnprocessedSceneMeshesUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['RemeshingModeManualPositionZ'] = self.RemeshingModeManualPositionZ
    if serializeUIComponents:
      jsonData['RemeshingModeManualPositionZUI'] = self.RemeshingModeManualPositionZUI.SaveJson()

    jsonData['RemeshingModeManualPositionY'] = self.RemeshingModeManualPositionY
    if serializeUIComponents:
      jsonData['RemeshingModeManualPositionYUI'] = self.RemeshingModeManualPositionYUI.SaveJson()

    jsonData['RemeshingModeManualPositionX'] = self.RemeshingModeManualPositionX
    if serializeUIComponents:
      jsonData['RemeshingModeManualPositionXUI'] = self.RemeshingModeManualPositionXUI.SaveJson()

    jsonData['OnScreenSize'] = self.OnScreenSize
    if serializeUIComponents:
      jsonData['OnScreenSizeUI'] = self.OnScreenSizeUI.SaveJson()

    jsonData['HoleFilling'] = int(self.HoleFilling)
    if serializeUIComponents:
      jsonData['HoleFillingUI'] = self.HoleFillingUI.SaveJson()

    jsonData['RemeshingMode'] = int(self.RemeshingMode)
    if serializeUIComponents:
      jsonData['RemeshingModeUI'] = self.RemeshingModeUI.SaveJson()

    jsonData['SurfaceTransferMode'] = int(self.SurfaceTransferMode)
    if serializeUIComponents:
      jsonData['SurfaceTransferModeUI'] = self.SurfaceTransferModeUI.SaveJson()

    jsonData['HardEdgeAngle'] = self.HardEdgeAngle
    if serializeUIComponents:
      jsonData['HardEdgeAngleUI'] = self.HardEdgeAngleUI.SaveJson()

    jsonData['ForceSoftEdgesWithinTextureCharts'] = self.ForceSoftEdgesWithinTextureCharts
    if serializeUIComponents:
      jsonData['ForceSoftEdgesWithinTextureChartsUI'] = self.ForceSoftEdgesWithinTextureChartsUI.SaveJson()

    jsonData['TransferNormals'] = self.TransferNormals
    if serializeUIComponents:
      jsonData['TransferNormalsUI'] = self.TransferNormalsUI.SaveJson()

    jsonData['TransferColors'] = self.TransferColors
    if serializeUIComponents:
      jsonData['TransferColorsUI'] = self.TransferColorsUI.SaveJson()

    jsonData['KeepUnprocessedSceneMeshes'] = self.KeepUnprocessedSceneMeshes
    if serializeUIComponents:
      jsonData['KeepUnprocessedSceneMeshesUI'] = self.KeepUnprocessedSceneMeshesUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'RemeshingModeManualPositionZ' in jsonData and jsonData['RemeshingModeManualPositionZ'] is not None:
      newRemeshingModeManualPositionZ = jsonData['RemeshingModeManualPositionZ']
      if newRemeshingModeManualPositionZ >= self.RemeshingModeManualPositionZUI.DefaultMinValue and newRemeshingModeManualPositionZ <= self.RemeshingModeManualPositionZUI.DefaultMaxValue:
        self.RemeshingModeManualPositionZ = newRemeshingModeManualPositionZ

      else:
        print("RemeshingModeManualPositionZ: Invalid value", newRemeshingModeManualPositionZ, "using default value", self.RemeshingModeManualPositionZ)


    if 'RemeshingModeManualPositionY' in jsonData and jsonData['RemeshingModeManualPositionY'] is not None:
      newRemeshingModeManualPositionY = jsonData['RemeshingModeManualPositionY']
      if newRemeshingModeManualPositionY >= self.RemeshingModeManualPositionYUI.DefaultMinValue and newRemeshingModeManualPositionY <= self.RemeshingModeManualPositionYUI.DefaultMaxValue:
        self.RemeshingModeManualPositionY = newRemeshingModeManualPositionY

      else:
        print("RemeshingModeManualPositionY: Invalid value", newRemeshingModeManualPositionY, "using default value", self.RemeshingModeManualPositionY)


    if 'RemeshingModeManualPositionX' in jsonData and jsonData['RemeshingModeManualPositionX'] is not None:
      newRemeshingModeManualPositionX = jsonData['RemeshingModeManualPositionX']
      if newRemeshingModeManualPositionX >= self.RemeshingModeManualPositionXUI.DefaultMinValue and newRemeshingModeManualPositionX <= self.RemeshingModeManualPositionXUI.DefaultMaxValue:
        self.RemeshingModeManualPositionX = newRemeshingModeManualPositionX

      else:
        print("RemeshingModeManualPositionX: Invalid value", newRemeshingModeManualPositionX, "using default value", self.RemeshingModeManualPositionX)


    if 'OnScreenSize' in jsonData and jsonData['OnScreenSize'] is not None:
      newOnScreenSize = jsonData['OnScreenSize']
      if newOnScreenSize >= self.OnScreenSizeUI.DefaultMinValue and newOnScreenSize <= self.OnScreenSizeUI.DefaultMaxValue:
        self.OnScreenSize = newOnScreenSize

      else:
        print("OnScreenSize: Invalid value", newOnScreenSize, "using default value", self.OnScreenSize)


    if 'HoleFilling' in jsonData and jsonData['HoleFilling'] is not None:
      self.HoleFilling = str(jsonData['HoleFilling'])

    if 'RemeshingMode' in jsonData and jsonData['RemeshingMode'] is not None:
      self.RemeshingMode = str(jsonData['RemeshingMode'])

    if 'SurfaceTransferMode' in jsonData and jsonData['SurfaceTransferMode'] is not None:
      self.SurfaceTransferMode = str(jsonData['SurfaceTransferMode'])

    if 'HardEdgeAngle' in jsonData and jsonData['HardEdgeAngle'] is not None:
      newHardEdgeAngle = jsonData['HardEdgeAngle']
      if newHardEdgeAngle >= self.HardEdgeAngleUI.DefaultMinValue and newHardEdgeAngle <= self.HardEdgeAngleUI.DefaultMaxValue:
        self.HardEdgeAngle = newHardEdgeAngle

      else:
        print("HardEdgeAngle: Invalid value", newHardEdgeAngle, "using default value", self.HardEdgeAngle)


    if 'ForceSoftEdgesWithinTextureCharts' in jsonData and jsonData['ForceSoftEdgesWithinTextureCharts'] is not None:
      self.ForceSoftEdgesWithinTextureCharts = jsonData['ForceSoftEdgesWithinTextureCharts']

    if 'TransferNormals' in jsonData and jsonData['TransferNormals'] is not None:
      self.TransferNormals = jsonData['TransferNormals']

    if 'TransferColors' in jsonData and jsonData['TransferColors'] is not None:
      self.TransferColors = jsonData['TransferColors']

    if 'KeepUnprocessedSceneMeshes' in jsonData and jsonData['KeepUnprocessedSceneMeshes'] is not None:
      self.KeepUnprocessedSceneMeshes = jsonData['KeepUnprocessedSceneMeshes']


  def Reset(self):
    self.RemeshingModeManualPositionZUI.Reset()
    self.RemeshingModeManualPositionYUI.Reset()
    self.RemeshingModeManualPositionXUI.Reset()
    self.OnScreenSizeUI.Reset()
    self.HoleFillingUI.Reset()
    self.RemeshingModeUI.Reset()
    self.SurfaceTransferModeUI.Reset()
    self.HardEdgeAngleUI.Reset()
    self.ForceSoftEdgesWithinTextureChartsUI.Reset()
    self.TransferNormalsUI.Reset()
    self.TransferColorsUI.Reset()
    self.KeepUnprocessedSceneMeshesUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.RemeshingModeManualPositionZUI.IsEditEnabled = isEditEnabled
    self.RemeshingModeManualPositionYUI.IsEditEnabled = isEditEnabled
    self.RemeshingModeManualPositionXUI.IsEditEnabled = isEditEnabled
    self.OnScreenSizeUI.IsEditEnabled = isEditEnabled
    self.HoleFillingUI.IsEditEnabled = isEditEnabled
    self.RemeshingModeUI.IsEditEnabled = isEditEnabled
    self.SurfaceTransferModeUI.IsEditEnabled = isEditEnabled
    self.HardEdgeAngleUI.IsEditEnabled = isEditEnabled
    self.ForceSoftEdgesWithinTextureChartsUI.IsEditEnabled = isEditEnabled
    self.TransferNormalsUI.IsEditEnabled = isEditEnabled
    self.TransferColorsUI.IsEditEnabled = isEditEnabled
    self.KeepUnprocessedSceneMeshesUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='RemeshingSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='RemeshingSettings', emboss=False)

        if self.RemeshingModeManualPositionZUI.Visible:
          column.prop(self, 'RemeshingModeManualPositionZ')

        if self.RemeshingModeManualPositionYUI.Visible:
          column.prop(self, 'RemeshingModeManualPositionY')

        if self.RemeshingModeManualPositionXUI.Visible:
          column.prop(self, 'RemeshingModeManualPositionX')

        if self.OnScreenSizeUI.Visible:
          column.prop(self, 'OnScreenSize')

        if self.HoleFillingUI.Visible:
          column.prop(self, 'HoleFilling')

        if self.RemeshingModeUI.Visible:
          column.prop(self, 'RemeshingMode')

        if self.SurfaceTransferModeUI.Visible:
          column.prop(self, 'SurfaceTransferMode')

        if self.HardEdgeAngleUI.Visible:
          column.prop(self, 'HardEdgeAngle')

        if self.TransferNormalsUI.Visible:
          column.prop(self, 'TransferNormals')

        if self.TransferColorsUI.Visible:
          column.prop(self, 'TransferColors')

        if self.ForceSoftEdgesWithinTextureChartsUI.Visible:
          column.prop(self, 'ForceSoftEdgesWithinTextureCharts')

        if self.KeepUnprocessedSceneMeshesUI.Visible:
          column.prop(self, 'KeepUnprocessedSceneMeshes')



    else :
      if self.RemeshingModeManualPositionZUI.Visible:
        column.prop(self, 'RemeshingModeManualPositionZ')

      if self.RemeshingModeManualPositionYUI.Visible:
        column.prop(self, 'RemeshingModeManualPositionY')

      if self.RemeshingModeManualPositionXUI.Visible:
        column.prop(self, 'RemeshingModeManualPositionX')

      if self.OnScreenSizeUI.Visible:
        column.prop(self, 'OnScreenSize')

      if self.HoleFillingUI.Visible:
        column.prop(self, 'HoleFilling')

      if self.RemeshingModeUI.Visible:
        column.prop(self, 'RemeshingMode')

      if self.SurfaceTransferModeUI.Visible:
        column.prop(self, 'SurfaceTransferMode')

      if self.HardEdgeAngleUI.Visible:
        column.prop(self, 'HardEdgeAngle')

      if self.TransferNormalsUI.Visible:
        column.prop(self, 'TransferNormals')

      if self.TransferColorsUI.Visible:
        column.prop(self, 'TransferColors')

      if self.ForceSoftEdgesWithinTextureChartsUI.Visible:
        column.prop(self, 'ForceSoftEdgesWithinTextureCharts')

      if self.KeepUnprocessedSceneMeshesUI.Visible:
        column.prop(self, 'KeepUnprocessedSceneMeshes')




class SimplygonGeometryCullingSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseClippingGeometryUI.Visible: return True
    if self.ClippingGeometrySelectionSetNameUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseClippingGeometryUI(self):
    index = bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List[index]

    return None

  UseClippingGeometry: bpy.props.BoolProperty(default=False,description='If set, the geometries defined in the matching selection set will be used to clip the process geometry. What side of the geometry that will be culled is determined by the triangle facing, so make sure your winding is correct and that triangles point ´up´ toward the space you want to keep. Inconsistent triangle winding or meshes that do not have a clear local inside and outside will cause inconsistent results when used as clipping geometries.')
  class SimplygonUseClippingGeometryEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseClippingGeometry

    @Value.setter
    def Value(self, value):
      self.Parent.UseClippingGeometry = value
      self.Parent.ClippingGeometrySelectionSetNameUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ClippingGeometrySelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List[index]

    return None

  ClippingGeometrySelectionSetName: bpy.props.StringProperty(default='',description='Which SelectionSet containing geometries will be used for clipping. Set name is prioritized over id if both are set.')
  class SimplygonClippingGeometrySelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ClippingGeometrySelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.ClippingGeometrySelectionSetName = value

    @property
    def Visible(self):
      if self.Parent.UseClippingGeometryUI is not None:
        return self.Parent.UseClippingGeometry and self.Parent.UseClippingGeometryUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GeometryCullingSettings'
    UseClippingGeometryUI = bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.add()
    UseClippingGeometryUI.Init(self.name)
    UseClippingGeometryUI.name = self.name
    ClippingGeometrySelectionSetNameUI = bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.add()
    ClippingGeometrySelectionSetNameUI.Init(self.name)
    ClippingGeometrySelectionSetNameUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GeometryCullingSettings'
    UseClippingGeometryUI = bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.add()
    UseClippingGeometryUI.InitJson(self.name, jsonData['UseClippingGeometryUI'] if jsonData is not None and 'UseClippingGeometryUI' in jsonData else None)
    UseClippingGeometryUI.name = self.name
    ClippingGeometrySelectionSetNameUI = bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.add()
    ClippingGeometrySelectionSetNameUI.InitJson(self.name, jsonData['ClippingGeometrySelectionSetNameUI'] if jsonData is not None and 'ClippingGeometrySelectionSetNameUI' in jsonData else None)
    ClippingGeometrySelectionSetNameUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseClippingGeometryUI_index = bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.find(self.name)
    bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.remove(UseClippingGeometryUI_index)
    ClippingGeometrySelectionSetNameUI_index = bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.find(self.name)
    bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.remove(ClippingGeometrySelectionSetNameUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseClippingGeometry'] = self.UseClippingGeometry
    if serializeUIComponents:
      jsonData['UseClippingGeometryUI'] = self.UseClippingGeometryUI.SaveJson()

    jsonData['ClippingGeometrySelectionSetName'] = self.ClippingGeometrySelectionSetName
    if serializeUIComponents:
      jsonData['ClippingGeometrySelectionSetNameUI'] = self.ClippingGeometrySelectionSetNameUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseClippingGeometry' in jsonData and jsonData['UseClippingGeometry'] is not None:
      self.UseClippingGeometry = jsonData['UseClippingGeometry']

    if 'ClippingGeometrySelectionSetName' in jsonData and jsonData['ClippingGeometrySelectionSetName'] is not None:
      self.ClippingGeometrySelectionSetName = jsonData['ClippingGeometrySelectionSetName']


  def Reset(self):
    self.UseClippingGeometryUI.Reset()
    self.ClippingGeometrySelectionSetNameUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseClippingGeometryUI.IsEditEnabled = isEditEnabled
    self.ClippingGeometrySelectionSetNameUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='GeometryCullingSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='GeometryCullingSettings', emboss=False)

        if self.UseClippingGeometryUI.Visible:
          column.prop(self, 'UseClippingGeometry')

        if self.ClippingGeometrySelectionSetNameUI.Visible:
          column.prop(self, 'ClippingGeometrySelectionSetName')



    else :
      if self.UseClippingGeometryUI.Visible:
        column.prop(self, 'UseClippingGeometry')

      if self.ClippingGeometrySelectionSetNameUI.Visible:
        column.prop(self, 'ClippingGeometrySelectionSetName')




class SimplygonAggregationSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MergeGeometriesUI.Visible: return True
    if self.KeepUnprocessedSceneMeshesUI.Visible: return True
    if self.EnableGeometryCullingUI.Visible: return True
    if self.GeometryCullingPrecisionUI.Visible: return True
    if self.SubdivideGeometryBasedOnUVTilesUI.Visible: return True
    if self.SubdivisionTileSizeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MergeGeometriesUI(self):
    index = bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List[index]

    return None

  MergeGeometries: bpy.props.BoolProperty(default=True,description='The processor will merge all the geometries in the scene into a single geometry if this is enabled.')
  class SimplygonMergeGeometriesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MergeGeometries

    @Value.setter
    def Value(self, value):
      self.Parent.MergeGeometries = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def KeepUnprocessedSceneMeshesUI(self):
    index = bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List[index]

    return None

  KeepUnprocessedSceneMeshes: bpy.props.BoolProperty(default=False,description='If false, the processor will remove all geometry and scene meshes which were not selected for processing from the scene. If true, only the geometry in the ProcessSelectionSet will be replaced or updated, while the rest of the scene tree is kept intact. New geometry is always added as the last child of the scene root. If generating a mappingimage to cast materials, new materialIds will also be appended to the end of the old material table instead of replacing the old ones.')
  class SimplygonKeepUnprocessedSceneMeshesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.KeepUnprocessedSceneMeshes

    @Value.setter
    def Value(self, value):
      self.Parent.KeepUnprocessedSceneMeshes = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def EnableGeometryCullingUI(self):
    index = bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List[index]

    return None

  EnableGeometryCulling: bpy.props.BoolProperty(default=False,description='Enables culling object insides and permits use of GeometryCullingSettings. If both this and visibility related culling is enabled, this is run first, then visibility.')
  class SimplygonEnableGeometryCullingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.EnableGeometryCulling

    @Value.setter
    def Value(self, value):
      self.Parent.EnableGeometryCulling = value
      self.Parent.GeometryCullingPrecisionUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GeometryCullingPrecisionUI(self):
    index = bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List[index]

    return None

  GeometryCullingPrecision: bpy.props.FloatProperty(default=0.5,min=0,max=1,description='The accuracy of the triangle intersection math to find and cull insides used by the EnableTriangleCulling setting. Defined from 0 to 1 where 0 is max speed and 1 is max precision.')
  class SimplygonGeometryCullingPrecisionEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GeometryCullingPrecision

    @Value.setter
    def Value(self, value):
      self.Parent.GeometryCullingPrecision = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.EnableGeometryCullingUI is not None:
        return self.Parent.EnableGeometryCulling and self.Parent.EnableGeometryCullingUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GeometryCullingPrecision: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GeometryCullingPrecision: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SubdivideGeometryBasedOnUVTilesUI(self):
    index = bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List[index]

    return None

  SubdivideGeometryBasedOnUVTiles: bpy.props.BoolProperty(default=False,description='Subdivides the geometry based on the tiling texture coords. The cutting frequency ´SubdivisionTileSize´ is a positive integer multiplier (i.e. the mesh will be cut each time its U or V texcoords crosses the SubdivisionTileSize). The output UVs will be in the range [(0,0),(SubdivisionTileSize,SubdivisionTileSize)].')
  class SimplygonSubdivideGeometryBasedOnUVTilesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SubdivideGeometryBasedOnUVTiles

    @Value.setter
    def Value(self, value):
      self.Parent.SubdivideGeometryBasedOnUVTiles = value
      self.Parent.SubdivisionTileSizeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SubdivisionTileSizeUI(self):
    index = bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List[index]

    return None

  SubdivisionTileSize: bpy.props.IntProperty(default=1,min=0,max=100,description='The cutting frequency used when SubdivideGeometryBasedOnUVTiles is enabled.')
  class SimplygonSubdivisionTileSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SubdivisionTileSize

    @Value.setter
    def Value(self, value):
      self.Parent.SubdivisionTileSize = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    @property
    def Visible(self):
      if self.Parent.SubdivideGeometryBasedOnUVTilesUI is not None:
        return self.Parent.SubdivideGeometryBasedOnUVTiles and self.Parent.SubdivideGeometryBasedOnUVTilesUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 100
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 100
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SubdivisionTileSize: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 100
      self.DefaultMaxValue = 100
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SubdivisionTileSize: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'AggregationSettings'
    MergeGeometriesUI = bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    EnableGeometryCullingUI = bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.add()
    EnableGeometryCullingUI.Init(self.name)
    EnableGeometryCullingUI.name = self.name
    GeometryCullingPrecisionUI = bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.add()
    GeometryCullingPrecisionUI.Init(self.name)
    GeometryCullingPrecisionUI.name = self.name
    SubdivideGeometryBasedOnUVTilesUI = bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.add()
    SubdivideGeometryBasedOnUVTilesUI.Init(self.name)
    SubdivideGeometryBasedOnUVTilesUI.name = self.name
    SubdivisionTileSizeUI = bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.add()
    SubdivisionTileSizeUI.Init(self.name)
    SubdivisionTileSizeUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.add()
    KeepUnprocessedSceneMeshesUI.Init(self.name)
    KeepUnprocessedSceneMeshesUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'AggregationSettings'
    MergeGeometriesUI = bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.add()
    MergeGeometriesUI.InitJson(self.name, jsonData['MergeGeometriesUI'] if jsonData is not None and 'MergeGeometriesUI' in jsonData else None)
    MergeGeometriesUI.name = self.name
    EnableGeometryCullingUI = bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.add()
    EnableGeometryCullingUI.InitJson(self.name, jsonData['EnableGeometryCullingUI'] if jsonData is not None and 'EnableGeometryCullingUI' in jsonData else None)
    EnableGeometryCullingUI.name = self.name
    GeometryCullingPrecisionUI = bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.add()
    GeometryCullingPrecisionUI.InitJson(self.name, jsonData['GeometryCullingPrecisionUI'] if jsonData is not None and 'GeometryCullingPrecisionUI' in jsonData else None)
    GeometryCullingPrecisionUI.name = self.name
    SubdivideGeometryBasedOnUVTilesUI = bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.add()
    SubdivideGeometryBasedOnUVTilesUI.InitJson(self.name, jsonData['SubdivideGeometryBasedOnUVTilesUI'] if jsonData is not None and 'SubdivideGeometryBasedOnUVTilesUI' in jsonData else None)
    SubdivideGeometryBasedOnUVTilesUI.name = self.name
    SubdivisionTileSizeUI = bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.add()
    SubdivisionTileSizeUI.InitJson(self.name, jsonData['SubdivisionTileSizeUI'] if jsonData is not None and 'SubdivisionTileSizeUI' in jsonData else None)
    SubdivisionTileSizeUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.add()
    KeepUnprocessedSceneMeshesUI.InitJson(self.name, jsonData['KeepUnprocessedSceneMeshesUI'] if jsonData is not None and 'KeepUnprocessedSceneMeshesUI' in jsonData else None)
    KeepUnprocessedSceneMeshesUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MergeGeometriesUI_index = bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.find(self.name)
    bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.remove(MergeGeometriesUI_index)
    EnableGeometryCullingUI_index = bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.find(self.name)
    bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.remove(EnableGeometryCullingUI_index)
    GeometryCullingPrecisionUI_index = bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.find(self.name)
    bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.remove(GeometryCullingPrecisionUI_index)
    SubdivideGeometryBasedOnUVTilesUI_index = bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.find(self.name)
    bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.remove(SubdivideGeometryBasedOnUVTilesUI_index)
    SubdivisionTileSizeUI_index = bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.find(self.name)
    bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.remove(SubdivisionTileSizeUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.find(self.name)
    bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.remove(KeepUnprocessedSceneMeshesUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MergeGeometries'] = self.MergeGeometries
    if serializeUIComponents:
      jsonData['MergeGeometriesUI'] = self.MergeGeometriesUI.SaveJson()

    jsonData['KeepUnprocessedSceneMeshes'] = self.KeepUnprocessedSceneMeshes
    if serializeUIComponents:
      jsonData['KeepUnprocessedSceneMeshesUI'] = self.KeepUnprocessedSceneMeshesUI.SaveJson()

    jsonData['EnableGeometryCulling'] = self.EnableGeometryCulling
    if serializeUIComponents:
      jsonData['EnableGeometryCullingUI'] = self.EnableGeometryCullingUI.SaveJson()

    jsonData['GeometryCullingPrecision'] = self.GeometryCullingPrecision
    if serializeUIComponents:
      jsonData['GeometryCullingPrecisionUI'] = self.GeometryCullingPrecisionUI.SaveJson()

    jsonData['SubdivideGeometryBasedOnUVTiles'] = self.SubdivideGeometryBasedOnUVTiles
    if serializeUIComponents:
      jsonData['SubdivideGeometryBasedOnUVTilesUI'] = self.SubdivideGeometryBasedOnUVTilesUI.SaveJson()

    jsonData['SubdivisionTileSize'] = self.SubdivisionTileSize
    if serializeUIComponents:
      jsonData['SubdivisionTileSizeUI'] = self.SubdivisionTileSizeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MergeGeometries' in jsonData and jsonData['MergeGeometries'] is not None:
      self.MergeGeometries = jsonData['MergeGeometries']

    if 'KeepUnprocessedSceneMeshes' in jsonData and jsonData['KeepUnprocessedSceneMeshes'] is not None:
      self.KeepUnprocessedSceneMeshes = jsonData['KeepUnprocessedSceneMeshes']

    if 'EnableGeometryCulling' in jsonData and jsonData['EnableGeometryCulling'] is not None:
      self.EnableGeometryCulling = jsonData['EnableGeometryCulling']

    if 'GeometryCullingPrecision' in jsonData and jsonData['GeometryCullingPrecision'] is not None:
      newGeometryCullingPrecision = jsonData['GeometryCullingPrecision']
      if newGeometryCullingPrecision >= self.GeometryCullingPrecisionUI.DefaultMinValue and newGeometryCullingPrecision <= self.GeometryCullingPrecisionUI.DefaultMaxValue:
        self.GeometryCullingPrecision = newGeometryCullingPrecision

      else:
        print("GeometryCullingPrecision: Invalid value", newGeometryCullingPrecision, "using default value", self.GeometryCullingPrecision)


    if 'SubdivideGeometryBasedOnUVTiles' in jsonData and jsonData['SubdivideGeometryBasedOnUVTiles'] is not None:
      self.SubdivideGeometryBasedOnUVTiles = jsonData['SubdivideGeometryBasedOnUVTiles']

    if 'SubdivisionTileSize' in jsonData and jsonData['SubdivisionTileSize'] is not None:
      newSubdivisionTileSize = jsonData['SubdivisionTileSize']
      if newSubdivisionTileSize >= self.SubdivisionTileSizeUI.DefaultMinValue and newSubdivisionTileSize <= self.SubdivisionTileSizeUI.DefaultMaxValue:
        self.SubdivisionTileSize = newSubdivisionTileSize

      else:
        print("SubdivisionTileSize: Invalid value", newSubdivisionTileSize, "using default value", self.SubdivisionTileSize)



  def Reset(self):
    self.MergeGeometriesUI.Reset()
    self.KeepUnprocessedSceneMeshesUI.Reset()
    self.EnableGeometryCullingUI.Reset()
    self.GeometryCullingPrecisionUI.Reset()
    self.SubdivideGeometryBasedOnUVTilesUI.Reset()
    self.SubdivisionTileSizeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MergeGeometriesUI.IsEditEnabled = isEditEnabled
    self.KeepUnprocessedSceneMeshesUI.IsEditEnabled = isEditEnabled
    self.EnableGeometryCullingUI.IsEditEnabled = isEditEnabled
    self.GeometryCullingPrecisionUI.IsEditEnabled = isEditEnabled
    self.SubdivideGeometryBasedOnUVTilesUI.IsEditEnabled = isEditEnabled
    self.SubdivisionTileSizeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='AggregationSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='AggregationSettings', emboss=False)

        if self.MergeGeometriesUI.Visible:
          column.prop(self, 'MergeGeometries')

        if self.EnableGeometryCullingUI.Visible:
          column.prop(self, 'EnableGeometryCulling')

        if self.GeometryCullingPrecisionUI.Visible:
          column.prop(self, 'GeometryCullingPrecision')

        if self.SubdivideGeometryBasedOnUVTilesUI.Visible:
          column.prop(self, 'SubdivideGeometryBasedOnUVTiles')

        if self.SubdivisionTileSizeUI.Visible:
          column.prop(self, 'SubdivisionTileSize')

        if self.KeepUnprocessedSceneMeshesUI.Visible:
          column.prop(self, 'KeepUnprocessedSceneMeshes')



    else :
      if self.MergeGeometriesUI.Visible:
        column.prop(self, 'MergeGeometries')

      if self.EnableGeometryCullingUI.Visible:
        column.prop(self, 'EnableGeometryCulling')

      if self.GeometryCullingPrecisionUI.Visible:
        column.prop(self, 'GeometryCullingPrecision')

      if self.SubdivideGeometryBasedOnUVTilesUI.Visible:
        column.prop(self, 'SubdivideGeometryBasedOnUVTiles')

      if self.SubdivisionTileSizeUI.Visible:
        column.prop(self, 'SubdivisionTileSize')

      if self.KeepUnprocessedSceneMeshesUI.Visible:
        column.prop(self, 'KeepUnprocessedSceneMeshes')




class SimplygonGenerateLightmapTexCoordSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.GenerateLightmapTexCoordUI.Visible: return True
    if self.LightmapTexCoordLevelUI.Visible: return True
    if self.LightmapTexCoordNameUI.Visible: return True
    if self.ChartAggregatorModeUI.Visible: return True
    if self.TextureWidthUI.Visible: return True
    if self.TextureHeightUI.Visible: return True
    if self.GutterSpaceUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def GenerateLightmapTexCoordUI(self):
    index = bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List[index]

    return None

  GenerateLightmapTexCoord: bpy.props.BoolProperty(default=False,description='Property for whether to generate an extra set of TexCoords for LightMapping.')
  class SimplygonGenerateLightmapTexCoordEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateLightmapTexCoord

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateLightmapTexCoord = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def LightmapTexCoordLevelUI(self):
    index = bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List[index]

    return None

  LightmapTexCoordLevel: bpy.props.IntProperty(default=-1,min=-1,max=10,description='The texture coordinate level used for storing the LightMap UVs. The texcoord name has priority over level. If neither name or level is set then output would be level 0.')
  class SimplygonLightmapTexCoordLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LightmapTexCoordLevel

    @Value.setter
    def Value(self, value):
      self.Parent.LightmapTexCoordLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("LightmapTexCoordLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("LightmapTexCoordLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def LightmapTexCoordNameUI(self):
    index = bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List[index]

    return None

  LightmapTexCoordName: bpy.props.StringProperty(default='',description='The texture coordinate level name used for storing the generated Lightmap UVs. If this is not set will default to level. If neither name or level is set then output would be level 0.')
  class SimplygonLightmapTexCoordNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.LightmapTexCoordName

    @Value.setter
    def Value(self, value):
      self.Parent.LightmapTexCoordName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ChartAggregatorModeUI(self):
    index = bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List[index]

    return None

  ChartAggregatorMode: bpy.props.EnumProperty(items=[('0','TextureSizeProportions', ''),('1','SurfaceArea', ''),('2','OriginalPixelDensity', ''),('3','UVSizeProportions', ''),],default='1',description='Determines which method to use when aggregating the UVs. TextureSizeProportions - Aggregated UV charts will be scaled to keep their relative pixel density relative to all other UV charts. The user can still set the size of the output texture maps. SurfaceArea - Aggregated UV charts will have their size set based on its actual geometrical size. OriginalPixelDensity - The combined atlas will be resized to fit each chart so that all charts retain the same amount of pixels as they originally had. This will override any manually set texture size. UVSizeProportions - Aggregated UV charts will have their size set based on its original UV size, disregarding the size of the texture they are used in.´);.')
  class SimplygonChartAggregatorModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ChartAggregatorMode

    @Value.setter
    def Value(self, value):
      self.Parent.ChartAggregatorMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TextureWidthUI(self):
    index = bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List[index]

    return None

  TextureWidth: bpy.props.IntProperty(default=512,min=0,max=8192,description='The width of the texture of the output mapping image.')
  class SimplygonTextureWidthEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureWidth

    @Value.setter
    def Value(self, value):
      self.Parent.TextureWidth = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 8192
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 8192
      self.TicksFrequencyValue = 256
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TextureWidth: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 8192
      self.DefaultMaxValue = 8192
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TextureWidth: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 256

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TextureHeightUI(self):
    index = bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List[index]

    return None

  TextureHeight: bpy.props.IntProperty(default=512,min=0,max=8192,description='The height of the texture of the output mapping image.')
  class SimplygonTextureHeightEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TextureHeight

    @Value.setter
    def Value(self, value):
      self.Parent.TextureHeight = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 8192
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 8192
      self.TicksFrequencyValue = 256
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TextureHeight: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 8192
      self.DefaultMaxValue = 8192
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TextureHeight: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 256

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GutterSpaceUI(self):
    index = bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List[index]

    return None

  GutterSpace: bpy.props.IntProperty(default=4,min=0,max=10,description='The minimum number of pixels between charts of the output mapping image.')
  class SimplygonGutterSpaceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GutterSpace

    @Value.setter
    def Value(self, value):
      self.Parent.GutterSpace = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GutterSpace: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GutterSpace: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GenerateLightmapTexCoordSettings'
    GenerateLightmapTexCoordUI = bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.add()
    GenerateLightmapTexCoordUI.Init(self.name)
    GenerateLightmapTexCoordUI.name = self.name
    LightmapTexCoordLevelUI = bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.add()
    LightmapTexCoordLevelUI.Init(self.name)
    LightmapTexCoordLevelUI.name = self.name
    LightmapTexCoordNameUI = bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.add()
    LightmapTexCoordNameUI.Init(self.name)
    LightmapTexCoordNameUI.name = self.name
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    TextureWidthUI = bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.add()
    GutterSpaceUI.Init(self.name)
    GutterSpaceUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GenerateLightmapTexCoordSettings'
    GenerateLightmapTexCoordUI = bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.add()
    GenerateLightmapTexCoordUI.InitJson(self.name, jsonData['GenerateLightmapTexCoordUI'] if jsonData is not None and 'GenerateLightmapTexCoordUI' in jsonData else None)
    GenerateLightmapTexCoordUI.name = self.name
    LightmapTexCoordLevelUI = bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.add()
    LightmapTexCoordLevelUI.InitJson(self.name, jsonData['LightmapTexCoordLevelUI'] if jsonData is not None and 'LightmapTexCoordLevelUI' in jsonData else None)
    LightmapTexCoordLevelUI.name = self.name
    LightmapTexCoordNameUI = bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.add()
    LightmapTexCoordNameUI.InitJson(self.name, jsonData['LightmapTexCoordNameUI'] if jsonData is not None and 'LightmapTexCoordNameUI' in jsonData else None)
    LightmapTexCoordNameUI.name = self.name
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.add()
    ChartAggregatorModeUI.InitJson(self.name, jsonData['ChartAggregatorModeUI'] if jsonData is not None and 'ChartAggregatorModeUI' in jsonData else None)
    ChartAggregatorModeUI.name = self.name
    TextureWidthUI = bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.add()
    TextureWidthUI.InitJson(self.name, jsonData['TextureWidthUI'] if jsonData is not None and 'TextureWidthUI' in jsonData else None)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.add()
    TextureHeightUI.InitJson(self.name, jsonData['TextureHeightUI'] if jsonData is not None and 'TextureHeightUI' in jsonData else None)
    TextureHeightUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.add()
    GutterSpaceUI.InitJson(self.name, jsonData['GutterSpaceUI'] if jsonData is not None and 'GutterSpaceUI' in jsonData else None)
    GutterSpaceUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    GenerateLightmapTexCoordUI_index = bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.find(self.name)
    bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.remove(GenerateLightmapTexCoordUI_index)
    LightmapTexCoordLevelUI_index = bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.find(self.name)
    bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.remove(LightmapTexCoordLevelUI_index)
    LightmapTexCoordNameUI_index = bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.find(self.name)
    bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.remove(LightmapTexCoordNameUI_index)
    ChartAggregatorModeUI_index = bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.find(self.name)
    bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.remove(ChartAggregatorModeUI_index)
    TextureWidthUI_index = bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.find(self.name)
    bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.find(self.name)
    bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.remove(TextureHeightUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.find(self.name)
    bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.remove(GutterSpaceUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['GenerateLightmapTexCoord'] = self.GenerateLightmapTexCoord
    if serializeUIComponents:
      jsonData['GenerateLightmapTexCoordUI'] = self.GenerateLightmapTexCoordUI.SaveJson()

    jsonData['LightmapTexCoordLevel'] = self.LightmapTexCoordLevel
    if serializeUIComponents:
      jsonData['LightmapTexCoordLevelUI'] = self.LightmapTexCoordLevelUI.SaveJson()

    jsonData['LightmapTexCoordName'] = self.LightmapTexCoordName
    if serializeUIComponents:
      jsonData['LightmapTexCoordNameUI'] = self.LightmapTexCoordNameUI.SaveJson()

    jsonData['ChartAggregatorMode'] = int(self.ChartAggregatorMode)
    if serializeUIComponents:
      jsonData['ChartAggregatorModeUI'] = self.ChartAggregatorModeUI.SaveJson()

    jsonData['TextureWidth'] = self.TextureWidth
    if serializeUIComponents:
      jsonData['TextureWidthUI'] = self.TextureWidthUI.SaveJson()

    jsonData['TextureHeight'] = self.TextureHeight
    if serializeUIComponents:
      jsonData['TextureHeightUI'] = self.TextureHeightUI.SaveJson()

    jsonData['GutterSpace'] = self.GutterSpace
    if serializeUIComponents:
      jsonData['GutterSpaceUI'] = self.GutterSpaceUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'GenerateLightmapTexCoord' in jsonData and jsonData['GenerateLightmapTexCoord'] is not None:
      self.GenerateLightmapTexCoord = jsonData['GenerateLightmapTexCoord']

    if 'LightmapTexCoordLevel' in jsonData and jsonData['LightmapTexCoordLevel'] is not None:
      newLightmapTexCoordLevel = jsonData['LightmapTexCoordLevel']
      if newLightmapTexCoordLevel >= self.LightmapTexCoordLevelUI.DefaultMinValue and newLightmapTexCoordLevel <= self.LightmapTexCoordLevelUI.DefaultMaxValue:
        self.LightmapTexCoordLevel = newLightmapTexCoordLevel

      else:
        print("LightmapTexCoordLevel: Invalid value", newLightmapTexCoordLevel, "using default value", self.LightmapTexCoordLevel)


    if 'LightmapTexCoordName' in jsonData and jsonData['LightmapTexCoordName'] is not None:
      self.LightmapTexCoordName = jsonData['LightmapTexCoordName']

    if 'ChartAggregatorMode' in jsonData and jsonData['ChartAggregatorMode'] is not None:
      self.ChartAggregatorMode = str(jsonData['ChartAggregatorMode'])

    if 'TextureWidth' in jsonData and jsonData['TextureWidth'] is not None:
      newTextureWidth = jsonData['TextureWidth']
      if newTextureWidth >= self.TextureWidthUI.DefaultMinValue and newTextureWidth <= self.TextureWidthUI.DefaultMaxValue:
        self.TextureWidth = newTextureWidth

      else:
        print("TextureWidth: Invalid value", newTextureWidth, "using default value", self.TextureWidth)


    if 'TextureHeight' in jsonData and jsonData['TextureHeight'] is not None:
      newTextureHeight = jsonData['TextureHeight']
      if newTextureHeight >= self.TextureHeightUI.DefaultMinValue and newTextureHeight <= self.TextureHeightUI.DefaultMaxValue:
        self.TextureHeight = newTextureHeight

      else:
        print("TextureHeight: Invalid value", newTextureHeight, "using default value", self.TextureHeight)


    if 'GutterSpace' in jsonData and jsonData['GutterSpace'] is not None:
      newGutterSpace = jsonData['GutterSpace']
      if newGutterSpace >= self.GutterSpaceUI.DefaultMinValue and newGutterSpace <= self.GutterSpaceUI.DefaultMaxValue:
        self.GutterSpace = newGutterSpace

      else:
        print("GutterSpace: Invalid value", newGutterSpace, "using default value", self.GutterSpace)



  def Reset(self):
    self.GenerateLightmapTexCoordUI.Reset()
    self.LightmapTexCoordLevelUI.Reset()
    self.LightmapTexCoordNameUI.Reset()
    self.ChartAggregatorModeUI.Reset()
    self.TextureWidthUI.Reset()
    self.TextureHeightUI.Reset()
    self.GutterSpaceUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.GenerateLightmapTexCoordUI.IsEditEnabled = isEditEnabled
    self.LightmapTexCoordLevelUI.IsEditEnabled = isEditEnabled
    self.LightmapTexCoordNameUI.IsEditEnabled = isEditEnabled
    self.ChartAggregatorModeUI.IsEditEnabled = isEditEnabled
    self.TextureWidthUI.IsEditEnabled = isEditEnabled
    self.TextureHeightUI.IsEditEnabled = isEditEnabled
    self.GutterSpaceUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='GenerateLightmapTexCoordSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='GenerateLightmapTexCoordSettings', emboss=False)

        if self.GenerateLightmapTexCoordUI.Visible:
          column.prop(self, 'GenerateLightmapTexCoord')

        if self.LightmapTexCoordLevelUI.Visible:
          column.prop(self, 'LightmapTexCoordLevel')

        if self.LightmapTexCoordNameUI.Visible:
          column.prop(self, 'LightmapTexCoordName')

        if self.ChartAggregatorModeUI.Visible:
          column.prop(self, 'ChartAggregatorMode')

        if self.TextureWidthUI.Visible:
          column.prop(self, 'TextureWidth')

        if self.TextureHeightUI.Visible:
          column.prop(self, 'TextureHeight')

        if self.GutterSpaceUI.Visible:
          column.prop(self, 'GutterSpace')



    else :
      if self.GenerateLightmapTexCoordUI.Visible:
        column.prop(self, 'GenerateLightmapTexCoord')

      if self.LightmapTexCoordLevelUI.Visible:
        column.prop(self, 'LightmapTexCoordLevel')

      if self.LightmapTexCoordNameUI.Visible:
        column.prop(self, 'LightmapTexCoordName')

      if self.ChartAggregatorModeUI.Visible:
        column.prop(self, 'ChartAggregatorMode')

      if self.TextureWidthUI.Visible:
        column.prop(self, 'TextureWidth')

      if self.TextureHeightUI.Visible:
        column.prop(self, 'TextureHeight')

      if self.GutterSpaceUI.Visible:
        column.prop(self, 'GutterSpace')




class SimplygonFoliageSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.SeparateTrunkAndFoliageUI.Visible: return True
    if self.SeparateFoliageTriangleRatioUI.Visible: return True
    if self.SeparateFoliageTriangleThresholdUI.Visible: return True
    if self.SeparateFoliageAreaThresholdUI.Visible: return True
    if self.SeparateFoliageSizeThresholdUI.Visible: return True
    if self.TrunkReductionRatioUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  Parent_id: bpy.props.StringProperty()
  @property
  def Parent(self):
    index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

    return None

  @property
  def SeparateTrunkAndFoliageUI(self):
    index = bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List[index]

    return None

  SeparateTrunkAndFoliage: bpy.props.BoolProperty(default=False,description='Determines whether to enable separation between foliage and trunk in a vegetation scene. Use the SeparateFoliage[...] settings to determine how parts are separated.')
  class SimplygonSeparateTrunkAndFoliageEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateTrunkAndFoliage

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateTrunkAndFoliage = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SeparateFoliageTriangleRatioUI(self):
    index = bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List[index]

    return None

  SeparateFoliageTriangleRatio: bpy.props.FloatProperty(default=0.01,min=0,max=1,description='Is used to separate the trunk from the foliage in a vegetation scene by comparing each group of connected triangles in the scene with the scene´s largest group. If a group´s triangle count is below SeparateFoliageTriangleRatio * largestGrouptriangleCount it is treated as foliage and processed into billboards. The trunk is optimized using triangle reduction. The range is 0.0->1.0. 0.0 means nothing will be foliage, 1.0 means everything will be foliage.')
  class SimplygonSeparateFoliageTriangleRatioEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateFoliageTriangleRatio

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateFoliageTriangleRatio = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SeparateFoliageTriangleRatio: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SeparateFoliageTriangleRatio: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SeparateFoliageTriangleThresholdUI(self):
    index = bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List[index]

    return None

  SeparateFoliageTriangleThreshold: bpy.props.IntProperty(default=10,min=0,max=10000,description='Is used to separate the trunk from the foliage in a vegetation scene by finding each group of connected triangles in the scene and if the triangle count is below SeparateFoliageTriangleThreshold it is treated as foliage and processed into billboards. The trunk is optimized using reduction. The range is 0->large value. 0 means nothing will be foliage, value larger than the maximum triangle count means everything will be foliage.')
  class SimplygonSeparateFoliageTriangleThresholdEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateFoliageTriangleThreshold

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateFoliageTriangleThreshold = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10000
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SeparateFoliageTriangleThreshold: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000
      self.DefaultMaxValue = 10000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SeparateFoliageTriangleThreshold: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SeparateFoliageAreaThresholdUI(self):
    index = bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List[index]

    return None

  SeparateFoliageAreaThreshold: bpy.props.FloatProperty(default=0.1,min=0,max=10000,description='Is used to separate the trunk from the foliage in a vegetation scene by finding each group of connected triangles in the scene and if the surface area is below (SeparateFoliageAreaThreshold * AreaOfTheLargestGroupInTheScene) it is treated as foliage and processed into billboards. The trunk is optimized using reduction. The range is 0->large value. 0 means nothing will be foliage, value larger than the maximum surface area means everything will be foliage.')
  class SimplygonSeparateFoliageAreaThresholdEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateFoliageAreaThreshold

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateFoliageAreaThreshold = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SeparateFoliageAreaThreshold: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000
      self.DefaultMaxValue = 10000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SeparateFoliageAreaThreshold: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def SeparateFoliageSizeThresholdUI(self):
    index = bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List[index]

    return None

  SeparateFoliageSizeThreshold: bpy.props.FloatProperty(default=0.1,min=0,max=10000,description='Is used to separate the trunk from the foliage in a vegetation scene by finding each group of connected triangles in the scene and if the diameter of the group is below (SeparateFoliageSizeThreshold * SceneDiameter) it is treated as foliage and processed into billboards. The trunk is optimized using reduction. The range is 0->large value. 0 means nothing will be foliage, value larger than the scene´s diameter means everything will be foliage.')
  class SimplygonSeparateFoliageSizeThresholdEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SeparateFoliageSizeThreshold

    @Value.setter
    def Value(self, value):
      self.Parent.SeparateFoliageSizeThreshold = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("SeparateFoliageSizeThreshold: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000
      self.DefaultMaxValue = 10000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("SeparateFoliageSizeThreshold: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TrunkReductionRatioUI(self):
    index = bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List[index]

    return None

  TrunkReductionRatio: bpy.props.FloatProperty(default=0.5,min=0,max=1,description='Determines the triangle reduction ratio for the trunk part that has been separated from the foliage part based on the ´separate foliage´ settings.')
  class SimplygonTrunkReductionRatioEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TrunkReductionRatio

    @Value.setter
    def Value(self, value):
      self.Parent.TrunkReductionRatio = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TrunkReductionRatio: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TrunkReductionRatio: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self, parentId):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'FoliageSettings'
    SeparateTrunkAndFoliageUI = bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.add()
    SeparateTrunkAndFoliageUI.Init(self.name)
    SeparateTrunkAndFoliageUI.name = self.name
    SeparateFoliageTriangleRatioUI = bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.add()
    SeparateFoliageTriangleRatioUI.Init(self.name)
    SeparateFoliageTriangleRatioUI.name = self.name
    SeparateFoliageTriangleThresholdUI = bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.add()
    SeparateFoliageTriangleThresholdUI.Init(self.name)
    SeparateFoliageTriangleThresholdUI.name = self.name
    SeparateFoliageAreaThresholdUI = bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.add()
    SeparateFoliageAreaThresholdUI.Init(self.name)
    SeparateFoliageAreaThresholdUI.name = self.name
    SeparateFoliageSizeThresholdUI = bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.add()
    SeparateFoliageSizeThresholdUI.Init(self.name)
    SeparateFoliageSizeThresholdUI.name = self.name
    TrunkReductionRatioUI = bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.add()
    TrunkReductionRatioUI.Init(self.name)
    TrunkReductionRatioUI.name = self.name

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'FoliageSettings'
    SeparateTrunkAndFoliageUI = bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.add()
    SeparateTrunkAndFoliageUI.InitJson(self.name, jsonData['SeparateTrunkAndFoliageUI'] if jsonData is not None and 'SeparateTrunkAndFoliageUI' in jsonData else None)
    SeparateTrunkAndFoliageUI.name = self.name
    SeparateFoliageTriangleRatioUI = bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.add()
    SeparateFoliageTriangleRatioUI.InitJson(self.name, jsonData['SeparateFoliageTriangleRatioUI'] if jsonData is not None and 'SeparateFoliageTriangleRatioUI' in jsonData else None)
    SeparateFoliageTriangleRatioUI.name = self.name
    SeparateFoliageTriangleThresholdUI = bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.add()
    SeparateFoliageTriangleThresholdUI.InitJson(self.name, jsonData['SeparateFoliageTriangleThresholdUI'] if jsonData is not None and 'SeparateFoliageTriangleThresholdUI' in jsonData else None)
    SeparateFoliageTriangleThresholdUI.name = self.name
    SeparateFoliageAreaThresholdUI = bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.add()
    SeparateFoliageAreaThresholdUI.InitJson(self.name, jsonData['SeparateFoliageAreaThresholdUI'] if jsonData is not None and 'SeparateFoliageAreaThresholdUI' in jsonData else None)
    SeparateFoliageAreaThresholdUI.name = self.name
    SeparateFoliageSizeThresholdUI = bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.add()
    SeparateFoliageSizeThresholdUI.InitJson(self.name, jsonData['SeparateFoliageSizeThresholdUI'] if jsonData is not None and 'SeparateFoliageSizeThresholdUI' in jsonData else None)
    SeparateFoliageSizeThresholdUI.name = self.name
    TrunkReductionRatioUI = bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.add()
    TrunkReductionRatioUI.InitJson(self.name, jsonData['TrunkReductionRatioUI'] if jsonData is not None and 'TrunkReductionRatioUI' in jsonData else None)
    TrunkReductionRatioUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    SeparateTrunkAndFoliageUI_index = bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.find(self.name)
    bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.remove(SeparateTrunkAndFoliageUI_index)
    SeparateFoliageTriangleRatioUI_index = bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.find(self.name)
    bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.remove(SeparateFoliageTriangleRatioUI_index)
    SeparateFoliageTriangleThresholdUI_index = bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.find(self.name)
    bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.remove(SeparateFoliageTriangleThresholdUI_index)
    SeparateFoliageAreaThresholdUI_index = bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.find(self.name)
    bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.remove(SeparateFoliageAreaThresholdUI_index)
    SeparateFoliageSizeThresholdUI_index = bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.find(self.name)
    bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.remove(SeparateFoliageSizeThresholdUI_index)
    TrunkReductionRatioUI_index = bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.find(self.name)
    bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.remove(TrunkReductionRatioUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['SeparateTrunkAndFoliage'] = self.SeparateTrunkAndFoliage
    if serializeUIComponents:
      jsonData['SeparateTrunkAndFoliageUI'] = self.SeparateTrunkAndFoliageUI.SaveJson()

    jsonData['SeparateFoliageTriangleRatio'] = self.SeparateFoliageTriangleRatio
    if serializeUIComponents:
      jsonData['SeparateFoliageTriangleRatioUI'] = self.SeparateFoliageTriangleRatioUI.SaveJson()

    jsonData['SeparateFoliageTriangleThreshold'] = self.SeparateFoliageTriangleThreshold
    if serializeUIComponents:
      jsonData['SeparateFoliageTriangleThresholdUI'] = self.SeparateFoliageTriangleThresholdUI.SaveJson()

    jsonData['SeparateFoliageAreaThreshold'] = self.SeparateFoliageAreaThreshold
    if serializeUIComponents:
      jsonData['SeparateFoliageAreaThresholdUI'] = self.SeparateFoliageAreaThresholdUI.SaveJson()

    jsonData['SeparateFoliageSizeThreshold'] = self.SeparateFoliageSizeThreshold
    if serializeUIComponents:
      jsonData['SeparateFoliageSizeThresholdUI'] = self.SeparateFoliageSizeThresholdUI.SaveJson()

    jsonData['TrunkReductionRatio'] = self.TrunkReductionRatio
    if serializeUIComponents:
      jsonData['TrunkReductionRatioUI'] = self.TrunkReductionRatioUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'SeparateTrunkAndFoliage' in jsonData and jsonData['SeparateTrunkAndFoliage'] is not None:
      self.SeparateTrunkAndFoliage = jsonData['SeparateTrunkAndFoliage']

    if 'SeparateFoliageTriangleRatio' in jsonData and jsonData['SeparateFoliageTriangleRatio'] is not None:
      newSeparateFoliageTriangleRatio = jsonData['SeparateFoliageTriangleRatio']
      if newSeparateFoliageTriangleRatio >= self.SeparateFoliageTriangleRatioUI.DefaultMinValue and newSeparateFoliageTriangleRatio <= self.SeparateFoliageTriangleRatioUI.DefaultMaxValue:
        self.SeparateFoliageTriangleRatio = newSeparateFoliageTriangleRatio

      else:
        print("SeparateFoliageTriangleRatio: Invalid value", newSeparateFoliageTriangleRatio, "using default value", self.SeparateFoliageTriangleRatio)


    if 'SeparateFoliageTriangleThreshold' in jsonData and jsonData['SeparateFoliageTriangleThreshold'] is not None:
      newSeparateFoliageTriangleThreshold = jsonData['SeparateFoliageTriangleThreshold']
      if newSeparateFoliageTriangleThreshold >= self.SeparateFoliageTriangleThresholdUI.DefaultMinValue and newSeparateFoliageTriangleThreshold <= self.SeparateFoliageTriangleThresholdUI.DefaultMaxValue:
        self.SeparateFoliageTriangleThreshold = newSeparateFoliageTriangleThreshold

      else:
        print("SeparateFoliageTriangleThreshold: Invalid value", newSeparateFoliageTriangleThreshold, "using default value", self.SeparateFoliageTriangleThreshold)


    if 'SeparateFoliageAreaThreshold' in jsonData and jsonData['SeparateFoliageAreaThreshold'] is not None:
      newSeparateFoliageAreaThreshold = jsonData['SeparateFoliageAreaThreshold']
      if newSeparateFoliageAreaThreshold >= self.SeparateFoliageAreaThresholdUI.DefaultMinValue and newSeparateFoliageAreaThreshold <= self.SeparateFoliageAreaThresholdUI.DefaultMaxValue:
        self.SeparateFoliageAreaThreshold = newSeparateFoliageAreaThreshold

      else:
        print("SeparateFoliageAreaThreshold: Invalid value", newSeparateFoliageAreaThreshold, "using default value", self.SeparateFoliageAreaThreshold)


    if 'SeparateFoliageSizeThreshold' in jsonData and jsonData['SeparateFoliageSizeThreshold'] is not None:
      newSeparateFoliageSizeThreshold = jsonData['SeparateFoliageSizeThreshold']
      if newSeparateFoliageSizeThreshold >= self.SeparateFoliageSizeThresholdUI.DefaultMinValue and newSeparateFoliageSizeThreshold <= self.SeparateFoliageSizeThresholdUI.DefaultMaxValue:
        self.SeparateFoliageSizeThreshold = newSeparateFoliageSizeThreshold

      else:
        print("SeparateFoliageSizeThreshold: Invalid value", newSeparateFoliageSizeThreshold, "using default value", self.SeparateFoliageSizeThreshold)


    if 'TrunkReductionRatio' in jsonData and jsonData['TrunkReductionRatio'] is not None:
      newTrunkReductionRatio = jsonData['TrunkReductionRatio']
      if newTrunkReductionRatio >= self.TrunkReductionRatioUI.DefaultMinValue and newTrunkReductionRatio <= self.TrunkReductionRatioUI.DefaultMaxValue:
        self.TrunkReductionRatio = newTrunkReductionRatio

      else:
        print("TrunkReductionRatio: Invalid value", newTrunkReductionRatio, "using default value", self.TrunkReductionRatio)



  def Reset(self):
    self.SeparateTrunkAndFoliageUI.Reset()
    self.SeparateFoliageTriangleRatioUI.Reset()
    self.SeparateFoliageTriangleThresholdUI.Reset()
    self.SeparateFoliageAreaThresholdUI.Reset()
    self.SeparateFoliageSizeThresholdUI.Reset()
    self.TrunkReductionRatioUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.SeparateTrunkAndFoliageUI.IsEditEnabled = isEditEnabled
    self.SeparateFoliageTriangleRatioUI.IsEditEnabled = isEditEnabled
    self.SeparateFoliageTriangleThresholdUI.IsEditEnabled = isEditEnabled
    self.SeparateFoliageAreaThresholdUI.IsEditEnabled = isEditEnabled
    self.SeparateFoliageSizeThresholdUI.IsEditEnabled = isEditEnabled
    self.TrunkReductionRatioUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='FoliageSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='FoliageSettings', emboss=False)

        if self.SeparateTrunkAndFoliageUI.Visible:
          column.prop(self, 'SeparateTrunkAndFoliage')

        if self.SeparateFoliageTriangleRatioUI.Visible:
          column.prop(self, 'SeparateFoliageTriangleRatio')

        if self.SeparateFoliageTriangleThresholdUI.Visible:
          column.prop(self, 'SeparateFoliageTriangleThreshold')

        if self.SeparateFoliageAreaThresholdUI.Visible:
          column.prop(self, 'SeparateFoliageAreaThreshold')

        if self.SeparateFoliageSizeThresholdUI.Visible:
          column.prop(self, 'SeparateFoliageSizeThreshold')

        if self.TrunkReductionRatioUI.Visible:
          column.prop(self, 'TrunkReductionRatio')



    else :
      if self.SeparateTrunkAndFoliageUI.Visible:
        column.prop(self, 'SeparateTrunkAndFoliage')

      if self.SeparateFoliageTriangleRatioUI.Visible:
        column.prop(self, 'SeparateFoliageTriangleRatio')

      if self.SeparateFoliageTriangleThresholdUI.Visible:
        column.prop(self, 'SeparateFoliageTriangleThreshold')

      if self.SeparateFoliageAreaThresholdUI.Visible:
        column.prop(self, 'SeparateFoliageAreaThreshold')

      if self.SeparateFoliageSizeThresholdUI.Visible:
        column.prop(self, 'SeparateFoliageSizeThreshold')

      if self.TrunkReductionRatioUI.Visible:
        column.prop(self, 'TrunkReductionRatio')




class SimplygonBillboardCloudSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.BillboardModeUI.Visible: return True
    if self.FavorVerticalPlanesUI.Visible: return True
    if self.TwoSidedUI.Visible: return True
    if self.UseVisibilityWeightsUI.Visible: return True
    if self.BillboardDensityUI.Visible: return True
    if self.MaxPlaneCountUI.Visible: return True
    if self.GeometricComplexityUI.Visible: return True
    if self.UpVectorXUI.Visible: return True
    if self.UpVectorYUI.Visible: return True
    if self.UpVectorZUI.Visible: return True

    if self.FoliageSettings is not None and self.FoliageSettings.Visible: return True
    return False

  @Visible.setter
  def Visible(self, value):
    pass

  FoliageSettings_id: bpy.props.StringProperty()
  @property
  def FoliageSettings(self):
    index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.FoliageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

    return None

  @property
  def BillboardModeUI(self):
    index = bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List[index]

    return None

  BillboardMode: bpy.props.EnumProperty(items=[('0','OuterShell', ''),('1','Foliage', ''),],default='0',description='Specifies how the impostors should be mapped to the scene.')
  class SimplygonBillboardModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BillboardMode

    @Value.setter
    def Value(self, value):
      self.Parent.BillboardMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FavorVerticalPlanesUI(self):
    index = bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List[index]

    return None

  FavorVerticalPlanes: bpy.props.BoolProperty(default=False,description='Determines whether to prioritize generating vertical billboards which means they will be optimized to be viewed from the side. Otherwise, if the geometry in the input scene is mostly facing upwards/downwards then the generated billboards will also be facing upwards/downwards which makes them not well suited to being viewed from the side.')
  class SimplygonFavorVerticalPlanesEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FavorVerticalPlanes

    @Value.setter
    def Value(self, value):
      self.Parent.FavorVerticalPlanes = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TwoSidedUI(self):
    index = bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List[index]

    return None

  TwoSided: bpy.props.BoolProperty(default=True,description='Only applicable if BillboardMode: Foliage. Determines if the scene is intended to be viewed from both sides without back face culling.')
  class SimplygonTwoSidedEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TwoSided

    @Value.setter
    def Value(self, value):
      self.Parent.TwoSided = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseVisibilityWeightsUI(self):
    index = bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List[index]

    return None

  UseVisibilityWeights: bpy.props.BoolProperty(default=True,description='Determines whether to prioritize accurately mapping triangles with higher visibility to billboards.')
  class SimplygonUseVisibilityWeightsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseVisibilityWeights

    @Value.setter
    def Value(self, value):
      self.Parent.UseVisibilityWeights = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BillboardDensityUI(self):
    index = bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List[index]

    return None

  BillboardDensity: bpy.props.FloatProperty(default=0.2,min=0,max=1,description='Determines how many billboards to create. A large BillboardDensity means that more billboards will be created to represent spatially spread out triangles better. Having a low BillboardDensity means that fewer billboards will be created and the distances from original leaves to billboards will get larger. The range is 0->1.')
  class SimplygonBillboardDensityEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BillboardDensity

    @Value.setter
    def Value(self, value):
      self.Parent.BillboardDensity = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("BillboardDensity: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("BillboardDensity: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MaxPlaneCountUI(self):
    index = bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List[index]

    return None

  MaxPlaneCount: bpy.props.IntProperty(default=10,min=0,max=64,description='Determines the maximum billboard count. When this criteria is met, it is not guaranteed that all triangles in the scene have been accurately mapped to a billboard yet. Triangles that have not been mapped to a billboard within the BillboardMaxDeviation distance will be mapped to an existing billboard that best represents the triangle.')
  class SimplygonMaxPlaneCountEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaxPlaneCount

    @Value.setter
    def Value(self, value):
      self.Parent.MaxPlaneCount = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 64
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 64
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MaxPlaneCount: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 64
      self.DefaultMaxValue = 64
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MaxPlaneCount: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GeometricComplexityUI(self):
    index = bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List[index]

    return None

  GeometricComplexity: bpy.props.FloatProperty(default=0.5,min=0,max=1,description='Determines the geometric complexity of the billboards. The value range is 0->1, where a value of Zero means that the billboards will be simple and not follow the projection closely. And a value of One means that the geometric complexity will be increased and follow the projection closely.')
  class SimplygonGeometricComplexityEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GeometricComplexity

    @Value.setter
    def Value(self, value):
      self.Parent.GeometricComplexity = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GeometricComplexity: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GeometricComplexity: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorXUI(self):
    index = bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List[index]

    return None

  UpVectorX: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The UpVector used in the Billboard Cloud Processor. Set this if the input scene has an up vector other than Y+. If FavorVerticalPlanes is enabled, the UpVector determines verticality.')
  class SimplygonUpVectorXEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorX

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorX = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorX: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorX: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorYUI(self):
    index = bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List[index]

    return None

  UpVectorY: bpy.props.FloatProperty(default=1,min=-1,max=1,description='The UpVector used in the Billboard Cloud Processor. Set this if the input scene has an up vector other than Y+. If FavorVerticalPlanes is enabled, the UpVector determines verticality.')
  class SimplygonUpVectorYEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorY

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorY = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorY: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorY: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorZUI(self):
    index = bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List[index]

    return None

  UpVectorZ: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The UpVector used in the Billboard Cloud Processor. Set this if the input scene has an up vector other than Y+. If FavorVerticalPlanes is enabled, the UpVector determines verticality.')
  class SimplygonUpVectorZEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorZ

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorZ = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorZ: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorZ: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'BillboardCloudSettings'
    BillboardModeUI = bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.add()
    BillboardModeUI.Init(self.name)
    BillboardModeUI.name = self.name
    FavorVerticalPlanesUI = bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.add()
    FavorVerticalPlanesUI.Init(self.name)
    FavorVerticalPlanesUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    UseVisibilityWeightsUI = bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.add()
    UseVisibilityWeightsUI.Init(self.name)
    UseVisibilityWeightsUI.name = self.name
    BillboardDensityUI = bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.add()
    BillboardDensityUI.Init(self.name)
    BillboardDensityUI.name = self.name
    MaxPlaneCountUI = bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.add()
    MaxPlaneCountUI.Init(self.name)
    MaxPlaneCountUI.name = self.name
    GeometricComplexityUI = bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.add()
    GeometricComplexityUI.Init(self.name)
    GeometricComplexityUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.add()
    UpVectorZUI.Init(self.name)
    UpVectorZUI.name = self.name
    FoliageSettings = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.add()
    FoliageSettings.Init(self.name)
    self.FoliageSettings_id = FoliageSettings.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'BillboardCloudSettings'
    BillboardModeUI = bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.add()
    BillboardModeUI.InitJson(self.name, jsonData['BillboardModeUI'] if jsonData is not None and 'BillboardModeUI' in jsonData else None)
    BillboardModeUI.name = self.name
    FavorVerticalPlanesUI = bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.add()
    FavorVerticalPlanesUI.InitJson(self.name, jsonData['FavorVerticalPlanesUI'] if jsonData is not None and 'FavorVerticalPlanesUI' in jsonData else None)
    FavorVerticalPlanesUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.add()
    TwoSidedUI.InitJson(self.name, jsonData['TwoSidedUI'] if jsonData is not None and 'TwoSidedUI' in jsonData else None)
    TwoSidedUI.name = self.name
    UseVisibilityWeightsUI = bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.add()
    UseVisibilityWeightsUI.InitJson(self.name, jsonData['UseVisibilityWeightsUI'] if jsonData is not None and 'UseVisibilityWeightsUI' in jsonData else None)
    UseVisibilityWeightsUI.name = self.name
    BillboardDensityUI = bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.add()
    BillboardDensityUI.InitJson(self.name, jsonData['BillboardDensityUI'] if jsonData is not None and 'BillboardDensityUI' in jsonData else None)
    BillboardDensityUI.name = self.name
    MaxPlaneCountUI = bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.add()
    MaxPlaneCountUI.InitJson(self.name, jsonData['MaxPlaneCountUI'] if jsonData is not None and 'MaxPlaneCountUI' in jsonData else None)
    MaxPlaneCountUI.name = self.name
    GeometricComplexityUI = bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.add()
    GeometricComplexityUI.InitJson(self.name, jsonData['GeometricComplexityUI'] if jsonData is not None and 'GeometricComplexityUI' in jsonData else None)
    GeometricComplexityUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.add()
    UpVectorXUI.InitJson(self.name, jsonData['UpVectorXUI'] if jsonData is not None and 'UpVectorXUI' in jsonData else None)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.add()
    UpVectorYUI.InitJson(self.name, jsonData['UpVectorYUI'] if jsonData is not None and 'UpVectorYUI' in jsonData else None)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.add()
    UpVectorZUI.InitJson(self.name, jsonData['UpVectorZUI'] if jsonData is not None and 'UpVectorZUI' in jsonData else None)
    UpVectorZUI.name = self.name
    if jsonData['FoliageSettings'] is not None:
      FoliageSettings = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.add()
      FoliageSettings.InitJson(self.name, jsonData['FoliageSettings'])
      self.FoliageSettings_id = FoliageSettings.name

    self.LoadJson(jsonData)

  def Deinit(self):
    BillboardModeUI_index = bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.find(self.name)
    bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.remove(BillboardModeUI_index)
    FavorVerticalPlanesUI_index = bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.find(self.name)
    bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.remove(FavorVerticalPlanesUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.find(self.name)
    bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.remove(TwoSidedUI_index)
    UseVisibilityWeightsUI_index = bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.find(self.name)
    bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.remove(UseVisibilityWeightsUI_index)
    BillboardDensityUI_index = bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.find(self.name)
    bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.remove(BillboardDensityUI_index)
    MaxPlaneCountUI_index = bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.find(self.name)
    bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.remove(MaxPlaneCountUI_index)
    GeometricComplexityUI_index = bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.find(self.name)
    bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.remove(GeometricComplexityUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.find(self.name)
    bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.find(self.name)
    bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.find(self.name)
    bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.remove(UpVectorZUI_index)
    FoliageSettings_index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.FoliageSettings_id)
    bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.remove(FoliageSettings_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['BillboardMode'] = int(self.BillboardMode)
    if serializeUIComponents:
      jsonData['BillboardModeUI'] = self.BillboardModeUI.SaveJson()

    jsonData['FavorVerticalPlanes'] = self.FavorVerticalPlanes
    if serializeUIComponents:
      jsonData['FavorVerticalPlanesUI'] = self.FavorVerticalPlanesUI.SaveJson()

    jsonData['TwoSided'] = self.TwoSided
    if serializeUIComponents:
      jsonData['TwoSidedUI'] = self.TwoSidedUI.SaveJson()

    jsonData['UseVisibilityWeights'] = self.UseVisibilityWeights
    if serializeUIComponents:
      jsonData['UseVisibilityWeightsUI'] = self.UseVisibilityWeightsUI.SaveJson()

    jsonData['BillboardDensity'] = self.BillboardDensity
    if serializeUIComponents:
      jsonData['BillboardDensityUI'] = self.BillboardDensityUI.SaveJson()

    jsonData['MaxPlaneCount'] = self.MaxPlaneCount
    if serializeUIComponents:
      jsonData['MaxPlaneCountUI'] = self.MaxPlaneCountUI.SaveJson()

    jsonData['GeometricComplexity'] = self.GeometricComplexity
    if serializeUIComponents:
      jsonData['GeometricComplexityUI'] = self.GeometricComplexityUI.SaveJson()

    jsonData['UpVectorX'] = self.UpVectorX
    if serializeUIComponents:
      jsonData['UpVectorXUI'] = self.UpVectorXUI.SaveJson()

    jsonData['UpVectorY'] = self.UpVectorY
    if serializeUIComponents:
      jsonData['UpVectorYUI'] = self.UpVectorYUI.SaveJson()

    jsonData['UpVectorZ'] = self.UpVectorZ
    if serializeUIComponents:
      jsonData['UpVectorZUI'] = self.UpVectorZUI.SaveJson()

    if self.FoliageSettings is not None:
      jsonData['FoliageSettings'] = self.FoliageSettings.SaveJson(serializeUIComponents)

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'BillboardMode' in jsonData and jsonData['BillboardMode'] is not None:
      self.BillboardMode = str(jsonData['BillboardMode'])

    if 'FavorVerticalPlanes' in jsonData and jsonData['FavorVerticalPlanes'] is not None:
      self.FavorVerticalPlanes = jsonData['FavorVerticalPlanes']

    if 'TwoSided' in jsonData and jsonData['TwoSided'] is not None:
      self.TwoSided = jsonData['TwoSided']

    if 'UseVisibilityWeights' in jsonData and jsonData['UseVisibilityWeights'] is not None:
      self.UseVisibilityWeights = jsonData['UseVisibilityWeights']

    if 'BillboardDensity' in jsonData and jsonData['BillboardDensity'] is not None:
      newBillboardDensity = jsonData['BillboardDensity']
      if newBillboardDensity >= self.BillboardDensityUI.DefaultMinValue and newBillboardDensity <= self.BillboardDensityUI.DefaultMaxValue:
        self.BillboardDensity = newBillboardDensity

      else:
        print("BillboardDensity: Invalid value", newBillboardDensity, "using default value", self.BillboardDensity)


    if 'MaxPlaneCount' in jsonData and jsonData['MaxPlaneCount'] is not None:
      newMaxPlaneCount = jsonData['MaxPlaneCount']
      if newMaxPlaneCount >= self.MaxPlaneCountUI.DefaultMinValue and newMaxPlaneCount <= self.MaxPlaneCountUI.DefaultMaxValue:
        self.MaxPlaneCount = newMaxPlaneCount

      else:
        print("MaxPlaneCount: Invalid value", newMaxPlaneCount, "using default value", self.MaxPlaneCount)


    if 'GeometricComplexity' in jsonData and jsonData['GeometricComplexity'] is not None:
      newGeometricComplexity = jsonData['GeometricComplexity']
      if newGeometricComplexity >= self.GeometricComplexityUI.DefaultMinValue and newGeometricComplexity <= self.GeometricComplexityUI.DefaultMaxValue:
        self.GeometricComplexity = newGeometricComplexity

      else:
        print("GeometricComplexity: Invalid value", newGeometricComplexity, "using default value", self.GeometricComplexity)


    if 'UpVectorX' in jsonData and jsonData['UpVectorX'] is not None:
      newUpVectorX = jsonData['UpVectorX']
      if newUpVectorX >= self.UpVectorXUI.DefaultMinValue and newUpVectorX <= self.UpVectorXUI.DefaultMaxValue:
        self.UpVectorX = newUpVectorX

      else:
        print("UpVectorX: Invalid value", newUpVectorX, "using default value", self.UpVectorX)


    if 'UpVectorY' in jsonData and jsonData['UpVectorY'] is not None:
      newUpVectorY = jsonData['UpVectorY']
      if newUpVectorY >= self.UpVectorYUI.DefaultMinValue and newUpVectorY <= self.UpVectorYUI.DefaultMaxValue:
        self.UpVectorY = newUpVectorY

      else:
        print("UpVectorY: Invalid value", newUpVectorY, "using default value", self.UpVectorY)


    if 'UpVectorZ' in jsonData and jsonData['UpVectorZ'] is not None:
      newUpVectorZ = jsonData['UpVectorZ']
      if newUpVectorZ >= self.UpVectorZUI.DefaultMinValue and newUpVectorZ <= self.UpVectorZUI.DefaultMaxValue:
        self.UpVectorZ = newUpVectorZ

      else:
        print("UpVectorZ: Invalid value", newUpVectorZ, "using default value", self.UpVectorZ)



  def Reset(self):
    self.BillboardModeUI.Reset()
    self.FavorVerticalPlanesUI.Reset()
    self.TwoSidedUI.Reset()
    self.UseVisibilityWeightsUI.Reset()
    self.BillboardDensityUI.Reset()
    self.MaxPlaneCountUI.Reset()
    self.GeometricComplexityUI.Reset()
    self.UpVectorXUI.Reset()
    self.UpVectorYUI.Reset()
    self.UpVectorZUI.Reset()
    if self.FoliageSettings is not None:
      self.FoliageSettings.Reset()


  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.BillboardModeUI.IsEditEnabled = isEditEnabled
    self.FavorVerticalPlanesUI.IsEditEnabled = isEditEnabled
    self.TwoSidedUI.IsEditEnabled = isEditEnabled
    self.UseVisibilityWeightsUI.IsEditEnabled = isEditEnabled
    self.BillboardDensityUI.IsEditEnabled = isEditEnabled
    self.MaxPlaneCountUI.IsEditEnabled = isEditEnabled
    self.GeometricComplexityUI.IsEditEnabled = isEditEnabled
    self.UpVectorXUI.IsEditEnabled = isEditEnabled
    self.UpVectorYUI.IsEditEnabled = isEditEnabled
    self.UpVectorZUI.IsEditEnabled = isEditEnabled
    if self.FoliageSettings is not None:
      self.FoliageSettings.SetEditMode(isEditEnabled)


  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='BillboardCloudSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='BillboardCloudSettings', emboss=False)

        if self.BillboardModeUI.Visible:
          column.prop(self, 'BillboardMode')

        if self.FavorVerticalPlanesUI.Visible:
          column.prop(self, 'FavorVerticalPlanes')

        if self.TwoSidedUI.Visible:
          column.prop(self, 'TwoSided')

        if self.UseVisibilityWeightsUI.Visible:
          column.prop(self, 'UseVisibilityWeights')

        if self.BillboardDensityUI.Visible:
          column.prop(self, 'BillboardDensity')

        if self.MaxPlaneCountUI.Visible:
          column.prop(self, 'MaxPlaneCount')

        if self.GeometricComplexityUI.Visible:
          column.prop(self, 'GeometricComplexity')

        if self.UpVectorXUI.Visible:
          column.prop(self, 'UpVectorX')

        if self.UpVectorYUI.Visible:
          column.prop(self, 'UpVectorY')

        if self.UpVectorZUI.Visible:
          column.prop(self, 'UpVectorZ')

        if self.FoliageSettings.Visible:
          self.FoliageSettings.draw(layout.box(), createSubGroup)



    else :
      if self.BillboardModeUI.Visible:
        column.prop(self, 'BillboardMode')

      if self.FavorVerticalPlanesUI.Visible:
        column.prop(self, 'FavorVerticalPlanes')

      if self.TwoSidedUI.Visible:
        column.prop(self, 'TwoSided')

      if self.UseVisibilityWeightsUI.Visible:
        column.prop(self, 'UseVisibilityWeights')

      if self.BillboardDensityUI.Visible:
        column.prop(self, 'BillboardDensity')

      if self.MaxPlaneCountUI.Visible:
        column.prop(self, 'MaxPlaneCount')

      if self.GeometricComplexityUI.Visible:
        column.prop(self, 'GeometricComplexity')

      if self.UpVectorXUI.Visible:
        column.prop(self, 'UpVectorX')

      if self.UpVectorYUI.Visible:
        column.prop(self, 'UpVectorY')

      if self.UpVectorZUI.Visible:
        column.prop(self, 'UpVectorZ')

      if self.FoliageSettingsUI.Visible:
        self.FoliageSettings.draw(layout.box(), createSubGroup)




class SimplygonFlipbookSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.NumberOfViewsUI.Visible: return True
    if self.ViewDirectionXUI.Visible: return True
    if self.ViewDirectionYUI.Visible: return True
    if self.ViewDirectionZUI.Visible: return True
    if self.UpVectorXUI.Visible: return True
    if self.UpVectorYUI.Visible: return True
    if self.UpVectorZUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def NumberOfViewsUI(self):
    index = bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List[index]

    return None

  NumberOfViews: bpy.props.IntProperty(default=9,min=0,max=64,description='Determines the number of views generated for the flip book impostor.')
  class SimplygonNumberOfViewsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.NumberOfViews

    @Value.setter
    def Value(self, value):
      self.Parent.NumberOfViews = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 64
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 64
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("NumberOfViews: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 64
      self.DefaultMaxValue = 64
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("NumberOfViews: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ViewDirectionXUI(self):
    index = bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List[index]

    return None

  ViewDirectionX: bpy.props.FloatProperty(default=1,min=-1,max=1,description='The X component of the ViewDirection vector. The ViewDirection determines the direction of the first view. The rest of the views are uniformly distributed around the scene rotated around the up-vector. The resulting billboard will be oriented in the negative view direction.')
  class SimplygonViewDirectionXEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionX

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionX = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionX: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionX: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ViewDirectionYUI(self):
    index = bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List[index]

    return None

  ViewDirectionY: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The Y component of the ViewDirection vector. The ViewDirection determines the direction of the first view. The rest of the views are uniformly distributed around the scene rotated around the up-vector. The resulting billboard will be oriented in the negative view direction.')
  class SimplygonViewDirectionYEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionY

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionY = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionY: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionY: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ViewDirectionZUI(self):
    index = bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List[index]

    return None

  ViewDirectionZ: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The Z component of the ViewDirection vector. The ViewDirection determines the direction of the first view. The rest of the views are uniformly distributed around the scene rotated around the up-vector. The resulting billboard will be oriented in the negative view direction.')
  class SimplygonViewDirectionZEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionZ

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionZ = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionZ: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionZ: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorXUI(self):
    index = bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List[index]

    return None

  UpVectorX: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The views are rotated around the up vector and the rendered images are oriented with the up vector.')
  class SimplygonUpVectorXEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorX

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorX = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorX: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorX: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorYUI(self):
    index = bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List[index]

    return None

  UpVectorY: bpy.props.FloatProperty(default=1,min=-1,max=1,description='The views are rotated around the up vector and the rendered images are oriented with the up vector.')
  class SimplygonUpVectorYEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorY

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorY = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorY: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorY: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UpVectorZUI(self):
    index = bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List[index]

    return None

  UpVectorZ: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The views are rotated around the up vector and the rendered images are oriented with the up vector.')
  class SimplygonUpVectorZEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UpVectorZ

    @Value.setter
    def Value(self, value):
      self.Parent.UpVectorZ = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("UpVectorZ: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("UpVectorZ: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'FlipbookSettings'
    NumberOfViewsUI = bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.add()
    NumberOfViewsUI.Init(self.name)
    NumberOfViewsUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.add()
    UpVectorZUI.Init(self.name)
    UpVectorZUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'FlipbookSettings'
    NumberOfViewsUI = bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.add()
    NumberOfViewsUI.InitJson(self.name, jsonData['NumberOfViewsUI'] if jsonData is not None and 'NumberOfViewsUI' in jsonData else None)
    NumberOfViewsUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.add()
    ViewDirectionXUI.InitJson(self.name, jsonData['ViewDirectionXUI'] if jsonData is not None and 'ViewDirectionXUI' in jsonData else None)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.add()
    ViewDirectionYUI.InitJson(self.name, jsonData['ViewDirectionYUI'] if jsonData is not None and 'ViewDirectionYUI' in jsonData else None)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.add()
    ViewDirectionZUI.InitJson(self.name, jsonData['ViewDirectionZUI'] if jsonData is not None and 'ViewDirectionZUI' in jsonData else None)
    ViewDirectionZUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.add()
    UpVectorXUI.InitJson(self.name, jsonData['UpVectorXUI'] if jsonData is not None and 'UpVectorXUI' in jsonData else None)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.add()
    UpVectorYUI.InitJson(self.name, jsonData['UpVectorYUI'] if jsonData is not None and 'UpVectorYUI' in jsonData else None)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.add()
    UpVectorZUI.InitJson(self.name, jsonData['UpVectorZUI'] if jsonData is not None and 'UpVectorZUI' in jsonData else None)
    UpVectorZUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    NumberOfViewsUI_index = bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.find(self.name)
    bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.remove(NumberOfViewsUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.find(self.name)
    bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.find(self.name)
    bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.find(self.name)
    bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.remove(ViewDirectionZUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.find(self.name)
    bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.find(self.name)
    bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.find(self.name)
    bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.remove(UpVectorZUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['NumberOfViews'] = self.NumberOfViews
    if serializeUIComponents:
      jsonData['NumberOfViewsUI'] = self.NumberOfViewsUI.SaveJson()

    jsonData['ViewDirectionX'] = self.ViewDirectionX
    if serializeUIComponents:
      jsonData['ViewDirectionXUI'] = self.ViewDirectionXUI.SaveJson()

    jsonData['ViewDirectionZ'] = -self.ViewDirectionY
    if serializeUIComponents:
      jsonData['ViewDirectionYUI'] = self.ViewDirectionYUI.SaveJson()

    jsonData['ViewDirectionY'] = self.ViewDirectionZ
    if serializeUIComponents:
      jsonData['ViewDirectionZUI'] = self.ViewDirectionZUI.SaveJson()

    jsonData['UpVectorX'] = self.UpVectorX
    if serializeUIComponents:
      jsonData['UpVectorXUI'] = self.UpVectorXUI.SaveJson()

    jsonData['UpVectorY'] = self.UpVectorY
    if serializeUIComponents:
      jsonData['UpVectorYUI'] = self.UpVectorYUI.SaveJson()

    jsonData['UpVectorZ'] = self.UpVectorZ
    if serializeUIComponents:
      jsonData['UpVectorZUI'] = self.UpVectorZUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'NumberOfViews' in jsonData and jsonData['NumberOfViews'] is not None:
      newNumberOfViews = jsonData['NumberOfViews']
      if newNumberOfViews >= self.NumberOfViewsUI.DefaultMinValue and newNumberOfViews <= self.NumberOfViewsUI.DefaultMaxValue:
        self.NumberOfViews = newNumberOfViews

      else:
        print("NumberOfViews: Invalid value", newNumberOfViews, "using default value", self.NumberOfViews)


    if 'ViewDirectionX' in jsonData and jsonData['ViewDirectionX'] is not None:
      newViewDirectionX = jsonData['ViewDirectionX']
      if newViewDirectionX >= self.ViewDirectionXUI.DefaultMinValue and newViewDirectionX <= self.ViewDirectionXUI.DefaultMaxValue:
        self.ViewDirectionX = newViewDirectionX

      else:
        print("ViewDirectionX: Invalid value", newViewDirectionX, "using default value", self.ViewDirectionX)


    if 'ViewDirectionY' in jsonData and jsonData['ViewDirectionY'] is not None:
      self.ViewDirectionZ = jsonData['ViewDirectionY']

    if 'ViewDirectionZ' in jsonData and jsonData['ViewDirectionZ'] is not None:
      self.ViewDirectionY = -jsonData['ViewDirectionZ']

    if 'UpVectorX' in jsonData and jsonData['UpVectorX'] is not None:
      newUpVectorX = jsonData['UpVectorX']
      if newUpVectorX >= self.UpVectorXUI.DefaultMinValue and newUpVectorX <= self.UpVectorXUI.DefaultMaxValue:
        self.UpVectorX = newUpVectorX

      else:
        print("UpVectorX: Invalid value", newUpVectorX, "using default value", self.UpVectorX)


    if 'UpVectorY' in jsonData and jsonData['UpVectorY'] is not None:
      newUpVectorY = jsonData['UpVectorY']
      if newUpVectorY >= self.UpVectorYUI.DefaultMinValue and newUpVectorY <= self.UpVectorYUI.DefaultMaxValue:
        self.UpVectorY = newUpVectorY

      else:
        print("UpVectorY: Invalid value", newUpVectorY, "using default value", self.UpVectorY)


    if 'UpVectorZ' in jsonData and jsonData['UpVectorZ'] is not None:
      newUpVectorZ = jsonData['UpVectorZ']
      if newUpVectorZ >= self.UpVectorZUI.DefaultMinValue and newUpVectorZ <= self.UpVectorZUI.DefaultMaxValue:
        self.UpVectorZ = newUpVectorZ

      else:
        print("UpVectorZ: Invalid value", newUpVectorZ, "using default value", self.UpVectorZ)



  def Reset(self):
    self.NumberOfViewsUI.Reset()
    self.ViewDirectionXUI.Reset()
    self.ViewDirectionYUI.Reset()
    self.ViewDirectionZUI.Reset()
    self.UpVectorXUI.Reset()
    self.UpVectorYUI.Reset()
    self.UpVectorZUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.NumberOfViewsUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionXUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionYUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionZUI.IsEditEnabled = isEditEnabled
    self.UpVectorXUI.IsEditEnabled = isEditEnabled
    self.UpVectorYUI.IsEditEnabled = isEditEnabled
    self.UpVectorZUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='FlipbookSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='FlipbookSettings', emboss=False)

        if self.NumberOfViewsUI.Visible:
          column.prop(self, 'NumberOfViews')

        if self.ViewDirectionXUI.Visible:
          column.prop(self, 'ViewDirectionX')

        if self.ViewDirectionYUI.Visible:
          column.prop(self, 'ViewDirectionY')

        if self.ViewDirectionZUI.Visible:
          column.prop(self, 'ViewDirectionZ')

        if self.UpVectorXUI.Visible:
          column.prop(self, 'UpVectorX')

        if self.UpVectorYUI.Visible:
          column.prop(self, 'UpVectorY')

        if self.UpVectorZUI.Visible:
          column.prop(self, 'UpVectorZ')



    else :
      if self.NumberOfViewsUI.Visible:
        column.prop(self, 'NumberOfViews')

      if self.ViewDirectionXUI.Visible:
        column.prop(self, 'ViewDirectionX')

      if self.ViewDirectionYUI.Visible:
        column.prop(self, 'ViewDirectionY')

      if self.ViewDirectionZUI.Visible:
        column.prop(self, 'ViewDirectionZ')

      if self.UpVectorXUI.Visible:
        column.prop(self, 'UpVectorX')

      if self.UpVectorYUI.Visible:
        column.prop(self, 'UpVectorY')

      if self.UpVectorZUI.Visible:
        column.prop(self, 'UpVectorZ')




class SimplygonImpostorFromSingleViewSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.UseTightFittingUI.Visible: return True
    if self.TightFittingDepthOffsetUI.Visible: return True
    if self.TwoSidedUI.Visible: return True
    if self.ViewDirectionXUI.Visible: return True
    if self.ViewDirectionYUI.Visible: return True
    if self.ViewDirectionZUI.Visible: return True
    if self.TexCoordPaddingUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def UseTightFittingUI(self):
    index = bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List[index]

    return None

  UseTightFitting: bpy.props.BoolProperty(default=False,description='If set, the impostor will exactly conform to the bounds of the geometry. If false, its dimensions will always be diameter*diameter.')
  class SimplygonUseTightFittingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseTightFitting

    @Value.setter
    def Value(self, value):
      self.Parent.UseTightFitting = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TightFittingDepthOffsetUI(self):
    index = bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List[index]

    return None

  TightFittingDepthOffset: bpy.props.FloatProperty(default=0,min=-1,max=1,description='This determines where the impostor will end up in depth. 0 is ´center´, 1 is ´front´ and -1 is ´back´.')
  class SimplygonTightFittingDepthOffsetEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TightFittingDepthOffset

    @Value.setter
    def Value(self, value):
      self.Parent.TightFittingDepthOffset = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TightFittingDepthOffset: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TightFittingDepthOffset: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TwoSidedUI(self):
    index = bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List[index]

    return None

  TwoSided: bpy.props.BoolProperty(default=False,description='If set, the impostor will contain both front and back facing surfaces.')
  class SimplygonTwoSidedEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TwoSided

    @Value.setter
    def Value(self, value):
      self.Parent.TwoSided = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ViewDirectionXUI(self):
    index = bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List[index]

    return None

  ViewDirectionX: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The X component of the ViewDirection vector. The ViewDirection determines how the resulting impostor geometry will be oriented. The billboard will be perpendicular to this vector.')
  class SimplygonViewDirectionXEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionX

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionX = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionX: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionX: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ViewDirectionYUI(self):
    index = bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List[index]

    return None

  ViewDirectionY: bpy.props.FloatProperty(default=0,min=-1,max=1,description='The Y component of the ViewDirection vector. The ViewDirection determines how the resulting impostor geometry will be oriented. The billboard will be perpendicular to this vector.')
  class SimplygonViewDirectionYEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionY

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionY = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionY: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionY: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def ViewDirectionZUI(self):
    index = bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List[index]

    return None

  ViewDirectionZ: bpy.props.FloatProperty(default=1,min=-1,max=1,description='The Z component of the ViewDirection vector. The ViewDirection determines how the resulting impostor geometry will be oriented. The billboard will be perpendicular to this vector.')
  class SimplygonViewDirectionZEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ViewDirectionZ

    @Value.setter
    def Value(self, value):
      self.Parent.ViewDirectionZ = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 1
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 1
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ViewDirectionZ: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1
      self.DefaultMaxValue = 1
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ViewDirectionZ: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def TexCoordPaddingUI(self):
    index = bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List[index]

    return None

  TexCoordPadding: bpy.props.FloatProperty(default=0,min=0,max=0.5,description='Normally, the processor will generate an impostor with texcoords from 0.0 to 1.0, giving perfect UV coverage in the final texture. If your engine uses permanent tiling rendering mode, you may need to add a small padding to avoid sub-pixel wrapping artifact at the impostor edges, which this setting supplies. Ex: Setting this to 0.01 will generate texcoords in the range 0.01 to 0.99.')
  class SimplygonTexCoordPaddingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TexCoordPadding

    @Value.setter
    def Value(self, value):
      self.Parent.TexCoordPadding = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 0.5
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 0.5
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("TexCoordPadding: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 0.5
      self.DefaultMaxValue = 0.5
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("TexCoordPadding: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ImpostorFromSingleViewSettings'
    UseTightFittingUI = bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.add()
    UseTightFittingUI.Init(self.name)
    UseTightFittingUI.name = self.name
    TightFittingDepthOffsetUI = bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.add()
    TightFittingDepthOffsetUI.Init(self.name)
    TightFittingDepthOffsetUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    TexCoordPaddingUI = bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.add()
    TexCoordPaddingUI.Init(self.name)
    TexCoordPaddingUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ImpostorFromSingleViewSettings'
    UseTightFittingUI = bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.add()
    UseTightFittingUI.InitJson(self.name, jsonData['UseTightFittingUI'] if jsonData is not None and 'UseTightFittingUI' in jsonData else None)
    UseTightFittingUI.name = self.name
    TightFittingDepthOffsetUI = bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.add()
    TightFittingDepthOffsetUI.InitJson(self.name, jsonData['TightFittingDepthOffsetUI'] if jsonData is not None and 'TightFittingDepthOffsetUI' in jsonData else None)
    TightFittingDepthOffsetUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.add()
    TwoSidedUI.InitJson(self.name, jsonData['TwoSidedUI'] if jsonData is not None and 'TwoSidedUI' in jsonData else None)
    TwoSidedUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.add()
    ViewDirectionXUI.InitJson(self.name, jsonData['ViewDirectionXUI'] if jsonData is not None and 'ViewDirectionXUI' in jsonData else None)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.add()
    ViewDirectionYUI.InitJson(self.name, jsonData['ViewDirectionYUI'] if jsonData is not None and 'ViewDirectionYUI' in jsonData else None)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.add()
    ViewDirectionZUI.InitJson(self.name, jsonData['ViewDirectionZUI'] if jsonData is not None and 'ViewDirectionZUI' in jsonData else None)
    ViewDirectionZUI.name = self.name
    TexCoordPaddingUI = bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.add()
    TexCoordPaddingUI.InitJson(self.name, jsonData['TexCoordPaddingUI'] if jsonData is not None and 'TexCoordPaddingUI' in jsonData else None)
    TexCoordPaddingUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    UseTightFittingUI_index = bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.find(self.name)
    bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.remove(UseTightFittingUI_index)
    TightFittingDepthOffsetUI_index = bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.find(self.name)
    bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.remove(TightFittingDepthOffsetUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.find(self.name)
    bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.remove(TwoSidedUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.find(self.name)
    bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.find(self.name)
    bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.find(self.name)
    bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.remove(ViewDirectionZUI_index)
    TexCoordPaddingUI_index = bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.find(self.name)
    bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.remove(TexCoordPaddingUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['UseTightFitting'] = self.UseTightFitting
    if serializeUIComponents:
      jsonData['UseTightFittingUI'] = self.UseTightFittingUI.SaveJson()

    jsonData['TightFittingDepthOffset'] = self.TightFittingDepthOffset
    if serializeUIComponents:
      jsonData['TightFittingDepthOffsetUI'] = self.TightFittingDepthOffsetUI.SaveJson()

    jsonData['TwoSided'] = self.TwoSided
    if serializeUIComponents:
      jsonData['TwoSidedUI'] = self.TwoSidedUI.SaveJson()

    jsonData['ViewDirectionX'] = self.ViewDirectionX
    if serializeUIComponents:
      jsonData['ViewDirectionXUI'] = self.ViewDirectionXUI.SaveJson()

    jsonData['ViewDirectionZ'] = -self.ViewDirectionY
    if serializeUIComponents:
      jsonData['ViewDirectionYUI'] = self.ViewDirectionYUI.SaveJson()

    jsonData['ViewDirectionY'] = self.ViewDirectionZ
    if serializeUIComponents:
      jsonData['ViewDirectionZUI'] = self.ViewDirectionZUI.SaveJson()

    jsonData['TexCoordPadding'] = self.TexCoordPadding
    if serializeUIComponents:
      jsonData['TexCoordPaddingUI'] = self.TexCoordPaddingUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'UseTightFitting' in jsonData and jsonData['UseTightFitting'] is not None:
      self.UseTightFitting = jsonData['UseTightFitting']

    if 'TightFittingDepthOffset' in jsonData and jsonData['TightFittingDepthOffset'] is not None:
      newTightFittingDepthOffset = jsonData['TightFittingDepthOffset']
      if newTightFittingDepthOffset >= self.TightFittingDepthOffsetUI.DefaultMinValue and newTightFittingDepthOffset <= self.TightFittingDepthOffsetUI.DefaultMaxValue:
        self.TightFittingDepthOffset = newTightFittingDepthOffset

      else:
        print("TightFittingDepthOffset: Invalid value", newTightFittingDepthOffset, "using default value", self.TightFittingDepthOffset)


    if 'TwoSided' in jsonData and jsonData['TwoSided'] is not None:
      self.TwoSided = jsonData['TwoSided']

    if 'ViewDirectionX' in jsonData and jsonData['ViewDirectionX'] is not None:
      newViewDirectionX = jsonData['ViewDirectionX']
      if newViewDirectionX >= self.ViewDirectionXUI.DefaultMinValue and newViewDirectionX <= self.ViewDirectionXUI.DefaultMaxValue:
        self.ViewDirectionX = newViewDirectionX

      else:
        print("ViewDirectionX: Invalid value", newViewDirectionX, "using default value", self.ViewDirectionX)


    if 'ViewDirectionY' in jsonData and jsonData['ViewDirectionY'] is not None:
      self.ViewDirectionZ = jsonData['ViewDirectionY']

    if 'ViewDirectionZ' in jsonData and jsonData['ViewDirectionZ'] is not None:
      self.ViewDirectionY = -jsonData['ViewDirectionZ']

    if 'TexCoordPadding' in jsonData and jsonData['TexCoordPadding'] is not None:
      newTexCoordPadding = jsonData['TexCoordPadding']
      if newTexCoordPadding >= self.TexCoordPaddingUI.DefaultMinValue and newTexCoordPadding <= self.TexCoordPaddingUI.DefaultMaxValue:
        self.TexCoordPadding = newTexCoordPadding

      else:
        print("TexCoordPadding: Invalid value", newTexCoordPadding, "using default value", self.TexCoordPadding)



  def Reset(self):
    self.UseTightFittingUI.Reset()
    self.TightFittingDepthOffsetUI.Reset()
    self.TwoSidedUI.Reset()
    self.ViewDirectionXUI.Reset()
    self.ViewDirectionYUI.Reset()
    self.ViewDirectionZUI.Reset()
    self.TexCoordPaddingUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.UseTightFittingUI.IsEditEnabled = isEditEnabled
    self.TightFittingDepthOffsetUI.IsEditEnabled = isEditEnabled
    self.TwoSidedUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionXUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionYUI.IsEditEnabled = isEditEnabled
    self.ViewDirectionZUI.IsEditEnabled = isEditEnabled
    self.TexCoordPaddingUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='ImpostorFromSingleViewSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='ImpostorFromSingleViewSettings', emboss=False)

        if self.UseTightFittingUI.Visible:
          column.prop(self, 'UseTightFitting')

        if self.TightFittingDepthOffsetUI.Visible:
          column.prop(self, 'TightFittingDepthOffset')

        if self.TwoSidedUI.Visible:
          column.prop(self, 'TwoSided')

        if self.ViewDirectionXUI.Visible:
          column.prop(self, 'ViewDirectionX')

        if self.ViewDirectionYUI.Visible:
          column.prop(self, 'ViewDirectionY')

        if self.ViewDirectionZUI.Visible:
          column.prop(self, 'ViewDirectionZ')

        if self.TexCoordPaddingUI.Visible:
          column.prop(self, 'TexCoordPadding')



    else :
      if self.UseTightFittingUI.Visible:
        column.prop(self, 'UseTightFitting')

      if self.TightFittingDepthOffsetUI.Visible:
        column.prop(self, 'TightFittingDepthOffset')

      if self.TwoSidedUI.Visible:
        column.prop(self, 'TwoSided')

      if self.ViewDirectionXUI.Visible:
        column.prop(self, 'ViewDirectionX')

      if self.ViewDirectionYUI.Visible:
        column.prop(self, 'ViewDirectionY')

      if self.ViewDirectionZUI.Visible:
        column.prop(self, 'ViewDirectionZ')

      if self.TexCoordPaddingUI.Visible:
        column.prop(self, 'TexCoordPadding')




class SimplygonOcclusionMeshSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.OnScreenSizeUI.Visible: return True
    if self.OnScreenErrorToleranceUI.Visible: return True
    if self.InvertOutputMeshUI.Visible: return True
    if self.TransferSkinningUI.Visible: return True
    if self.UseCamerasUI.Visible: return True
    if self.CameraSelectionSetNameUI.Visible: return True
    if self.OcclusionModeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def OnScreenSizeUI(self):
    index = bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List[index]

    return None

  OnScreenSize: bpy.props.IntProperty(default=100,min=20,max=10000,description='The onscreen size (px) of the output utility mesh. This will determine triangle count and quality.')
  class SimplygonOnScreenSizeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OnScreenSize

    @Value.setter
    def Value(self, value):
      self.Parent.OnScreenSize = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 20
      self.MaxValue = 10000
      self.DefaultMinValue = 20
      self.DefaultMaxValue = 10000
      self.TicksFrequencyValue = 10
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 20
      self.DefaultMinValue = 20
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OnScreenSize: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10000
      self.DefaultMaxValue = 10000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OnScreenSize: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 10

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OnScreenErrorToleranceUI(self):
    index = bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List[index]

    return None

  OnScreenErrorTolerance: bpy.props.IntProperty(default=10,min=1,max=50,description='The OnScreenErrorTolerance determines how large of an error that is tolerated, in pixels. Valid range is 1-50. Since this setting is based around the absolute worst-case scenario, you can usually get good results at relatively high tolerances.')
  class SimplygonOnScreenErrorToleranceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OnScreenErrorTolerance

    @Value.setter
    def Value(self, value):
      self.Parent.OnScreenErrorTolerance = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 1
      self.MaxValue = 50
      self.DefaultMinValue = 1
      self.DefaultMaxValue = 50
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 1
      self.DefaultMinValue = 1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OnScreenErrorTolerance: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 50
      self.DefaultMaxValue = 50
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OnScreenErrorTolerance: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def InvertOutputMeshUI(self):
    index = bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List[index]

    return None

  InvertOutputMesh: bpy.props.BoolProperty(default=False,description='Flips the winding of the triangles of the output, making frontfaces backfaces and vice versa. Good for conservative z testing.')
  class SimplygonInvertOutputMeshEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.InvertOutputMesh

    @Value.setter
    def Value(self, value):
      self.Parent.InvertOutputMesh = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def TransferSkinningUI(self):
    index = bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List[index]

    return None

  TransferSkinning: bpy.props.BoolProperty(default=False,description='Sets whether to transfer the bone weights and bone ids to the new geometry.')
  class SimplygonTransferSkinningEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.TransferSkinning

    @Value.setter
    def Value(self, value):
      self.Parent.TransferSkinning = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseCamerasUI(self):
    index = bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List[index]

    return None

  UseCameras: bpy.props.BoolProperty(default=False,description='If set, cameras from the input scene will be used to define what angles the occlusion mesh can be visible from, and optimize the output mesh accordingly. Otherwise, the occlusion mesh will be assumed to be viewable from all directions.')
  class SimplygonUseCamerasEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseCameras

    @Value.setter
    def Value(self, value):
      self.Parent.UseCameras = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def CameraSelectionSetNameUI(self):
    index = bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List[index]

    return None

  CameraSelectionSetName: bpy.props.StringProperty(default='',description='The camera selection set name. This determines the selection set used for the cameras for when UseCameras is on. If set to null, all cameras in the scene will be used. If both selection set name and ID are set, the name will be used.')
  class SimplygonCameraSelectionSetNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CameraSelectionSetName

    @Value.setter
    def Value(self, value):
      self.Parent.CameraSelectionSetName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OcclusionModeUI(self):
    index = bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List[index]

    return None

  OcclusionMode: bpy.props.EnumProperty(items=[('0','Occluder', ''),('1','Occludee', ''),('2','Standard', ''),],default='0',description='The occlusion mode. This decides if the processor generates an occluder (which is smaller than the original mesh), an occludee (which is larger), or an output that just tries to match the input.')
  class SimplygonOcclusionModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OcclusionMode

    @Value.setter
    def Value(self, value):
      self.Parent.OcclusionMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OcclusionMeshSettings'
    OnScreenSizeUI = bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    OnScreenErrorToleranceUI = bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.add()
    OnScreenErrorToleranceUI.Init(self.name)
    OnScreenErrorToleranceUI.name = self.name
    InvertOutputMeshUI = bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.add()
    InvertOutputMeshUI.Init(self.name)
    InvertOutputMeshUI.name = self.name
    TransferSkinningUI = bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.add()
    TransferSkinningUI.Init(self.name)
    TransferSkinningUI.name = self.name
    UseCamerasUI = bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.add()
    UseCamerasUI.Init(self.name)
    UseCamerasUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OcclusionModeUI = bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.add()
    OcclusionModeUI.Init(self.name)
    OcclusionModeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OcclusionMeshSettings'
    OnScreenSizeUI = bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.add()
    OnScreenSizeUI.InitJson(self.name, jsonData['OnScreenSizeUI'] if jsonData is not None and 'OnScreenSizeUI' in jsonData else None)
    OnScreenSizeUI.name = self.name
    OnScreenErrorToleranceUI = bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.add()
    OnScreenErrorToleranceUI.InitJson(self.name, jsonData['OnScreenErrorToleranceUI'] if jsonData is not None and 'OnScreenErrorToleranceUI' in jsonData else None)
    OnScreenErrorToleranceUI.name = self.name
    InvertOutputMeshUI = bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.add()
    InvertOutputMeshUI.InitJson(self.name, jsonData['InvertOutputMeshUI'] if jsonData is not None and 'InvertOutputMeshUI' in jsonData else None)
    InvertOutputMeshUI.name = self.name
    TransferSkinningUI = bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.add()
    TransferSkinningUI.InitJson(self.name, jsonData['TransferSkinningUI'] if jsonData is not None and 'TransferSkinningUI' in jsonData else None)
    TransferSkinningUI.name = self.name
    UseCamerasUI = bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.add()
    UseCamerasUI.InitJson(self.name, jsonData['UseCamerasUI'] if jsonData is not None and 'UseCamerasUI' in jsonData else None)
    UseCamerasUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.add()
    CameraSelectionSetNameUI.InitJson(self.name, jsonData['CameraSelectionSetNameUI'] if jsonData is not None and 'CameraSelectionSetNameUI' in jsonData else None)
    CameraSelectionSetNameUI.name = self.name
    OcclusionModeUI = bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.add()
    OcclusionModeUI.InitJson(self.name, jsonData['OcclusionModeUI'] if jsonData is not None and 'OcclusionModeUI' in jsonData else None)
    OcclusionModeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    OnScreenSizeUI_index = bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.find(self.name)
    bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.remove(OnScreenSizeUI_index)
    OnScreenErrorToleranceUI_index = bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.find(self.name)
    bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.remove(OnScreenErrorToleranceUI_index)
    InvertOutputMeshUI_index = bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.find(self.name)
    bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.remove(InvertOutputMeshUI_index)
    TransferSkinningUI_index = bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.find(self.name)
    bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.remove(TransferSkinningUI_index)
    UseCamerasUI_index = bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.find(self.name)
    bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.remove(UseCamerasUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.find(self.name)
    bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.remove(CameraSelectionSetNameUI_index)
    OcclusionModeUI_index = bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.find(self.name)
    bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.remove(OcclusionModeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['OnScreenSize'] = self.OnScreenSize
    if serializeUIComponents:
      jsonData['OnScreenSizeUI'] = self.OnScreenSizeUI.SaveJson()

    jsonData['OnScreenErrorTolerance'] = self.OnScreenErrorTolerance
    if serializeUIComponents:
      jsonData['OnScreenErrorToleranceUI'] = self.OnScreenErrorToleranceUI.SaveJson()

    jsonData['InvertOutputMesh'] = self.InvertOutputMesh
    if serializeUIComponents:
      jsonData['InvertOutputMeshUI'] = self.InvertOutputMeshUI.SaveJson()

    jsonData['TransferSkinning'] = self.TransferSkinning
    if serializeUIComponents:
      jsonData['TransferSkinningUI'] = self.TransferSkinningUI.SaveJson()

    jsonData['UseCameras'] = self.UseCameras
    if serializeUIComponents:
      jsonData['UseCamerasUI'] = self.UseCamerasUI.SaveJson()

    jsonData['CameraSelectionSetName'] = self.CameraSelectionSetName
    if serializeUIComponents:
      jsonData['CameraSelectionSetNameUI'] = self.CameraSelectionSetNameUI.SaveJson()

    jsonData['OcclusionMode'] = int(self.OcclusionMode)
    if serializeUIComponents:
      jsonData['OcclusionModeUI'] = self.OcclusionModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'OnScreenSize' in jsonData and jsonData['OnScreenSize'] is not None:
      newOnScreenSize = jsonData['OnScreenSize']
      if newOnScreenSize >= self.OnScreenSizeUI.DefaultMinValue and newOnScreenSize <= self.OnScreenSizeUI.DefaultMaxValue:
        self.OnScreenSize = newOnScreenSize

      else:
        print("OnScreenSize: Invalid value", newOnScreenSize, "using default value", self.OnScreenSize)


    if 'OnScreenErrorTolerance' in jsonData and jsonData['OnScreenErrorTolerance'] is not None:
      newOnScreenErrorTolerance = jsonData['OnScreenErrorTolerance']
      if newOnScreenErrorTolerance >= self.OnScreenErrorToleranceUI.DefaultMinValue and newOnScreenErrorTolerance <= self.OnScreenErrorToleranceUI.DefaultMaxValue:
        self.OnScreenErrorTolerance = newOnScreenErrorTolerance

      else:
        print("OnScreenErrorTolerance: Invalid value", newOnScreenErrorTolerance, "using default value", self.OnScreenErrorTolerance)


    if 'InvertOutputMesh' in jsonData and jsonData['InvertOutputMesh'] is not None:
      self.InvertOutputMesh = jsonData['InvertOutputMesh']

    if 'TransferSkinning' in jsonData and jsonData['TransferSkinning'] is not None:
      self.TransferSkinning = jsonData['TransferSkinning']

    if 'UseCameras' in jsonData and jsonData['UseCameras'] is not None:
      self.UseCameras = jsonData['UseCameras']

    if 'CameraSelectionSetName' in jsonData and jsonData['CameraSelectionSetName'] is not None:
      self.CameraSelectionSetName = jsonData['CameraSelectionSetName']

    if 'OcclusionMode' in jsonData and jsonData['OcclusionMode'] is not None:
      self.OcclusionMode = str(jsonData['OcclusionMode'])


  def Reset(self):
    self.OnScreenSizeUI.Reset()
    self.OnScreenErrorToleranceUI.Reset()
    self.InvertOutputMeshUI.Reset()
    self.TransferSkinningUI.Reset()
    self.UseCamerasUI.Reset()
    self.CameraSelectionSetNameUI.Reset()
    self.OcclusionModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.OnScreenSizeUI.IsEditEnabled = isEditEnabled
    self.OnScreenErrorToleranceUI.IsEditEnabled = isEditEnabled
    self.InvertOutputMeshUI.IsEditEnabled = isEditEnabled
    self.TransferSkinningUI.IsEditEnabled = isEditEnabled
    self.UseCamerasUI.IsEditEnabled = isEditEnabled
    self.CameraSelectionSetNameUI.IsEditEnabled = isEditEnabled
    self.OcclusionModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='OcclusionMeshSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='OcclusionMeshSettings', emboss=False)

        if self.OnScreenSizeUI.Visible:
          column.prop(self, 'OnScreenSize')

        if self.OnScreenErrorToleranceUI.Visible:
          column.prop(self, 'OnScreenErrorTolerance')

        if self.InvertOutputMeshUI.Visible:
          column.prop(self, 'InvertOutputMesh')

        if self.TransferSkinningUI.Visible:
          column.prop(self, 'TransferSkinning')

        if self.UseCamerasUI.Visible:
          column.prop(self, 'UseCameras')

        if self.CameraSelectionSetNameUI.Visible:
          column.prop(self, 'CameraSelectionSetName')

        if self.OcclusionModeUI.Visible:
          column.prop(self, 'OcclusionMode')



    else :
      if self.OnScreenSizeUI.Visible:
        column.prop(self, 'OnScreenSize')

      if self.OnScreenErrorToleranceUI.Visible:
        column.prop(self, 'OnScreenErrorTolerance')

      if self.InvertOutputMeshUI.Visible:
        column.prop(self, 'InvertOutputMesh')

      if self.TransferSkinningUI.Visible:
        column.prop(self, 'TransferSkinning')

      if self.UseCamerasUI.Visible:
        column.prop(self, 'UseCameras')

      if self.CameraSelectionSetNameUI.Visible:
        column.prop(self, 'CameraSelectionSetName')

      if self.OcclusionModeUI.Visible:
        column.prop(self, 'OcclusionMode')




class SimplygonColorCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.BakeOpacityInAlphaUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.OutputOpacityTypeUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.SkipCastingIfNoInputChannelUI.Visible: return True
    if self.OutputSRGBUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List[index]

    return None

  MaterialChannel: bpy.props.EnumProperty(items=[('anisotropic', 'Anisotropic', ''),('Basecolor', 'Base Color', ''),('clearcoat', 'Clearcoat', ''),('clearcoatnormal', 'Clearcoat Normal', ''),('clearcoatroughness', 'Clearcoat Roughness', ''),('color', 'Color', ''),('Emissive', 'Emission', ''),('emissivecolor', 'Emissive Color', ''),('Metalness', 'Metallic', ''),('Roughness', 'Roughness', ''),('specular', 'Specular', ''),('transmission', 'Transmission', ''),('transmissionroughness', 'Transmission Roughness', ''),],default='Basecolor',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def BakeOpacityInAlphaUI(self):
    index = bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List[index]

    return None

  BakeOpacityInAlpha: bpy.props.BoolProperty(default=False,description='If set, the total opacity of the baked layers replaces the alpha value in the output texture.')
  class SimplygonBakeOpacityInAlphaEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.BakeOpacityInAlpha

    @Value.setter
    def Value(self, value):
      self.Parent.BakeOpacityInAlpha = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputOpacityTypeUI(self):
    index = bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List[index]

    return None

  OutputOpacityType: bpy.props.EnumProperty(items=[('0','Opacity', ''),('1','Transparency', ''),],default='0',description='The opacity type determines how the opacity channel of this material should be saved. To make (0.0->1.0) map to (transparent-opaque), use ´Opacity´. To make (0.0->1.0) map to (opaque-transparent), use ´Transparency´')
  class SimplygonOutputOpacityTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputOpacityType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputOpacityType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def SkipCastingIfNoInputChannelUI(self):
    index = bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List[index]

    return None

  SkipCastingIfNoInputChannel: bpy.props.BoolProperty(default=False,description='If this flag is set, the caster will only run if there is at least one input material that has the main input channel which is to be cast. If the flag is not set, the caster will always produce an output, even if it is totally empty/unset.')
  class SimplygonSkipCastingIfNoInputChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.SkipCastingIfNoInputChannel

    @Value.setter
    def Value(self, value):
      self.Parent.SkipCastingIfNoInputChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputSRGBUI(self):
    index = bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List[index]

    return None

  OutputSRGB: bpy.props.BoolProperty(default=True,description='If set, output textures are exported in sRGB format. Input texture format is determined by the flag in the corresponding texture node in the material definition.')
  class SimplygonOutputSRGBEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputSRGB

    @Value.setter
    def Value(self, value):
      self.Parent.OutputSRGB = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ColorCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    BakeOpacityInAlphaUI = bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.add()
    BakeOpacityInAlphaUI.Init(self.name)
    BakeOpacityInAlphaUI.name = self.name
    SkipCastingIfNoInputChannelUI = bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.add()
    SkipCastingIfNoInputChannelUI.Init(self.name)
    SkipCastingIfNoInputChannelUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.add()
    OutputOpacityTypeUI.Init(self.name)
    OutputOpacityTypeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'ColorCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.add()
    OutputSRGBUI.InitJson(self.name, jsonData['OutputSRGBUI'] if jsonData is not None and 'OutputSRGBUI' in jsonData else None)
    OutputSRGBUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    BakeOpacityInAlphaUI = bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.add()
    BakeOpacityInAlphaUI.InitJson(self.name, jsonData['BakeOpacityInAlphaUI'] if jsonData is not None and 'BakeOpacityInAlphaUI' in jsonData else None)
    BakeOpacityInAlphaUI.name = self.name
    SkipCastingIfNoInputChannelUI = bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.add()
    SkipCastingIfNoInputChannelUI.InitJson(self.name, jsonData['SkipCastingIfNoInputChannelUI'] if jsonData is not None and 'SkipCastingIfNoInputChannelUI' in jsonData else None)
    SkipCastingIfNoInputChannelUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.add()
    OutputOpacityTypeUI.InitJson(self.name, jsonData['OutputOpacityTypeUI'] if jsonData is not None and 'OutputOpacityTypeUI' in jsonData else None)
    OutputOpacityTypeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.find(self.name)
    bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.find(self.name)
    bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.find(self.name)
    bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.find(self.name)
    bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.find(self.name)
    bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.find(self.name)
    bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.find(self.name)
    bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.find(self.name)
    bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.remove(OutputPixelFormatUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.find(self.name)
    bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.remove(OutputSRGBUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.find(self.name)
    bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.find(self.name)
    bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.remove(OutputDDSCompressionTypeUI_index)
    BakeOpacityInAlphaUI_index = bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.find(self.name)
    bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.remove(BakeOpacityInAlphaUI_index)
    SkipCastingIfNoInputChannelUI_index = bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.find(self.name)
    bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.remove(SkipCastingIfNoInputChannelUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.find(self.name)
    bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.remove(OutputOpacityTypeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['BakeOpacityInAlpha'] = self.BakeOpacityInAlpha
    if serializeUIComponents:
      jsonData['BakeOpacityInAlphaUI'] = self.BakeOpacityInAlphaUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['OutputOpacityType'] = int(self.OutputOpacityType)
    if serializeUIComponents:
      jsonData['OutputOpacityTypeUI'] = self.OutputOpacityTypeUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['SkipCastingIfNoInputChannel'] = self.SkipCastingIfNoInputChannel
    if serializeUIComponents:
      jsonData['SkipCastingIfNoInputChannelUI'] = self.SkipCastingIfNoInputChannelUI.SaveJson()

    jsonData['OutputSRGB'] = self.OutputSRGB
    if serializeUIComponents:
      jsonData['OutputSRGBUI'] = self.OutputSRGBUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'BakeOpacityInAlpha' in jsonData and jsonData['BakeOpacityInAlpha'] is not None:
      self.BakeOpacityInAlpha = jsonData['BakeOpacityInAlpha']

    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'OutputOpacityType' in jsonData and jsonData['OutputOpacityType'] is not None:
      self.OutputOpacityType = str(jsonData['OutputOpacityType'])

    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'SkipCastingIfNoInputChannel' in jsonData and jsonData['SkipCastingIfNoInputChannel'] is not None:
      self.SkipCastingIfNoInputChannel = jsonData['SkipCastingIfNoInputChannel']

    if 'OutputSRGB' in jsonData and jsonData['OutputSRGB'] is not None:
      self.OutputSRGB = jsonData['OutputSRGB']


  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.BakeOpacityInAlphaUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.OutputOpacityTypeUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.SkipCastingIfNoInputChannelUI.Reset()
    self.OutputSRGBUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.BakeOpacityInAlphaUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.OutputOpacityTypeUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.SkipCastingIfNoInputChannelUI.IsEditEnabled = isEditEnabled
    self.OutputSRGBUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='ColorCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='ColorCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputSRGBUI.Visible:
          column.prop(self, 'OutputSRGB')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.BakeOpacityInAlphaUI.Visible:
          column.prop(self, 'BakeOpacityInAlpha')

        if self.SkipCastingIfNoInputChannelUI.Visible:
          column.prop(self, 'SkipCastingIfNoInputChannel')

        if self.OutputOpacityTypeUI.Visible:
          column.prop(self, 'OutputOpacityType')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputSRGBUI.Visible:
        column.prop(self, 'OutputSRGB')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.BakeOpacityInAlphaUI.Visible:
        column.prop(self, 'BakeOpacityInAlpha')

      if self.SkipCastingIfNoInputChannelUI.Visible:
        column.prop(self, 'SkipCastingIfNoInputChannel')

      if self.OutputOpacityTypeUI.Visible:
        column.prop(self, 'OutputOpacityType')




class SimplygonOpacityCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.OutputSRGBUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.OutputOpacityTypeUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List[index]

    return None

  MaterialChannel: bpy.props.StringProperty(default='',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputSRGBUI(self):
    index = bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List[index]

    return None

  OutputSRGB: bpy.props.BoolProperty(default=False,description='If set, output textures are exported in sRGB format. Input texture format is determined by the flag in the corresponding texture node in the material definition.')
  class SimplygonOutputSRGBEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputSRGB

    @Value.setter
    def Value(self, value):
      self.Parent.OutputSRGB = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputOpacityTypeUI(self):
    index = bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List[index]

    return None

  OutputOpacityType: bpy.props.EnumProperty(items=[('0','Opacity', ''),('1','Transparency', ''),],default='0',description='The opacity type determines how the opacity channel of this material should be saved. To make (0.0->1.0) map to (transparent-opaque), use ´Opacity´. To make (0.0->1.0) map to (opaque-transparent), use ´Transparency´')
  class SimplygonOutputOpacityTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputOpacityType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputOpacityType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OpacityCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.add()
    OutputOpacityTypeUI.Init(self.name)
    OutputOpacityTypeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'OpacityCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.add()
    OutputSRGBUI.InitJson(self.name, jsonData['OutputSRGBUI'] if jsonData is not None and 'OutputSRGBUI' in jsonData else None)
    OutputSRGBUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.add()
    OutputOpacityTypeUI.InitJson(self.name, jsonData['OutputOpacityTypeUI'] if jsonData is not None and 'OutputOpacityTypeUI' in jsonData else None)
    OutputOpacityTypeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.find(self.name)
    bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.find(self.name)
    bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.find(self.name)
    bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.find(self.name)
    bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.find(self.name)
    bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.find(self.name)
    bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.find(self.name)
    bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.remove(UseMultisamplingUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.find(self.name)
    bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.remove(OutputSRGBUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.find(self.name)
    bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.find(self.name)
    bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.find(self.name)
    bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.remove(OutputDDSCompressionTypeUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.find(self.name)
    bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.remove(OutputOpacityTypeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['OutputSRGB'] = self.OutputSRGB
    if serializeUIComponents:
      jsonData['OutputSRGBUI'] = self.OutputSRGBUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['OutputOpacityType'] = int(self.OutputOpacityType)
    if serializeUIComponents:
      jsonData['OutputOpacityTypeUI'] = self.OutputOpacityTypeUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'OutputSRGB' in jsonData and jsonData['OutputSRGB'] is not None:
      self.OutputSRGB = jsonData['OutputSRGB']

    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'OutputOpacityType' in jsonData and jsonData['OutputOpacityType'] is not None:
      self.OutputOpacityType = str(jsonData['OutputOpacityType'])

    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])


  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.OutputSRGBUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.OutputOpacityTypeUI.Reset()
    self.OutputPixelFormatUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.OutputSRGBUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.OutputOpacityTypeUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='OpacityCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='OpacityCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputSRGBUI.Visible:
          column.prop(self, 'OutputSRGB')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.OutputOpacityTypeUI.Visible:
          column.prop(self, 'OutputOpacityType')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputSRGBUI.Visible:
        column.prop(self, 'OutputSRGB')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.OutputOpacityTypeUI.Visible:
        column.prop(self, 'OutputOpacityType')




class SimplygonNormalCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.FlipBackfacingNormalsUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.GenerateTangentSpaceNormalsUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.FlipGreenUI.Visible: return True
    if self.CalculateBitangentPerFragmentUI.Visible: return True
    if self.NormalizeInterpolatedTangentSpaceUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List[index]

    return None

  MaterialChannel: bpy.props.StringProperty(default='',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FlipBackfacingNormalsUI(self):
    index = bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List[index]

    return None

  FlipBackfacingNormals: bpy.props.BoolProperty(default=False,description='If set, then normals will be flipped if they are back facing, i.e. pointing into the surface. This may introduce artifacts on geometries that have correctly facing normals, so only use for geometries with known back-facing normals.')
  class SimplygonFlipBackfacingNormalsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FlipBackfacingNormals

    @Value.setter
    def Value(self, value):
      self.Parent.FlipBackfacingNormals = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GenerateTangentSpaceNormalsUI(self):
    index = bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List[index]

    return None

  GenerateTangentSpaceNormals: bpy.props.BoolProperty(default=True,description='If set, then the generated normal map will be in tangent space. Please note that the geometry casted to must contain tangent space fields.')
  class SimplygonGenerateTangentSpaceNormalsEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateTangentSpaceNormals

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateTangentSpaceNormals = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FlipGreenUI(self):
    index = bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List[index]

    return None

  FlipGreen: bpy.props.BoolProperty(default=False,description='If set, the green channel is assumed to point along the negative bitangent instead of the positive. This is roughly equivalent to switching between left- and righthanded, but some rounding may differ.')
  class SimplygonFlipGreenEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FlipGreen

    @Value.setter
    def Value(self, value):
      self.Parent.FlipGreen = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def CalculateBitangentPerFragmentUI(self):
    index = bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List[index]

    return None

  CalculateBitangentPerFragment: bpy.props.BoolProperty(default=True,description='If set, the normal caster calculates the bitangent used for encoding per-fragment using the normal, tangent and bitangent sign instead of interpolating the actual bitangent vertex data. This needs to match the behavior of the renderer to not produce rendering artifacts.')
  class SimplygonCalculateBitangentPerFragmentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.CalculateBitangentPerFragment

    @Value.setter
    def Value(self, value):
      self.Parent.CalculateBitangentPerFragment = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def NormalizeInterpolatedTangentSpaceUI(self):
    index = bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List[index]

    return None

  NormalizeInterpolatedTangentSpace: bpy.props.BoolProperty(default=False,description='If set, the normal caster normalizes the normal and tangent data used for encoding after interpolation. This needs to match the behavior of the renderer to not produce rendering artifacts.')
  class SimplygonNormalizeInterpolatedTangentSpaceEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.NormalizeInterpolatedTangentSpace

    @Value.setter
    def Value(self, value):
      self.Parent.NormalizeInterpolatedTangentSpace = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'NormalCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    FlipBackfacingNormalsUI = bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.add()
    FlipBackfacingNormalsUI.Init(self.name)
    FlipBackfacingNormalsUI.name = self.name
    GenerateTangentSpaceNormalsUI = bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.add()
    GenerateTangentSpaceNormalsUI.Init(self.name)
    GenerateTangentSpaceNormalsUI.name = self.name
    FlipGreenUI = bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.add()
    FlipGreenUI.Init(self.name)
    FlipGreenUI.name = self.name
    CalculateBitangentPerFragmentUI = bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.add()
    CalculateBitangentPerFragmentUI.Init(self.name)
    CalculateBitangentPerFragmentUI.name = self.name
    NormalizeInterpolatedTangentSpaceUI = bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.add()
    NormalizeInterpolatedTangentSpaceUI.Init(self.name)
    NormalizeInterpolatedTangentSpaceUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'NormalCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    FlipBackfacingNormalsUI = bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.add()
    FlipBackfacingNormalsUI.InitJson(self.name, jsonData['FlipBackfacingNormalsUI'] if jsonData is not None and 'FlipBackfacingNormalsUI' in jsonData else None)
    FlipBackfacingNormalsUI.name = self.name
    GenerateTangentSpaceNormalsUI = bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.add()
    GenerateTangentSpaceNormalsUI.InitJson(self.name, jsonData['GenerateTangentSpaceNormalsUI'] if jsonData is not None and 'GenerateTangentSpaceNormalsUI' in jsonData else None)
    GenerateTangentSpaceNormalsUI.name = self.name
    FlipGreenUI = bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.add()
    FlipGreenUI.InitJson(self.name, jsonData['FlipGreenUI'] if jsonData is not None and 'FlipGreenUI' in jsonData else None)
    FlipGreenUI.name = self.name
    CalculateBitangentPerFragmentUI = bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.add()
    CalculateBitangentPerFragmentUI.InitJson(self.name, jsonData['CalculateBitangentPerFragmentUI'] if jsonData is not None and 'CalculateBitangentPerFragmentUI' in jsonData else None)
    CalculateBitangentPerFragmentUI.name = self.name
    NormalizeInterpolatedTangentSpaceUI = bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.add()
    NormalizeInterpolatedTangentSpaceUI.InitJson(self.name, jsonData['NormalizeInterpolatedTangentSpaceUI'] if jsonData is not None and 'NormalizeInterpolatedTangentSpaceUI' in jsonData else None)
    NormalizeInterpolatedTangentSpaceUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.find(self.name)
    bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.find(self.name)
    bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.find(self.name)
    bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.find(self.name)
    bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.find(self.name)
    bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.find(self.name)
    bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.find(self.name)
    bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.find(self.name)
    bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.find(self.name)
    bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.find(self.name)
    bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.remove(OutputDDSCompressionTypeUI_index)
    FlipBackfacingNormalsUI_index = bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.find(self.name)
    bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.remove(FlipBackfacingNormalsUI_index)
    GenerateTangentSpaceNormalsUI_index = bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.find(self.name)
    bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.remove(GenerateTangentSpaceNormalsUI_index)
    FlipGreenUI_index = bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.find(self.name)
    bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.remove(FlipGreenUI_index)
    CalculateBitangentPerFragmentUI_index = bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.find(self.name)
    bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.remove(CalculateBitangentPerFragmentUI_index)
    NormalizeInterpolatedTangentSpaceUI_index = bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.find(self.name)
    bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.remove(NormalizeInterpolatedTangentSpaceUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['FlipBackfacingNormals'] = self.FlipBackfacingNormals
    if serializeUIComponents:
      jsonData['FlipBackfacingNormalsUI'] = self.FlipBackfacingNormalsUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['GenerateTangentSpaceNormals'] = self.GenerateTangentSpaceNormals
    if serializeUIComponents:
      jsonData['GenerateTangentSpaceNormalsUI'] = self.GenerateTangentSpaceNormalsUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['FlipGreen'] = self.FlipGreen
    if serializeUIComponents:
      jsonData['FlipGreenUI'] = self.FlipGreenUI.SaveJson()

    jsonData['CalculateBitangentPerFragment'] = self.CalculateBitangentPerFragment
    if serializeUIComponents:
      jsonData['CalculateBitangentPerFragmentUI'] = self.CalculateBitangentPerFragmentUI.SaveJson()

    jsonData['NormalizeInterpolatedTangentSpace'] = self.NormalizeInterpolatedTangentSpace
    if serializeUIComponents:
      jsonData['NormalizeInterpolatedTangentSpaceUI'] = self.NormalizeInterpolatedTangentSpaceUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'FlipBackfacingNormals' in jsonData and jsonData['FlipBackfacingNormals'] is not None:
      self.FlipBackfacingNormals = jsonData['FlipBackfacingNormals']

    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'GenerateTangentSpaceNormals' in jsonData and jsonData['GenerateTangentSpaceNormals'] is not None:
      self.GenerateTangentSpaceNormals = jsonData['GenerateTangentSpaceNormals']

    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'FlipGreen' in jsonData and jsonData['FlipGreen'] is not None:
      self.FlipGreen = jsonData['FlipGreen']

    if 'CalculateBitangentPerFragment' in jsonData and jsonData['CalculateBitangentPerFragment'] is not None:
      self.CalculateBitangentPerFragment = jsonData['CalculateBitangentPerFragment']

    if 'NormalizeInterpolatedTangentSpace' in jsonData and jsonData['NormalizeInterpolatedTangentSpace'] is not None:
      self.NormalizeInterpolatedTangentSpace = jsonData['NormalizeInterpolatedTangentSpace']


  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.FlipBackfacingNormalsUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.GenerateTangentSpaceNormalsUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.FlipGreenUI.Reset()
    self.CalculateBitangentPerFragmentUI.Reset()
    self.NormalizeInterpolatedTangentSpaceUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.FlipBackfacingNormalsUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.GenerateTangentSpaceNormalsUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.FlipGreenUI.IsEditEnabled = isEditEnabled
    self.CalculateBitangentPerFragmentUI.IsEditEnabled = isEditEnabled
    self.NormalizeInterpolatedTangentSpaceUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='NormalCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='NormalCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.FlipBackfacingNormalsUI.Visible:
          column.prop(self, 'FlipBackfacingNormals')

        if self.GenerateTangentSpaceNormalsUI.Visible:
          column.prop(self, 'GenerateTangentSpaceNormals')

        if self.FlipGreenUI.Visible:
          column.prop(self, 'FlipGreen')

        if self.CalculateBitangentPerFragmentUI.Visible:
          column.prop(self, 'CalculateBitangentPerFragment')

        if self.NormalizeInterpolatedTangentSpaceUI.Visible:
          column.prop(self, 'NormalizeInterpolatedTangentSpace')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.FlipBackfacingNormalsUI.Visible:
        column.prop(self, 'FlipBackfacingNormals')

      if self.GenerateTangentSpaceNormalsUI.Visible:
        column.prop(self, 'GenerateTangentSpaceNormals')

      if self.FlipGreenUI.Visible:
        column.prop(self, 'FlipGreen')

      if self.CalculateBitangentPerFragmentUI.Visible:
        column.prop(self, 'CalculateBitangentPerFragment')

      if self.NormalizeInterpolatedTangentSpaceUI.Visible:
        column.prop(self, 'NormalizeInterpolatedTangentSpace')




class SimplygonDisplacementCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.DistanceScalingUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.GenerateScalarDisplacementUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.GenerateTangentSpaceDisplacementUI.Visible: return True
    if self.NormalMapTexCoordLevelUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List[index]

    return None

  MaterialChannel: bpy.props.StringProperty(default='',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DistanceScalingUI(self):
    index = bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List[index]

    return None

  DistanceScaling: bpy.props.FloatProperty(default=1,min=0,max=10,description='All the delta values are divided by this value before storing them into an image.')
  class SimplygonDistanceScalingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DistanceScaling

    @Value.setter
    def Value(self, value):
      self.Parent.DistanceScaling = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("DistanceScaling: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("DistanceScaling: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GenerateScalarDisplacementUI(self):
    index = bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List[index]

    return None

  GenerateScalarDisplacement: bpy.props.BoolProperty(default=False,description='If set to true, the size of the displacement vector components in the direction of the interpolated normal are stored in the displacement map, instead of the displacement vectors.')
  class SimplygonGenerateScalarDisplacementEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateScalarDisplacement

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateScalarDisplacement = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GenerateTangentSpaceDisplacementUI(self):
    index = bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List[index]

    return None

  GenerateTangentSpaceDisplacement: bpy.props.BoolProperty(default=True,description='If set, the displacement vectors are transformed into the destination object tangent space.')
  class SimplygonGenerateTangentSpaceDisplacementEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GenerateTangentSpaceDisplacement

    @Value.setter
    def Value(self, value):
      self.Parent.GenerateTangentSpaceDisplacement = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def NormalMapTexCoordLevelUI(self):
    index = bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List[index]

    return None

  NormalMapTexCoordLevel: bpy.props.IntProperty(default=-1,min=-1,max=10,description='The texture coordinate level to use for the tangent space displacement vectors.')
  class SimplygonNormalMapTexCoordLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.NormalMapTexCoordLevel

    @Value.setter
    def Value(self, value):
      self.Parent.NormalMapTexCoordLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("NormalMapTexCoordLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("NormalMapTexCoordLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'DisplacementCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    DistanceScalingUI = bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.add()
    DistanceScalingUI.Init(self.name)
    DistanceScalingUI.name = self.name
    GenerateScalarDisplacementUI = bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.add()
    GenerateScalarDisplacementUI.Init(self.name)
    GenerateScalarDisplacementUI.name = self.name
    GenerateTangentSpaceDisplacementUI = bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.add()
    GenerateTangentSpaceDisplacementUI.Init(self.name)
    GenerateTangentSpaceDisplacementUI.name = self.name
    NormalMapTexCoordLevelUI = bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.add()
    NormalMapTexCoordLevelUI.Init(self.name)
    NormalMapTexCoordLevelUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'DisplacementCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    DistanceScalingUI = bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.add()
    DistanceScalingUI.InitJson(self.name, jsonData['DistanceScalingUI'] if jsonData is not None and 'DistanceScalingUI' in jsonData else None)
    DistanceScalingUI.name = self.name
    GenerateScalarDisplacementUI = bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.add()
    GenerateScalarDisplacementUI.InitJson(self.name, jsonData['GenerateScalarDisplacementUI'] if jsonData is not None and 'GenerateScalarDisplacementUI' in jsonData else None)
    GenerateScalarDisplacementUI.name = self.name
    GenerateTangentSpaceDisplacementUI = bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.add()
    GenerateTangentSpaceDisplacementUI.InitJson(self.name, jsonData['GenerateTangentSpaceDisplacementUI'] if jsonData is not None and 'GenerateTangentSpaceDisplacementUI' in jsonData else None)
    GenerateTangentSpaceDisplacementUI.name = self.name
    NormalMapTexCoordLevelUI = bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.add()
    NormalMapTexCoordLevelUI.InitJson(self.name, jsonData['NormalMapTexCoordLevelUI'] if jsonData is not None and 'NormalMapTexCoordLevelUI' in jsonData else None)
    NormalMapTexCoordLevelUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.find(self.name)
    bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.find(self.name)
    bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.find(self.name)
    bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.find(self.name)
    bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.find(self.name)
    bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.find(self.name)
    bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.find(self.name)
    bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.find(self.name)
    bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.find(self.name)
    bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.find(self.name)
    bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.remove(OutputDDSCompressionTypeUI_index)
    DistanceScalingUI_index = bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.find(self.name)
    bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.remove(DistanceScalingUI_index)
    GenerateScalarDisplacementUI_index = bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.find(self.name)
    bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.remove(GenerateScalarDisplacementUI_index)
    GenerateTangentSpaceDisplacementUI_index = bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.find(self.name)
    bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.remove(GenerateTangentSpaceDisplacementUI_index)
    NormalMapTexCoordLevelUI_index = bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.find(self.name)
    bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.remove(NormalMapTexCoordLevelUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['DistanceScaling'] = self.DistanceScaling
    if serializeUIComponents:
      jsonData['DistanceScalingUI'] = self.DistanceScalingUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['GenerateScalarDisplacement'] = self.GenerateScalarDisplacement
    if serializeUIComponents:
      jsonData['GenerateScalarDisplacementUI'] = self.GenerateScalarDisplacementUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['GenerateTangentSpaceDisplacement'] = self.GenerateTangentSpaceDisplacement
    if serializeUIComponents:
      jsonData['GenerateTangentSpaceDisplacementUI'] = self.GenerateTangentSpaceDisplacementUI.SaveJson()

    jsonData['NormalMapTexCoordLevel'] = self.NormalMapTexCoordLevel
    if serializeUIComponents:
      jsonData['NormalMapTexCoordLevelUI'] = self.NormalMapTexCoordLevelUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'DistanceScaling' in jsonData and jsonData['DistanceScaling'] is not None:
      newDistanceScaling = jsonData['DistanceScaling']
      if newDistanceScaling >= self.DistanceScalingUI.DefaultMinValue and newDistanceScaling <= self.DistanceScalingUI.DefaultMaxValue:
        self.DistanceScaling = newDistanceScaling

      else:
        print("DistanceScaling: Invalid value", newDistanceScaling, "using default value", self.DistanceScaling)


    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'GenerateScalarDisplacement' in jsonData and jsonData['GenerateScalarDisplacement'] is not None:
      self.GenerateScalarDisplacement = jsonData['GenerateScalarDisplacement']

    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'GenerateTangentSpaceDisplacement' in jsonData and jsonData['GenerateTangentSpaceDisplacement'] is not None:
      self.GenerateTangentSpaceDisplacement = jsonData['GenerateTangentSpaceDisplacement']

    if 'NormalMapTexCoordLevel' in jsonData and jsonData['NormalMapTexCoordLevel'] is not None:
      newNormalMapTexCoordLevel = jsonData['NormalMapTexCoordLevel']
      if newNormalMapTexCoordLevel >= self.NormalMapTexCoordLevelUI.DefaultMinValue and newNormalMapTexCoordLevel <= self.NormalMapTexCoordLevelUI.DefaultMaxValue:
        self.NormalMapTexCoordLevel = newNormalMapTexCoordLevel

      else:
        print("NormalMapTexCoordLevel: Invalid value", newNormalMapTexCoordLevel, "using default value", self.NormalMapTexCoordLevel)



  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.DistanceScalingUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.GenerateScalarDisplacementUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.GenerateTangentSpaceDisplacementUI.Reset()
    self.NormalMapTexCoordLevelUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.DistanceScalingUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.GenerateScalarDisplacementUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.GenerateTangentSpaceDisplacementUI.IsEditEnabled = isEditEnabled
    self.NormalMapTexCoordLevelUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='DisplacementCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='DisplacementCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.DistanceScalingUI.Visible:
          column.prop(self, 'DistanceScaling')

        if self.GenerateScalarDisplacementUI.Visible:
          column.prop(self, 'GenerateScalarDisplacement')

        if self.GenerateTangentSpaceDisplacementUI.Visible:
          column.prop(self, 'GenerateTangentSpaceDisplacement')

        if self.NormalMapTexCoordLevelUI.Visible:
          column.prop(self, 'NormalMapTexCoordLevel')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.DistanceScalingUI.Visible:
        column.prop(self, 'DistanceScaling')

      if self.GenerateScalarDisplacementUI.Visible:
        column.prop(self, 'GenerateScalarDisplacement')

      if self.GenerateTangentSpaceDisplacementUI.Visible:
        column.prop(self, 'GenerateTangentSpaceDisplacement')

      if self.NormalMapTexCoordLevelUI.Visible:
        column.prop(self, 'NormalMapTexCoordLevel')




class SimplygonAmbientOcclusionCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.RaysPerPixelUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.OcclusionFalloffUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.OcclusionMultiplierUI.Visible: return True
    if self.UseSimpleOcclusionModeUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List[index]

    return None

  MaterialChannel: bpy.props.StringProperty(default='',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def RaysPerPixelUI(self):
    index = bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List[index]

    return None

  RaysPerPixel: bpy.props.IntProperty(default=64,min=0,max=256,description='This determines how many rays are traced per pixel (or subpixel) to evaluate the occlusion.')
  class SimplygonRaysPerPixelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.RaysPerPixel

    @Value.setter
    def Value(self, value):
      self.Parent.RaysPerPixel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 256
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 256
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("RaysPerPixel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 256
      self.DefaultMaxValue = 256
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("RaysPerPixel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OcclusionFalloffUI(self):
    index = bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List[index]

    return None

  OcclusionFalloff: bpy.props.FloatProperty(default=-1,min=-1000,max=1000,description='How far away a surface has to be from another surface to generate no occlusion. Only applicable if SimpleOcclusionMode is off.')
  class SimplygonOcclusionFalloffEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OcclusionFalloff

    @Value.setter
    def Value(self, value):
      self.Parent.OcclusionFalloff = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OcclusionFalloff: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OcclusionFalloff: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OcclusionMultiplierUI(self):
    index = bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List[index]

    return None

  OcclusionMultiplier: bpy.props.FloatProperty(default=-1,min=-10,max=10,description='This is just a basic intensity scaler. Higher is ´darker´.')
  class SimplygonOcclusionMultiplierEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OcclusionMultiplier

    @Value.setter
    def Value(self, value):
      self.Parent.OcclusionMultiplier = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -10
      self.MaxValue = 10
      self.DefaultMinValue = -10
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -10
      self.DefaultMinValue = -10
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OcclusionMultiplier: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OcclusionMultiplier: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def UseSimpleOcclusionModeUI(self):
    index = bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List[index]

    return None

  UseSimpleOcclusionMode: bpy.props.BoolProperty(default=False,description='If set, occlusion will not scale with distance, each ray will only be either fully occluded or not at all. Speeds up processing time.')
  class SimplygonUseSimpleOcclusionModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseSimpleOcclusionMode

    @Value.setter
    def Value(self, value):
      self.Parent.UseSimpleOcclusionMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'AmbientOcclusionCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    RaysPerPixelUI = bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.add()
    RaysPerPixelUI.Init(self.name)
    RaysPerPixelUI.name = self.name
    OcclusionFalloffUI = bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.add()
    OcclusionFalloffUI.Init(self.name)
    OcclusionFalloffUI.name = self.name
    OcclusionMultiplierUI = bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.add()
    OcclusionMultiplierUI.Init(self.name)
    OcclusionMultiplierUI.name = self.name
    UseSimpleOcclusionModeUI = bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.add()
    UseSimpleOcclusionModeUI.Init(self.name)
    UseSimpleOcclusionModeUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'AmbientOcclusionCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    RaysPerPixelUI = bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.add()
    RaysPerPixelUI.InitJson(self.name, jsonData['RaysPerPixelUI'] if jsonData is not None and 'RaysPerPixelUI' in jsonData else None)
    RaysPerPixelUI.name = self.name
    OcclusionFalloffUI = bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.add()
    OcclusionFalloffUI.InitJson(self.name, jsonData['OcclusionFalloffUI'] if jsonData is not None and 'OcclusionFalloffUI' in jsonData else None)
    OcclusionFalloffUI.name = self.name
    OcclusionMultiplierUI = bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.add()
    OcclusionMultiplierUI.InitJson(self.name, jsonData['OcclusionMultiplierUI'] if jsonData is not None and 'OcclusionMultiplierUI' in jsonData else None)
    OcclusionMultiplierUI.name = self.name
    UseSimpleOcclusionModeUI = bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.add()
    UseSimpleOcclusionModeUI.InitJson(self.name, jsonData['UseSimpleOcclusionModeUI'] if jsonData is not None and 'UseSimpleOcclusionModeUI' in jsonData else None)
    UseSimpleOcclusionModeUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.find(self.name)
    bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.find(self.name)
    bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.find(self.name)
    bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.find(self.name)
    bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.find(self.name)
    bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.find(self.name)
    bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.find(self.name)
    bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.find(self.name)
    bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.find(self.name)
    bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.find(self.name)
    bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.remove(OutputDDSCompressionTypeUI_index)
    RaysPerPixelUI_index = bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.find(self.name)
    bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.remove(RaysPerPixelUI_index)
    OcclusionFalloffUI_index = bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.find(self.name)
    bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.remove(OcclusionFalloffUI_index)
    OcclusionMultiplierUI_index = bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.find(self.name)
    bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.remove(OcclusionMultiplierUI_index)
    UseSimpleOcclusionModeUI_index = bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.find(self.name)
    bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.remove(UseSimpleOcclusionModeUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['RaysPerPixel'] = self.RaysPerPixel
    if serializeUIComponents:
      jsonData['RaysPerPixelUI'] = self.RaysPerPixelUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['OcclusionFalloff'] = self.OcclusionFalloff
    if serializeUIComponents:
      jsonData['OcclusionFalloffUI'] = self.OcclusionFalloffUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['OcclusionMultiplier'] = self.OcclusionMultiplier
    if serializeUIComponents:
      jsonData['OcclusionMultiplierUI'] = self.OcclusionMultiplierUI.SaveJson()

    jsonData['UseSimpleOcclusionMode'] = self.UseSimpleOcclusionMode
    if serializeUIComponents:
      jsonData['UseSimpleOcclusionModeUI'] = self.UseSimpleOcclusionModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'RaysPerPixel' in jsonData and jsonData['RaysPerPixel'] is not None:
      newRaysPerPixel = jsonData['RaysPerPixel']
      if newRaysPerPixel >= self.RaysPerPixelUI.DefaultMinValue and newRaysPerPixel <= self.RaysPerPixelUI.DefaultMaxValue:
        self.RaysPerPixel = newRaysPerPixel

      else:
        print("RaysPerPixel: Invalid value", newRaysPerPixel, "using default value", self.RaysPerPixel)


    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'OcclusionFalloff' in jsonData and jsonData['OcclusionFalloff'] is not None:
      newOcclusionFalloff = jsonData['OcclusionFalloff']
      if newOcclusionFalloff >= self.OcclusionFalloffUI.DefaultMinValue and newOcclusionFalloff <= self.OcclusionFalloffUI.DefaultMaxValue:
        self.OcclusionFalloff = newOcclusionFalloff

      else:
        print("OcclusionFalloff: Invalid value", newOcclusionFalloff, "using default value", self.OcclusionFalloff)


    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'OcclusionMultiplier' in jsonData and jsonData['OcclusionMultiplier'] is not None:
      newOcclusionMultiplier = jsonData['OcclusionMultiplier']
      if newOcclusionMultiplier >= self.OcclusionMultiplierUI.DefaultMinValue and newOcclusionMultiplier <= self.OcclusionMultiplierUI.DefaultMaxValue:
        self.OcclusionMultiplier = newOcclusionMultiplier

      else:
        print("OcclusionMultiplier: Invalid value", newOcclusionMultiplier, "using default value", self.OcclusionMultiplier)


    if 'UseSimpleOcclusionMode' in jsonData and jsonData['UseSimpleOcclusionMode'] is not None:
      self.UseSimpleOcclusionMode = jsonData['UseSimpleOcclusionMode']


  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.RaysPerPixelUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.OcclusionFalloffUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.OcclusionMultiplierUI.Reset()
    self.UseSimpleOcclusionModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.RaysPerPixelUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.OcclusionFalloffUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.OcclusionMultiplierUI.IsEditEnabled = isEditEnabled
    self.UseSimpleOcclusionModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='AmbientOcclusionCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='AmbientOcclusionCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.RaysPerPixelUI.Visible:
          column.prop(self, 'RaysPerPixel')

        if self.OcclusionFalloffUI.Visible:
          column.prop(self, 'OcclusionFalloff')

        if self.OcclusionMultiplierUI.Visible:
          column.prop(self, 'OcclusionMultiplier')

        if self.UseSimpleOcclusionModeUI.Visible:
          column.prop(self, 'UseSimpleOcclusionMode')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.RaysPerPixelUI.Visible:
        column.prop(self, 'RaysPerPixel')

      if self.OcclusionFalloffUI.Visible:
        column.prop(self, 'OcclusionFalloff')

      if self.OcclusionMultiplierUI.Visible:
        column.prop(self, 'OcclusionMultiplier')

      if self.UseSimpleOcclusionModeUI.Visible:
        column.prop(self, 'UseSimpleOcclusionMode')




class SimplygonGeometryDataCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.GeometryDataFieldTypeUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.GeometryDataFieldIndexUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.MappingLayerIndexUI.Visible: return True
    if self.MappingInfRUI.Visible: return True
    if self.MappingSupRUI.Visible: return True
    if self.MappingInfGUI.Visible: return True
    if self.MappingSupGUI.Visible: return True
    if self.MappingInfBUI.Visible: return True
    if self.MappingSupBUI.Visible: return True
    if self.MappingInfAUI.Visible: return True
    if self.MappingSupAUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List[index]

    return None

  MaterialChannel: bpy.props.StringProperty(default='',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def GeometryDataFieldTypeUI(self):
    index = bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List[index]

    return None

  GeometryDataFieldType: bpy.props.EnumProperty(items=[('0','Coords', ''),('1','TexCoords', ''),('2','Normals', ''),('3','Tangents', ''),('4','Bitangents', ''),('5','Colors', ''),('6','TriangleIds', ''),('7','MaterialIds', ''),],default='0',description='The GeometryDataFieldType setting, which specifies what field type to cast in the GeometryDataCaster.')
  class SimplygonGeometryDataFieldTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GeometryDataFieldType

    @Value.setter
    def Value(self, value):
      self.Parent.GeometryDataFieldType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def GeometryDataFieldIndexUI(self):
    index = bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List[index]

    return None

  GeometryDataFieldIndex: bpy.props.IntProperty(default=0,min=0,max=10,description='The GeometryDataFieldIndex setting, which specifies what field index to cast in the GeometryDataCaster, for fields where it is applicable (TexCoords, Tangents, Bitangents and Colors). The setting is ignored for other field types.')
  class SimplygonGeometryDataFieldIndexEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.GeometryDataFieldIndex

    @Value.setter
    def Value(self, value):
      self.Parent.GeometryDataFieldIndex = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("GeometryDataFieldIndex: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("GeometryDataFieldIndex: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def MappingLayerIndexUI(self):
    index = bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List[index]

    return None

  MappingLayerIndex: bpy.props.IntProperty(default=0,min=0,max=10,description='The MappingLayerIndex setting, which specifies the layer of the mapping image to use for mapping the geometry data. This is useful eg if you have decals which are on layer 0, and the real geometry on layer 1')
  class SimplygonMappingLayerIndexEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingLayerIndex

    @Value.setter
    def Value(self, value):
      self.Parent.MappingLayerIndex = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 10
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingLayerIndex: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingLayerIndex: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingInfRUI(self):
    index = bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List[index]

    return None

  MappingInfR: bpy.props.FloatProperty(default=0,min=-1000,max=1000,description='The inferior/minimum value of field values to map onto the image data range (0->1). The minimum value will be represented by 0 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingInfREx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingInfR

    @Value.setter
    def Value(self, value):
      self.Parent.MappingInfR = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingInfR: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingInfR: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingSupRUI(self):
    index = bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List[index]

    return None

  MappingSupR: bpy.props.FloatProperty(default=1,min=-1000,max=1000,description='The Superior/maximum value of field values to map onto the image data range (0->1). The maximum value will be represented by 1 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingSupREx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingSupR

    @Value.setter
    def Value(self, value):
      self.Parent.MappingSupR = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingSupR: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingSupR: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingInfGUI(self):
    index = bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List[index]

    return None

  MappingInfG: bpy.props.FloatProperty(default=0,min=-1000,max=1000,description='The inferior/minimum value of field values to map onto the image data range (0->1). The minimum value will be represented by 0 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingInfGEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingInfG

    @Value.setter
    def Value(self, value):
      self.Parent.MappingInfG = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingInfG: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingInfG: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingSupGUI(self):
    index = bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List[index]

    return None

  MappingSupG: bpy.props.FloatProperty(default=1,min=-1000,max=1000,description='The Superior/maximum value of field values to map onto the image data range (0->1). The maximum value will be represented by 1 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingSupGEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingSupG

    @Value.setter
    def Value(self, value):
      self.Parent.MappingSupG = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingSupG: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingSupG: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingInfBUI(self):
    index = bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List[index]

    return None

  MappingInfB: bpy.props.FloatProperty(default=0,min=-1000,max=1000,description='The inferior/minimum value of field values to map onto the image data range (0->1). The minimum value will be represented by 0 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingInfBEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingInfB

    @Value.setter
    def Value(self, value):
      self.Parent.MappingInfB = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingInfB: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingInfB: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingSupBUI(self):
    index = bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List[index]

    return None

  MappingSupB: bpy.props.FloatProperty(default=1,min=-1000,max=1000,description='The Superior/maximum value of field values to map onto the image data range (0->1). The maximum value will be represented by 1 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingSupBEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingSupB

    @Value.setter
    def Value(self, value):
      self.Parent.MappingSupB = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingSupB: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingSupB: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingInfAUI(self):
    index = bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List[index]

    return None

  MappingInfA: bpy.props.FloatProperty(default=0,min=-1000,max=1000,description='Property the inferior/minimum value of field values to map onto the image data range (0->1). The minimum value will be represented by 0 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingInfAEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingInfA

    @Value.setter
    def Value(self, value):
      self.Parent.MappingInfA = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingInfA: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingInfA: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def MappingSupAUI(self):
    index = bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List[index]

    return None

  MappingSupA: bpy.props.FloatProperty(default=1,min=-1000,max=1000,description='Property the Superior/maximum value of field values to map onto the image data range (0->1). The maximum value will be represented by 1 in the image. Note that the mapping is only used for real value fields, not id-based fields, which cannot be scaled accurately.')
  class SimplygonMappingSupAEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MappingSupA

    @Value.setter
    def Value(self, value):
      self.Parent.MappingSupA = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1000
      self.MaxValue = 1000
      self.DefaultMinValue = -1000
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 0.1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1000
      self.DefaultMinValue = -1000
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("MappingSupA: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("MappingSupA: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GeometryDataCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    GeometryDataFieldTypeUI = bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.add()
    GeometryDataFieldTypeUI.Init(self.name)
    GeometryDataFieldTypeUI.name = self.name
    GeometryDataFieldIndexUI = bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.add()
    GeometryDataFieldIndexUI.Init(self.name)
    GeometryDataFieldIndexUI.name = self.name
    MappingLayerIndexUI = bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.add()
    MappingLayerIndexUI.Init(self.name)
    MappingLayerIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.add()
    MappingInfRUI.Init(self.name)
    MappingInfRUI.name = self.name
    MappingSupRUI = bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.add()
    MappingSupRUI.Init(self.name)
    MappingSupRUI.name = self.name
    MappingInfGUI = bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.add()
    MappingInfGUI.Init(self.name)
    MappingInfGUI.name = self.name
    MappingSupGUI = bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.add()
    MappingSupGUI.Init(self.name)
    MappingSupGUI.name = self.name
    MappingInfBUI = bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.add()
    MappingInfBUI.Init(self.name)
    MappingInfBUI.name = self.name
    MappingSupBUI = bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.add()
    MappingSupBUI.Init(self.name)
    MappingSupBUI.name = self.name
    MappingInfAUI = bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.add()
    MappingInfAUI.Init(self.name)
    MappingInfAUI.name = self.name
    MappingSupAUI = bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.add()
    MappingSupAUI.Init(self.name)
    MappingSupAUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'GeometryDataCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    GeometryDataFieldTypeUI = bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.add()
    GeometryDataFieldTypeUI.InitJson(self.name, jsonData['GeometryDataFieldTypeUI'] if jsonData is not None and 'GeometryDataFieldTypeUI' in jsonData else None)
    GeometryDataFieldTypeUI.name = self.name
    GeometryDataFieldIndexUI = bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.add()
    GeometryDataFieldIndexUI.InitJson(self.name, jsonData['GeometryDataFieldIndexUI'] if jsonData is not None and 'GeometryDataFieldIndexUI' in jsonData else None)
    GeometryDataFieldIndexUI.name = self.name
    MappingLayerIndexUI = bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.add()
    MappingLayerIndexUI.InitJson(self.name, jsonData['MappingLayerIndexUI'] if jsonData is not None and 'MappingLayerIndexUI' in jsonData else None)
    MappingLayerIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.add()
    MappingInfRUI.InitJson(self.name, jsonData['MappingInfRUI'] if jsonData is not None and 'MappingInfRUI' in jsonData else None)
    MappingInfRUI.name = self.name
    MappingSupRUI = bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.add()
    MappingSupRUI.InitJson(self.name, jsonData['MappingSupRUI'] if jsonData is not None and 'MappingSupRUI' in jsonData else None)
    MappingSupRUI.name = self.name
    MappingInfGUI = bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.add()
    MappingInfGUI.InitJson(self.name, jsonData['MappingInfGUI'] if jsonData is not None and 'MappingInfGUI' in jsonData else None)
    MappingInfGUI.name = self.name
    MappingSupGUI = bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.add()
    MappingSupGUI.InitJson(self.name, jsonData['MappingSupGUI'] if jsonData is not None and 'MappingSupGUI' in jsonData else None)
    MappingSupGUI.name = self.name
    MappingInfBUI = bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.add()
    MappingInfBUI.InitJson(self.name, jsonData['MappingInfBUI'] if jsonData is not None and 'MappingInfBUI' in jsonData else None)
    MappingInfBUI.name = self.name
    MappingSupBUI = bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.add()
    MappingSupBUI.InitJson(self.name, jsonData['MappingSupBUI'] if jsonData is not None and 'MappingSupBUI' in jsonData else None)
    MappingSupBUI.name = self.name
    MappingInfAUI = bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.add()
    MappingInfAUI.InitJson(self.name, jsonData['MappingInfAUI'] if jsonData is not None and 'MappingInfAUI' in jsonData else None)
    MappingInfAUI.name = self.name
    MappingSupAUI = bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.add()
    MappingSupAUI.InitJson(self.name, jsonData['MappingSupAUI'] if jsonData is not None and 'MappingSupAUI' in jsonData else None)
    MappingSupAUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.find(self.name)
    bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.find(self.name)
    bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.find(self.name)
    bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.find(self.name)
    bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.find(self.name)
    bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.find(self.name)
    bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.find(self.name)
    bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.find(self.name)
    bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.find(self.name)
    bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.find(self.name)
    bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.remove(OutputDDSCompressionTypeUI_index)
    GeometryDataFieldTypeUI_index = bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.find(self.name)
    bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.remove(GeometryDataFieldTypeUI_index)
    GeometryDataFieldIndexUI_index = bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.find(self.name)
    bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.remove(GeometryDataFieldIndexUI_index)
    MappingLayerIndexUI_index = bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.find(self.name)
    bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.remove(MappingLayerIndexUI_index)
    MappingInfRUI_index = bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.find(self.name)
    bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.remove(MappingInfRUI_index)
    MappingSupRUI_index = bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.find(self.name)
    bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.remove(MappingSupRUI_index)
    MappingInfGUI_index = bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.find(self.name)
    bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.remove(MappingInfGUI_index)
    MappingSupGUI_index = bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.find(self.name)
    bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.remove(MappingSupGUI_index)
    MappingInfBUI_index = bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.find(self.name)
    bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.remove(MappingInfBUI_index)
    MappingSupBUI_index = bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.find(self.name)
    bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.remove(MappingSupBUI_index)
    MappingInfAUI_index = bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.find(self.name)
    bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.remove(MappingInfAUI_index)
    MappingSupAUI_index = bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.find(self.name)
    bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.remove(MappingSupAUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['GeometryDataFieldType'] = int(self.GeometryDataFieldType)
    if serializeUIComponents:
      jsonData['GeometryDataFieldTypeUI'] = self.GeometryDataFieldTypeUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['GeometryDataFieldIndex'] = self.GeometryDataFieldIndex
    if serializeUIComponents:
      jsonData['GeometryDataFieldIndexUI'] = self.GeometryDataFieldIndexUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['MappingLayerIndex'] = self.MappingLayerIndex
    if serializeUIComponents:
      jsonData['MappingLayerIndexUI'] = self.MappingLayerIndexUI.SaveJson()

    jsonData['MappingInfR'] = self.MappingInfR
    if serializeUIComponents:
      jsonData['MappingInfRUI'] = self.MappingInfRUI.SaveJson()

    jsonData['MappingSupR'] = self.MappingSupR
    if serializeUIComponents:
      jsonData['MappingSupRUI'] = self.MappingSupRUI.SaveJson()

    jsonData['MappingInfG'] = self.MappingInfG
    if serializeUIComponents:
      jsonData['MappingInfGUI'] = self.MappingInfGUI.SaveJson()

    jsonData['MappingSupG'] = self.MappingSupG
    if serializeUIComponents:
      jsonData['MappingSupGUI'] = self.MappingSupGUI.SaveJson()

    jsonData['MappingInfB'] = self.MappingInfB
    if serializeUIComponents:
      jsonData['MappingInfBUI'] = self.MappingInfBUI.SaveJson()

    jsonData['MappingSupB'] = self.MappingSupB
    if serializeUIComponents:
      jsonData['MappingSupBUI'] = self.MappingSupBUI.SaveJson()

    jsonData['MappingInfA'] = self.MappingInfA
    if serializeUIComponents:
      jsonData['MappingInfAUI'] = self.MappingInfAUI.SaveJson()

    jsonData['MappingSupA'] = self.MappingSupA
    if serializeUIComponents:
      jsonData['MappingSupAUI'] = self.MappingSupAUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'GeometryDataFieldType' in jsonData and jsonData['GeometryDataFieldType'] is not None:
      self.GeometryDataFieldType = str(jsonData['GeometryDataFieldType'])

    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'GeometryDataFieldIndex' in jsonData and jsonData['GeometryDataFieldIndex'] is not None:
      newGeometryDataFieldIndex = jsonData['GeometryDataFieldIndex']
      if newGeometryDataFieldIndex >= self.GeometryDataFieldIndexUI.DefaultMinValue and newGeometryDataFieldIndex <= self.GeometryDataFieldIndexUI.DefaultMaxValue:
        self.GeometryDataFieldIndex = newGeometryDataFieldIndex

      else:
        print("GeometryDataFieldIndex: Invalid value", newGeometryDataFieldIndex, "using default value", self.GeometryDataFieldIndex)


    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'MappingLayerIndex' in jsonData and jsonData['MappingLayerIndex'] is not None:
      newMappingLayerIndex = jsonData['MappingLayerIndex']
      if newMappingLayerIndex >= self.MappingLayerIndexUI.DefaultMinValue and newMappingLayerIndex <= self.MappingLayerIndexUI.DefaultMaxValue:
        self.MappingLayerIndex = newMappingLayerIndex

      else:
        print("MappingLayerIndex: Invalid value", newMappingLayerIndex, "using default value", self.MappingLayerIndex)


    if 'MappingInfR' in jsonData and jsonData['MappingInfR'] is not None:
      newMappingInfR = jsonData['MappingInfR']
      if newMappingInfR >= self.MappingInfRUI.DefaultMinValue and newMappingInfR <= self.MappingInfRUI.DefaultMaxValue:
        self.MappingInfR = newMappingInfR

      else:
        print("MappingInfR: Invalid value", newMappingInfR, "using default value", self.MappingInfR)


    if 'MappingSupR' in jsonData and jsonData['MappingSupR'] is not None:
      newMappingSupR = jsonData['MappingSupR']
      if newMappingSupR >= self.MappingSupRUI.DefaultMinValue and newMappingSupR <= self.MappingSupRUI.DefaultMaxValue:
        self.MappingSupR = newMappingSupR

      else:
        print("MappingSupR: Invalid value", newMappingSupR, "using default value", self.MappingSupR)


    if 'MappingInfG' in jsonData and jsonData['MappingInfG'] is not None:
      newMappingInfG = jsonData['MappingInfG']
      if newMappingInfG >= self.MappingInfGUI.DefaultMinValue and newMappingInfG <= self.MappingInfGUI.DefaultMaxValue:
        self.MappingInfG = newMappingInfG

      else:
        print("MappingInfG: Invalid value", newMappingInfG, "using default value", self.MappingInfG)


    if 'MappingSupG' in jsonData and jsonData['MappingSupG'] is not None:
      newMappingSupG = jsonData['MappingSupG']
      if newMappingSupG >= self.MappingSupGUI.DefaultMinValue and newMappingSupG <= self.MappingSupGUI.DefaultMaxValue:
        self.MappingSupG = newMappingSupG

      else:
        print("MappingSupG: Invalid value", newMappingSupG, "using default value", self.MappingSupG)


    if 'MappingInfB' in jsonData and jsonData['MappingInfB'] is not None:
      newMappingInfB = jsonData['MappingInfB']
      if newMappingInfB >= self.MappingInfBUI.DefaultMinValue and newMappingInfB <= self.MappingInfBUI.DefaultMaxValue:
        self.MappingInfB = newMappingInfB

      else:
        print("MappingInfB: Invalid value", newMappingInfB, "using default value", self.MappingInfB)


    if 'MappingSupB' in jsonData and jsonData['MappingSupB'] is not None:
      newMappingSupB = jsonData['MappingSupB']
      if newMappingSupB >= self.MappingSupBUI.DefaultMinValue and newMappingSupB <= self.MappingSupBUI.DefaultMaxValue:
        self.MappingSupB = newMappingSupB

      else:
        print("MappingSupB: Invalid value", newMappingSupB, "using default value", self.MappingSupB)


    if 'MappingInfA' in jsonData and jsonData['MappingInfA'] is not None:
      newMappingInfA = jsonData['MappingInfA']
      if newMappingInfA >= self.MappingInfAUI.DefaultMinValue and newMappingInfA <= self.MappingInfAUI.DefaultMaxValue:
        self.MappingInfA = newMappingInfA

      else:
        print("MappingInfA: Invalid value", newMappingInfA, "using default value", self.MappingInfA)


    if 'MappingSupA' in jsonData and jsonData['MappingSupA'] is not None:
      newMappingSupA = jsonData['MappingSupA']
      if newMappingSupA >= self.MappingSupAUI.DefaultMinValue and newMappingSupA <= self.MappingSupAUI.DefaultMaxValue:
        self.MappingSupA = newMappingSupA

      else:
        print("MappingSupA: Invalid value", newMappingSupA, "using default value", self.MappingSupA)



  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.GeometryDataFieldTypeUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.GeometryDataFieldIndexUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.MappingLayerIndexUI.Reset()
    self.MappingInfRUI.Reset()
    self.MappingSupRUI.Reset()
    self.MappingInfGUI.Reset()
    self.MappingSupGUI.Reset()
    self.MappingInfBUI.Reset()
    self.MappingSupBUI.Reset()
    self.MappingInfAUI.Reset()
    self.MappingSupAUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.GeometryDataFieldTypeUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.GeometryDataFieldIndexUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.MappingLayerIndexUI.IsEditEnabled = isEditEnabled
    self.MappingInfRUI.IsEditEnabled = isEditEnabled
    self.MappingSupRUI.IsEditEnabled = isEditEnabled
    self.MappingInfGUI.IsEditEnabled = isEditEnabled
    self.MappingSupGUI.IsEditEnabled = isEditEnabled
    self.MappingInfBUI.IsEditEnabled = isEditEnabled
    self.MappingSupBUI.IsEditEnabled = isEditEnabled
    self.MappingInfAUI.IsEditEnabled = isEditEnabled
    self.MappingSupAUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='GeometryDataCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='GeometryDataCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.GeometryDataFieldTypeUI.Visible:
          column.prop(self, 'GeometryDataFieldType')

        if self.GeometryDataFieldIndexUI.Visible:
          column.prop(self, 'GeometryDataFieldIndex')

        if self.MappingLayerIndexUI.Visible:
          column.prop(self, 'MappingLayerIndex')

        if self.MappingInfRUI.Visible:
          column.prop(self, 'MappingInfR')

        if self.MappingSupRUI.Visible:
          column.prop(self, 'MappingSupR')

        if self.MappingInfGUI.Visible:
          column.prop(self, 'MappingInfG')

        if self.MappingSupGUI.Visible:
          column.prop(self, 'MappingSupG')

        if self.MappingInfBUI.Visible:
          column.prop(self, 'MappingInfB')

        if self.MappingSupBUI.Visible:
          column.prop(self, 'MappingSupB')

        if self.MappingInfAUI.Visible:
          column.prop(self, 'MappingInfA')

        if self.MappingSupAUI.Visible:
          column.prop(self, 'MappingSupA')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.GeometryDataFieldTypeUI.Visible:
        column.prop(self, 'GeometryDataFieldType')

      if self.GeometryDataFieldIndexUI.Visible:
        column.prop(self, 'GeometryDataFieldIndex')

      if self.MappingLayerIndexUI.Visible:
        column.prop(self, 'MappingLayerIndex')

      if self.MappingInfRUI.Visible:
        column.prop(self, 'MappingInfR')

      if self.MappingSupRUI.Visible:
        column.prop(self, 'MappingSupR')

      if self.MappingInfGUI.Visible:
        column.prop(self, 'MappingInfG')

      if self.MappingSupGUI.Visible:
        column.prop(self, 'MappingSupG')

      if self.MappingInfBUI.Visible:
        column.prop(self, 'MappingInfB')

      if self.MappingSupBUI.Visible:
        column.prop(self, 'MappingSupB')

      if self.MappingInfAUI.Visible:
        column.prop(self, 'MappingInfA')

      if self.MappingSupAUI.Visible:
        column.prop(self, 'MappingSupA')




class SimplygonVertexColorCasterSettings(bpy.types.PropertyGroup):
  visible: bpy.props.BoolProperty()
  settingsName: bpy.props.StringProperty()
  visibleOverride: bpy.props.BoolProperty()
  @property
  def VisibleOverride(self):
    return self.visibleOverride

  @VisibleOverride.setter
  def VisibleOverride(self, value):
    self.visibleOverride = value

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.OutputColorLevelUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.OutputColorNameUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.ColorSpaceEdgeThresholdUI.Visible: return True

    return False

  @Visible.setter
  def Visible(self, value):
    pass

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List[index]

    return None

  MaterialChannel: bpy.props.EnumProperty(items=[('anisotropic', 'Anisotropic', ''),('Basecolor', 'Base Color', ''),('clearcoat', 'Clearcoat', ''),('clearcoatnormal', 'Clearcoat Normal', ''),('clearcoatroughness', 'Clearcoat Roughness', ''),('color', 'Color', ''),('Emissive', 'Emission', ''),('emissivecolor', 'Emissive Color', ''),('Metalness', 'Metallic', ''),('Roughness', 'Roughness', ''),('specular', 'Specular', ''),('transmission', 'Transmission', ''),('transmissionroughness', 'Transmission Roughness', ''),],default='Basecolor',description='The name of the input material channel to cast. Existing user channels of any arbitrary name in the input materials can be cast.')
  class SimplygonMaterialChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.MaterialChannel

    @Value.setter
    def Value(self, value):
      self.Parent.MaterialChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelComponentUI(self):
    index = bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List[index]

    return None

  OpacityChannelComponent: bpy.props.EnumProperty(items=[('0','Red', ''),('1','Green', ''),('2','Blue', ''),('3','Alpha', ''),],default='0',description='The component in the opacity channel to use as opacity value.')
  class SimplygonOpacityChannelComponentEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannelComponent

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannelComponent = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DitherTypeUI(self):
    index = bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List[index]

    return None

  DitherType: bpy.props.EnumProperty(items=[('0','NoDither', ''),('1','FloydSteinberg', ''),('2','JarvisJudiceNinke', ''),('3','Sierra', ''),],default='1',description='The type of dithering to use when creating the output object.')
  class SimplygonDitherTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.DitherType

    @Value.setter
    def Value(self, value):
      self.Parent.DitherType = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def FillModeUI(self):
    index = bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List[index]

    return None

  FillMode: bpy.props.EnumProperty(items=[('0','Interpolate', ''),('1','NearestNeighbor', ''),('2','NoFill', ''),],default='0',description='The fill mode determines what to do with the pixels that remain unfilled after both the casting and dilation has been performed. Options are:  None = Do not fill remaining pixels  Interpolate = linearly interpolate the closest samples  NearestNeighbor = use the closest available pixel value without interpolation.')
  class SimplygonFillModeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.FillMode

    @Value.setter
    def Value(self, value):
      self.Parent.FillMode = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OpacityChannelUI(self):
    index = bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List[index]

    return None

  OpacityChannel: bpy.props.StringProperty(default='Opacity',description='The name of the input opacity channel to use for combining layers in most casters and casting opacity in the opacitycaster. User channels of any arbitrary name can be used. If the caster is run through a Pipeline object, the OpacityChannel set here will also be set as the output materials OpacityChannel property.')
  class SimplygonOpacityChannelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OpacityChannel

    @Value.setter
    def Value(self, value):
      self.Parent.OpacityChannel = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def UseMultisamplingUI(self):
    index = bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List[index]

    return None

  UseMultisampling: bpy.props.BoolProperty(default=True,description='Enable or disable multisampling.')
  class SimplygonUseMultisamplingEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.UseMultisampling

    @Value.setter
    def Value(self, value):
      self.Parent.UseMultisampling = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputColorLevelUI(self):
    index = bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List[index]

    return None

  OutputColorLevel: bpy.props.IntProperty(default=-1,min=-1,max=10,description='The OutputColorLevel index.')
  class SimplygonOutputColorLevelEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputColorLevel

    @Value.setter
    def Value(self, value):
      self.Parent.OutputColorLevel = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = -1
      self.MaxValue = 10
      self.DefaultMinValue = -1
      self.DefaultMaxValue = 10
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = -1
      self.DefaultMinValue = -1
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("OutputColorLevel: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 10
      self.DefaultMaxValue = 10
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("OutputColorLevel: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputImageFileFormatUI(self):
    index = bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputImageFileFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputImageFileFormat = value
      self.Parent.OutputDDSCompressionTypeUI.Visible = Visible

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputDDSCompressionTypeUI(self):
    index = bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List[index]

    return None

  OutputDDSCompressionType: bpy.props.EnumProperty(items=[('-1','NoCompression', ''),('0','BC1', ''),('1','BC2', ''),('2','BC3', ''),('3','BC4', ''),('4','BC5', ''),],default='-1',description='DDS compression if output format is DDS.')
  class SimplygonOutputDDSCompressionTypeEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputDDSCompressionType

    @Value.setter
    def Value(self, value):
      self.Parent.OutputDDSCompressionType = value

    @property
    def Visible(self):
      if self.Parent.OutputImageFileFormatUI is not None:
        return self.Parent.OutputImageFileFormat == str(int(Simplygon.EImageOutputFormat_DDS)) and self.Parent.OutputImageFileFormatUI.Visible

      else:
        return False


    @Visible.setter
    def Visible(self, value):
      pass

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def DilationUI(self):
    index = bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List[index]

    return None

  Dilation: bpy.props.IntProperty(default=10,min=0,max=1000,description='The Dilation value. Where applicable, such as colors and normals, the caster will fill empty pixels surrounding filled pixels with values mixed from the filled ones. This setting sets how many pixels to fill outside the original filled pixels.')
  class SimplygonDilationEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.Dilation

    @Value.setter
    def Value(self, value):
      self.Parent.Dilation = value

    minValue: bpy.props.IntProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.IntProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.IntProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.IntProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.IntProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 1000
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 1000
      self.TicksFrequencyValue = 1
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("Dilation: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 1000
      self.DefaultMaxValue = 1000
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("Dilation: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 1

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData


  @property
  def OutputColorNameUI(self):
    index = bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List[index]

    return None

  OutputColorName: bpy.props.StringProperty(default='',description='The OutputColorName string .')
  class SimplygonOutputColorNameEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputColorName

    @Value.setter
    def Value(self, value):
      self.Parent.OutputColorName = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def OutputPixelFormatUI(self):
    index = bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List[index]

    return None

  OutputPixelFormat: bpy.props.EnumProperty(items=[('0','R8G8B8A8', ''),('1','R8G8B8', ''),('2','R8', ''),('3','R16G16B16A16', ''),('4','R16G16B16', ''),('5','R16', ''),('6','R32G32B32A32F', ''),],default='0',description='The output pixel format')
  class SimplygonOutputPixelFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.OutputPixelFormat

    @Value.setter
    def Value(self, value):
      self.Parent.OutputPixelFormat = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      return jsonData


  @property
  def ColorSpaceEdgeThresholdUI(self):
    index = bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List[index]

    return None

  ColorSpaceEdgeThreshold: bpy.props.FloatProperty(default=2,min=0,max=2,description='The color space edge threshold, which will define how many hard color borders there will be. Corners more similar than the threshold will be merged. This works similarly to HardEdgeAngle for normals; lower values leads more hard borders between neighboring corner colors, and higher values will give you more shared, smoother, colors. This also impacts data usage when using packed geometry since (more unique colors) == (more vertices). The distance is measured in RGBA space.')
  class SimplygonColorSpaceEdgeThresholdEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

      return None

    @property
    def Value(self):
      return self.Parent.ColorSpaceEdgeThreshold

    @Value.setter
    def Value(self, value):
      self.Parent.ColorSpaceEdgeThreshold = value

    minValue: bpy.props.FloatProperty()
    @property
    def MinValue(self):
      return self.minValue

    @MinValue.setter
    def MinValue(self, value):
      self.minValue = value

    maxValue: bpy.props.FloatProperty()
    @property
    def MaxValue(self):
      return self.maxValue

    @MaxValue.setter
    def MaxValue(self, value):
      self.maxValue = value

    defaultMinValue: bpy.props.FloatProperty()
    @property
    def DefaultMinValue(self):
      return self.defaultMinValue

    @DefaultMinValue.setter
    def DefaultMinValue(self, value):
      self.defaultMinValue = value

    defaultMaxValue: bpy.props.FloatProperty()
    @property
    def DefaultMaxValue(self):
      return self.defaultMaxValue

    @DefaultMaxValue.setter
    def DefaultMaxValue(self, value):
      self.defaultMaxValue = value

    ticksFrequencyValue: bpy.props.FloatProperty()
    @property
    def TicksFrequencyValue(self):
      return self.ticksFrequencyValue

    @TicksFrequencyValue.setter
    def TicksFrequencyValue(self, value):
      self.ticksFrequencyValue = value

    visible: bpy.props.BoolProperty()
    @property
    def Visible(self):
      return self.visible

    @Visible.setter
    def Visible(self, value):
      self.visible = value

    visibleOverride: bpy.props.BoolProperty()
    @property
    def VisibleOverride(self):
      return self.visibleOverride

    @VisibleOverride.setter
    def VisibleOverride(self, value):
      self.visibleOverride = value
      self.Visible = value


    def Init(self, parentId):
      self.MinValue = 0
      self.MaxValue = 2
      self.DefaultMinValue = 0
      self.DefaultMaxValue = 2
      self.TicksFrequencyValue = 0.01
      self.Parent_id = parentId
      self.Visible = True

    def InitJson(self, parentId, jsonData):
      self.Parent_id = parentId
      self.MinValue = 0
      self.DefaultMinValue = 0
      if jsonData is not None and jsonData['MinValue'] is not None:
        newMinValue = jsonData['MinValue']
        if newMinValue >= self.MinValue:
          self.MinValue = newMinValue

        else:
          print("ColorSpaceEdgeThreshold: Invalid MinValue", newMinValue, "using default value", self.DefaultMinValue)


      self.MaxValue = 2
      self.DefaultMaxValue = 2
      if jsonData is not None and jsonData['MaxValue'] is not None:
        newMaxValue = jsonData['MaxValue']
        if newMaxValue <= self.MaxValue:
          self.MaxValue = newMaxValue

        else:
          print("ColorSpaceEdgeThreshold: Invalid MaxValue", newMaxValue, "using default value", self.DefaultMaxValue)


      if jsonData is not None and jsonData['TicksFrequencyValue'] is not None:
        self.TicksFrequencyValue = jsonData['TicksFrequencyValue']

      else:
        self.TicksFrequencyValue = 0.01

      if jsonData is not None and jsonData['Visible'] is not None:
        self.Visible = jsonData['Visible']

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

    def SaveJson(self):
      jsonData = {}
      jsonData['Visible'] = self.Visible
      jsonData['MinValue'] = self.MinValue
      jsonData['MaxValue'] = self.MaxValue
      jsonData['TicksFrequencyValue'] = self.TicksFrequencyValue
      return jsonData



  def Init(self):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VertexColorCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputColorLevelUI = bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.add()
    OutputColorLevelUI.Init(self.name)
    OutputColorLevelUI.name = self.name
    OutputColorNameUI = bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.add()
    OutputColorNameUI.Init(self.name)
    OutputColorNameUI.name = self.name
    ColorSpaceEdgeThresholdUI = bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.add()
    ColorSpaceEdgeThresholdUI.Init(self.name)
    ColorSpaceEdgeThresholdUI.name = self.name

  def InitJson(self, jsonData):
    self.name = str(uuid.uuid4())
    self.Visible = True
    self.VisibleOverride = True
    self.settingsName = 'VertexColorCasterSettings'
    MaterialChannelUI = bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.add()
    MaterialChannelUI.InitJson(self.name, jsonData['MaterialChannelUI'] if jsonData is not None and 'MaterialChannelUI' in jsonData else None)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.add()
    OpacityChannelComponentUI.InitJson(self.name, jsonData['OpacityChannelComponentUI'] if jsonData is not None and 'OpacityChannelComponentUI' in jsonData else None)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.add()
    OpacityChannelUI.InitJson(self.name, jsonData['OpacityChannelUI'] if jsonData is not None and 'OpacityChannelUI' in jsonData else None)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.add()
    DitherTypeUI.InitJson(self.name, jsonData['DitherTypeUI'] if jsonData is not None and 'DitherTypeUI' in jsonData else None)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.add()
    FillModeUI.InitJson(self.name, jsonData['FillModeUI'] if jsonData is not None and 'FillModeUI' in jsonData else None)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.add()
    DilationUI.InitJson(self.name, jsonData['DilationUI'] if jsonData is not None and 'DilationUI' in jsonData else None)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.add()
    UseMultisamplingUI.InitJson(self.name, jsonData['UseMultisamplingUI'] if jsonData is not None and 'UseMultisamplingUI' in jsonData else None)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.add()
    OutputPixelFormatUI.InitJson(self.name, jsonData['OutputPixelFormatUI'] if jsonData is not None and 'OutputPixelFormatUI' in jsonData else None)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.add()
    OutputImageFileFormatUI.InitJson(self.name, jsonData['OutputImageFileFormatUI'] if jsonData is not None and 'OutputImageFileFormatUI' in jsonData else None)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.add()
    OutputDDSCompressionTypeUI.InitJson(self.name, jsonData['OutputDDSCompressionTypeUI'] if jsonData is not None and 'OutputDDSCompressionTypeUI' in jsonData else None)
    OutputDDSCompressionTypeUI.name = self.name
    OutputColorLevelUI = bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.add()
    OutputColorLevelUI.InitJson(self.name, jsonData['OutputColorLevelUI'] if jsonData is not None and 'OutputColorLevelUI' in jsonData else None)
    OutputColorLevelUI.name = self.name
    OutputColorNameUI = bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.add()
    OutputColorNameUI.InitJson(self.name, jsonData['OutputColorNameUI'] if jsonData is not None and 'OutputColorNameUI' in jsonData else None)
    OutputColorNameUI.name = self.name
    ColorSpaceEdgeThresholdUI = bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.add()
    ColorSpaceEdgeThresholdUI.InitJson(self.name, jsonData['ColorSpaceEdgeThresholdUI'] if jsonData is not None and 'ColorSpaceEdgeThresholdUI' in jsonData else None)
    ColorSpaceEdgeThresholdUI.name = self.name
    self.LoadJson(jsonData)

  def Deinit(self):
    MaterialChannelUI_index = bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.find(self.name)
    bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.find(self.name)
    bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.find(self.name)
    bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.find(self.name)
    bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.find(self.name)
    bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.find(self.name)
    bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.find(self.name)
    bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.find(self.name)
    bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.find(self.name)
    bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.find(self.name)
    bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.remove(OutputDDSCompressionTypeUI_index)
    OutputColorLevelUI_index = bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.find(self.name)
    bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.remove(OutputColorLevelUI_index)
    OutputColorNameUI_index = bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.find(self.name)
    bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.remove(OutputColorNameUI_index)
    ColorSpaceEdgeThresholdUI_index = bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.find(self.name)
    bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.remove(ColorSpaceEdgeThresholdUI_index)

  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['MaterialChannel'] = self.MaterialChannel
    if serializeUIComponents:
      jsonData['MaterialChannelUI'] = self.MaterialChannelUI.SaveJson()

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['OutputColorLevel'] = self.OutputColorLevel
    if serializeUIComponents:
      jsonData['OutputColorLevelUI'] = self.OutputColorLevelUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['OutputColorName'] = self.OutputColorName
    if serializeUIComponents:
      jsonData['OutputColorNameUI'] = self.OutputColorNameUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['ColorSpaceEdgeThreshold'] = self.ColorSpaceEdgeThreshold
    if serializeUIComponents:
      jsonData['ColorSpaceEdgeThresholdUI'] = self.ColorSpaceEdgeThresholdUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'MaterialChannel' in jsonData and jsonData['MaterialChannel'] is not None:
      self.MaterialChannel = jsonData['MaterialChannel']

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

    if 'OpacityChannel' in jsonData and jsonData['OpacityChannel'] is not None:
      self.OpacityChannel = jsonData['OpacityChannel']

    if 'UseMultisampling' in jsonData and jsonData['UseMultisampling'] is not None:
      self.UseMultisampling = jsonData['UseMultisampling']

    if 'OutputColorLevel' in jsonData and jsonData['OutputColorLevel'] is not None:
      newOutputColorLevel = jsonData['OutputColorLevel']
      if newOutputColorLevel >= self.OutputColorLevelUI.DefaultMinValue and newOutputColorLevel <= self.OutputColorLevelUI.DefaultMaxValue:
        self.OutputColorLevel = newOutputColorLevel

      else:
        print("OutputColorLevel: Invalid value", newOutputColorLevel, "using default value", self.OutputColorLevel)


    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'OutputColorName' in jsonData and jsonData['OutputColorName'] is not None:
      self.OutputColorName = jsonData['OutputColorName']

    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'ColorSpaceEdgeThreshold' in jsonData and jsonData['ColorSpaceEdgeThreshold'] is not None:
      newColorSpaceEdgeThreshold = jsonData['ColorSpaceEdgeThreshold']
      if newColorSpaceEdgeThreshold >= self.ColorSpaceEdgeThresholdUI.DefaultMinValue and newColorSpaceEdgeThreshold <= self.ColorSpaceEdgeThresholdUI.DefaultMaxValue:
        self.ColorSpaceEdgeThreshold = newColorSpaceEdgeThreshold

      else:
        print("ColorSpaceEdgeThreshold: Invalid value", newColorSpaceEdgeThreshold, "using default value", self.ColorSpaceEdgeThreshold)



  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.OutputColorLevelUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.OutputColorNameUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.ColorSpaceEdgeThresholdUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.OutputColorLevelUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.OutputColorNameUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.ColorSpaceEdgeThresholdUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='VertexColorCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='VertexColorCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.OutputColorLevelUI.Visible:
          column.prop(self, 'OutputColorLevel')

        if self.OutputColorNameUI.Visible:
          column.prop(self, 'OutputColorName')

        if self.ColorSpaceEdgeThresholdUI.Visible:
          column.prop(self, 'ColorSpaceEdgeThreshold')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.OutputColorLevelUI.Visible:
        column.prop(self, 'OutputColorLevel')

      if self.OutputColorNameUI.Visible:
        column.prop(self, 'OutputColorName')

      if self.ColorSpaceEdgeThresholdUI.Visible:
        column.prop(self, 'ColorSpaceEdgeThreshold')




class ESimplygonMaterialCaster(IntEnum):
  ColorCaster = 1
  OpacityCaster = 2
  NormalCaster = 3
  DisplacementCaster = 4
  AmbientOcclusionCaster = 5
  GeometryDataCaster = 6
  VertexColorCaster = 7

class SimplygonMaterialCaster(bpy.types.PropertyGroup):
  Visible: bpy.props.BoolProperty()
  PipelineType: bpy.props.IntProperty()
  MaterialCasterType: bpy.props.IntProperty()
  PipelineId: bpy.props.StringProperty()
  MenuPath: bpy.props.StringProperty()
  FilePath: bpy.props.StringProperty()
  @property
  def MaterialCasterName(self):
    return ESimplygonMaterialCaster(self.MaterialCasterType).name

  @property
  def Pipeline(self):
    return GetSimplygonPipeline(self.PipelineId)

  @property
  def MaterialChannelName(self):
    if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      return self.ColorCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      return self.OpacityCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      return self.NormalCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      return self.DisplacementCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      return self.AmbientOcclusionCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      return self.GeometryDataCasterSettings.MaterialChannel

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      return self.VertexColorCasterSettings.MaterialChannel

    return ""

  ColorCasterSettings_id: bpy.props.StringProperty()
  @property
  def ColorCasterSettings(self):
    index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.ColorCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List[index]

    return None

  OpacityCasterSettings_id: bpy.props.StringProperty()
  @property
  def OpacityCasterSettings(self):
    index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.OpacityCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List[index]

    return None

  NormalCasterSettings_id: bpy.props.StringProperty()
  @property
  def NormalCasterSettings(self):
    index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.NormalCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List[index]

    return None

  DisplacementCasterSettings_id: bpy.props.StringProperty()
  @property
  def DisplacementCasterSettings(self):
    index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.DisplacementCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List[index]

    return None

  AmbientOcclusionCasterSettings_id: bpy.props.StringProperty()
  @property
  def AmbientOcclusionCasterSettings(self):
    index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.AmbientOcclusionCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List[index]

    return None

  GeometryDataCasterSettings_id: bpy.props.StringProperty()
  @property
  def GeometryDataCasterSettings(self):
    index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.GeometryDataCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List[index]

    return None

  VertexColorCasterSettings_id: bpy.props.StringProperty()
  @property
  def VertexColorCasterSettings(self):
    index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.VertexColorCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List[index]

    return None


  def Init(self, pipelineId, materialCasterType, materialChannelName, allowMaterialChannelOverride):
    self.name = str(uuid.uuid4())
    self.PipelineId = pipelineId
    self.PipelineType = self.Pipeline.PipelineType
    self.Visible = True
    self.MaterialCasterType = materialCasterType

    if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      ColorCasterSettings = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.add()
      ColorCasterSettings.Init()
      ColorCasterSettings.MaterialChannel = materialChannelName
      self.ColorCasterSettings_id = ColorCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      OpacityCasterSettings = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.add()
      OpacityCasterSettings.Init()
      OpacityCasterSettings.MaterialChannel = materialChannelName
      self.OpacityCasterSettings_id = OpacityCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      NormalCasterSettings = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.add()
      NormalCasterSettings.Init()
      NormalCasterSettings.MaterialChannel = materialChannelName
      self.NormalCasterSettings_id = NormalCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      DisplacementCasterSettings = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.add()
      DisplacementCasterSettings.Init()
      DisplacementCasterSettings.MaterialChannel = materialChannelName
      self.DisplacementCasterSettings_id = DisplacementCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      AmbientOcclusionCasterSettings = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.add()
      AmbientOcclusionCasterSettings.Init()
      AmbientOcclusionCasterSettings.MaterialChannel = materialChannelName
      self.AmbientOcclusionCasterSettings_id = AmbientOcclusionCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      GeometryDataCasterSettings = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.add()
      GeometryDataCasterSettings.Init()
      GeometryDataCasterSettings.MaterialChannel = materialChannelName
      self.GeometryDataCasterSettings_id = GeometryDataCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      VertexColorCasterSettings = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.add()
      VertexColorCasterSettings.Init()
      VertexColorCasterSettings.MaterialChannel = materialChannelName
      self.VertexColorCasterSettings_id = VertexColorCasterSettings.name

    self.SetTemplateOverrides(allowMaterialChannelOverride)

  def InitJson(self, pipelineId, jsonData):
    self.name = str(uuid.uuid4())
    self.PipelineId = pipelineId
    self.PipelineType = self.Pipeline.PipelineType
    self.Visible = True

    self.LoadJson(jsonData)


  def Deinit(self):
    if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      self.ColorCasterSettings.Deinit()
      ColorCasterSettings_index = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.find(self.ColorCasterSettings_id)
      bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.remove(ColorCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      self.OpacityCasterSettings.Deinit()
      OpacityCasterSettings_index = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.find(self.OpacityCasterSettings_id)
      bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.remove(OpacityCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      self.NormalCasterSettings.Deinit()
      NormalCasterSettings_index = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.find(self.NormalCasterSettings_id)
      bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.remove(NormalCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      self.DisplacementCasterSettings.Deinit()
      DisplacementCasterSettings_index = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.find(self.DisplacementCasterSettings_id)
      bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.remove(DisplacementCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      self.AmbientOcclusionCasterSettings.Deinit()
      AmbientOcclusionCasterSettings_index = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.find(self.AmbientOcclusionCasterSettings_id)
      bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.remove(AmbientOcclusionCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      self.GeometryDataCasterSettings.Deinit()
      GeometryDataCasterSettings_index = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.find(self.GeometryDataCasterSettings_id)
      bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.remove(GeometryDataCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      self.VertexColorCasterSettings.Deinit()
      VertexColorCasterSettings_index = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.find(self.VertexColorCasterSettings_id)
      bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.remove(VertexColorCasterSettings_index)


  def SaveJson(self, serializeUIComponents):
    if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      return self.SaveJsonColorCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      return self.SaveJsonOpacityCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      return self.SaveJsonNormalCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      return self.SaveJsonDisplacementCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      return self.SaveJsonAmbientOcclusionCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      return self.SaveJsonGeometryDataCaster(serializeUIComponents)

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      return self.SaveJsonVertexColorCaster(serializeUIComponents)

    return {}

  def SaveJsonColorCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['ColorCasterSettings'] = self.ColorCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonOpacityCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['OpacityCasterSettings'] = self.OpacityCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonNormalCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['NormalCasterSettings'] = self.NormalCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonDisplacementCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['DisplacementCasterSettings'] = self.DisplacementCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonAmbientOcclusionCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['AmbientOcclusionCasterSettings'] = self.AmbientOcclusionCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonGeometryDataCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['GeometryDataCasterSettings'] = self.GeometryDataCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonVertexColorCaster(self, serializeUIComponents):
    jsonData = {}
    jsonData['VertexColorCasterSettings'] = self.VertexColorCasterSettings.SaveJson(serializeUIComponents)
    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if 'ColorCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.ColorCaster
      ColorCasterSettings = bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.add()
      ColorCasterSettings.InitJson(jsonData['ColorCasterSettings'])
      self.ColorCasterSettings_id = ColorCasterSettings.name

    if 'OpacityCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.OpacityCaster
      OpacityCasterSettings = bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.add()
      OpacityCasterSettings.InitJson(jsonData['OpacityCasterSettings'])
      self.OpacityCasterSettings_id = OpacityCasterSettings.name

    if 'NormalCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.NormalCaster
      NormalCasterSettings = bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.add()
      NormalCasterSettings.InitJson(jsonData['NormalCasterSettings'])
      self.NormalCasterSettings_id = NormalCasterSettings.name

    if 'DisplacementCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.DisplacementCaster
      DisplacementCasterSettings = bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.add()
      DisplacementCasterSettings.InitJson(jsonData['DisplacementCasterSettings'])
      self.DisplacementCasterSettings_id = DisplacementCasterSettings.name

    if 'AmbientOcclusionCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.AmbientOcclusionCaster
      AmbientOcclusionCasterSettings = bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.add()
      AmbientOcclusionCasterSettings.InitJson(jsonData['AmbientOcclusionCasterSettings'])
      self.AmbientOcclusionCasterSettings_id = AmbientOcclusionCasterSettings.name

    if 'GeometryDataCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.GeometryDataCaster
      GeometryDataCasterSettings = bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.add()
      GeometryDataCasterSettings.InitJson(jsonData['GeometryDataCasterSettings'])
      self.GeometryDataCasterSettings_id = GeometryDataCasterSettings.name

    if 'VertexColorCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.VertexColorCaster
      VertexColorCasterSettings = bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.add()
      VertexColorCasterSettings.InitJson(jsonData['VertexColorCasterSettings'])
      self.VertexColorCasterSettings_id = VertexColorCasterSettings.name


  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    if MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      self.ColorCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      self.OpacityCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      self.NormalCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      self.DisplacementCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      self.AmbientOcclusionCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      self.GeometryDataCasterSettings.SetEditMode(isEditEnabled)

    if MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      self.VertexColorCasterSettings.SetEditMode(isEditEnabled)


  def Reset(self):
    self.Settings.Reset()

  def SetTemplateOverrides(self, allowMaterialChannelOverride):
    if self.FilePath:
      return

    if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
      self.ColorCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.ColorCasterSettings.MaterialChannel = "Basecolor"

      self.ColorCasterSettings.MaterialChannelUI.VisibleOverride = True
      if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
        self.ColorCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8G8B8A8))

      if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
        self.ColorCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8G8B8A8))

      if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
        self.ColorCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8G8B8A8))

      if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
        self.ColorCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8G8B8A8))

      self.ColorCasterSettings.OpacityChannel = "Opacity"
      self.ColorCasterSettings.OpacityChannelUI.Visible = False
      self.ColorCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.ColorCasterSettings.OpacityChannelComponentUI.Visible = False
      self.ColorCasterSettings.OpacityChannelUI.Visible = True
      self.ColorCasterSettings.OpacityChannelComponentUI.Visible = True
      if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
        self.ColorCasterSettings.BakeOpacityInAlpha = True

      if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
        self.ColorCasterSettings.BakeOpacityInAlpha = True

      if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
        self.ColorCasterSettings.BakeOpacityInAlpha = True

      if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
        self.ColorCasterSettings.BakeOpacityInAlpha = True


    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      self.OpacityCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.OpacityCasterSettings.MaterialChannel = "Opacity"

      self.OpacityCasterSettings.MaterialChannelUI.VisibleOverride = True
      if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
        self.OpacityCasterSettings.FillMode = str(int(Simplygon.EAtlasFillMode_NoFill))

      if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
        self.OpacityCasterSettings.FillMode = str(int(Simplygon.EAtlasFillMode_NoFill))

      if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
        self.OpacityCasterSettings.FillMode = str(int(Simplygon.EAtlasFillMode_NoFill))

      if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
        self.OpacityCasterSettings.FillMode = str(int(Simplygon.EAtlasFillMode_NoFill))

      if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
        self.OpacityCasterSettings.Dilation = 0

      if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
        self.OpacityCasterSettings.Dilation = 0

      if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
        self.OpacityCasterSettings.Dilation = 0

      if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
        self.OpacityCasterSettings.Dilation = 0

      self.OpacityCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8))
      self.OpacityCasterSettings.OutputPixelFormatUI.Visible = False
      self.OpacityCasterSettings.OpacityChannel = "Opacity"
      self.OpacityCasterSettings.OpacityChannelUI.Visible = False
      self.OpacityCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.OpacityCasterSettings.OpacityChannelComponentUI.Visible = False

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      self.NormalCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.NormalCasterSettings.MaterialChannel = "Normals"

      self.NormalCasterSettings.OutputPixelFormat = str(int(Simplygon.EPixelFormat_R8G8B8))
      self.NormalCasterSettings.OpacityChannel = "Opacity"
      self.NormalCasterSettings.OpacityChannelUI.Visible = False
      self.NormalCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.NormalCasterSettings.OpacityChannelComponentUI.Visible = False

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      self.DisplacementCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.DisplacementCasterSettings.MaterialChannel = "Displacement"

      self.DisplacementCasterSettings.OpacityChannel = "Opacity"
      self.DisplacementCasterSettings.OpacityChannelUI.Visible = False
      self.DisplacementCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.DisplacementCasterSettings.OpacityChannelComponentUI.Visible = False

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      self.AmbientOcclusionCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.AmbientOcclusionCasterSettings.MaterialChannel = "Occlusion"

      self.AmbientOcclusionCasterSettings.OpacityChannel = "Opacity"
      self.AmbientOcclusionCasterSettings.OpacityChannelUI.Visible = False
      self.AmbientOcclusionCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.AmbientOcclusionCasterSettings.OpacityChannelComponentUI.Visible = False

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      self.GeometryDataCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.GeometryDataCasterSettings.MaterialChannel = "Geometry"

      self.GeometryDataCasterSettings.OpacityChannel = "Opacity"
      self.GeometryDataCasterSettings.OpacityChannelUI.Visible = False
      self.GeometryDataCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.GeometryDataCasterSettings.OpacityChannelComponentUI.Visible = False

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      self.VertexColorCasterSettings.MaterialChannelUI.VisibleOverride = False
      if allowMaterialChannelOverride:
        self.VertexColorCasterSettings.MaterialChannel = "Basecolor"

      self.VertexColorCasterSettings.OpacityChannel = "Opacity"
      self.VertexColorCasterSettings.OpacityChannelUI.Visible = False
      self.VertexColorCasterSettings.OpacityChannelComponent = str(int(Simplygon.EColorComponent_Alpha))
      self.VertexColorCasterSettings.OpacityChannelComponentUI.Visible = False
      self.VertexColorCasterSettings.OutputColorName = "color"


  def draw(self, layout) :
    row = layout.row()
    if self.Visible is False:
      row.prop(self, 'Visible', icon='TRIA_RIGHT', text=self.MaterialCasterName, emboss=False)
      removeOp = row.operator('simplygon.operator_remove_material_caster', text = '', icon = 'TRASH')
      removeOp.pipelineId = self.PipelineId
      removeOp.materialCasterId = self.name

    else:
      row.prop(self, 'Visible', icon='TRIA_DOWN', text=self.MaterialCasterName, emboss=False)
      removeOp = row.operator('simplygon.operator_remove_material_caster', text = '', icon = 'TRASH')
      removeOp.pipelineId = self.PipelineId
      removeOp.materialCasterId = self.name

      if self.MaterialCasterType == ESimplygonMaterialCaster.ColorCaster:
        self.drawColorCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
        self.drawOpacityCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
        self.drawNormalCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
        self.drawDisplacementCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
        self.drawAmbientOcclusionCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
        self.drawGeometryDataCaster(layout.column())

      if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
        self.drawVertexColorCaster(layout.column())



  def drawColorCaster(self, layout) :
    self.ColorCasterSettings.draw(layout, False)

  def drawOpacityCaster(self, layout) :
    self.OpacityCasterSettings.draw(layout, False)

  def drawNormalCaster(self, layout) :
    self.NormalCasterSettings.draw(layout, False)

  def drawDisplacementCaster(self, layout) :
    self.DisplacementCasterSettings.draw(layout, False)

  def drawAmbientOcclusionCaster(self, layout) :
    self.AmbientOcclusionCasterSettings.draw(layout, False)

  def drawGeometryDataCaster(self, layout) :
    self.GeometryDataCasterSettings.draw(layout, False)

  def drawVertexColorCaster(self, layout) :
    self.VertexColorCasterSettings.draw(layout, False)


class ESimplygonPipeline(IntEnum):
  ReductionPipeline = 1
  RemeshingPipeline = 2
  AggregationPipeline = 3
  BillboardCloudPipeline = 4
  BillboardCloudVegetationPipeline = 5
  FlipbookPipeline = 6
  ImpostorFromSingleViewPipeline = 7
  OcclusionMeshPipeline = 8
  Passthrough = 9

class SimplygonPipeline(bpy.types.PropertyGroup):
  Visible: bpy.props.BoolProperty()
  VisibleMaterialCasters: bpy.props.BoolProperty()
  VisibleCascadedPipelines: bpy.props.BoolProperty()
  PipelineType: bpy.props.IntProperty()
  MenuPath: bpy.props.StringProperty()
  FilePath: bpy.props.StringProperty()
  AutomaticMaterialCastersFromSelection: bpy.props.BoolProperty()
  IsEditEnabled: bpy.props.BoolProperty()
  Parent_id: bpy.props.StringProperty()
  @property
  def PipelineName(self):
    return ESimplygonPipeline(self.PipelineType).name

  @property
  def Parent(self):
    return GetSimplygonPipeline(self.Parent_id)

  GlobalSettings_id: bpy.props.StringProperty()
  PipelineSettings_id: bpy.props.StringProperty()
  @property
  def GlobalSettings(self):
    index = bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.find(self.GlobalSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List[index]

    return None

  @property
  def PipelineSettings(self):
    index = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.find(self.PipelineSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List[index]

    return None

  MaterialCasterIds: bpy.props.StringProperty()
  CascadedPipelineIds: bpy.props.StringProperty()
  ReductionSettings_id : bpy.props.StringProperty()
  @property
  def ReductionSettings(self):
    index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.ReductionSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List[index]

    return None

  RepairSettings_id : bpy.props.StringProperty()
  @property
  def RepairSettings(self):
    index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.RepairSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List[index]

    return None

  NormalCalculationSettings_id : bpy.props.StringProperty()
  @property
  def NormalCalculationSettings(self):
    index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.NormalCalculationSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List[index]

    return None

  VisibilitySettings_id : bpy.props.StringProperty()
  @property
  def VisibilitySettings(self):
    index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.VisibilitySettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List[index]

    return None

  BoneSettings_id : bpy.props.StringProperty()
  @property
  def BoneSettings(self):
    index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.BoneSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List[index]

    return None

  VertexWeightSettings_id : bpy.props.StringProperty()
  @property
  def VertexWeightSettings(self):
    index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.VertexWeightSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List[index]

    return None

  MappingImageInputMaterialSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageInputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.find(self.MappingImageInputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List[index]

    return None

  MappingImageOutputMaterialSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageOutputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.find(self.MappingImageOutputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List[index]

    return None

  ChartAggregatorSettings_id : bpy.props.StringProperty()
  @property
  def ChartAggregatorSettings(self):
    index = bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.find(self.ChartAggregatorSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List[index]

    return None

  ParameterizerSettings_id : bpy.props.StringProperty()
  @property
  def ParameterizerSettings(self):
    index = bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.find(self.ParameterizerSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List[index]

    return None

  MappingImageSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageSettings(self):
    index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List[index]

    return None

  RemeshingSettings_id : bpy.props.StringProperty()
  @property
  def RemeshingSettings(self):
    index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.RemeshingSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List[index]

    return None

  GeometryCullingSettings_id : bpy.props.StringProperty()
  @property
  def GeometryCullingSettings(self):
    index = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.find(self.GeometryCullingSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List[index]

    return None

  AggregationSettings_id : bpy.props.StringProperty()
  @property
  def AggregationSettings(self):
    index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.AggregationSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List[index]

    return None

  GenerateLightmapTexCoordSettings_id : bpy.props.StringProperty()
  @property
  def GenerateLightmapTexCoordSettings(self):
    index = bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.find(self.GenerateLightmapTexCoordSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List[index]

    return None

  FoliageSettings_id : bpy.props.StringProperty()
  @property
  def FoliageSettings(self):
    index = bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.find(self.FoliageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List[index]

    return None

  BillboardCloudSettings_id : bpy.props.StringProperty()
  @property
  def BillboardCloudSettings(self):
    index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.BillboardCloudSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List[index]

    return None

  FlipbookSettings_id : bpy.props.StringProperty()
  @property
  def FlipbookSettings(self):
    index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.FlipbookSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List[index]

    return None

  ImpostorFromSingleViewSettings_id : bpy.props.StringProperty()
  @property
  def ImpostorFromSingleViewSettings(self):
    index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.ImpostorFromSingleViewSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List[index]

    return None

  OcclusionMeshSettings_id : bpy.props.StringProperty()
  @property
  def OcclusionMeshSettings(self):
    index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.OcclusionMeshSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List[index]

    return None


  def Init(self, parentId, pipelineType, menuPath, automaticMaterialCastersFromSelection):
    self.name = str(uuid.uuid4())
    self.Parent_id = parentId
    self.PipelineType = pipelineType
    self.MenuPath = menuPath
    self.AutomaticMaterialCastersFromSelection = automaticMaterialCastersFromSelection
    globalSettings = bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.add()
    globalSettings.Init()
    self.GlobalSettings_id = globalSettings.name
    pipelineSettings = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.add()
    pipelineSettings.Init()
    self.PipelineSettings_id = pipelineSettings.name
    if self.PipelineType == ESimplygonPipeline.Passthrough:
      self.PipelineSettings.IntermediateStep = True

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      ReductionSettings = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.add()
      ReductionSettings.Init()
      self.ReductionSettings_id = ReductionSettings.name
      RepairSettings = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.add()
      RepairSettings.Init()
      self.RepairSettings_id = RepairSettings.name
      NormalCalculationSettings = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.add()
      NormalCalculationSettings.Init()
      self.NormalCalculationSettings_id = NormalCalculationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      BoneSettings = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      RemeshingSettings = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.add()
      RemeshingSettings.Init()
      self.RemeshingSettings_id = RemeshingSettings.name
      BoneSettings = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      AggregationSettings = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.add()
      AggregationSettings.Init()
      self.AggregationSettings_id = AggregationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      BillboardCloudSettings = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.add()
      BillboardCloudSettings.Init()
      self.BillboardCloudSettings_id = BillboardCloudSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      BillboardCloudSettings = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.add()
      BillboardCloudSettings.Init()
      self.BillboardCloudSettings_id = BillboardCloudSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      FlipbookSettings = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.add()
      FlipbookSettings.Init()
      self.FlipbookSettings_id = FlipbookSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      ImpostorFromSingleViewSettings = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.add()
      ImpostorFromSingleViewSettings.Init()
      self.ImpostorFromSingleViewSettings_id = ImpostorFromSingleViewSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      OcclusionMeshSettings = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.add()
      OcclusionMeshSettings.Init()
      self.OcclusionMeshSettings_id = OcclusionMeshSettings.name

    self.SetTemplateOverrides()

  def InitJson(self, parentId, jsonData):
    self.Parent_id = parentId
    self.name = str(uuid.uuid4())
    self.LoadJson(jsonData)

  def Deinit(self):
    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      self.ReductionSettings.Deinit()
      ReductionSettings_index = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.find(self.ReductionSettings_id)
      bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.remove(ReductionSettings_index)
      self.RepairSettings.Deinit()
      RepairSettings_index = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.find(self.RepairSettings_id)
      bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.remove(RepairSettings_index)
      self.NormalCalculationSettings.Deinit()
      NormalCalculationSettings_index = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.find(self.NormalCalculationSettings_id)
      bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.remove(NormalCalculationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.remove(VisibilitySettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.remove(BoneSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      self.RemeshingSettings.Deinit()
      RemeshingSettings_index = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.find(self.RemeshingSettings_id)
      bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.remove(RemeshingSettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.remove(BoneSettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.remove(GeometryCullingSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.remove(VisibilitySettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      self.AggregationSettings.Deinit()
      AggregationSettings_index = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.find(self.AggregationSettings_id)
      bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.remove(AggregationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.remove(VisibilitySettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.remove(GeometryCullingSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      self.BillboardCloudSettings.Deinit()
      BillboardCloudSettings_index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.BillboardCloudSettings_id)
      bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.remove(BillboardCloudSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      self.BillboardCloudSettings.Deinit()
      BillboardCloudSettings_index = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.find(self.BillboardCloudSettings_id)
      bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.remove(BillboardCloudSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      self.FlipbookSettings.Deinit()
      FlipbookSettings_index = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.find(self.FlipbookSettings_id)
      bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.remove(FlipbookSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      self.ImpostorFromSingleViewSettings.Deinit()
      ImpostorFromSingleViewSettings_index = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.find(self.ImpostorFromSingleViewSettings_id)
      bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.remove(ImpostorFromSingleViewSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      self.OcclusionMeshSettings.Deinit()
      OcclusionMeshSettings_index = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.find(self.OcclusionMeshSettings_id)
      bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.remove(OcclusionMeshSettings_index)

    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      materialCaster.Deinit()
      RemoveSimplygonMaterialCaster(materialCaster)

    for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
      cascadedPipeline.Deinit()
      RemoveSimplygonPipeline(cascadedPipeline)


  def SaveJson(self, serializeUIComponents):
    jsonData = {}
    jsonData['Settings'] = {}
    if self.PipelineType == ESimplygonPipeline.Passthrough:
      jsonData['Pipeline'] = "Passthrough"

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      jsonData['Pipeline'] = "Reduction"

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      jsonData['Pipeline'] = "Remeshing"

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      jsonData['Pipeline'] = "Aggregation"

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      jsonData['Pipeline'] = "BillboardCloud"

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      jsonData['Pipeline'] = "BillboardCloudVegetation"

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      jsonData['Pipeline'] = "Flipbook"

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      jsonData['Pipeline'] = "ImpostorFromSingleView"

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      jsonData['Pipeline'] = "OcclusionMesh"

    jsonData['Version'] = "9.2"
    jsonData['Build'] = "9.2.7000.0"
    jsonData['Commit'] = "b140eb10a65409d5f047e07a6e39846540d35c1d"
    jsonData['Settings']['GlobalSettings'] = self.GlobalSettings.SaveJson(serializeUIComponents)
    jsonData['Settings']['PipelineSettings'] = self.PipelineSettings.SaveJson(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      jsonData['Settings']['ReductionProcessor'] = self.SaveJsonReductionPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      jsonData['Settings']['RemeshingProcessor'] = self.SaveJsonRemeshingPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      jsonData['Settings']['AggregationProcessor'] = self.SaveJsonAggregationPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonBillboardCloudPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonBillboardCloudVegetationPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonFlipbookPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonImpostorFromSingleViewPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      jsonData['Settings']['OcclusionMeshProcessor'] = self.SaveJsonOcclusionMeshPipeline(serializeUIComponents)

    jsonData['Settings']['MaterialCaster'] = []
    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      jsonData['Settings']['MaterialCaster'].append(materialCaster.SaveJson(serializeUIComponents))

    jsonData['Cascaded'] = []
    for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
      jsonData['Cascaded'].append(cascadedPipeline.SaveJson(serializeUIComponents))

    return jsonData

  def SaveJsonReductionPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ReductionSettings'] = self.ReductionSettings.SaveJson(serializeUIComponents)
    jsonData['RepairSettings'] = self.RepairSettings.SaveJson(serializeUIComponents)
    jsonData['NormalCalculationSettings'] = self.NormalCalculationSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['BoneSettings'] = self.BoneSettings.SaveJson(serializeUIComponents)
    jsonData['VertexWeightSettings'] = self.VertexWeightSettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonRemeshingPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['RemeshingSettings'] = self.RemeshingSettings.SaveJson(serializeUIComponents)
    jsonData['BoneSettings'] = self.BoneSettings.SaveJson(serializeUIComponents)
    jsonData['GeometryCullingSettings'] = self.GeometryCullingSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonAggregationPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['AggregationSettings'] = self.AggregationSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['GeometryCullingSettings'] = self.GeometryCullingSettings.SaveJson(serializeUIComponents)
    jsonData['VertexWeightSettings'] = self.VertexWeightSettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonBillboardCloudPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['BillboardCloudSettings'] = self.BillboardCloudSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_BillboardCloud
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonBillboardCloudVegetationPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['BillboardCloudSettings'] = self.BillboardCloudSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_BillboardCloud
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonFlipbookPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['FlipbookSettings'] = self.FlipbookSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_Flipbook
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonImpostorFromSingleViewPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['ImpostorFromSingleViewSettings'] = self.ImpostorFromSingleViewSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_FromSingleView
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonOcclusionMeshPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['OcclusionMeshSettings'] = self.OcclusionMeshSettings.SaveJson(serializeUIComponents)
    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if jsonData['Pipeline'] == "Passthrough":
      self.PipelineType = ESimplygonPipeline.Passthrough

    if jsonData['Pipeline'] == "Reduction":
      self.PipelineType = ESimplygonPipeline.ReductionPipeline

    if jsonData['Pipeline'] == "Remeshing":
      self.PipelineType = ESimplygonPipeline.RemeshingPipeline

    if jsonData['Pipeline'] == "Aggregation":
      self.PipelineType = ESimplygonPipeline.AggregationPipeline

    if jsonData['Pipeline'] == "BillboardCloud":
      self.PipelineType = ESimplygonPipeline.BillboardCloudPipeline

    if jsonData['Pipeline'] == "BillboardCloudVegetation":
      self.PipelineType = ESimplygonPipeline.BillboardCloudVegetationPipeline

    if jsonData['Pipeline'] == "Flipbook":
      self.PipelineType = ESimplygonPipeline.FlipbookPipeline

    if jsonData['Pipeline'] == "ImpostorFromSingleView":
      self.PipelineType = ESimplygonPipeline.ImpostorFromSingleViewPipeline

    if jsonData['Pipeline'] == "OcclusionMesh":
      self.PipelineType = ESimplygonPipeline.OcclusionMeshPipeline

    if 'Settings' in jsonData and jsonData['Settings'] is not None:
      globalSettings = bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.add()
      globalSettings.InitJson(jsonData['Settings']['GlobalSettings'])
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.add()
      pipelineSettings.InitJson(jsonData['Settings']['PipelineSettings'])
      self.PipelineSettings_id = pipelineSettings.name

    else:
      globalSettings = bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.add()
      globalSettings.Init()
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.add()
      pipelineSettings.Init()
      self.PipelineSettings_id = pipelineSettings.name

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      self.LoadJsonReductionPipeline(jsonData['Settings']['ReductionProcessor'])

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      self.LoadJsonRemeshingPipeline(jsonData['Settings']['RemeshingProcessor'])

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      self.LoadJsonAggregationPipeline(jsonData['Settings']['AggregationProcessor'])

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      self.LoadJsonBillboardCloudPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      self.LoadJsonBillboardCloudVegetationPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      self.LoadJsonFlipbookPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      self.LoadJsonImpostorFromSingleViewPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      self.LoadJsonOcclusionMeshPipeline(jsonData['Settings']['OcclusionMeshProcessor'])

    if 'Cascaded' in jsonData and jsonData['Cascaded'] is not None:
      for i in range(0, len(jsonData['Cascaded'])):
        cascadedPipeline = bpy.context.scene.Simplygon_Pipelines.add()
        cascadedPipeline.InitJson(self.name, jsonData['Cascaded'][i])
        self.CascadedPipelineIds += cascadedPipeline.name + ';'
        self.VisibleCascadedPipelines = True


    if 'Settings' in jsonData and jsonData['Settings'] is not None:
      if jsonData['Settings']['MaterialCaster'] is not None:
        for i in range(0, len(jsonData['Settings']['MaterialCaster'])):
          materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
          materialCaster.InitJson(self.name, jsonData['Settings']['MaterialCaster'][i])
          self.MaterialCasterIds += materialCaster.name + ';'
          self.VisibleCascadedPipelines = True





  def LoadJsonReductionPipeline(self, jsonData):
    if jsonData is None:
      return

    ReductionSettings = bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.add()
    ReductionSettings.InitJson(jsonData['ReductionSettings'] if jsonData is not None and 'ReductionSettings' in jsonData else None)
    self.ReductionSettings_id = ReductionSettings.name
    RepairSettings = bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.add()
    RepairSettings.InitJson(jsonData['RepairSettings'] if jsonData is not None and 'RepairSettings' in jsonData else None)
    self.RepairSettings_id = RepairSettings.name
    NormalCalculationSettings = bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.add()
    NormalCalculationSettings.InitJson(jsonData['NormalCalculationSettings'] if jsonData is not None and 'NormalCalculationSettings' in jsonData else None)
    self.NormalCalculationSettings_id = NormalCalculationSettings.name
    VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
    VisibilitySettings.InitJson(jsonData['VisibilitySettings'] if jsonData is not None and 'VisibilitySettings' in jsonData else None)
    self.VisibilitySettings_id = VisibilitySettings.name
    BoneSettings = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.add()
    BoneSettings.InitJson(jsonData['BoneSettings'] if jsonData is not None and 'BoneSettings' in jsonData else None)
    self.BoneSettings_id = BoneSettings.name
    VertexWeightSettings = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.add()
    VertexWeightSettings.InitJson(jsonData['VertexWeightSettings'] if jsonData is not None and 'VertexWeightSettings' in jsonData else None)
    self.VertexWeightSettings_id = VertexWeightSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonRemeshingPipeline(self, jsonData):
    if jsonData is None:
      return

    RemeshingSettings = bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.add()
    RemeshingSettings.InitJson(jsonData['RemeshingSettings'] if jsonData is not None and 'RemeshingSettings' in jsonData else None)
    self.RemeshingSettings_id = RemeshingSettings.name
    BoneSettings = bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.add()
    BoneSettings.InitJson(jsonData['BoneSettings'] if jsonData is not None and 'BoneSettings' in jsonData else None)
    self.BoneSettings_id = BoneSettings.name
    GeometryCullingSettings = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.add()
    GeometryCullingSettings.InitJson(jsonData['GeometryCullingSettings'] if jsonData is not None and 'GeometryCullingSettings' in jsonData else None)
    self.GeometryCullingSettings_id = GeometryCullingSettings.name
    VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
    VisibilitySettings.InitJson(jsonData['VisibilitySettings'] if jsonData is not None and 'VisibilitySettings' in jsonData else None)
    self.VisibilitySettings_id = VisibilitySettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonAggregationPipeline(self, jsonData):
    if jsonData is None:
      return

    AggregationSettings = bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.add()
    AggregationSettings.InitJson(jsonData['AggregationSettings'] if jsonData is not None and 'AggregationSettings' in jsonData else None)
    self.AggregationSettings_id = AggregationSettings.name
    VisibilitySettings = bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.add()
    VisibilitySettings.InitJson(jsonData['VisibilitySettings'] if jsonData is not None and 'VisibilitySettings' in jsonData else None)
    self.VisibilitySettings_id = VisibilitySettings.name
    GeometryCullingSettings = bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.add()
    GeometryCullingSettings.InitJson(jsonData['GeometryCullingSettings'] if jsonData is not None and 'GeometryCullingSettings' in jsonData else None)
    self.GeometryCullingSettings_id = GeometryCullingSettings.name
    VertexWeightSettings = bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.add()
    VertexWeightSettings.InitJson(jsonData['VertexWeightSettings'] if jsonData is not None and 'VertexWeightSettings' in jsonData else None)
    self.VertexWeightSettings_id = VertexWeightSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonBillboardCloudPipeline(self, jsonData):
    if jsonData is None:
      return

    BillboardCloudSettings = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonBillboardCloudVegetationPipeline(self, jsonData):
    if jsonData is None:
      return

    BillboardCloudSettings = bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonFlipbookPipeline(self, jsonData):
    if jsonData is None:
      return

    FlipbookSettings = bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.add()
    FlipbookSettings.InitJson(jsonData['ImpostorSettings']['FlipbookSettings'])
    self.FlipbookSettings_id = FlipbookSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonImpostorFromSingleViewPipeline(self, jsonData):
    if jsonData is None:
      return

    ImpostorFromSingleViewSettings = bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.add()
    ImpostorFromSingleViewSettings.InitJson(jsonData['ImpostorSettings']['ImpostorFromSingleViewSettings'])
    self.ImpostorFromSingleViewSettings_id = ImpostorFromSingleViewSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.add()
    MappingImageSettings.InitJson(jsonData['MappingImageSettings'] if jsonData is not None and 'MappingImageSettings' in jsonData else None)
    self.MappingImageSettings_id = MappingImageSettings.name

  def LoadJsonOcclusionMeshPipeline(self, jsonData):
    if jsonData is None:
      return

    OcclusionMeshSettings = bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.add()
    OcclusionMeshSettings.InitJson(jsonData['OcclusionMeshSettings'] if jsonData is not None and 'OcclusionMeshSettings' in jsonData else None)
    self.OcclusionMeshSettings_id = OcclusionMeshSettings.name

  def AddMaterialCaster(self, materialCasterType, materialChannelName, allowMaterialChannelOverride, allowDuplicates) :
    if materialChannelName == '':
      materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
      materialCaster.Init(self.name, materialCasterType, materialChannelName, allowMaterialChannelOverride)
      self.MaterialCasterIds += materialCaster.name + ';'

    else:
      newMaterialChannel = True
      if not allowDuplicates:
        for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
          if materialCaster.MaterialChannelName == materialChannelName:
            newMaterialChannel = False



      if newMaterialChannel:
        materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
        materialCaster.Init(self.name, materialCasterType, materialChannelName, allowMaterialChannelOverride)
        self.MaterialCasterIds += materialCaster.name + ';'


    self.VisibleMaterialCasters = True
    self.MappingImageSettings.GenerateMappingImage = True
    self.MappingImageSettings.UseFullRetexturing = True
    self.MappingImageSettings.ApplyNewMaterialIds = True

  def RemoveMaterialCaster(self, id) :
    materialCaster = GetSimplygonMaterialCaster(id)
    materialCaster.Deinit()
    self.MaterialCasterIds = self.MaterialCasterIds.replace(materialCaster.name + ';', '')
    RemoveSimplygonMaterialCaster(materialCaster)

  def RemoveAllMaterialCaster(self) :
    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      materialCaster.Deinit()
      RemoveSimplygonMaterialCaster(materialCaster)

    self.MaterialCasterIds = ''

  def AddCascadedPipeline(self, pipelineType, menuPath, automaticMaterialCastersFromSelection):
    cascadedPipeline = bpy.context.scene.Simplygon_Pipelines.add()
    cascadedPipeline.Init(self.name, pipelineType, menuPath, automaticMaterialCastersFromSelection)
    self.CascadedPipelineIds += cascadedPipeline.name + ';'
    self.VisibleCascadedPipelines = True
    return cascadedPipeline

  def RemoveCascadedPipeline(self, id) :
    pipeline = GetSimplygonPipeline(id)
    pipeline.Deinit()
    self.CascadedPipelineIds = self.CascadedPipelineIds.replace(pipeline.name + ';', '')
    RemoveSimplygonPipeline(pipeline)

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled

  def SetTemplateOverrides(self):
    if self.FilePath:
      return

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Advanced/Reduction":
      self.VertexWeightSettings.WeightsFromColorLevel = 0
      self.VertexWeightSettings.WeightsFromColorNameUI.VisibleOverride = False
      self.VertexWeightSettings.WeightsFromColorLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline and self.MenuPath == "Template/Advanced/Remeshing":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Advanced/Aggregation":
      self.VertexWeightSettings.WeightsFromColorLevel = 0
      self.VertexWeightSettings.WeightsFromColorNameUI.VisibleOverride = False
      self.VertexWeightSettings.WeightsFromColorLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline and self.MenuPath == "Template/Advanced/Billboard cloud":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.FoliageSettings.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_OuterShell))
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline and self.MenuPath == "Template/Advanced/Billboard cloud for vegetation":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_Foliage))
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline and self.MenuPath == "Template/Advanced/Impostor from single view":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ImpostorFromSingleViewSettings.ViewDirectionX = -1
      self.ImpostorFromSingleViewSettings.ViewDirectionY = 0
      self.ImpostorFromSingleViewSettings.ViewDirectionZ = 0
      self.ImpostorFromSingleViewSettings.TwoSidedUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline and self.MenuPath == "Template/Advanced/Occlusion mesh":
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Basic/Reduction":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ReductionSettings.ReductionTargetTriangleCountUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetMaxDeviationUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetOnScreenSizeUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetStopConditionUI.VisibleOverride = False
      self.ReductionSettings.ReductionHeuristicsUI.VisibleOverride = False
      self.ReductionSettings.GeometryImportanceUI.VisibleOverride = False
      self.ReductionSettings.MaterialImportanceUI.VisibleOverride = False
      self.ReductionSettings.TextureImportanceUI.VisibleOverride = False
      self.ReductionSettings.ShadingImportanceUI.VisibleOverride = False
      self.ReductionSettings.GroupImportanceUI.VisibleOverride = False
      self.ReductionSettings.VertexColorImportanceUI.VisibleOverride = False
      self.ReductionSettings.EdgeSetImportanceUI.VisibleOverride = False
      self.ReductionSettings.SkinningImportanceUI.VisibleOverride = False
      self.ReductionSettings.CurvatureImportanceUI.VisibleOverride = False
      self.ReductionSettings.OutwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.InwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.KeepSymmetryUI.VisibleOverride = False
      self.ReductionSettings.CreateGeomorphGeometryUI.VisibleOverride = False
      self.ReductionSettings.DataCreationPreferencesUI.VisibleOverride = False
      self.ReductionSettings.UseHighQualityNormalCalculationUI.VisibleOverride = False
      self.ReductionSettings.LockGeometricBorderUI.VisibleOverride = False
      self.ReductionSettings.MergeGeometriesUI.VisibleOverride = False
      self.ReductionSettings.AllowDegenerateTexCoordsUI.VisibleOverride = False
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.RepairSettings.VisibleOverride = False
      self.NormalCalculationSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.MappingImageSettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Basic/Reduction with material baking":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ReductionSettings.ReductionTargetTriangleCountUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetMaxDeviationUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetOnScreenSizeUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetStopConditionUI.VisibleOverride = False
      self.ReductionSettings.ReductionHeuristicsUI.VisibleOverride = False
      self.ReductionSettings.GeometryImportanceUI.VisibleOverride = False
      self.ReductionSettings.MaterialImportanceUI.VisibleOverride = False
      self.ReductionSettings.TextureImportanceUI.VisibleOverride = False
      self.ReductionSettings.ShadingImportanceUI.VisibleOverride = False
      self.ReductionSettings.GroupImportanceUI.VisibleOverride = False
      self.ReductionSettings.VertexColorImportanceUI.VisibleOverride = False
      self.ReductionSettings.EdgeSetImportanceUI.VisibleOverride = False
      self.ReductionSettings.SkinningImportanceUI.VisibleOverride = False
      self.ReductionSettings.CurvatureImportanceUI.VisibleOverride = False
      self.ReductionSettings.OutwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.InwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.KeepSymmetryUI.VisibleOverride = False
      self.ReductionSettings.CreateGeomorphGeometryUI.VisibleOverride = False
      self.ReductionSettings.DataCreationPreferencesUI.VisibleOverride = False
      self.ReductionSettings.UseHighQualityNormalCalculationUI.VisibleOverride = False
      self.ReductionSettings.LockGeometricBorderUI.VisibleOverride = False
      self.ReductionSettings.MergeGeometriesUI.VisibleOverride = False
      self.ReductionSettings.AllowDegenerateTexCoordsUI.VisibleOverride = False
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.RepairSettings.VisibleOverride = False
      self.NormalCalculationSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline and self.MenuPath == "Template/Basic/Remeshing with material baking":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.RemeshingSettings.RemeshingModeManualPositionXUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeManualPositionYUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeManualPositionZUI.VisibleOverride = False
      self.RemeshingSettings.ForceSoftEdgesWithinTextureChartsUI.VisibleOverride = False
      self.RemeshingSettings.HoleFillingUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeUI.VisibleOverride = False
      self.RemeshingSettings.SurfaceTransferModeUI.VisibleOverride = False
      self.RemeshingSettings.HardEdgeAngleUI.VisibleOverride = False
      self.RemeshingSettings.TransferNormalsUI.VisibleOverride = False
      self.RemeshingSettings.TransferColorsUI.VisibleOverride = False
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Basic/Aggregation":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.AggregationSettings.SubdivideGeometryBasedOnUVTilesUI.VisibleOverride = False
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.MappingImageSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Basic/Aggregation with material baking":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.AggregationSettings.SubdivideGeometryBasedOnUVTilesUI.VisibleOverride = False
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline and self.MenuPath == "Template/Basic/Billboard cloud":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardDensityUI.VisibleOverride = False
      self.BillboardCloudSettings.MaxPlaneCountUI.VisibleOverride = False
      self.BillboardCloudSettings.GeometricComplexityUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_OuterShell))
      self.BillboardCloudSettings.FoliageSettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline and self.MenuPath == "Template/Basic/Billboard cloud for vegetation":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardDensityUI.VisibleOverride = False
      self.BillboardCloudSettings.MaxPlaneCountUI.VisibleOverride = False
      self.BillboardCloudSettings.GeometricComplexityUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_Foliage))
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline and self.MenuPath == "Template/Basic/Impostor from single view":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ImpostorFromSingleViewSettings.ViewDirectionX = -1
      self.ImpostorFromSingleViewSettings.ViewDirectionY = 0
      self.ImpostorFromSingleViewSettings.ViewDirectionZ = 0
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.ImpostorFromSingleViewSettings.TwoSidedUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      materialCaster.SetTemplateOverrides()

    for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
      cascadedPipeline.SetTemplateOverrides()


  def draw(self, layout) :
    cascadedPipelines = GetSimplygonPipelines(self.CascadedPipelineIds)
    if self.PipelineType == ESimplygonPipeline.Passthrough and cascadedPipelines and len(cascadedPipelines) > 0 :
      for cascadedPipeline in cascadedPipelines:
        cascadedPipeline.draw(layout.column())


    else:
      row = layout.row()
      if self.Visible is False:
        row.prop(self, 'Visible', icon='TRIA_RIGHT', text=self.PipelineName, emboss=False)
        row.operator('simplygon.operator_remove_lod_component', text = '', icon = 'TRASH').pipelineId = self.name

      else:
        row.prop(self, 'Visible', icon='TRIA_DOWN', text=self.PipelineName, emboss=False)
        row.operator('simplygon.operator_remove_lod_component', text = '', icon = 'TRASH').pipelineId = self.name

        if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
          self.drawReductionPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
          self.drawRemeshingPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
          self.drawAggregationPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
          self.drawBillboardCloudPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
          self.drawBillboardCloudVegetationPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
          self.drawFlipbookPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
          self.drawImpostorFromSingleViewPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
          self.drawOcclusionMeshPipeline(layout.column())





  def drawReductionPipeline(self, layout) :
    if self.ReductionSettings.Visible:
      self.ReductionSettings.draw(layout.box(), True)

    if self.RepairSettings.Visible:
      self.RepairSettings.draw(layout.box(), True)

    if self.NormalCalculationSettings.Visible:
      self.NormalCalculationSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.BoneSettings.Visible:
      self.BoneSettings.draw(layout.box(), True)

    if self.VertexWeightSettings.Visible:
      self.VertexWeightSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawRemeshingPipeline(self, layout) :
    if self.RemeshingSettings.Visible:
      self.RemeshingSettings.draw(layout.box(), True)

    if self.BoneSettings.Visible:
      self.BoneSettings.draw(layout.box(), True)

    if self.GeometryCullingSettings.Visible:
      self.GeometryCullingSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawAggregationPipeline(self, layout) :
    if self.AggregationSettings.Visible:
      self.AggregationSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.GeometryCullingSettings.Visible:
      self.GeometryCullingSettings.draw(layout.box(), True)

    if self.VertexWeightSettings.Visible:
      self.VertexWeightSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawBillboardCloudPipeline(self, layout) :
    if self.BillboardCloudSettings.Visible:
      self.BillboardCloudSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawBillboardCloudVegetationPipeline(self, layout) :
    if self.BillboardCloudSettings.Visible:
      self.BillboardCloudSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawFlipbookPipeline(self, layout) :
    if self.FlipbookSettings.Visible:
      self.FlipbookSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawImpostorFromSingleViewPipeline(self, layout) :
    if self.ImpostorFromSingleViewSettings.Visible:
      self.ImpostorFromSingleViewSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawOcclusionMeshPipeline(self, layout) :
    if self.OcclusionMeshSettings.Visible:
      self.OcclusionMeshSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())




def simplygon_template_menu_draw(self, context):
  self.layout.menu('SIMPLYGON_MT_template_scripts')
simplygon_icons = []

classes = (
  Simplygon_Operator_Process,
  Simplygon_Operator_SettingsMenu,
  Simplygon_Operator_SavePipeline,
  Simplygon_Operator_SavePipelineDialog,
  Simplygon_Operator_LoadPipeline,
  Simplygon_Operator_LoadPipelineDialog,
  Simplygon_Operator_AddMaterialCasterMenu,
  Simplygon_Operator_RemoveAllMaterialCasterMenu,
  Simplygon_Operator_AddMaterialCaster,
  Simplygon_Operator_AddAutomaticMaterialCasters,
  Simplygon_Operator_RemoveMaterialCaster,
  Simplygon_Operator_AddLODComponentMenu,
  Simplygon_Operator_AddLODComponent,
  Simplygon_Operator_RemoveLODComponent,
  Simplygon_Operator_TemplateScript,
  Simplygon_Menu_AdvancedLODComponents,
  Simplygon_Menu_BasicLODComponents,
  Simplygon_Menu_AdvancedMaterialCasters,
  Simplygon_Menu_AddMaterialCaster,
  Simplygon_Menu_AddLODComponent,
  Simplygon_Menu_TemplateScripts,
  Simplygon_Menu_Settings,
  Simplygon_Panel,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEx,
  SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEx,
  SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEx,
  SimplygonReductionSettings.SimplygonReductionTargetStopConditionEx,
  SimplygonReductionSettings.SimplygonReductionHeuristicsEx,
  SimplygonReductionSettings.SimplygonGeometryImportanceEx,
  SimplygonReductionSettings.SimplygonMaterialImportanceEx,
  SimplygonReductionSettings.SimplygonTextureImportanceEx,
  SimplygonReductionSettings.SimplygonShadingImportanceEx,
  SimplygonReductionSettings.SimplygonGroupImportanceEx,
  SimplygonReductionSettings.SimplygonVertexColorImportanceEx,
  SimplygonReductionSettings.SimplygonEdgeSetImportanceEx,
  SimplygonReductionSettings.SimplygonSkinningImportanceEx,
  SimplygonReductionSettings.SimplygonCurvatureImportanceEx,
  SimplygonReductionSettings.SimplygonCreateGeomorphGeometryEx,
  SimplygonReductionSettings.SimplygonAllowDegenerateTexCoordsEx,
  SimplygonReductionSettings.SimplygonKeepSymmetryEx,
  SimplygonReductionSettings.SimplygonUseAutomaticSymmetryDetectionEx,
  SimplygonReductionSettings.SimplygonUseSymmetryQuadRetriangulatorEx,
  SimplygonReductionSettings.SimplygonSymmetryAxisEx,
  SimplygonReductionSettings.SimplygonSymmetryOffsetEx,
  SimplygonReductionSettings.SimplygonSymmetryDetectionToleranceEx,
  SimplygonReductionSettings.SimplygonDataCreationPreferencesEx,
  SimplygonReductionSettings.SimplygonOutwardMoveMultiplierEx,
  SimplygonReductionSettings.SimplygonInwardMoveMultiplierEx,
  SimplygonReductionSettings.SimplygonUseHighQualityNormalCalculationEx,
  SimplygonReductionSettings.SimplygonMergeGeometriesEx,
  SimplygonReductionSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonReductionSettings.SimplygonLockGeometricBorderEx,
  SimplygonReductionSettings,
  SimplygonRepairSettings.SimplygonUseTJunctionRemoverEx,
  SimplygonRepairSettings.SimplygonTJuncDistEx,
  SimplygonRepairSettings.SimplygonWeldDistEx,
  SimplygonRepairSettings.SimplygonWeldOnlyBorderVerticesEx,
  SimplygonRepairSettings.SimplygonWeldOnlyWithinMaterialEx,
  SimplygonRepairSettings.SimplygonWeldOnlyWithinSceneNodeEx,
  SimplygonRepairSettings.SimplygonWeldOnlyBetweenSceneNodesEx,
  SimplygonRepairSettings.SimplygonUseWeldingEx,
  SimplygonRepairSettings.SimplygonProgressivePassesEx,
  SimplygonRepairSettings,
  SimplygonNormalCalculationSettings.SimplygonReplaceNormalsEx,
  SimplygonNormalCalculationSettings.SimplygonReplaceTangentsEx,
  SimplygonNormalCalculationSettings.SimplygonHardEdgeAngleEx,
  SimplygonNormalCalculationSettings.SimplygonRepairInvalidNormalsEx,
  SimplygonNormalCalculationSettings.SimplygonReorthogonalizeTangentSpaceEx,
  SimplygonNormalCalculationSettings.SimplygonScaleByAreaEx,
  SimplygonNormalCalculationSettings.SimplygonScaleByAngleEx,
  SimplygonNormalCalculationSettings.SimplygonSnapNormalsToFlatSurfacesEx,
  SimplygonNormalCalculationSettings,
  SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInReducerEx,
  SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInTexcoordGeneratorEx,
  SimplygonVisibilitySettings.SimplygonVisibilityWeightsPowerEx,
  SimplygonVisibilitySettings.SimplygonCullOccludedGeometryEx,
  SimplygonVisibilitySettings.SimplygonForceVisibilityCalculationEx,
  SimplygonVisibilitySettings.SimplygonUseBackfaceCullingEx,
  SimplygonVisibilitySettings.SimplygonCameraSelectionSetNameEx,
  SimplygonVisibilitySettings.SimplygonOccluderSelectionSetNameEx,
  SimplygonVisibilitySettings.SimplygonFillNonVisibleAreaThresholdEx,
  SimplygonVisibilitySettings.SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx,
  SimplygonVisibilitySettings.SimplygonConservativeModeEx,
  SimplygonVisibilitySettings.SimplygonComputeVisibilityModeEx,
  SimplygonVisibilitySettings,
  SimplygonBoneSettings.SimplygonUseBoneReducerEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEnabledEx,
  SimplygonBoneSettings.SimplygonRemoveUnusedBonesEx,
  SimplygonBoneSettings.SimplygonLimitBonesPerVertexEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEnabledEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEnabledEx,
  SimplygonBoneSettings.SimplygonMaxBonePerVertexEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEnabledEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetStopConditionEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEx,
  SimplygonBoneSettings.SimplygonLockBoneSelectionSetNameEx,
  SimplygonBoneSettings.SimplygonRemoveBoneSelectionSetNameEx,
  SimplygonBoneSettings,
  SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInReducerEx,
  SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInTexcoordGeneratorEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorNameEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorLevelEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorComponentEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorMultiplierEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorModeEx,
  SimplygonVertexWeightSettings,
  SimplygonPipelineSettings.SimplygonTextureOutputPathEx,
  SimplygonPipelineSettings.SimplygonSimplygonBatchPathEx,
  SimplygonPipelineSettings.SimplygonOutputMaterialNameEx,
  SimplygonPipelineSettings.SimplygonOutputUniqueMaterialNamesEx,
  SimplygonPipelineSettings.SimplygonEmbedReferencesEx,
  SimplygonPipelineSettings.SimplygonIntermediateStepEx,
  SimplygonPipelineSettings.SimplygonCascadedRunModeEx,
  SimplygonPipelineSettings,
  SimplygonMappingImageInputMaterialSettings.SimplygonMaterialMappingEx,
  SimplygonMappingImageInputMaterialSettings,
  SimplygonMappingImageOutputMaterialSettings.SimplygonTextureWidthEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonTextureHeightEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonMultisamplingLevelEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonGutterSpaceEx,
  SimplygonMappingImageOutputMaterialSettings,
  SimplygonChartAggregatorSettings.SimplygonChartAggregatorModeEx,
  SimplygonChartAggregatorSettings.SimplygonSurfaceAreaScaleEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordLevelEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordNameEx,
  SimplygonChartAggregatorSettings.SimplygonSeparateOverlappingChartsEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalChartProportionsChannelEx,
  SimplygonChartAggregatorSettings.SimplygonLockUVRotationEx,
  SimplygonChartAggregatorSettings,
  SimplygonParameterizerSettings.SimplygonMaxStretchEx,
  SimplygonParameterizerSettings.SimplygonLargeChartsImportanceEx,
  SimplygonParameterizerSettings,
  SimplygonMappingImageSettings.SimplygonGenerateMappingImageEx,
  SimplygonMappingImageSettings.SimplygonGenerateTexCoordsEx,
  SimplygonMappingImageSettings.SimplygonGenerateTangentsEx,
  SimplygonMappingImageSettings.SimplygonMaximumLayersEx,
  SimplygonMappingImageSettings.SimplygonUseFullRetexturingEx,
  SimplygonMappingImageSettings.SimplygonApplyNewMaterialIdsEx,
  SimplygonMappingImageSettings.SimplygonAllowTransparencyMappingEx,
  SimplygonMappingImageSettings.SimplygonTexCoordLevelEx,
  SimplygonMappingImageSettings.SimplygonTexCoordNameEx,
  SimplygonMappingImageSettings.SimplygonUseAutomaticTextureSizeEx,
  SimplygonMappingImageSettings.SimplygonAutomaticTextureSizeMultiplierEx,
  SimplygonMappingImageSettings.SimplygonForcePower2TextureEx,
  SimplygonMappingImageSettings.SimplygonTexCoordGeneratorTypeEx,
  SimplygonMappingImageSettings.SimplygonOnlyParameterizeInvalidUVsEx,
  SimplygonMappingImageSettings,
  SimplygonGlobalSettings.SimplygonDefaultTangentCalculatorTypeEx,
  SimplygonGlobalSettings,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionZEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionYEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionXEx,
  SimplygonRemeshingSettings.SimplygonOnScreenSizeEx,
  SimplygonRemeshingSettings.SimplygonHoleFillingEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeEx,
  SimplygonRemeshingSettings.SimplygonSurfaceTransferModeEx,
  SimplygonRemeshingSettings.SimplygonHardEdgeAngleEx,
  SimplygonRemeshingSettings.SimplygonForceSoftEdgesWithinTextureChartsEx,
  SimplygonRemeshingSettings.SimplygonTransferNormalsEx,
  SimplygonRemeshingSettings.SimplygonTransferColorsEx,
  SimplygonRemeshingSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonRemeshingSettings,
  SimplygonGeometryCullingSettings.SimplygonUseClippingGeometryEx,
  SimplygonGeometryCullingSettings.SimplygonClippingGeometrySelectionSetNameEx,
  SimplygonGeometryCullingSettings,
  SimplygonAggregationSettings.SimplygonMergeGeometriesEx,
  SimplygonAggregationSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonAggregationSettings.SimplygonEnableGeometryCullingEx,
  SimplygonAggregationSettings.SimplygonGeometryCullingPrecisionEx,
  SimplygonAggregationSettings.SimplygonSubdivideGeometryBasedOnUVTilesEx,
  SimplygonAggregationSettings.SimplygonSubdivisionTileSizeEx,
  SimplygonAggregationSettings,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonGenerateLightmapTexCoordEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordLevelEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordNameEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonChartAggregatorModeEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureWidthEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureHeightEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonGutterSpaceEx,
  SimplygonGenerateLightmapTexCoordSettings,
  SimplygonFoliageSettings.SimplygonSeparateTrunkAndFoliageEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleRatioEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleThresholdEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageAreaThresholdEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageSizeThresholdEx,
  SimplygonFoliageSettings.SimplygonTrunkReductionRatioEx,
  SimplygonFoliageSettings,
  SimplygonBillboardCloudSettings.SimplygonBillboardModeEx,
  SimplygonBillboardCloudSettings.SimplygonFavorVerticalPlanesEx,
  SimplygonBillboardCloudSettings.SimplygonTwoSidedEx,
  SimplygonBillboardCloudSettings.SimplygonUseVisibilityWeightsEx,
  SimplygonBillboardCloudSettings.SimplygonBillboardDensityEx,
  SimplygonBillboardCloudSettings.SimplygonMaxPlaneCountEx,
  SimplygonBillboardCloudSettings.SimplygonGeometricComplexityEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorXEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorYEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorZEx,
  SimplygonBillboardCloudSettings,
  SimplygonFlipbookSettings.SimplygonNumberOfViewsEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionXEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionYEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionZEx,
  SimplygonFlipbookSettings.SimplygonUpVectorXEx,
  SimplygonFlipbookSettings.SimplygonUpVectorYEx,
  SimplygonFlipbookSettings.SimplygonUpVectorZEx,
  SimplygonFlipbookSettings,
  SimplygonImpostorFromSingleViewSettings.SimplygonUseTightFittingEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTightFittingDepthOffsetEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTwoSidedEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionXEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionYEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionZEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTexCoordPaddingEx,
  SimplygonImpostorFromSingleViewSettings,
  SimplygonOcclusionMeshSettings.SimplygonOnScreenSizeEx,
  SimplygonOcclusionMeshSettings.SimplygonOnScreenErrorToleranceEx,
  SimplygonOcclusionMeshSettings.SimplygonInvertOutputMeshEx,
  SimplygonOcclusionMeshSettings.SimplygonTransferSkinningEx,
  SimplygonOcclusionMeshSettings.SimplygonUseCamerasEx,
  SimplygonOcclusionMeshSettings.SimplygonCameraSelectionSetNameEx,
  SimplygonOcclusionMeshSettings.SimplygonOcclusionModeEx,
  SimplygonOcclusionMeshSettings,
  SimplygonColorCasterSettings.SimplygonMaterialChannelEx,
  SimplygonColorCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonColorCasterSettings.SimplygonDitherTypeEx,
  SimplygonColorCasterSettings.SimplygonFillModeEx,
  SimplygonColorCasterSettings.SimplygonOpacityChannelEx,
  SimplygonColorCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonColorCasterSettings.SimplygonBakeOpacityInAlphaEx,
  SimplygonColorCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonColorCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonColorCasterSettings.SimplygonDilationEx,
  SimplygonColorCasterSettings.SimplygonOutputOpacityTypeEx,
  SimplygonColorCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonColorCasterSettings.SimplygonSkipCastingIfNoInputChannelEx,
  SimplygonColorCasterSettings.SimplygonOutputSRGBEx,
  SimplygonColorCasterSettings,
  SimplygonOpacityCasterSettings.SimplygonMaterialChannelEx,
  SimplygonOpacityCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonOpacityCasterSettings.SimplygonDitherTypeEx,
  SimplygonOpacityCasterSettings.SimplygonFillModeEx,
  SimplygonOpacityCasterSettings.SimplygonOpacityChannelEx,
  SimplygonOpacityCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonOpacityCasterSettings.SimplygonOutputSRGBEx,
  SimplygonOpacityCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonOpacityCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonOpacityCasterSettings.SimplygonDilationEx,
  SimplygonOpacityCasterSettings.SimplygonOutputOpacityTypeEx,
  SimplygonOpacityCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonOpacityCasterSettings,
  SimplygonNormalCasterSettings.SimplygonMaterialChannelEx,
  SimplygonNormalCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonNormalCasterSettings.SimplygonDitherTypeEx,
  SimplygonNormalCasterSettings.SimplygonFillModeEx,
  SimplygonNormalCasterSettings.SimplygonOpacityChannelEx,
  SimplygonNormalCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonNormalCasterSettings.SimplygonFlipBackfacingNormalsEx,
  SimplygonNormalCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonNormalCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonNormalCasterSettings.SimplygonDilationEx,
  SimplygonNormalCasterSettings.SimplygonGenerateTangentSpaceNormalsEx,
  SimplygonNormalCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonNormalCasterSettings.SimplygonFlipGreenEx,
  SimplygonNormalCasterSettings.SimplygonCalculateBitangentPerFragmentEx,
  SimplygonNormalCasterSettings.SimplygonNormalizeInterpolatedTangentSpaceEx,
  SimplygonNormalCasterSettings,
  SimplygonDisplacementCasterSettings.SimplygonMaterialChannelEx,
  SimplygonDisplacementCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonDisplacementCasterSettings.SimplygonDitherTypeEx,
  SimplygonDisplacementCasterSettings.SimplygonFillModeEx,
  SimplygonDisplacementCasterSettings.SimplygonOpacityChannelEx,
  SimplygonDisplacementCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonDisplacementCasterSettings.SimplygonDistanceScalingEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonDisplacementCasterSettings.SimplygonDilationEx,
  SimplygonDisplacementCasterSettings.SimplygonGenerateScalarDisplacementEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonDisplacementCasterSettings.SimplygonGenerateTangentSpaceDisplacementEx,
  SimplygonDisplacementCasterSettings.SimplygonNormalMapTexCoordLevelEx,
  SimplygonDisplacementCasterSettings,
  SimplygonAmbientOcclusionCasterSettings.SimplygonMaterialChannelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonDitherTypeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonFillModeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonRaysPerPixelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonDilationEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionFalloffEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionMultiplierEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonUseSimpleOcclusionModeEx,
  SimplygonAmbientOcclusionCasterSettings,
  SimplygonGeometryDataCasterSettings.SimplygonMaterialChannelEx,
  SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonGeometryDataCasterSettings.SimplygonDitherTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonFillModeEx,
  SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelEx,
  SimplygonGeometryDataCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonDilationEx,
  SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldIndexEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingLayerIndexEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfREx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupREx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfGEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupGEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfBEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupBEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfAEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupAEx,
  SimplygonGeometryDataCasterSettings,
  SimplygonVertexColorCasterSettings.SimplygonMaterialChannelEx,
  SimplygonVertexColorCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonVertexColorCasterSettings.SimplygonDitherTypeEx,
  SimplygonVertexColorCasterSettings.SimplygonFillModeEx,
  SimplygonVertexColorCasterSettings.SimplygonOpacityChannelEx,
  SimplygonVertexColorCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputColorLevelEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonVertexColorCasterSettings.SimplygonDilationEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputColorNameEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonVertexColorCasterSettings.SimplygonColorSpaceEdgeThresholdEx,
  SimplygonVertexColorCasterSettings,
  SimplygonMaterialCaster,
  SimplygonPipeline

)

def register():
  for cls in classes:
    bpy.utils.register_class(cls)


  bpy.types.Scene.Simplygon_Process_Progress = bpy.props.IntProperty(min=-1,max=100,soft_min=-1,soft_max=100)
  bpy.types.Scene.Simplygon_Current_PipelineId = bpy.props.StringProperty()
  bpy.types.Scene.Simplygon_PipelineIds = bpy.props.StringProperty()
  bpy.types.Scene.Simplygon_Pipelines = bpy.props.CollectionProperty(type = SimplygonPipeline)
  bpy.types.Scene.Simplygon_MaterialCasters = bpy.props.CollectionProperty(type = SimplygonMaterialCaster)
  bpy.types.Scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings)
  bpy.types.Scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEnabledEx)
  bpy.types.Scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEx)
  bpy.types.Scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEnabledEx)
  bpy.types.Scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEx)
  bpy.types.Scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionHeuristicsEx)
  bpy.types.Scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGeometryImportanceEx)
  bpy.types.Scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMaterialImportanceEx)
  bpy.types.Scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonTextureImportanceEx)
  bpy.types.Scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonShadingImportanceEx)
  bpy.types.Scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGroupImportanceEx)
  bpy.types.Scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonVertexColorImportanceEx)
  bpy.types.Scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonEdgeSetImportanceEx)
  bpy.types.Scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSkinningImportanceEx)
  bpy.types.Scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCurvatureImportanceEx)
  bpy.types.Scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCreateGeomorphGeometryEx)
  bpy.types.Scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonAllowDegenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepSymmetryEx)
  bpy.types.Scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseAutomaticSymmetryDetectionEx)
  bpy.types.Scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseSymmetryQuadRetriangulatorEx)
  bpy.types.Scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryAxisEx)
  bpy.types.Scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryOffsetEx)
  bpy.types.Scene.Simplygon_399ad70b72084a0ba283494b89339595_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryDetectionToleranceEx)
  bpy.types.Scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonDataCreationPreferencesEx)
  bpy.types.Scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonOutwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonInwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseHighQualityNormalCalculationEx)
  bpy.types.Scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonLockGeometricBorderEx)
  bpy.types.Scene.Simplygon_046834f72823480c8774aa392854f44a_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings)
  bpy.types.Scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseTJunctionRemoverEx)
  bpy.types.Scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonTJuncDistEx)
  bpy.types.Scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldDistEx)
  bpy.types.Scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBorderVerticesEx)
  bpy.types.Scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinMaterialEx)
  bpy.types.Scene.Simplygon_99453894002e4379ad99ca409d3abd16_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinSceneNodeEx)
  bpy.types.Scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBetweenSceneNodesEx)
  bpy.types.Scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseWeldingEx)
  bpy.types.Scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonProgressivePassesEx)
  bpy.types.Scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings)
  bpy.types.Scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceNormalsEx)
  bpy.types.Scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceTangentsEx)
  bpy.types.Scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonRepairInvalidNormalsEx)
  bpy.types.Scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReorthogonalizeTangentSpaceEx)
  bpy.types.Scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAreaEx)
  bpy.types.Scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAngleEx)
  bpy.types.Scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonSnapNormalsToFlatSurfacesEx)
  bpy.types.Scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings)
  bpy.types.Scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInReducerEx)
  bpy.types.Scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonVisibilityWeightsPowerEx)
  bpy.types.Scene.Simplygon_27301c22f35e4fd5867d443de295a812_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCullOccludedGeometryEx)
  bpy.types.Scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonForceVisibilityCalculationEx)
  bpy.types.Scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseBackfaceCullingEx)
  bpy.types.Scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonOccluderSelectionSetNameEx)
  bpy.types.Scene.Simplygon_d60577f2e751433797ba1a004653f693_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonFillNonVisibleAreaThresholdEx)
  bpy.types.Scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx)
  bpy.types.Scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonConservativeModeEx)
  bpy.types.Scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonComputeVisibilityModeEx)
  bpy.types.Scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings)
  bpy.types.Scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonUseBoneReducerEx)
  bpy.types.Scene.Simplygon_637baeff25624d258b83833d40b9aac6_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEnabledEx)
  bpy.types.Scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveUnusedBonesEx)
  bpy.types.Scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLimitBonesPerVertexEx)
  bpy.types.Scene.Simplygon_b44381d030f84776822f1640f4449eea_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEnabledEx)
  bpy.types.Scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonMaxBonePerVertexEx)
  bpy.types.Scene.Simplygon_555cde1e90be4f748d058543daa7721d_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEx)
  bpy.types.Scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEx)
  bpy.types.Scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLockBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_9eb86501b52f469997d0d345bd498245_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings)
  bpy.types.Scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInReducerEx)
  bpy.types.Scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorNameEx)
  bpy.types.Scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorLevelEx)
  bpy.types.Scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorComponentEx)
  bpy.types.Scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorMultiplierEx)
  bpy.types.Scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorModeEx)
  bpy.types.Scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings)
  bpy.types.Scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonTextureOutputPathEx)
  bpy.types.Scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonSimplygonBatchPathEx)
  bpy.types.Scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputMaterialNameEx)
  bpy.types.Scene.Simplygon_40544e72469549f1a19fb903f511ff07_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputUniqueMaterialNamesEx)
  bpy.types.Scene.Simplygon_c2921f9d00254670b4901277253ab770_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonEmbedReferencesEx)
  bpy.types.Scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonIntermediateStepEx)
  bpy.types.Scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonCascadedRunModeEx)
  bpy.types.Scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings)
  bpy.types.Scene.Simplygon_c567f592c30d410b8090d63439128e69_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings.SimplygonMaterialMappingEx)
  bpy.types.Scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings)
  bpy.types.Scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonMultisamplingLevelEx)
  bpy.types.Scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings)
  bpy.types.Scene.Simplygon_76374f1f1a374735a19650945967cc1e_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSurfaceAreaScaleEx)
  bpy.types.Scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordLevelEx)
  bpy.types.Scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordNameEx)
  bpy.types.Scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSeparateOverlappingChartsEx)
  bpy.types.Scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalChartProportionsChannelEx)
  bpy.types.Scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonLockUVRotationEx)
  bpy.types.Scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings)
  bpy.types.Scene.Simplygon_d19177ac776141748533afcd77e12a32_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonMaxStretchEx)
  bpy.types.Scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonLargeChartsImportanceEx)
  bpy.types.Scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings)
  bpy.types.Scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateMappingImageEx)
  bpy.types.Scene.Simplygon_dda781686289442fae1905da06e02338_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTangentsEx)
  bpy.types.Scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonMaximumLayersEx)
  bpy.types.Scene.Simplygon_1ff2063927e742999f00efa63da701ec_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseFullRetexturingEx)
  bpy.types.Scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonApplyNewMaterialIdsEx)
  bpy.types.Scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAllowTransparencyMappingEx)
  bpy.types.Scene.Simplygon_ed616a49a5064d54866518c49339ec10_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordLevelEx)
  bpy.types.Scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordNameEx)
  bpy.types.Scene.Simplygon_230199b789854dab988313139710204f_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseAutomaticTextureSizeEx)
  bpy.types.Scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAutomaticTextureSizeMultiplierEx)
  bpy.types.Scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonForcePower2TextureEx)
  bpy.types.Scene.Simplygon_a558cb225f76424a92ed27135d98544e_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordGeneratorTypeEx)
  bpy.types.Scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonOnlyParameterizeInvalidUVsEx)
  bpy.types.Scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings)
  bpy.types.Scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings.SimplygonDefaultTangentCalculatorTypeEx)
  bpy.types.Scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings)
  bpy.types.Scene.Simplygon_7c917299739d41a5a5b03785fa627372_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionZEx)
  bpy.types.Scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionYEx)
  bpy.types.Scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionXEx)
  bpy.types.Scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_08224212c6074351b196304affd2add7_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHoleFillingEx)
  bpy.types.Scene.Simplygon_549594188ac14670b53a153dd45d68a9_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeEx)
  bpy.types.Scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonSurfaceTransferModeEx)
  bpy.types.Scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonForceSoftEdgesWithinTextureChartsEx)
  bpy.types.Scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferNormalsEx)
  bpy.types.Scene.Simplygon_2279f4159bac464abe7f8300db103059_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferColorsEx)
  bpy.types.Scene.Simplygon_255681b15e964ce3b25e78c261206045_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings)
  bpy.types.Scene.Simplygon_25acb7f2bead4f76892646160d202188_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonUseClippingGeometryEx)
  bpy.types.Scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonClippingGeometrySelectionSetNameEx)
  bpy.types.Scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings)
  bpy.types.Scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonEnableGeometryCullingEx)
  bpy.types.Scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonGeometryCullingPrecisionEx)
  bpy.types.Scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivideGeometryBasedOnUVTilesEx)
  bpy.types.Scene.Simplygon_3a47cdfb83224c178978e71963e78139_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivisionTileSizeEx)
  bpy.types.Scene.Simplygon_b034267a7423494e89330be254ec2e3c_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings)
  bpy.types.Scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGenerateLightmapTexCoordEx)
  bpy.types.Scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordNameEx)
  bpy.types.Scene.Simplygon_06ec4a1133934c43802057141e35f31c_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_b0a39d2326034d9396e47f011f217938_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings)
  bpy.types.Scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateTrunkAndFoliageEx)
  bpy.types.Scene.Simplygon_0b930377c55741f985ae449ed7287e73_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleRatioEx)
  bpy.types.Scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleThresholdEx)
  bpy.types.Scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageAreaThresholdEx)
  bpy.types.Scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageSizeThresholdEx)
  bpy.types.Scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonTrunkReductionRatioEx)
  bpy.types.Scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings)
  bpy.types.Scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardModeEx)
  bpy.types.Scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonFavorVerticalPlanesEx)
  bpy.types.Scene.Simplygon_578dab21b5a94ac29220204001dc066c_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUseVisibilityWeightsEx)
  bpy.types.Scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardDensityEx)
  bpy.types.Scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonMaxPlaneCountEx)
  bpy.types.Scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonGeometricComplexityEx)
  bpy.types.Scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings)
  bpy.types.Scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonNumberOfViewsEx)
  bpy.types.Scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_51968e193594429e89c8344b75323858_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings)
  bpy.types.Scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonUseTightFittingEx)
  bpy.types.Scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTightFittingDepthOffsetEx)
  bpy.types.Scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_21f55e352fc1422196667e88aca0af72_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTexCoordPaddingEx)
  bpy.types.Scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings)
  bpy.types.Scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenErrorToleranceEx)
  bpy.types.Scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonInvertOutputMeshEx)
  bpy.types.Scene.Simplygon_852cbc0242e6426384469367acd6bcee_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonTransferSkinningEx)
  bpy.types.Scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonUseCamerasEx)
  bpy.types.Scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOcclusionModeEx)
  bpy.types.Scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings)
  bpy.types.Scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_5f598d91111541e699c2b3590e552a04_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_ef6392cf02d84573873d291f596635d1_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonBakeOpacityInAlphaEx)
  bpy.types.Scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonSkipCastingIfNoInputChannelEx)
  bpy.types.Scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings)
  bpy.types.Scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_2eba209bd6744911828239591d075051_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_750ea9fe93504c7889835054f86bc403_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings)
  bpy.types.Scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_b446005bd59646ef9b07085e343f7629_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipBackfacingNormalsEx)
  bpy.types.Scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_2e468c62b68742658522172a787ecca2_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_5641a916238246e6884963697f07d6db_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonGenerateTangentSpaceNormalsEx)
  bpy.types.Scene.Simplygon_a3b91946c5884085924f0fae0df74683_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipGreenEx)
  bpy.types.Scene.Simplygon_16e84318c4c04024820f060501189ba2_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonCalculateBitangentPerFragmentEx)
  bpy.types.Scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonNormalizeInterpolatedTangentSpaceEx)
  bpy.types.Scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings)
  bpy.types.Scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_d7727e81048549f894080372f931ac96_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDistanceScalingEx)
  bpy.types.Scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateScalarDisplacementEx)
  bpy.types.Scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateTangentSpaceDisplacementEx)
  bpy.types.Scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonNormalMapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings)
  bpy.types.Scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonRaysPerPixelEx)
  bpy.types.Scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionFalloffEx)
  bpy.types.Scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_6cdca5f6469e463d95037cb001220277_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionMultiplierEx)
  bpy.types.Scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseSimpleOcclusionModeEx)
  bpy.types.Scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings)
  bpy.types.Scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldTypeEx)
  bpy.types.Scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_680e680b76eb46348189d88044f88179_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldIndexEx)
  bpy.types.Scene.Simplygon_f597403a1e294008b14304fa5f49410e_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingLayerIndexEx)
  bpy.types.Scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfREx)
  bpy.types.Scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupREx)
  bpy.types.Scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfGEx)
  bpy.types.Scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupGEx)
  bpy.types.Scene.Simplygon_cc2262d978da416bb31c58d845054b89_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfBEx)
  bpy.types.Scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupBEx)
  bpy.types.Scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfAEx)
  bpy.types.Scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupAEx)
  bpy.types.Scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings)
  bpy.types.Scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorLevelEx)
  bpy.types.Scene.Simplygon_2bd3c340f61942769533317960ac457a_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorNameEx)
  bpy.types.Scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonColorSpaceEdgeThresholdEx)

  simplygon_icon_enabled = bpy.utils.previews.new()
  simplygon_icon_enabled.load('simplygon_process_enabled', os.path.join(os.path.dirname(__file__), 'simplygon_process_enabled.png'), 'IMAGE')
  simplygon_icons.append(simplygon_icon_enabled)

  bpy.types.TEXT_MT_templates.append(simplygon_template_menu_draw)

def unregister():
  bpy.context.scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List.clear()
  del bpy.types.Scene.Simplygon_16cc203d7b604535a1d198d1af949cc5_List
  bpy.context.scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List.clear()
  del bpy.types.Scene.Simplygon_c2363f264088414da2ee3d6c6aba9483_List
  bpy.context.scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List.clear()
  del bpy.types.Scene.Simplygon_de75034101fe4ca09e6f5975ae8abac4_List
  bpy.context.scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List.clear()
  del bpy.types.Scene.Simplygon_f5d8b05160064e52a38115d73277b0e8_List
  bpy.context.scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List.clear()
  del bpy.types.Scene.Simplygon_a5cea39aad694fb4831e311b119baa31_List
  bpy.context.scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List.clear()
  del bpy.types.Scene.Simplygon_fbea652b2c7c41f79d36182f93a13d41_List
  bpy.context.scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List.clear()
  del bpy.types.Scene.Simplygon_363d17cce62841da8964b9c3f280dc46_List
  bpy.context.scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List.clear()
  del bpy.types.Scene.Simplygon_034849ebc3434bb0afea9040307a8f48_List
  bpy.context.scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List.clear()
  del bpy.types.Scene.Simplygon_9e8d6eb86bc345be8ee381500b69b2a3_List
  bpy.context.scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List.clear()
  del bpy.types.Scene.Simplygon_f228d34025f74ee796d95afab3944ce2_List
  bpy.context.scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List.clear()
  del bpy.types.Scene.Simplygon_c10364a1b84043fc98ff48ad052ecf98_List
  bpy.context.scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List.clear()
  del bpy.types.Scene.Simplygon_0286a7c535ac4cbbb7cfaef9949cb6ec_List
  bpy.context.scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List.clear()
  del bpy.types.Scene.Simplygon_320853f9932e4e04b697c93dd2122de7_List
  bpy.context.scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List.clear()
  del bpy.types.Scene.Simplygon_e39cf4aaa0fa494f8f6bc74f33f214b5_List
  bpy.context.scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List.clear()
  del bpy.types.Scene.Simplygon_ee1d5fe2e09e4225bb97f83bfbb3f0d7_List
  bpy.context.scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List.clear()
  del bpy.types.Scene.Simplygon_5a75c6a3b1514edaa0293f0a7626f7ea_List
  bpy.context.scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List.clear()
  del bpy.types.Scene.Simplygon_afe65b0b3e3b45a28764e3d5082d748c_List
  bpy.context.scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List.clear()
  del bpy.types.Scene.Simplygon_eedd4f699efa4c4dab60bb6eb2842ee3_List
  bpy.context.scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List.clear()
  del bpy.types.Scene.Simplygon_c36b3c13ea024c3a97ecd1ed83ecaca0_List
  bpy.context.scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List.clear()
  del bpy.types.Scene.Simplygon_507ec99f1b0842fcbc0912ae16557b13_List
  bpy.context.scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List.clear()
  del bpy.types.Scene.Simplygon_a11e784215724fd8be5a5af5eeaa956e_List
  bpy.context.scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List.clear()
  del bpy.types.Scene.Simplygon_358735f6e28c49b99ec8c177cd05f5b8_List
  bpy.context.scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List.clear()
  del bpy.types.Scene.Simplygon_32ba61fe29e94389ac4bf293949c438e_List
  bpy.context.scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List.clear()
  del bpy.types.Scene.Simplygon_0637205de12b4d89a0306411a9aa369d_List
  bpy.context.scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List.clear()
  del bpy.types.Scene.Simplygon_b012426509fe4f4bb7fc15179ddc42d6_List
  bpy.context.scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List.clear()
  del bpy.types.Scene.Simplygon_6604f83870e846f7a63df8238aae2e5e_List
  bpy.context.scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List.clear()
  del bpy.types.Scene.Simplygon_d12294ae58d24b4f9dba452f4a2e915a_List
  bpy.context.scene.Simplygon_399ad70b72084a0ba283494b89339595_List.clear()
  del bpy.types.Scene.Simplygon_399ad70b72084a0ba283494b89339595_List
  bpy.context.scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List.clear()
  del bpy.types.Scene.Simplygon_fa804f15ef2a486c8f8f7095ce26efb3_List
  bpy.context.scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List.clear()
  del bpy.types.Scene.Simplygon_c0ba3865a09949cd89b56b532c67529a_List
  bpy.context.scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List.clear()
  del bpy.types.Scene.Simplygon_e2f86ce9c44547a1bc52024a7927e5c4_List
  bpy.context.scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List.clear()
  del bpy.types.Scene.Simplygon_6880ff7fd6464f10872fcd547ede17ac_List
  bpy.context.scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List.clear()
  del bpy.types.Scene.Simplygon_c7425e90df1c42509d9b1a7f69cfb298_List
  bpy.context.scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List.clear()
  del bpy.types.Scene.Simplygon_a4fc0a60ae844be2b4a163d4602c9cb7_List
  bpy.context.scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List.clear()
  del bpy.types.Scene.Simplygon_394fb1cb864a4974970e29ec952d49fe_List
  bpy.context.scene.Simplygon_046834f72823480c8774aa392854f44a_List.clear()
  del bpy.types.Scene.Simplygon_046834f72823480c8774aa392854f44a_List
  bpy.context.scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List.clear()
  del bpy.types.Scene.Simplygon_f4e8ad708c1c4642bf98b9c2d00175cf_List
  bpy.context.scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List.clear()
  del bpy.types.Scene.Simplygon_b5762a55ce9e40dd8891cc678ad57339_List
  bpy.context.scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List.clear()
  del bpy.types.Scene.Simplygon_d157e8791e2d49e1a87e7db00762cc01_List
  bpy.context.scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List.clear()
  del bpy.types.Scene.Simplygon_97a9360aee734ed4a365903aa8ce8f59_List
  bpy.context.scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List.clear()
  del bpy.types.Scene.Simplygon_1a7c8daeb4b242af9eff91db2100e00d_List
  bpy.context.scene.Simplygon_99453894002e4379ad99ca409d3abd16_List.clear()
  del bpy.types.Scene.Simplygon_99453894002e4379ad99ca409d3abd16_List
  bpy.context.scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List.clear()
  del bpy.types.Scene.Simplygon_83d2a0ac3a4e41398963b3e2d35474d4_List
  bpy.context.scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List.clear()
  del bpy.types.Scene.Simplygon_04daae375699429993e35bc5f5cb78e2_List
  bpy.context.scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List.clear()
  del bpy.types.Scene.Simplygon_4be67d80f862495482dd48fb827d1f6f_List
  bpy.context.scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List.clear()
  del bpy.types.Scene.Simplygon_7d28a063fda145fea766679f46d03f1e_List
  bpy.context.scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List.clear()
  del bpy.types.Scene.Simplygon_e0d75ad858a144f2ae8baee405556ab3_List
  bpy.context.scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List.clear()
  del bpy.types.Scene.Simplygon_8758502d8e7840e2adee8b9622b99271_List
  bpy.context.scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List.clear()
  del bpy.types.Scene.Simplygon_d82c1aa9368a40b6b3c4f304ba152cc8_List
  bpy.context.scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List.clear()
  del bpy.types.Scene.Simplygon_3fa7527189e14ca9a00d2794a6b9bc6e_List
  bpy.context.scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List.clear()
  del bpy.types.Scene.Simplygon_e78df2acb07a412fb6a1a1d7f7349bed_List
  bpy.context.scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List.clear()
  del bpy.types.Scene.Simplygon_06c6b34d4a8b49caa9dbb3b9aba7005b_List
  bpy.context.scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List.clear()
  del bpy.types.Scene.Simplygon_00aa0a7f633443a0a2e9fb40d3bc68ca_List
  bpy.context.scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List.clear()
  del bpy.types.Scene.Simplygon_5a2762f46d774b6eb8673c555bbd0298_List
  bpy.context.scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List.clear()
  del bpy.types.Scene.Simplygon_58fb6773646b42cc8a690a7a5697d94d_List
  bpy.context.scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List.clear()
  del bpy.types.Scene.Simplygon_445db361cc47445c8dd1ac9695e5e4f6_List
  bpy.context.scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List.clear()
  del bpy.types.Scene.Simplygon_5bd4d5e36065408dbc43498e23d8a23d_List
  bpy.context.scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List.clear()
  del bpy.types.Scene.Simplygon_b8ffe550218747669b69604d14ba6fdf_List
  bpy.context.scene.Simplygon_27301c22f35e4fd5867d443de295a812_List.clear()
  del bpy.types.Scene.Simplygon_27301c22f35e4fd5867d443de295a812_List
  bpy.context.scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List.clear()
  del bpy.types.Scene.Simplygon_5165b7ec7de14c56b3a598ee7619eaa1_List
  bpy.context.scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List.clear()
  del bpy.types.Scene.Simplygon_4b0b9f00eb6145e09ed40c1a1673a0d0_List
  bpy.context.scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List.clear()
  del bpy.types.Scene.Simplygon_1982e4fa4a564d9d8808dc39327796ae_List
  bpy.context.scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List.clear()
  del bpy.types.Scene.Simplygon_e28f839cc69248019eab9931fcb3ba84_List
  bpy.context.scene.Simplygon_d60577f2e751433797ba1a004653f693_List.clear()
  del bpy.types.Scene.Simplygon_d60577f2e751433797ba1a004653f693_List
  bpy.context.scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List.clear()
  del bpy.types.Scene.Simplygon_0ceb052b9a754862ab9f520bd0d0bbe6_List
  bpy.context.scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List.clear()
  del bpy.types.Scene.Simplygon_f6b58ae209b24119a73db2be947832b9_List
  bpy.context.scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List.clear()
  del bpy.types.Scene.Simplygon_a953f197d7b84f9e9cb687d7c1a0816b_List
  bpy.context.scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List.clear()
  del bpy.types.Scene.Simplygon_2909312aa8204911b735142f28c4ddd3_List
  bpy.context.scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List.clear()
  del bpy.types.Scene.Simplygon_c9c3b8d2abdc4404a3f255f0b2f8013e_List
  bpy.context.scene.Simplygon_637baeff25624d258b83833d40b9aac6_List.clear()
  del bpy.types.Scene.Simplygon_637baeff25624d258b83833d40b9aac6_List
  bpy.context.scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List.clear()
  del bpy.types.Scene.Simplygon_c4f8940ae9824ea88809e1543ae4e5ef_List
  bpy.context.scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List.clear()
  del bpy.types.Scene.Simplygon_72044dbe1a834d779d556fc9eb0fc55f_List
  bpy.context.scene.Simplygon_b44381d030f84776822f1640f4449eea_List.clear()
  del bpy.types.Scene.Simplygon_b44381d030f84776822f1640f4449eea_List
  bpy.context.scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List.clear()
  del bpy.types.Scene.Simplygon_9e2526f5fd404bf4a48a0594d1d48671_List
  bpy.context.scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List.clear()
  del bpy.types.Scene.Simplygon_f4aa2ff7eeb546e286cec3b853eb23cd_List
  bpy.context.scene.Simplygon_555cde1e90be4f748d058543daa7721d_List.clear()
  del bpy.types.Scene.Simplygon_555cde1e90be4f748d058543daa7721d_List
  bpy.context.scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List.clear()
  del bpy.types.Scene.Simplygon_ee5d462a07bb4cdfb8b7f817aa8ed014_List
  bpy.context.scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List.clear()
  del bpy.types.Scene.Simplygon_f1cfb2c7f73a4c2cb349829f9ea2e4ff_List
  bpy.context.scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List.clear()
  del bpy.types.Scene.Simplygon_a9d9fca596ba4c4db942748884772cb6_List
  bpy.context.scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List.clear()
  del bpy.types.Scene.Simplygon_e1ffb7ce47c946018509aff55fc462ed_List
  bpy.context.scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List.clear()
  del bpy.types.Scene.Simplygon_00a421c415ed4afc8be5e7011e6af46c_List
  bpy.context.scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List.clear()
  del bpy.types.Scene.Simplygon_54c74dff38ba495fb1797c3ee70078fd_List
  bpy.context.scene.Simplygon_9eb86501b52f469997d0d345bd498245_List.clear()
  del bpy.types.Scene.Simplygon_9eb86501b52f469997d0d345bd498245_List
  bpy.context.scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List.clear()
  del bpy.types.Scene.Simplygon_99db37b82f0a412b90f7e961a3398a31_List
  bpy.context.scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List.clear()
  del bpy.types.Scene.Simplygon_6d8bd3d5a4d9495dac197bde34dd9672_List
  bpy.context.scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List.clear()
  del bpy.types.Scene.Simplygon_9bc5bf0adc5a4688bf6599c2e9bf3ff9_List
  bpy.context.scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List.clear()
  del bpy.types.Scene.Simplygon_4e4ceece3b87493f8131993904feae7b_List
  bpy.context.scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List.clear()
  del bpy.types.Scene.Simplygon_46e14d019ee14f76ab1ecfa5ac977f03_List
  bpy.context.scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List.clear()
  del bpy.types.Scene.Simplygon_86a5057f9fa4472da49a0486d1c6cd14_List
  bpy.context.scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List.clear()
  del bpy.types.Scene.Simplygon_705589b68e8b4c33b432c6240c7627d3_List
  bpy.context.scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List.clear()
  del bpy.types.Scene.Simplygon_b375733abcd84d04abbc6aba26a67152_List
  bpy.context.scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List.clear()
  del bpy.types.Scene.Simplygon_dfa1329b6c76406bb59c013912c39439_List
  bpy.context.scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List.clear()
  del bpy.types.Scene.Simplygon_7ea77d975d8d4ee792237ee6dd6d75e1_List
  bpy.context.scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List.clear()
  del bpy.types.Scene.Simplygon_7d24eceea53b474d90a84e1814606ffb_List
  bpy.context.scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List.clear()
  del bpy.types.Scene.Simplygon_ab13ce1e70e84bd58af4582c822ad20f_List
  bpy.context.scene.Simplygon_40544e72469549f1a19fb903f511ff07_List.clear()
  del bpy.types.Scene.Simplygon_40544e72469549f1a19fb903f511ff07_List
  bpy.context.scene.Simplygon_c2921f9d00254670b4901277253ab770_List.clear()
  del bpy.types.Scene.Simplygon_c2921f9d00254670b4901277253ab770_List
  bpy.context.scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List.clear()
  del bpy.types.Scene.Simplygon_fac8b93562c2470d8f2d4da9d5931818_List
  bpy.context.scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List.clear()
  del bpy.types.Scene.Simplygon_86124beb089548aebf7e6e2a7fe977e2_List
  bpy.context.scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List.clear()
  del bpy.types.Scene.Simplygon_5eeaf6e87d804e99bccb0586aeda1e34_List
  bpy.context.scene.Simplygon_c567f592c30d410b8090d63439128e69_List.clear()
  del bpy.types.Scene.Simplygon_c567f592c30d410b8090d63439128e69_List
  bpy.context.scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List.clear()
  del bpy.types.Scene.Simplygon_e9a4c30b29664a388dd45af8e71159aa_List
  bpy.context.scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List.clear()
  del bpy.types.Scene.Simplygon_c7f4f0e4ac8f4b6da71260202edaa5aa_List
  bpy.context.scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List.clear()
  del bpy.types.Scene.Simplygon_4cf2ff2831284921b19c526b470970ca_List
  bpy.context.scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List.clear()
  del bpy.types.Scene.Simplygon_ca45943eb13940019f9dee1a1de630cf_List
  bpy.context.scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List.clear()
  del bpy.types.Scene.Simplygon_0a618d5bbf0946f8bd72aaed9ff022af_List
  bpy.context.scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List.clear()
  del bpy.types.Scene.Simplygon_37cfd7c713454464b85a894683b9fda3_List
  bpy.context.scene.Simplygon_76374f1f1a374735a19650945967cc1e_List.clear()
  del bpy.types.Scene.Simplygon_76374f1f1a374735a19650945967cc1e_List
  bpy.context.scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List.clear()
  del bpy.types.Scene.Simplygon_09900ee117c24616aaac92c3f5247fc4_List
  bpy.context.scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List.clear()
  del bpy.types.Scene.Simplygon_432c5d75e8fa44dc932ead83a5e41c0f_List
  bpy.context.scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List.clear()
  del bpy.types.Scene.Simplygon_e041dbe7382240fc89c9a6f1d5892c6f_List
  bpy.context.scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List.clear()
  del bpy.types.Scene.Simplygon_caa21aa0bd0245c2996d70c1417c6c14_List
  bpy.context.scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List.clear()
  del bpy.types.Scene.Simplygon_b58ed99194834407b24acf8ea5c59f0c_List
  bpy.context.scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List.clear()
  del bpy.types.Scene.Simplygon_e89c79d5391f4ed18627ab53ae6d4548_List
  bpy.context.scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List.clear()
  del bpy.types.Scene.Simplygon_bbd852763907453ab48bf1621e3f6923_List
  bpy.context.scene.Simplygon_d19177ac776141748533afcd77e12a32_List.clear()
  del bpy.types.Scene.Simplygon_d19177ac776141748533afcd77e12a32_List
  bpy.context.scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List.clear()
  del bpy.types.Scene.Simplygon_d552fbb67a3e477e961edf03d862e109_List
  bpy.context.scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List.clear()
  del bpy.types.Scene.Simplygon_dc60b8716c3546d4ac29e717e117f0f0_List
  bpy.context.scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List.clear()
  del bpy.types.Scene.Simplygon_b91a3bcc41ad4671a9a6f0113d35764c_List
  bpy.context.scene.Simplygon_dda781686289442fae1905da06e02338_List.clear()
  del bpy.types.Scene.Simplygon_dda781686289442fae1905da06e02338_List
  bpy.context.scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List.clear()
  del bpy.types.Scene.Simplygon_1719472c6c584ed898f1957e34a0a0bf_List
  bpy.context.scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List.clear()
  del bpy.types.Scene.Simplygon_08e9020431c34f6ca022db4b60a71938_List
  bpy.context.scene.Simplygon_1ff2063927e742999f00efa63da701ec_List.clear()
  del bpy.types.Scene.Simplygon_1ff2063927e742999f00efa63da701ec_List
  bpy.context.scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List.clear()
  del bpy.types.Scene.Simplygon_dee08d5e1eac4d9bad85d8329e16da3b_List
  bpy.context.scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List.clear()
  del bpy.types.Scene.Simplygon_38d56ec54eb649c7a9b358e2d55422b2_List
  bpy.context.scene.Simplygon_ed616a49a5064d54866518c49339ec10_List.clear()
  del bpy.types.Scene.Simplygon_ed616a49a5064d54866518c49339ec10_List
  bpy.context.scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List.clear()
  del bpy.types.Scene.Simplygon_7c685a859ecf427f8c446fe7e09286df_List
  bpy.context.scene.Simplygon_230199b789854dab988313139710204f_List.clear()
  del bpy.types.Scene.Simplygon_230199b789854dab988313139710204f_List
  bpy.context.scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List.clear()
  del bpy.types.Scene.Simplygon_658385411b3a4ff5914c613d663dbed1_List
  bpy.context.scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List.clear()
  del bpy.types.Scene.Simplygon_a6ff76d1866a4ae786cffcb2b3ae9d97_List
  bpy.context.scene.Simplygon_a558cb225f76424a92ed27135d98544e_List.clear()
  del bpy.types.Scene.Simplygon_a558cb225f76424a92ed27135d98544e_List
  bpy.context.scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List.clear()
  del bpy.types.Scene.Simplygon_4fe6e788a4e546d9bbf79bae69a6ee8a_List
  bpy.context.scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List.clear()
  del bpy.types.Scene.Simplygon_ad28d1181a0c4f1e848ba43f3dfc2776_List
  bpy.context.scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List.clear()
  del bpy.types.Scene.Simplygon_16f82a7fc08741978576cc361d6f0170_List
  bpy.context.scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List.clear()
  del bpy.types.Scene.Simplygon_941cd0dcb4df426998b399b84b8906df_List
  bpy.context.scene.Simplygon_7c917299739d41a5a5b03785fa627372_List.clear()
  del bpy.types.Scene.Simplygon_7c917299739d41a5a5b03785fa627372_List
  bpy.context.scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List.clear()
  del bpy.types.Scene.Simplygon_bb01f1e1e4f24718a085d63f94ad27d3_List
  bpy.context.scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List.clear()
  del bpy.types.Scene.Simplygon_bb8771549cc94903965b5e576eb8f386_List
  bpy.context.scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List.clear()
  del bpy.types.Scene.Simplygon_92418bd57c764c308359f42722bdd9bc_List
  bpy.context.scene.Simplygon_08224212c6074351b196304affd2add7_List.clear()
  del bpy.types.Scene.Simplygon_08224212c6074351b196304affd2add7_List
  bpy.context.scene.Simplygon_549594188ac14670b53a153dd45d68a9_List.clear()
  del bpy.types.Scene.Simplygon_549594188ac14670b53a153dd45d68a9_List
  bpy.context.scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List.clear()
  del bpy.types.Scene.Simplygon_f59707ad53634df3a10c9056dbc16248_List
  bpy.context.scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List.clear()
  del bpy.types.Scene.Simplygon_0db79d800ecb40b8835018255c482d6d_List
  bpy.context.scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List.clear()
  del bpy.types.Scene.Simplygon_1061ea7b141d40fc8ecdab1cb294c8b0_List
  bpy.context.scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List.clear()
  del bpy.types.Scene.Simplygon_0f1ee8ca86214a618372f5dea40d8e98_List
  bpy.context.scene.Simplygon_2279f4159bac464abe7f8300db103059_List.clear()
  del bpy.types.Scene.Simplygon_2279f4159bac464abe7f8300db103059_List
  bpy.context.scene.Simplygon_255681b15e964ce3b25e78c261206045_List.clear()
  del bpy.types.Scene.Simplygon_255681b15e964ce3b25e78c261206045_List
  bpy.context.scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List.clear()
  del bpy.types.Scene.Simplygon_a479e79bdeb84afd91f87b3af02bae83_List
  bpy.context.scene.Simplygon_25acb7f2bead4f76892646160d202188_List.clear()
  del bpy.types.Scene.Simplygon_25acb7f2bead4f76892646160d202188_List
  bpy.context.scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List.clear()
  del bpy.types.Scene.Simplygon_9a4420b882a4433fb62e814b49f21c5d_List
  bpy.context.scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List.clear()
  del bpy.types.Scene.Simplygon_7a1896aff4104e23b7a47232d344d44b_List
  bpy.context.scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List.clear()
  del bpy.types.Scene.Simplygon_3c39b28fb898490bb38dea1e38dbf8b4_List
  bpy.context.scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List.clear()
  del bpy.types.Scene.Simplygon_44d0dab46ba4449fb144f210193b48c9_List
  bpy.context.scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List.clear()
  del bpy.types.Scene.Simplygon_ca136b5eef9543b39540c9037d5990b5_List
  bpy.context.scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List.clear()
  del bpy.types.Scene.Simplygon_86f71e3fcbdc4c6580754e32bc07b8b3_List
  bpy.context.scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List.clear()
  del bpy.types.Scene.Simplygon_017e7f0b86d74307af3173e0889df5ff_List
  bpy.context.scene.Simplygon_3a47cdfb83224c178978e71963e78139_List.clear()
  del bpy.types.Scene.Simplygon_3a47cdfb83224c178978e71963e78139_List
  bpy.context.scene.Simplygon_b034267a7423494e89330be254ec2e3c_List.clear()
  del bpy.types.Scene.Simplygon_b034267a7423494e89330be254ec2e3c_List
  bpy.context.scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List.clear()
  del bpy.types.Scene.Simplygon_0ff80670c7bc43b3abb1909fe9d424dd_List
  bpy.context.scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List.clear()
  del bpy.types.Scene.Simplygon_f7c0414aba9b40cf9338247c788a027e_List
  bpy.context.scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List.clear()
  del bpy.types.Scene.Simplygon_c4370eb6e54c447f9f1146e33c54f699_List
  bpy.context.scene.Simplygon_06ec4a1133934c43802057141e35f31c_List.clear()
  del bpy.types.Scene.Simplygon_06ec4a1133934c43802057141e35f31c_List
  bpy.context.scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List.clear()
  del bpy.types.Scene.Simplygon_0634bb7439c04104bd832c7f7cdf5246_List
  bpy.context.scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List.clear()
  del bpy.types.Scene.Simplygon_4f27e46c87a54e2e95eef936792d2708_List
  bpy.context.scene.Simplygon_b0a39d2326034d9396e47f011f217938_List.clear()
  del bpy.types.Scene.Simplygon_b0a39d2326034d9396e47f011f217938_List
  bpy.context.scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List.clear()
  del bpy.types.Scene.Simplygon_4520412933a7458a9ac3983f4035c17d_List
  bpy.context.scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List.clear()
  del bpy.types.Scene.Simplygon_a2c6076f6e024a879b5428186ecd1072_List
  bpy.context.scene.Simplygon_0b930377c55741f985ae449ed7287e73_List.clear()
  del bpy.types.Scene.Simplygon_0b930377c55741f985ae449ed7287e73_List
  bpy.context.scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List.clear()
  del bpy.types.Scene.Simplygon_443ee5844fd240c6868037a8c08b0ede_List
  bpy.context.scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List.clear()
  del bpy.types.Scene.Simplygon_4d5ab1b798fe41ff85471f6e4482fb07_List
  bpy.context.scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List.clear()
  del bpy.types.Scene.Simplygon_4e7f52efce3447f4ab7963b15056f28b_List
  bpy.context.scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List.clear()
  del bpy.types.Scene.Simplygon_ff729bbb41b349a1abe96a7832d28551_List
  bpy.context.scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List.clear()
  del bpy.types.Scene.Simplygon_4f179be8e474461f8fcb37254440e7a8_List
  bpy.context.scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List.clear()
  del bpy.types.Scene.Simplygon_9b190ce34b6e474fb73c1e19e7feee40_List
  bpy.context.scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List.clear()
  del bpy.types.Scene.Simplygon_aa57e7fba44b41fca9ee71c793c1d6e9_List
  bpy.context.scene.Simplygon_578dab21b5a94ac29220204001dc066c_List.clear()
  del bpy.types.Scene.Simplygon_578dab21b5a94ac29220204001dc066c_List
  bpy.context.scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List.clear()
  del bpy.types.Scene.Simplygon_64d8c42482ae4c21b60599bba5261282_List
  bpy.context.scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List.clear()
  del bpy.types.Scene.Simplygon_07567595054645aa9ea76c1ba38df53c_List
  bpy.context.scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List.clear()
  del bpy.types.Scene.Simplygon_17f5613ae5b54f5fa9c384a736574ea9_List
  bpy.context.scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List.clear()
  del bpy.types.Scene.Simplygon_6911a586a631485eb7fa5f5d1b55a168_List
  bpy.context.scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List.clear()
  del bpy.types.Scene.Simplygon_efe03be47f44498c911169f5fb20ddbc_List
  bpy.context.scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List.clear()
  del bpy.types.Scene.Simplygon_49cf40b49ef04e80a6ac1e8b9ac6b6b5_List
  bpy.context.scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List.clear()
  del bpy.types.Scene.Simplygon_58d35866bc08451f8863c4b62caf7a46_List
  bpy.context.scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List.clear()
  del bpy.types.Scene.Simplygon_c5cba5d4a1444972859bea99ba023eaf_List
  bpy.context.scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List.clear()
  del bpy.types.Scene.Simplygon_b3eb7b37875c4136a91ef7766ee10b69_List
  bpy.context.scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List.clear()
  del bpy.types.Scene.Simplygon_477fd12e7a724d428bd7e1b361ee0b6c_List
  bpy.context.scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List.clear()
  del bpy.types.Scene.Simplygon_e6c26b3aeb9f4797ad6dca55752ba1ab_List
  bpy.context.scene.Simplygon_51968e193594429e89c8344b75323858_List.clear()
  del bpy.types.Scene.Simplygon_51968e193594429e89c8344b75323858_List
  bpy.context.scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List.clear()
  del bpy.types.Scene.Simplygon_f07415d3719a471a82a641c6aa0512e6_List
  bpy.context.scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List.clear()
  del bpy.types.Scene.Simplygon_6d17b8dc962e4178ac5398dc500211bd_List
  bpy.context.scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List.clear()
  del bpy.types.Scene.Simplygon_5f7fef7931094305a2dee59a03b17974_List
  bpy.context.scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List.clear()
  del bpy.types.Scene.Simplygon_89fe82ca18f243c5bb73c656ccd7e707_List
  bpy.context.scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List.clear()
  del bpy.types.Scene.Simplygon_9a8f14a1114d402dbac967915afaac81_List
  bpy.context.scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List.clear()
  del bpy.types.Scene.Simplygon_1b3501b2eee74ef9a139ba4398e097ac_List
  bpy.context.scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List.clear()
  del bpy.types.Scene.Simplygon_75d272e87e8342f785b9aa0e36feb24a_List
  bpy.context.scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List.clear()
  del bpy.types.Scene.Simplygon_8f8be505b59c4d8282826e1450a4724f_List
  bpy.context.scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List.clear()
  del bpy.types.Scene.Simplygon_5f17387a11aa4e63a577bde7d98bc0f8_List
  bpy.context.scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List.clear()
  del bpy.types.Scene.Simplygon_d3f4ac328ec64a489e7de4058a0b60ba_List
  bpy.context.scene.Simplygon_21f55e352fc1422196667e88aca0af72_List.clear()
  del bpy.types.Scene.Simplygon_21f55e352fc1422196667e88aca0af72_List
  bpy.context.scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List.clear()
  del bpy.types.Scene.Simplygon_b0ff171563874730bf177a61c9437d4e_List
  bpy.context.scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List.clear()
  del bpy.types.Scene.Simplygon_3e669f904a97403d81778bb31fe908fb_List
  bpy.context.scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List.clear()
  del bpy.types.Scene.Simplygon_c02f22b1dbb44a299cb33b4643647488_List
  bpy.context.scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List.clear()
  del bpy.types.Scene.Simplygon_c4b1c00742e04f53818d468e029fc056_List
  bpy.context.scene.Simplygon_852cbc0242e6426384469367acd6bcee_List.clear()
  del bpy.types.Scene.Simplygon_852cbc0242e6426384469367acd6bcee_List
  bpy.context.scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List.clear()
  del bpy.types.Scene.Simplygon_b57f2275bf35444aae9677389a6ccffe_List
  bpy.context.scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List.clear()
  del bpy.types.Scene.Simplygon_bbb62a665e064a7ab15041784c98da9c_List
  bpy.context.scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List.clear()
  del bpy.types.Scene.Simplygon_aac695c2e1624017a7c97b48cd5559c4_List
  bpy.context.scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List.clear()
  del bpy.types.Scene.Simplygon_d568e7a5d6504feda950e30aadb02cf1_List
  bpy.context.scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List.clear()
  del bpy.types.Scene.Simplygon_d1086a8400d64349a6f2c790ef2384b9_List
  bpy.context.scene.Simplygon_5f598d91111541e699c2b3590e552a04_List.clear()
  del bpy.types.Scene.Simplygon_5f598d91111541e699c2b3590e552a04_List
  bpy.context.scene.Simplygon_ef6392cf02d84573873d291f596635d1_List.clear()
  del bpy.types.Scene.Simplygon_ef6392cf02d84573873d291f596635d1_List
  bpy.context.scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List.clear()
  del bpy.types.Scene.Simplygon_31a352c9e8da4bc4bd9e6def70fac77b_List
  bpy.context.scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List.clear()
  del bpy.types.Scene.Simplygon_d66828bee31649da8b4823f68b61e4d6_List
  bpy.context.scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List.clear()
  del bpy.types.Scene.Simplygon_8a0451ed138442f397ea1eea25a1892e_List
  bpy.context.scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List.clear()
  del bpy.types.Scene.Simplygon_447cf006f8a44edcb113c8e200b8e4e6_List
  bpy.context.scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List.clear()
  del bpy.types.Scene.Simplygon_c4161b75bb034f3d904332db461c78e9_List
  bpy.context.scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List.clear()
  del bpy.types.Scene.Simplygon_e430c08336af49b9a632ae5161fcde01_List
  bpy.context.scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List.clear()
  del bpy.types.Scene.Simplygon_c948b81d053143ec9195e617b4ab82ba_List
  bpy.context.scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List.clear()
  del bpy.types.Scene.Simplygon_f7d65105cdda40b191aa1268cbd346b8_List
  bpy.context.scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List.clear()
  del bpy.types.Scene.Simplygon_c60da6ffba26481fa58d783bca08b647_List
  bpy.context.scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List.clear()
  del bpy.types.Scene.Simplygon_93bd72a1a0d945aab22e88f49454148b_List
  bpy.context.scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List.clear()
  del bpy.types.Scene.Simplygon_f1c593e6c4b44cb1b2ae7541608b185f_List
  bpy.context.scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List.clear()
  del bpy.types.Scene.Simplygon_a88ea218fd5a456dbea6e87fc669ad77_List
  bpy.context.scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List.clear()
  del bpy.types.Scene.Simplygon_d4a8e77f438b4639abfbb242c52a5f64_List
  bpy.context.scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List.clear()
  del bpy.types.Scene.Simplygon_d8abb3c5b69b465aac97a7c2b7fb9269_List
  bpy.context.scene.Simplygon_2eba209bd6744911828239591d075051_List.clear()
  del bpy.types.Scene.Simplygon_2eba209bd6744911828239591d075051_List
  bpy.context.scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List.clear()
  del bpy.types.Scene.Simplygon_2ef1b893915e45f1aa5a04d36d29b446_List
  bpy.context.scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List.clear()
  del bpy.types.Scene.Simplygon_212be4c2a81f4961a9ad6a386a0cec6e_List
  bpy.context.scene.Simplygon_750ea9fe93504c7889835054f86bc403_List.clear()
  del bpy.types.Scene.Simplygon_750ea9fe93504c7889835054f86bc403_List
  bpy.context.scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List.clear()
  del bpy.types.Scene.Simplygon_4fda119f1d5249898aace1f2bbf09912_List
  bpy.context.scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List.clear()
  del bpy.types.Scene.Simplygon_2a2dbe734e4945e6b9257e04cafac4ec_List
  bpy.context.scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List.clear()
  del bpy.types.Scene.Simplygon_fa1172ecda1d4975a01578a7a6a20ff1_List
  bpy.context.scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List.clear()
  del bpy.types.Scene.Simplygon_269d94dd4a9d491abfdc3b3e849daa34_List
  bpy.context.scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List.clear()
  del bpy.types.Scene.Simplygon_98f31a5724b94cb5a299ebf81a18f9b8_List
  bpy.context.scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List.clear()
  del bpy.types.Scene.Simplygon_3087f9f830e247bfabe0e6b34ee18430_List
  bpy.context.scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List.clear()
  del bpy.types.Scene.Simplygon_d27d3157c13640bd9dba9f6edb622252_List
  bpy.context.scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List.clear()
  del bpy.types.Scene.Simplygon_a5f18d9b8422497fa2efbb05eef7c5df_List
  bpy.context.scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List.clear()
  del bpy.types.Scene.Simplygon_92f735ad12744525a4e2206dd81932f4_List
  bpy.context.scene.Simplygon_b446005bd59646ef9b07085e343f7629_List.clear()
  del bpy.types.Scene.Simplygon_b446005bd59646ef9b07085e343f7629_List
  bpy.context.scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List.clear()
  del bpy.types.Scene.Simplygon_071766e3edb14e3f8c9ff5d6b139cb7c_List
  bpy.context.scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List.clear()
  del bpy.types.Scene.Simplygon_76feb88d85f2459fb3f18d1d54a8ba66_List
  bpy.context.scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List.clear()
  del bpy.types.Scene.Simplygon_b2bbb28bc5944e80b6ac9a9aa978f1d5_List
  bpy.context.scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List.clear()
  del bpy.types.Scene.Simplygon_f78e932365b845e9a6c3ff5321587f09_List
  bpy.context.scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List.clear()
  del bpy.types.Scene.Simplygon_50cd9f96d61f4f35b489c41738d1f4d8_List
  bpy.context.scene.Simplygon_2e468c62b68742658522172a787ecca2_List.clear()
  del bpy.types.Scene.Simplygon_2e468c62b68742658522172a787ecca2_List
  bpy.context.scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List.clear()
  del bpy.types.Scene.Simplygon_3b2f68fb4da64163b4e4dc128161fbbe_List
  bpy.context.scene.Simplygon_5641a916238246e6884963697f07d6db_List.clear()
  del bpy.types.Scene.Simplygon_5641a916238246e6884963697f07d6db_List
  bpy.context.scene.Simplygon_a3b91946c5884085924f0fae0df74683_List.clear()
  del bpy.types.Scene.Simplygon_a3b91946c5884085924f0fae0df74683_List
  bpy.context.scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List.clear()
  del bpy.types.Scene.Simplygon_eae48b6d4cb34fb996d78afdf1669807_List
  bpy.context.scene.Simplygon_16e84318c4c04024820f060501189ba2_List.clear()
  del bpy.types.Scene.Simplygon_16e84318c4c04024820f060501189ba2_List
  bpy.context.scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List.clear()
  del bpy.types.Scene.Simplygon_e521820504194afda1e9abfd1a96cb7b_List
  bpy.context.scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List.clear()
  del bpy.types.Scene.Simplygon_483d7b9e8bc641a3908dcfdd7f030528_List
  bpy.context.scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List.clear()
  del bpy.types.Scene.Simplygon_c2c3bc868b4044df93c15dfead76e4b5_List
  bpy.context.scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List.clear()
  del bpy.types.Scene.Simplygon_9606a9332eff46e0897016b25a7b2014_List
  bpy.context.scene.Simplygon_d7727e81048549f894080372f931ac96_List.clear()
  del bpy.types.Scene.Simplygon_d7727e81048549f894080372f931ac96_List
  bpy.context.scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List.clear()
  del bpy.types.Scene.Simplygon_2e341aab64844f1493a6c10fa8c0d0a7_List
  bpy.context.scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List.clear()
  del bpy.types.Scene.Simplygon_bb0f3c90f06c49a8916c978e74462f48_List
  bpy.context.scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List.clear()
  del bpy.types.Scene.Simplygon_dbc0d302c36e4fa2af0551d04c80aa19_List
  bpy.context.scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List.clear()
  del bpy.types.Scene.Simplygon_ea981e04f8e0490e8acd7b113e4902b0_List
  bpy.context.scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List.clear()
  del bpy.types.Scene.Simplygon_378e10bb0319481ab1fcb39bb4bd78f9_List
  bpy.context.scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List.clear()
  del bpy.types.Scene.Simplygon_0126f2eb764f437c88f64b0b6dcdfe90_List
  bpy.context.scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List.clear()
  del bpy.types.Scene.Simplygon_08afc5aec15c4610947e70e1f5408980_List
  bpy.context.scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List.clear()
  del bpy.types.Scene.Simplygon_fb1d7906b00a4223949e0a14f977c01f_List
  bpy.context.scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List.clear()
  del bpy.types.Scene.Simplygon_1868e81639fa48348a30c14e2d6d1f9a_List
  bpy.context.scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List.clear()
  del bpy.types.Scene.Simplygon_473664bbb70b4d9c8b0339859f2aa230_List
  bpy.context.scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List.clear()
  del bpy.types.Scene.Simplygon_823753d35b5845c3bba2d452e4fc31cf_List
  bpy.context.scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List.clear()
  del bpy.types.Scene.Simplygon_4d076841ea134063bb3ae2823e8b53fc_List
  bpy.context.scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List.clear()
  del bpy.types.Scene.Simplygon_aff8ff80c172432d9d9df80189b2f056_List
  bpy.context.scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List.clear()
  del bpy.types.Scene.Simplygon_839a81c480ee40288e134ddb8f4ffd8b_List
  bpy.context.scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List.clear()
  del bpy.types.Scene.Simplygon_7c11f8d79e40497596c1cefee087d789_List
  bpy.context.scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List.clear()
  del bpy.types.Scene.Simplygon_ccdfdabf89da4c5d9642cff1f31d011f_List
  bpy.context.scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List.clear()
  del bpy.types.Scene.Simplygon_00dcd8e77c1c481d92f057d20ec1edfb_List
  bpy.context.scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List.clear()
  del bpy.types.Scene.Simplygon_cd38b6f3f2fe47ec8cffd71320a1a38c_List
  bpy.context.scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List.clear()
  del bpy.types.Scene.Simplygon_023c682390ff46f2b96456185b84b1c9_List
  bpy.context.scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List.clear()
  del bpy.types.Scene.Simplygon_d05da930bee64cb7ad2c46ca836c0436_List
  bpy.context.scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List.clear()
  del bpy.types.Scene.Simplygon_246abdeb88974ce78fc1c126da3c8123_List
  bpy.context.scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List.clear()
  del bpy.types.Scene.Simplygon_209bccaf26044d02aa575dd7b293ffb5_List
  bpy.context.scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List.clear()
  del bpy.types.Scene.Simplygon_1b3a850271de42bf8223e0a956af9665_List
  bpy.context.scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List.clear()
  del bpy.types.Scene.Simplygon_54b1c78332e44697aa69c13d7f7dabe1_List
  bpy.context.scene.Simplygon_6cdca5f6469e463d95037cb001220277_List.clear()
  del bpy.types.Scene.Simplygon_6cdca5f6469e463d95037cb001220277_List
  bpy.context.scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List.clear()
  del bpy.types.Scene.Simplygon_97f6d9ee67c546ec9cff5484f78dac69_List
  bpy.context.scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List.clear()
  del bpy.types.Scene.Simplygon_abfec87727d54605b61ba7e2a763bda9_List
  bpy.context.scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List.clear()
  del bpy.types.Scene.Simplygon_aec6b28c1cc84815af4a1cb75cd425e8_List
  bpy.context.scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List.clear()
  del bpy.types.Scene.Simplygon_3709a9e5d3b04728a1dbfbadbe0bf851_List
  bpy.context.scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List.clear()
  del bpy.types.Scene.Simplygon_ce8c977e64c844a9b139cc80eb1c479a_List
  bpy.context.scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List.clear()
  del bpy.types.Scene.Simplygon_ee14d2e44b8b4de69fc5faef3eaff751_List
  bpy.context.scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List.clear()
  del bpy.types.Scene.Simplygon_d7b7dbe6aba342c6a02b66243deb38e1_List
  bpy.context.scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List.clear()
  del bpy.types.Scene.Simplygon_dfbf6804c8224a958b4ea867b7a4c05c_List
  bpy.context.scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List.clear()
  del bpy.types.Scene.Simplygon_b78bea144be14bcc9a92ff8ad13b1c2a_List
  bpy.context.scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List.clear()
  del bpy.types.Scene.Simplygon_4e0ed713bfb84e198684f0dc060d1492_List
  bpy.context.scene.Simplygon_680e680b76eb46348189d88044f88179_List.clear()
  del bpy.types.Scene.Simplygon_680e680b76eb46348189d88044f88179_List
  bpy.context.scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List.clear()
  del bpy.types.Scene.Simplygon_2cce19ea59a048919cac247b0c2b78a9_List
  bpy.context.scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List.clear()
  del bpy.types.Scene.Simplygon_062bea0ec0544422bd0d7de8e6f57e8e_List
  bpy.context.scene.Simplygon_f597403a1e294008b14304fa5f49410e_List.clear()
  del bpy.types.Scene.Simplygon_f597403a1e294008b14304fa5f49410e_List
  bpy.context.scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List.clear()
  del bpy.types.Scene.Simplygon_ea1a3a34232e4a5e9f0bb1ff389cabd8_List
  bpy.context.scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List.clear()
  del bpy.types.Scene.Simplygon_cfbee560b85d4a47a957b9ffba433a1d_List
  bpy.context.scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List.clear()
  del bpy.types.Scene.Simplygon_f9b2eebdddd1492997dd62911d9afbe9_List
  bpy.context.scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List.clear()
  del bpy.types.Scene.Simplygon_11b44519b30d4a6d9e9aeec25d27dda9_List
  bpy.context.scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List.clear()
  del bpy.types.Scene.Simplygon_18256d063fb247e8aee6ce96ce55291b_List
  bpy.context.scene.Simplygon_cc2262d978da416bb31c58d845054b89_List.clear()
  del bpy.types.Scene.Simplygon_cc2262d978da416bb31c58d845054b89_List
  bpy.context.scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List.clear()
  del bpy.types.Scene.Simplygon_60b9c5c3375641f9bdb63c4d11de1cae_List
  bpy.context.scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List.clear()
  del bpy.types.Scene.Simplygon_9ba4917add8846fd98c25e2294ef12fe_List
  bpy.context.scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List.clear()
  del bpy.types.Scene.Simplygon_2faa89fe35a842bd818db12c7bce9948_List
  bpy.context.scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List.clear()
  del bpy.types.Scene.Simplygon_a70c83e8dbb34b3e8389cc57724c4b61_List
  bpy.context.scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List.clear()
  del bpy.types.Scene.Simplygon_20448ed03d2e470ea886fcf4d513585c_List
  bpy.context.scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List.clear()
  del bpy.types.Scene.Simplygon_59161e6dfccf433da82ff7914ed29483_List
  bpy.context.scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List.clear()
  del bpy.types.Scene.Simplygon_07a635ac30b0403080c8b3529379cbc6_List
  bpy.context.scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List.clear()
  del bpy.types.Scene.Simplygon_884a5ad06c6843dcad8a749e714c61e1_List
  bpy.context.scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List.clear()
  del bpy.types.Scene.Simplygon_6a0eb6a2563245488751c6e58e7f7850_List
  bpy.context.scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List.clear()
  del bpy.types.Scene.Simplygon_219262062ef44ddd8462a404eb21ac78_List
  bpy.context.scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List.clear()
  del bpy.types.Scene.Simplygon_6450dcc940dd4083b0c1f2e5af389f6a_List
  bpy.context.scene.Simplygon_2bd3c340f61942769533317960ac457a_List.clear()
  del bpy.types.Scene.Simplygon_2bd3c340f61942769533317960ac457a_List
  bpy.context.scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List.clear()
  del bpy.types.Scene.Simplygon_46c9221a5c324b92a0e6c4416f361225_List
  bpy.context.scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List.clear()
  del bpy.types.Scene.Simplygon_8abfc4d4fedd40a6be318fbc12ef1f90_List
  bpy.context.scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List.clear()
  del bpy.types.Scene.Simplygon_9f8253d062824270ac70dde7eefc6120_List
  bpy.context.scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List.clear()
  del bpy.types.Scene.Simplygon_a761c012160945a1872e3ab293b7fbcc_List
  bpy.context.scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List.clear()
  del bpy.types.Scene.Simplygon_0c9f239ffd7e450bbaf3e57d961e4e0f_List
  bpy.context.scene.Simplygon_PipelineIds = ''
  bpy.context.scene.Simplygon_Current_PipelineId = ''
  bpy.context.scene.Simplygon_Pipelines.clear()
  bpy.context.scene.Simplygon_MaterialCasters.clear()
  del bpy.types.Scene.Simplygon_Process_Progress
  del bpy.types.Scene.Simplygon_Current_PipelineId
  del bpy.types.Scene.Simplygon_PipelineIds
  del bpy.types.Scene.Simplygon_Pipelines
  del bpy.types.Scene.Simplygon_MaterialCasters

  for cls in reversed(classes):
    bpy.utils.unregister_class(cls)


  for icon in simplygon_icons:
    bpy.utils.previews.remove(icon)

  simplygon_icons.clear()

  bpy.types.TEXT_MT_templates.remove(simplygon_template_menu_draw)


if __name__ == '__main__':
  register()

