bl_info = {
  'name': 'Simplygon',
  'blender': (2, 90, 0),
  'version': (9, 2, 1400, 0),
  'location': 'View3D',
  'category': '3D Optimization',
  'author': 'Microsoft Corporation',
  'doc_url': 'https://documentation.simplygon.com/SimplygonSDK_9.2.1400.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 simplygon import simplygon_loader
from simplygon 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.1400.0'
  jsonData['Commit'] = 'c47d3175d00ec884bd836442df285bc06f7754eb'

  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.1400.0"
  Commit = "c47d3175d00ec884bd836442df285bc06f7754eb"

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 = 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))
        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.1400.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_fbc44824ef4e4aac8f456030c35cf553_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fbc44824ef4e4aac8f456030c35cf553_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_a4af02e90048402bad216470900eec75_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a4af02e90048402bad216470900eec75_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_e178facd203d4f8dbbf5c853c2d75778_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_56f944938f8540328d8d79540274abda_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_56f944938f8540328d8d79540274abda_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_853b198e3bdd45908af0bdac708db2f0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_7a2c37ef1cac4b1a851360776c233c3f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_34ff94d6cce24f9dab3d4fad7496522f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_3704d88de7794de694ca97cfa91f85fd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_74fe44f0caa944d481e6ef29afbf1c60_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_649d2a12f54a490c98b52307e0b13926_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_649d2a12f54a490c98b52307e0b13926_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_542d6c6369674140b14c7bf9007274fe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_542d6c6369674140b14c7bf9007274fe_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_a2a77dd216b24d20893d834f450e502e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a2a77dd216b24d20893d834f450e502e_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_f567169898ad4e9197074702a3782349_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f567169898ad4e9197074702a3782349_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_56e9a47eb8424c3989951308c7bcc2ee_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_bf0ba9dfe02b48d790335d5fb3f29f23_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_d8c772fcf642440ebe3309cec4d1f108_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_d373871262384f3499290c4b9d683151_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d373871262384f3499290c4b9d683151_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_937162aad69c4cd8942abbb2408e8365_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_937162aad69c4cd8942abbb2408e8365_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_d0aae8b607424e9eac1e0aaecd8f7c31_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_2e401281a1514dac9d73592b9889d7ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_4f93851dde594909ad9789a583525cc9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f93851dde594909ad9789a583525cc9_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_851df449a09d46e59989f6018cca8107_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_851df449a09d46e59989f6018cca8107_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_12339c1d93ac4e4c8575d097b915ee56_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_0ea692bee3dd4b889065dc98c7767367_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_640ac49a6e584b86af88d1fe040267fc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_94b6a06089324bddb303fefa7473339b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_94b6a06089324bddb303fefa7473339b_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_c717fe26288b4a2da4ee228eeb6fdb10_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_aab663677985458790e54d1623678472_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aab663677985458790e54d1623678472_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_ffb84b55d4c749679aa980aeeb25251a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_68354f2509a34c08b0438de369f2ee60_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_68354f2509a34c08b0438de369f2ee60_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_c68c46621fbb4eb09a316b308c951719_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c68c46621fbb4eb09a316b308c951719_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_1d6340120f964efe9d4168a3f9560de9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_3bd1b46542854b78968fd920dfd55cec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_4dc789ea7c20495899cf7621b051b2e7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_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_fbc44824ef4e4aac8f456030c35cf553_List.add()
    ReductionTargetTriangleRatioEnabledUI.Init(self.name)
    ReductionTargetTriangleRatioEnabledUI.name = self.name
    ReductionTargetTriangleRatioUI = bpy.context.scene.Simplygon_a4af02e90048402bad216470900eec75_List.add()
    ReductionTargetTriangleRatioUI.Init(self.name)
    ReductionTargetTriangleRatioUI.name = self.name
    ReductionTargetTriangleCountEnabledUI = bpy.context.scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List.add()
    ReductionTargetTriangleCountEnabledUI.Init(self.name)
    ReductionTargetTriangleCountEnabledUI.name = self.name
    ReductionTargetTriangleCountUI = bpy.context.scene.Simplygon_56f944938f8540328d8d79540274abda_List.add()
    ReductionTargetTriangleCountUI.Init(self.name)
    ReductionTargetTriangleCountUI.name = self.name
    ReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List.add()
    ReductionTargetMaxDeviationEnabledUI.Init(self.name)
    ReductionTargetMaxDeviationEnabledUI.name = self.name
    ReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List.add()
    ReductionTargetMaxDeviationUI.Init(self.name)
    ReductionTargetMaxDeviationUI.name = self.name
    ReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List.add()
    ReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    ReductionTargetOnScreenSizeEnabledUI.name = self.name
    ReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List.add()
    ReductionTargetOnScreenSizeUI.Init(self.name)
    ReductionTargetOnScreenSizeUI.name = self.name
    ReductionTargetStopConditionUI = bpy.context.scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List.add()
    ReductionTargetStopConditionUI.Init(self.name)
    ReductionTargetStopConditionUI.name = self.name
    ReductionHeuristicsUI = bpy.context.scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List.add()
    ReductionHeuristicsUI.Init(self.name)
    ReductionHeuristicsUI.name = self.name
    GeometryImportanceUI = bpy.context.scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List.add()
    GeometryImportanceUI.Init(self.name)
    GeometryImportanceUI.name = self.name
    MaterialImportanceUI = bpy.context.scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List.add()
    MaterialImportanceUI.Init(self.name)
    MaterialImportanceUI.name = self.name
    TextureImportanceUI = bpy.context.scene.Simplygon_f567169898ad4e9197074702a3782349_List.add()
    TextureImportanceUI.Init(self.name)
    TextureImportanceUI.name = self.name
    ShadingImportanceUI = bpy.context.scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List.add()
    ShadingImportanceUI.Init(self.name)
    ShadingImportanceUI.name = self.name
    GroupImportanceUI = bpy.context.scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List.add()
    GroupImportanceUI.Init(self.name)
    GroupImportanceUI.name = self.name
    VertexColorImportanceUI = bpy.context.scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List.add()
    VertexColorImportanceUI.Init(self.name)
    VertexColorImportanceUI.name = self.name
    EdgeSetImportanceUI = bpy.context.scene.Simplygon_d373871262384f3499290c4b9d683151_List.add()
    EdgeSetImportanceUI.Init(self.name)
    EdgeSetImportanceUI.name = self.name
    SkinningImportanceUI = bpy.context.scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List.add()
    SkinningImportanceUI.Init(self.name)
    SkinningImportanceUI.name = self.name
    CurvatureImportanceUI = bpy.context.scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List.add()
    CurvatureImportanceUI.Init(self.name)
    CurvatureImportanceUI.name = self.name
    OutwardMoveMultiplierUI = bpy.context.scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List.add()
    OutwardMoveMultiplierUI.Init(self.name)
    OutwardMoveMultiplierUI.name = self.name
    InwardMoveMultiplierUI = bpy.context.scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List.add()
    InwardMoveMultiplierUI.Init(self.name)
    InwardMoveMultiplierUI.name = self.name
    KeepSymmetryUI = bpy.context.scene.Simplygon_851df449a09d46e59989f6018cca8107_List.add()
    KeepSymmetryUI.Init(self.name)
    KeepSymmetryUI.name = self.name
    UseSymmetryQuadRetriangulatorUI = bpy.context.scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List.add()
    UseSymmetryQuadRetriangulatorUI.Init(self.name)
    UseSymmetryQuadRetriangulatorUI.name = self.name
    UseAutomaticSymmetryDetectionUI = bpy.context.scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List.add()
    UseAutomaticSymmetryDetectionUI.Init(self.name)
    UseAutomaticSymmetryDetectionUI.name = self.name
    SymmetryDetectionToleranceUI = bpy.context.scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List.add()
    SymmetryDetectionToleranceUI.Init(self.name)
    SymmetryDetectionToleranceUI.name = self.name
    SymmetryAxisUI = bpy.context.scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List.add()
    SymmetryAxisUI.Init(self.name)
    SymmetryAxisUI.name = self.name
    SymmetryOffsetUI = bpy.context.scene.Simplygon_94b6a06089324bddb303fefa7473339b_List.add()
    SymmetryOffsetUI.Init(self.name)
    SymmetryOffsetUI.name = self.name
    CreateGeomorphGeometryUI = bpy.context.scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List.add()
    CreateGeomorphGeometryUI.Init(self.name)
    CreateGeomorphGeometryUI.name = self.name
    DataCreationPreferencesUI = bpy.context.scene.Simplygon_aab663677985458790e54d1623678472_List.add()
    DataCreationPreferencesUI.Init(self.name)
    DataCreationPreferencesUI.name = self.name
    UseHighQualityNormalCalculationUI = bpy.context.scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List.add()
    UseHighQualityNormalCalculationUI.Init(self.name)
    UseHighQualityNormalCalculationUI.name = self.name
    LockGeometricBorderUI = bpy.context.scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List.add()
    LockGeometricBorderUI.Init(self.name)
    LockGeometricBorderUI.name = self.name
    MergeGeometriesUI = bpy.context.scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    AllowDegenerateTexCoordsUI = bpy.context.scene.Simplygon_4f93851dde594909ad9789a583525cc9_List.add()
    AllowDegenerateTexCoordsUI.Init(self.name)
    AllowDegenerateTexCoordsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_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_fbc44824ef4e4aac8f456030c35cf553_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_a4af02e90048402bad216470900eec75_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_e178facd203d4f8dbbf5c853c2d75778_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_56f944938f8540328d8d79540274abda_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_853b198e3bdd45908af0bdac708db2f0_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_7a2c37ef1cac4b1a851360776c233c3f_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_34ff94d6cce24f9dab3d4fad7496522f_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_3704d88de7794de694ca97cfa91f85fd_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_74fe44f0caa944d481e6ef29afbf1c60_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_649d2a12f54a490c98b52307e0b13926_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_542d6c6369674140b14c7bf9007274fe_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_a2a77dd216b24d20893d834f450e502e_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_f567169898ad4e9197074702a3782349_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_56e9a47eb8424c3989951308c7bcc2ee_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_bf0ba9dfe02b48d790335d5fb3f29f23_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_d8c772fcf642440ebe3309cec4d1f108_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_d373871262384f3499290c4b9d683151_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_937162aad69c4cd8942abbb2408e8365_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_d0aae8b607424e9eac1e0aaecd8f7c31_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_ffb84b55d4c749679aa980aeeb25251a_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_68354f2509a34c08b0438de369f2ee60_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_851df449a09d46e59989f6018cca8107_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_0ea692bee3dd4b889065dc98c7767367_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_12339c1d93ac4e4c8575d097b915ee56_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_c717fe26288b4a2da4ee228eeb6fdb10_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_640ac49a6e584b86af88d1fe040267fc_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_94b6a06089324bddb303fefa7473339b_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_2e401281a1514dac9d73592b9889d7ec_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_aab663677985458790e54d1623678472_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_c68c46621fbb4eb09a316b308c951719_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_4dc789ea7c20495899cf7621b051b2e7_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_1d6340120f964efe9d4168a3f9560de9_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_4f93851dde594909ad9789a583525cc9_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_3bd1b46542854b78968fd920dfd55cec_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_fbc44824ef4e4aac8f456030c35cf553_List.find(self.name)
    bpy.context.scene.Simplygon_fbc44824ef4e4aac8f456030c35cf553_List.remove(ReductionTargetTriangleRatioEnabledUI_index)
    ReductionTargetTriangleRatioUI_index = bpy.context.scene.Simplygon_a4af02e90048402bad216470900eec75_List.find(self.name)
    bpy.context.scene.Simplygon_a4af02e90048402bad216470900eec75_List.remove(ReductionTargetTriangleRatioUI_index)
    ReductionTargetTriangleCountEnabledUI_index = bpy.context.scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List.find(self.name)
    bpy.context.scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List.remove(ReductionTargetTriangleCountEnabledUI_index)
    ReductionTargetTriangleCountUI_index = bpy.context.scene.Simplygon_56f944938f8540328d8d79540274abda_List.find(self.name)
    bpy.context.scene.Simplygon_56f944938f8540328d8d79540274abda_List.remove(ReductionTargetTriangleCountUI_index)
    ReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List.find(self.name)
    bpy.context.scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List.remove(ReductionTargetMaxDeviationEnabledUI_index)
    ReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List.find(self.name)
    bpy.context.scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List.remove(ReductionTargetMaxDeviationUI_index)
    ReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List.find(self.name)
    bpy.context.scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List.remove(ReductionTargetOnScreenSizeEnabledUI_index)
    ReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List.find(self.name)
    bpy.context.scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List.remove(ReductionTargetOnScreenSizeUI_index)
    ReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List.find(self.name)
    bpy.context.scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List.remove(ReductionTargetStopConditionUI_index)
    ReductionHeuristicsUI_index = bpy.context.scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List.find(self.name)
    bpy.context.scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List.remove(ReductionHeuristicsUI_index)
    GeometryImportanceUI_index = bpy.context.scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List.find(self.name)
    bpy.context.scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List.remove(GeometryImportanceUI_index)
    MaterialImportanceUI_index = bpy.context.scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List.find(self.name)
    bpy.context.scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List.remove(MaterialImportanceUI_index)
    TextureImportanceUI_index = bpy.context.scene.Simplygon_f567169898ad4e9197074702a3782349_List.find(self.name)
    bpy.context.scene.Simplygon_f567169898ad4e9197074702a3782349_List.remove(TextureImportanceUI_index)
    ShadingImportanceUI_index = bpy.context.scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List.find(self.name)
    bpy.context.scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List.remove(ShadingImportanceUI_index)
    GroupImportanceUI_index = bpy.context.scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List.find(self.name)
    bpy.context.scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List.remove(GroupImportanceUI_index)
    VertexColorImportanceUI_index = bpy.context.scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List.find(self.name)
    bpy.context.scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List.remove(VertexColorImportanceUI_index)
    EdgeSetImportanceUI_index = bpy.context.scene.Simplygon_d373871262384f3499290c4b9d683151_List.find(self.name)
    bpy.context.scene.Simplygon_d373871262384f3499290c4b9d683151_List.remove(EdgeSetImportanceUI_index)
    SkinningImportanceUI_index = bpy.context.scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List.find(self.name)
    bpy.context.scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List.remove(SkinningImportanceUI_index)
    CurvatureImportanceUI_index = bpy.context.scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List.find(self.name)
    bpy.context.scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List.remove(CurvatureImportanceUI_index)
    OutwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List.find(self.name)
    bpy.context.scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List.remove(OutwardMoveMultiplierUI_index)
    InwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List.find(self.name)
    bpy.context.scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List.remove(InwardMoveMultiplierUI_index)
    KeepSymmetryUI_index = bpy.context.scene.Simplygon_851df449a09d46e59989f6018cca8107_List.find(self.name)
    bpy.context.scene.Simplygon_851df449a09d46e59989f6018cca8107_List.remove(KeepSymmetryUI_index)
    UseSymmetryQuadRetriangulatorUI_index = bpy.context.scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List.find(self.name)
    bpy.context.scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List.remove(UseSymmetryQuadRetriangulatorUI_index)
    UseAutomaticSymmetryDetectionUI_index = bpy.context.scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List.find(self.name)
    bpy.context.scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List.remove(UseAutomaticSymmetryDetectionUI_index)
    SymmetryDetectionToleranceUI_index = bpy.context.scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List.find(self.name)
    bpy.context.scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List.remove(SymmetryDetectionToleranceUI_index)
    SymmetryAxisUI_index = bpy.context.scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List.find(self.name)
    bpy.context.scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List.remove(SymmetryAxisUI_index)
    SymmetryOffsetUI_index = bpy.context.scene.Simplygon_94b6a06089324bddb303fefa7473339b_List.find(self.name)
    bpy.context.scene.Simplygon_94b6a06089324bddb303fefa7473339b_List.remove(SymmetryOffsetUI_index)
    CreateGeomorphGeometryUI_index = bpy.context.scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List.find(self.name)
    bpy.context.scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List.remove(CreateGeomorphGeometryUI_index)
    DataCreationPreferencesUI_index = bpy.context.scene.Simplygon_aab663677985458790e54d1623678472_List.find(self.name)
    bpy.context.scene.Simplygon_aab663677985458790e54d1623678472_List.remove(DataCreationPreferencesUI_index)
    UseHighQualityNormalCalculationUI_index = bpy.context.scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List.find(self.name)
    bpy.context.scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List.remove(UseHighQualityNormalCalculationUI_index)
    LockGeometricBorderUI_index = bpy.context.scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List.find(self.name)
    bpy.context.scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List.remove(LockGeometricBorderUI_index)
    MergeGeometriesUI_index = bpy.context.scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List.find(self.name)
    bpy.context.scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List.remove(MergeGeometriesUI_index)
    AllowDegenerateTexCoordsUI_index = bpy.context.scene.Simplygon_4f93851dde594909ad9789a583525cc9_List.find(self.name)
    bpy.context.scene.Simplygon_4f93851dde594909ad9789a583525cc9_List.remove(AllowDegenerateTexCoordsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_List.find(self.name)
    bpy.context.scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_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_26dd05c605394866992534074e041988_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_26dd05c605394866992534074e041988_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_aed4d0c5e27c46458beaf448dcdca81d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_aeadc5b4b0994868a171c6f300092dfa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_434e9b9aec1848068515fc55aab42e5e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_20f47d60346d4db39a45ceab76e7b1af_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_6fb522ed84a14c3c9a86aaaa306a4c6c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_82985558c5cb42579bdb8c6530fe08c3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_f5577ffc397c414e83c7111b15e9f4ad_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_18e826f8fb204cffa55e43ba5aeacac3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_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_41ba6b11934d4e54857bed8da14257bb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_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_26dd05c605394866992534074e041988_List.add()
    UseTJunctionRemoverUI.Init(self.name)
    UseTJunctionRemoverUI.name = self.name
    TJuncDistUI = bpy.context.scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List.add()
    TJuncDistUI.Init(self.name)
    TJuncDistUI.name = self.name
    UseWeldingUI = bpy.context.scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List.add()
    UseWeldingUI.Init(self.name)
    UseWeldingUI.name = self.name
    WeldOnlyBorderVerticesUI = bpy.context.scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List.add()
    WeldOnlyBorderVerticesUI.Init(self.name)
    WeldOnlyBorderVerticesUI.name = self.name
    WeldOnlyWithinMaterialUI = bpy.context.scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List.add()
    WeldOnlyWithinMaterialUI.Init(self.name)
    WeldOnlyWithinMaterialUI.name = self.name
    WeldOnlyWithinSceneNodeUI = bpy.context.scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List.add()
    WeldOnlyWithinSceneNodeUI.Init(self.name)
    WeldOnlyWithinSceneNodeUI.name = self.name
    WeldOnlyBetweenSceneNodesUI = bpy.context.scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List.add()
    WeldOnlyBetweenSceneNodesUI.Init(self.name)
    WeldOnlyBetweenSceneNodesUI.name = self.name
    WeldDistUI = bpy.context.scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List.add()
    WeldDistUI.Init(self.name)
    WeldDistUI.name = self.name
    ProgressivePassesUI = bpy.context.scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_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_26dd05c605394866992534074e041988_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_aed4d0c5e27c46458beaf448dcdca81d_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_f5577ffc397c414e83c7111b15e9f4ad_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_434e9b9aec1848068515fc55aab42e5e_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_20f47d60346d4db39a45ceab76e7b1af_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_6fb522ed84a14c3c9a86aaaa306a4c6c_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_82985558c5cb42579bdb8c6530fe08c3_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_aeadc5b4b0994868a171c6f300092dfa_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_18e826f8fb204cffa55e43ba5aeacac3_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_26dd05c605394866992534074e041988_List.find(self.name)
    bpy.context.scene.Simplygon_26dd05c605394866992534074e041988_List.remove(UseTJunctionRemoverUI_index)
    TJuncDistUI_index = bpy.context.scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List.find(self.name)
    bpy.context.scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List.remove(TJuncDistUI_index)
    UseWeldingUI_index = bpy.context.scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List.find(self.name)
    bpy.context.scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List.remove(UseWeldingUI_index)
    WeldOnlyBorderVerticesUI_index = bpy.context.scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List.find(self.name)
    bpy.context.scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List.remove(WeldOnlyBorderVerticesUI_index)
    WeldOnlyWithinMaterialUI_index = bpy.context.scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List.find(self.name)
    bpy.context.scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List.remove(WeldOnlyWithinMaterialUI_index)
    WeldOnlyWithinSceneNodeUI_index = bpy.context.scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List.find(self.name)
    bpy.context.scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List.remove(WeldOnlyWithinSceneNodeUI_index)
    WeldOnlyBetweenSceneNodesUI_index = bpy.context.scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List.find(self.name)
    bpy.context.scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List.remove(WeldOnlyBetweenSceneNodesUI_index)
    WeldDistUI_index = bpy.context.scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List.find(self.name)
    bpy.context.scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List.remove(WeldDistUI_index)
    ProgressivePassesUI_index = bpy.context.scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_List.find(self.name)
    bpy.context.scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_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_c0ae98c2511d4b6295af224b41d8f009_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c0ae98c2511d4b6295af224b41d8f009_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_7e21c0f8c71340db9fd6e61b10c54f0d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_80d331b2728e45d6bf5ab73f4617b97c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_b1b72be41ffa4c14a072de1b0b0710d7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_33549acbc5464a98a63847ebaa5714d6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_64207287ee154f4f9a128abffb96a726_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_64207287ee154f4f9a128abffb96a726_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_aa9b3091e54c493ba3dfc5d7fbf1b24d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_536892a45c48434eb07af0049883ea9e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_536892a45c48434eb07af0049883ea9e_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_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_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_c0ae98c2511d4b6295af224b41d8f009_List.add()
    ReplaceNormalsUI.Init(self.name)
    ReplaceNormalsUI.name = self.name
    RepairInvalidNormalsUI = bpy.context.scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List.add()
    RepairInvalidNormalsUI.Init(self.name)
    RepairInvalidNormalsUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    ReplaceTangentsUI = bpy.context.scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List.add()
    ReplaceTangentsUI.Init(self.name)
    ReplaceTangentsUI.name = self.name
    ReorthogonalizeTangentSpaceUI = bpy.context.scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List.add()
    ReorthogonalizeTangentSpaceUI.Init(self.name)
    ReorthogonalizeTangentSpaceUI.name = self.name
    ScaleByAreaUI = bpy.context.scene.Simplygon_64207287ee154f4f9a128abffb96a726_List.add()
    ScaleByAreaUI.Init(self.name)
    ScaleByAreaUI.name = self.name
    ScaleByAngleUI = bpy.context.scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List.add()
    ScaleByAngleUI.Init(self.name)
    ScaleByAngleUI.name = self.name
    SnapNormalsToFlatSurfacesUI = bpy.context.scene.Simplygon_536892a45c48434eb07af0049883ea9e_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_c0ae98c2511d4b6295af224b41d8f009_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_b1b72be41ffa4c14a072de1b0b0710d7_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_80d331b2728e45d6bf5ab73f4617b97c_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_7e21c0f8c71340db9fd6e61b10c54f0d_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_33549acbc5464a98a63847ebaa5714d6_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_64207287ee154f4f9a128abffb96a726_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_aa9b3091e54c493ba3dfc5d7fbf1b24d_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_536892a45c48434eb07af0049883ea9e_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_c0ae98c2511d4b6295af224b41d8f009_List.find(self.name)
    bpy.context.scene.Simplygon_c0ae98c2511d4b6295af224b41d8f009_List.remove(ReplaceNormalsUI_index)
    RepairInvalidNormalsUI_index = bpy.context.scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List.find(self.name)
    bpy.context.scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List.remove(RepairInvalidNormalsUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List.find(self.name)
    bpy.context.scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List.remove(HardEdgeAngleUI_index)
    ReplaceTangentsUI_index = bpy.context.scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List.find(self.name)
    bpy.context.scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List.remove(ReplaceTangentsUI_index)
    ReorthogonalizeTangentSpaceUI_index = bpy.context.scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List.find(self.name)
    bpy.context.scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List.remove(ReorthogonalizeTangentSpaceUI_index)
    ScaleByAreaUI_index = bpy.context.scene.Simplygon_64207287ee154f4f9a128abffb96a726_List.find(self.name)
    bpy.context.scene.Simplygon_64207287ee154f4f9a128abffb96a726_List.remove(ScaleByAreaUI_index)
    ScaleByAngleUI_index = bpy.context.scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List.find(self.name)
    bpy.context.scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List.remove(ScaleByAngleUI_index)
    SnapNormalsToFlatSurfacesUI_index = bpy.context.scene.Simplygon_536892a45c48434eb07af0049883ea9e_List.find(self.name)
    bpy.context.scene.Simplygon_536892a45c48434eb07af0049883ea9e_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_33621a67d25b470baf54ec43e0b96ea4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_33621a67d25b470baf54ec43e0b96ea4_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_bdae79fc0afb45fba3b0631aa6d766cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_4d6081e538884b38b93df13d9e99157b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4d6081e538884b38b93df13d9e99157b_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_a105498780c34420be674224e82c3a97_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a105498780c34420be674224e82c3a97_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_ed33e5345cd1429b8759ad9851405455_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ed33e5345cd1429b8759ad9851405455_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_40ca7a8a6d824075adcd2b53b794bf50_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_013faa1b2ee942d69dd22ecc1707cc8b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_12907e1aa06247388621a8d5bc0de0df_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_c183866041db42eca8181e3e019f3a9f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c183866041db42eca8181e3e019f3a9f_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_b4daa8167ff24b05bf2b6d6fae972d5a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_25198057a02940fa8526eba6ed6ca140_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_25198057a02940fa8526eba6ed6ca140_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_0f9b5b7887814a6a8c7ef854deaf1945_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_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_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_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_33621a67d25b470baf54ec43e0b96ea4_List.add()
    UseVisibilityWeightsInReducerUI.Init(self.name)
    UseVisibilityWeightsInReducerUI.name = self.name
    UseVisibilityWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List.add()
    UseVisibilityWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVisibilityWeightsInTexcoordGeneratorUI.name = self.name
    VisibilityWeightsPowerUI = bpy.context.scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List.add()
    VisibilityWeightsPowerUI.Init(self.name)
    VisibilityWeightsPowerUI.name = self.name
    CullOccludedGeometryUI = bpy.context.scene.Simplygon_a105498780c34420be674224e82c3a97_List.add()
    CullOccludedGeometryUI.Init(self.name)
    CullOccludedGeometryUI.name = self.name
    ForceVisibilityCalculationUI = bpy.context.scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List.add()
    ForceVisibilityCalculationUI.Init(self.name)
    ForceVisibilityCalculationUI.name = self.name
    UseBackfaceCullingUI = bpy.context.scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List.add()
    UseBackfaceCullingUI.Init(self.name)
    UseBackfaceCullingUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OccluderSelectionSetNameUI = bpy.context.scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List.add()
    OccluderSelectionSetNameUI.Init(self.name)
    OccluderSelectionSetNameUI.name = self.name
    FillNonVisibleAreaThresholdUI = bpy.context.scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List.add()
    FillNonVisibleAreaThresholdUI.Init(self.name)
    FillNonVisibleAreaThresholdUI.name = self.name
    RemoveTrianglesNotOccludingOtherTrianglesUI = bpy.context.scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List.add()
    RemoveTrianglesNotOccludingOtherTrianglesUI.Init(self.name)
    RemoveTrianglesNotOccludingOtherTrianglesUI.name = self.name
    ConservativeModeUI = bpy.context.scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List.add()
    ConservativeModeUI.Init(self.name)
    ConservativeModeUI.name = self.name
    ComputeVisibilityModeUI = bpy.context.scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_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_33621a67d25b470baf54ec43e0b96ea4_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_bdae79fc0afb45fba3b0631aa6d766cf_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_4d6081e538884b38b93df13d9e99157b_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_a105498780c34420be674224e82c3a97_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_ed33e5345cd1429b8759ad9851405455_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_40ca7a8a6d824075adcd2b53b794bf50_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_013faa1b2ee942d69dd22ecc1707cc8b_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_12907e1aa06247388621a8d5bc0de0df_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_c183866041db42eca8181e3e019f3a9f_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_b4daa8167ff24b05bf2b6d6fae972d5a_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_25198057a02940fa8526eba6ed6ca140_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_0f9b5b7887814a6a8c7ef854deaf1945_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_33621a67d25b470baf54ec43e0b96ea4_List.find(self.name)
    bpy.context.scene.Simplygon_33621a67d25b470baf54ec43e0b96ea4_List.remove(UseVisibilityWeightsInReducerUI_index)
    UseVisibilityWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List.find(self.name)
    bpy.context.scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List.remove(UseVisibilityWeightsInTexcoordGeneratorUI_index)
    VisibilityWeightsPowerUI_index = bpy.context.scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List.find(self.name)
    bpy.context.scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List.remove(VisibilityWeightsPowerUI_index)
    CullOccludedGeometryUI_index = bpy.context.scene.Simplygon_a105498780c34420be674224e82c3a97_List.find(self.name)
    bpy.context.scene.Simplygon_a105498780c34420be674224e82c3a97_List.remove(CullOccludedGeometryUI_index)
    ForceVisibilityCalculationUI_index = bpy.context.scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List.find(self.name)
    bpy.context.scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List.remove(ForceVisibilityCalculationUI_index)
    UseBackfaceCullingUI_index = bpy.context.scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List.find(self.name)
    bpy.context.scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List.remove(UseBackfaceCullingUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List.find(self.name)
    bpy.context.scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List.remove(CameraSelectionSetNameUI_index)
    OccluderSelectionSetNameUI_index = bpy.context.scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List.find(self.name)
    bpy.context.scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List.remove(OccluderSelectionSetNameUI_index)
    FillNonVisibleAreaThresholdUI_index = bpy.context.scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List.find(self.name)
    bpy.context.scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List.remove(FillNonVisibleAreaThresholdUI_index)
    RemoveTrianglesNotOccludingOtherTrianglesUI_index = bpy.context.scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List.find(self.name)
    bpy.context.scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List.remove(RemoveTrianglesNotOccludingOtherTrianglesUI_index)
    ConservativeModeUI_index = bpy.context.scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List.find(self.name)
    bpy.context.scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List.remove(ConservativeModeUI_index)
    ComputeVisibilityModeUI_index = bpy.context.scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_List.find(self.name)
    bpy.context.scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_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_8c3862f0c1664de0b0a72bacfc5be1c3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8c3862f0c1664de0b0a72bacfc5be1c3_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_3a89430e94a141429e4098cdf0367cbc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_93705df2e8d446ebb8dae1f1071a7546_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_8671fa08cf834590a84c9322bb201dbf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_c7aaf2cc767b4aaeb57a76671288d72f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_62e27828b1d542e58578137388482842_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_62e27828b1d542e58578137388482842_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_fe0386e987f74a15bbf1a5b11231f951_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_f4e939a227bc47239d4ff1704b12193b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_0b9fbfe3edc24dd6a61aed4b70523f3c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_d3e2561b20c2458bbb241b6b94f96cc5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_e97465fb17b94744ad033c3855a6e0d3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_2af10eddc0ab4f9cbcd2f272de23c13c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_92947a97f0ce4eb1959d7e3137b3115e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_b5b128ce84fb4a0695a35450b74f6b37_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_92a06cac8990426c9a878f1092e2402c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_92a06cac8990426c9a878f1092e2402c_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_8200dd0e95e74876998049ed30ec0263_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_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_8c3862f0c1664de0b0a72bacfc5be1c3_List.add()
    UseBoneReducerUI.Init(self.name)
    UseBoneReducerUI.name = self.name
    RemoveUnusedBonesUI = bpy.context.scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List.add()
    RemoveUnusedBonesUI.Init(self.name)
    RemoveUnusedBonesUI.name = self.name
    LimitBonesPerVertexUI = bpy.context.scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List.add()
    LimitBonesPerVertexUI.Init(self.name)
    LimitBonesPerVertexUI.name = self.name
    MaxBonePerVertexUI = bpy.context.scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List.add()
    MaxBonePerVertexUI.Init(self.name)
    MaxBonePerVertexUI.name = self.name
    BoneReductionTargetBoneRatioEnabledUI = bpy.context.scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List.add()
    BoneReductionTargetBoneRatioEnabledUI.Init(self.name)
    BoneReductionTargetBoneRatioEnabledUI.name = self.name
    BoneReductionTargetBoneRatioUI = bpy.context.scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List.add()
    BoneReductionTargetBoneRatioUI.Init(self.name)
    BoneReductionTargetBoneRatioUI.name = self.name
    BoneReductionTargetBoneCountEnabledUI = bpy.context.scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List.add()
    BoneReductionTargetBoneCountEnabledUI.Init(self.name)
    BoneReductionTargetBoneCountEnabledUI.name = self.name
    BoneReductionTargetBoneCountUI = bpy.context.scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List.add()
    BoneReductionTargetBoneCountUI.Init(self.name)
    BoneReductionTargetBoneCountUI.name = self.name
    BoneReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_62e27828b1d542e58578137388482842_List.add()
    BoneReductionTargetMaxDeviationEnabledUI.Init(self.name)
    BoneReductionTargetMaxDeviationEnabledUI.name = self.name
    BoneReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List.add()
    BoneReductionTargetMaxDeviationUI.Init(self.name)
    BoneReductionTargetMaxDeviationUI.name = self.name
    BoneReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List.add()
    BoneReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    BoneReductionTargetOnScreenSizeEnabledUI.name = self.name
    BoneReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List.add()
    BoneReductionTargetOnScreenSizeUI.Init(self.name)
    BoneReductionTargetOnScreenSizeUI.name = self.name
    BoneReductionTargetStopConditionUI = bpy.context.scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List.add()
    BoneReductionTargetStopConditionUI.Init(self.name)
    BoneReductionTargetStopConditionUI.name = self.name
    LockBoneSelectionSetNameUI = bpy.context.scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List.add()
    LockBoneSelectionSetNameUI.Init(self.name)
    LockBoneSelectionSetNameUI.name = self.name
    RemoveBoneSelectionSetNameUI = bpy.context.scene.Simplygon_92a06cac8990426c9a878f1092e2402c_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_8c3862f0c1664de0b0a72bacfc5be1c3_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_93705df2e8d446ebb8dae1f1071a7546_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_8671fa08cf834590a84c9322bb201dbf_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_fe0386e987f74a15bbf1a5b11231f951_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_3a89430e94a141429e4098cdf0367cbc_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_d3e2561b20c2458bbb241b6b94f96cc5_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_c7aaf2cc767b4aaeb57a76671288d72f_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_e97465fb17b94744ad033c3855a6e0d3_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_62e27828b1d542e58578137388482842_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_2af10eddc0ab4f9cbcd2f272de23c13c_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_f4e939a227bc47239d4ff1704b12193b_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_92947a97f0ce4eb1959d7e3137b3115e_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_0b9fbfe3edc24dd6a61aed4b70523f3c_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_b5b128ce84fb4a0695a35450b74f6b37_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_92a06cac8990426c9a878f1092e2402c_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_8c3862f0c1664de0b0a72bacfc5be1c3_List.find(self.name)
    bpy.context.scene.Simplygon_8c3862f0c1664de0b0a72bacfc5be1c3_List.remove(UseBoneReducerUI_index)
    RemoveUnusedBonesUI_index = bpy.context.scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List.find(self.name)
    bpy.context.scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List.remove(RemoveUnusedBonesUI_index)
    LimitBonesPerVertexUI_index = bpy.context.scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List.find(self.name)
    bpy.context.scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List.remove(LimitBonesPerVertexUI_index)
    MaxBonePerVertexUI_index = bpy.context.scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List.find(self.name)
    bpy.context.scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List.remove(MaxBonePerVertexUI_index)
    BoneReductionTargetBoneRatioEnabledUI_index = bpy.context.scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List.find(self.name)
    bpy.context.scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List.remove(BoneReductionTargetBoneRatioEnabledUI_index)
    BoneReductionTargetBoneRatioUI_index = bpy.context.scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List.find(self.name)
    bpy.context.scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List.remove(BoneReductionTargetBoneRatioUI_index)
    BoneReductionTargetBoneCountEnabledUI_index = bpy.context.scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List.find(self.name)
    bpy.context.scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List.remove(BoneReductionTargetBoneCountEnabledUI_index)
    BoneReductionTargetBoneCountUI_index = bpy.context.scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List.find(self.name)
    bpy.context.scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List.remove(BoneReductionTargetBoneCountUI_index)
    BoneReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_62e27828b1d542e58578137388482842_List.find(self.name)
    bpy.context.scene.Simplygon_62e27828b1d542e58578137388482842_List.remove(BoneReductionTargetMaxDeviationEnabledUI_index)
    BoneReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List.find(self.name)
    bpy.context.scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List.remove(BoneReductionTargetMaxDeviationUI_index)
    BoneReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List.find(self.name)
    bpy.context.scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List.remove(BoneReductionTargetOnScreenSizeEnabledUI_index)
    BoneReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List.find(self.name)
    bpy.context.scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List.remove(BoneReductionTargetOnScreenSizeUI_index)
    BoneReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List.find(self.name)
    bpy.context.scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List.remove(BoneReductionTargetStopConditionUI_index)
    LockBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List.find(self.name)
    bpy.context.scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List.remove(LockBoneSelectionSetNameUI_index)
    RemoveBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_92a06cac8990426c9a878f1092e2402c_List.find(self.name)
    bpy.context.scene.Simplygon_92a06cac8990426c9a878f1092e2402c_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_e7a6d67fc1644a7d88a3e2d103bcd939_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e7a6d67fc1644a7d88a3e2d103bcd939_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_947c293161fb4efcbee117658007d9ee_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_947c293161fb4efcbee117658007d9ee_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_3570292dd70344bf80c4f852aabaf8d2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_30db0e6970484606913cabf9d09e2de3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_30db0e6970484606913cabf9d09e2de3_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_b01b959123c7468cb66f3d8ab19881da_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_76183fd974084f78aec71167d9eab64f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_76183fd974084f78aec71167d9eab64f_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_e68854a1f4b04c2d9d67394fb6440158_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_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_fd216bc817b84579b610ab179b262905_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_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_e7a6d67fc1644a7d88a3e2d103bcd939_List.add()
    UseVertexWeightsInReducerUI.Init(self.name)
    UseVertexWeightsInReducerUI.name = self.name
    UseVertexWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_947c293161fb4efcbee117658007d9ee_List.add()
    UseVertexWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVertexWeightsInTexcoordGeneratorUI.name = self.name
    WeightsFromColorLevelUI = bpy.context.scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List.add()
    WeightsFromColorLevelUI.Init(self.name)
    WeightsFromColorLevelUI.name = self.name
    WeightsFromColorNameUI = bpy.context.scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List.add()
    WeightsFromColorNameUI.Init(self.name)
    WeightsFromColorNameUI.name = self.name
    WeightsFromColorComponentUI = bpy.context.scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List.add()
    WeightsFromColorComponentUI.Init(self.name)
    WeightsFromColorComponentUI.name = self.name
    WeightsFromColorMultiplierUI = bpy.context.scene.Simplygon_76183fd974084f78aec71167d9eab64f_List.add()
    WeightsFromColorMultiplierUI.Init(self.name)
    WeightsFromColorMultiplierUI.name = self.name
    WeightsFromColorModeUI = bpy.context.scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_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_e7a6d67fc1644a7d88a3e2d103bcd939_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_947c293161fb4efcbee117658007d9ee_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_30db0e6970484606913cabf9d09e2de3_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_3570292dd70344bf80c4f852aabaf8d2_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_b01b959123c7468cb66f3d8ab19881da_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_76183fd974084f78aec71167d9eab64f_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_e68854a1f4b04c2d9d67394fb6440158_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_e7a6d67fc1644a7d88a3e2d103bcd939_List.find(self.name)
    bpy.context.scene.Simplygon_e7a6d67fc1644a7d88a3e2d103bcd939_List.remove(UseVertexWeightsInReducerUI_index)
    UseVertexWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_947c293161fb4efcbee117658007d9ee_List.find(self.name)
    bpy.context.scene.Simplygon_947c293161fb4efcbee117658007d9ee_List.remove(UseVertexWeightsInTexcoordGeneratorUI_index)
    WeightsFromColorLevelUI_index = bpy.context.scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List.find(self.name)
    bpy.context.scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List.remove(WeightsFromColorLevelUI_index)
    WeightsFromColorNameUI_index = bpy.context.scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List.find(self.name)
    bpy.context.scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List.remove(WeightsFromColorNameUI_index)
    WeightsFromColorComponentUI_index = bpy.context.scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List.find(self.name)
    bpy.context.scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List.remove(WeightsFromColorComponentUI_index)
    WeightsFromColorMultiplierUI_index = bpy.context.scene.Simplygon_76183fd974084f78aec71167d9eab64f_List.find(self.name)
    bpy.context.scene.Simplygon_76183fd974084f78aec71167d9eab64f_List.remove(WeightsFromColorMultiplierUI_index)
    WeightsFromColorModeUI_index = bpy.context.scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_List.find(self.name)
    bpy.context.scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_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_f44fd961d8f340d2a17c27e9bab932f8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f44fd961d8f340d2a17c27e9bab932f8_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_7d4127a6bc5d4c45bd7444d05038072b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_06a265dd8559414184f5614ddf781962_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_06a265dd8559414184f5614ddf781962_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_ec34b13153cb47a48e1986a30ee5ac10_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_05825192fab84ce9bd92cf51d5bc5b7d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_cf538cd7ae9b4695a8b275e918451cf2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_4921f127f6724e249db64c3c11051f87_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4921f127f6724e249db64c3c11051f87_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_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_f44fd961d8f340d2a17c27e9bab932f8_List.add()
    TextureOutputPathUI.Init(self.name)
    TextureOutputPathUI.name = self.name
    SimplygonBatchPathUI = bpy.context.scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List.add()
    SimplygonBatchPathUI.Init(self.name)
    SimplygonBatchPathUI.name = self.name
    OutputMaterialNameUI = bpy.context.scene.Simplygon_06a265dd8559414184f5614ddf781962_List.add()
    OutputMaterialNameUI.Init(self.name)
    OutputMaterialNameUI.name = self.name
    OutputUniqueMaterialNamesUI = bpy.context.scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List.add()
    OutputUniqueMaterialNamesUI.Init(self.name)
    OutputUniqueMaterialNamesUI.name = self.name
    EmbedReferencesUI = bpy.context.scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List.add()
    EmbedReferencesUI.Init(self.name)
    EmbedReferencesUI.name = self.name
    IntermediateStepUI = bpy.context.scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List.add()
    IntermediateStepUI.Init(self.name)
    IntermediateStepUI.name = self.name
    CascadedRunModeUI = bpy.context.scene.Simplygon_4921f127f6724e249db64c3c11051f87_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_f44fd961d8f340d2a17c27e9bab932f8_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_7d4127a6bc5d4c45bd7444d05038072b_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_06a265dd8559414184f5614ddf781962_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_ec34b13153cb47a48e1986a30ee5ac10_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_05825192fab84ce9bd92cf51d5bc5b7d_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_cf538cd7ae9b4695a8b275e918451cf2_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_4921f127f6724e249db64c3c11051f87_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_f44fd961d8f340d2a17c27e9bab932f8_List.find(self.name)
    bpy.context.scene.Simplygon_f44fd961d8f340d2a17c27e9bab932f8_List.remove(TextureOutputPathUI_index)
    SimplygonBatchPathUI_index = bpy.context.scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List.find(self.name)
    bpy.context.scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List.remove(SimplygonBatchPathUI_index)
    OutputMaterialNameUI_index = bpy.context.scene.Simplygon_06a265dd8559414184f5614ddf781962_List.find(self.name)
    bpy.context.scene.Simplygon_06a265dd8559414184f5614ddf781962_List.remove(OutputMaterialNameUI_index)
    OutputUniqueMaterialNamesUI_index = bpy.context.scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List.find(self.name)
    bpy.context.scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List.remove(OutputUniqueMaterialNamesUI_index)
    EmbedReferencesUI_index = bpy.context.scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List.find(self.name)
    bpy.context.scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List.remove(EmbedReferencesUI_index)
    IntermediateStepUI_index = bpy.context.scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List.find(self.name)
    bpy.context.scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List.remove(IntermediateStepUI_index)
    CascadedRunModeUI_index = bpy.context.scene.Simplygon_4921f127f6724e249db64c3c11051f87_List.find(self.name)
    bpy.context.scene.Simplygon_4921f127f6724e249db64c3c11051f87_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List[index]

    return None

  @property
  def MaterialMappingUI(self):
    index = bpy.context.scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_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_b2306ec831084863a1f7996679eb2c38_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_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_cb7245fdd4d945f2bcea63c1a16e8ef6_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_cb7245fdd4d945f2bcea63c1a16e8ef6_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_cb7245fdd4d945f2bcea63c1a16e8ef6_List.find(self.name)
    bpy.context.scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List[index]

    return None

  @property
  def TextureWidthUI(self):
    index = bpy.context.scene.Simplygon_e9f5594d331546ef802731f7cc35531e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e9f5594d331546ef802731f7cc35531e_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_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_b88525500e74481aad1cfd97c3af8524_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b88525500e74481aad1cfd97c3af8524_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_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_ee1eb2a919b84b3d996f4d85115e4a91_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_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_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_925f86d5713c46fb82c9bb9a8983ee40_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_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_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_e9f5594d331546ef802731f7cc35531e_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    MultisamplingLevelUI = bpy.context.scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List.add()
    MultisamplingLevelUI.Init(self.name)
    MultisamplingLevelUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_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_e9f5594d331546ef802731f7cc35531e_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_b88525500e74481aad1cfd97c3af8524_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_ee1eb2a919b84b3d996f4d85115e4a91_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_925f86d5713c46fb82c9bb9a8983ee40_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_e9f5594d331546ef802731f7cc35531e_List.find(self.name)
    bpy.context.scene.Simplygon_e9f5594d331546ef802731f7cc35531e_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List.find(self.name)
    bpy.context.scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List.remove(TextureHeightUI_index)
    MultisamplingLevelUI_index = bpy.context.scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List.find(self.name)
    bpy.context.scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List.remove(MultisamplingLevelUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_List.find(self.name)
    bpy.context.scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List[index]

    return None

  @property
  def ChartAggregatorModeUI(self):
    index = bpy.context.scene.Simplygon_12c524753d9d462db791625f7678b9e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12c524753d9d462db791625f7678b9e6_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_fef7d49d90b746a09af7af99725e606f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fef7d49d90b746a09af7af99725e606f_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_cc5e3ce3283e4f809d42b0076b588e35_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_0702e40f7d8b4513b901b8ca4f62a2de_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_177b6c196e4a499d90e93a6dafeef360_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_2bdb06bd16524477a3ddea6b0bc9df62_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_7425f454f7d7452ca97e385605f195b3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7425f454f7d7452ca97e385605f195b3_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_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_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_12c524753d9d462db791625f7678b9e6_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    SurfaceAreaScaleUI = bpy.context.scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List.add()
    SurfaceAreaScaleUI.Init(self.name)
    SurfaceAreaScaleUI.name = self.name
    OriginalTexCoordLevelUI = bpy.context.scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List.add()
    OriginalTexCoordLevelUI.Init(self.name)
    OriginalTexCoordLevelUI.name = self.name
    OriginalTexCoordNameUI = bpy.context.scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List.add()
    OriginalTexCoordNameUI.Init(self.name)
    OriginalTexCoordNameUI.name = self.name
    SeparateOverlappingChartsUI = bpy.context.scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List.add()
    SeparateOverlappingChartsUI.Init(self.name)
    SeparateOverlappingChartsUI.name = self.name
    OriginalChartProportionsChannelUI = bpy.context.scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List.add()
    OriginalChartProportionsChannelUI.Init(self.name)
    OriginalChartProportionsChannelUI.name = self.name
    LockUVRotationUI = bpy.context.scene.Simplygon_7425f454f7d7452ca97e385605f195b3_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_12c524753d9d462db791625f7678b9e6_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_fef7d49d90b746a09af7af99725e606f_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_cc5e3ce3283e4f809d42b0076b588e35_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_0702e40f7d8b4513b901b8ca4f62a2de_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_177b6c196e4a499d90e93a6dafeef360_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_2bdb06bd16524477a3ddea6b0bc9df62_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_7425f454f7d7452ca97e385605f195b3_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_12c524753d9d462db791625f7678b9e6_List.find(self.name)
    bpy.context.scene.Simplygon_12c524753d9d462db791625f7678b9e6_List.remove(ChartAggregatorModeUI_index)
    SurfaceAreaScaleUI_index = bpy.context.scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List.find(self.name)
    bpy.context.scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List.remove(SurfaceAreaScaleUI_index)
    OriginalTexCoordLevelUI_index = bpy.context.scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List.find(self.name)
    bpy.context.scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List.remove(OriginalTexCoordLevelUI_index)
    OriginalTexCoordNameUI_index = bpy.context.scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List.find(self.name)
    bpy.context.scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List.remove(OriginalTexCoordNameUI_index)
    SeparateOverlappingChartsUI_index = bpy.context.scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List.find(self.name)
    bpy.context.scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List.remove(SeparateOverlappingChartsUI_index)
    OriginalChartProportionsChannelUI_index = bpy.context.scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List.find(self.name)
    bpy.context.scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List.remove(OriginalChartProportionsChannelUI_index)
    LockUVRotationUI_index = bpy.context.scene.Simplygon_7425f454f7d7452ca97e385605f195b3_List.find(self.name)
    bpy.context.scene.Simplygon_7425f454f7d7452ca97e385605f195b3_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List[index]

    return None

  @property
  def MaxStretchUI(self):
    index = bpy.context.scene.Simplygon_cb773b650dd341c2944806862007bfd6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cb773b650dd341c2944806862007bfd6_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_2378c68f0bf94636a15206135242c538_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_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_795c21a4422b42d5aafedcab3f7b1596_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_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_2378c68f0bf94636a15206135242c538_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_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_cb773b650dd341c2944806862007bfd6_List.add()
    MaxStretchUI.Init(self.name)
    MaxStretchUI.name = self.name
    LargeChartsImportanceUI = bpy.context.scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_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_cb773b650dd341c2944806862007bfd6_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_795c21a4422b42d5aafedcab3f7b1596_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_cb773b650dd341c2944806862007bfd6_List.find(self.name)
    bpy.context.scene.Simplygon_cb773b650dd341c2944806862007bfd6_List.remove(MaxStretchUI_index)
    LargeChartsImportanceUI_index = bpy.context.scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_List.find(self.name)
    bpy.context.scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_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_b2306ec831084863a1f7996679eb2c38_List.find(self.InputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List[index]

    return None

  OutputMaterialSettings_id: bpy.props.StringProperty()
  @property
  def OutputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.OutputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List[index]

    return None

  ChartAggregatorSettings_id: bpy.props.StringProperty()
  @property
  def ChartAggregatorSettings(self):
    index = bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.ChartAggregatorSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List[index]

    return None

  ParameterizerSettings_id: bpy.props.StringProperty()
  @property
  def ParameterizerSettings(self):
    index = bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.find(self.ParameterizerSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List[index]

    return None

  @property
  def GenerateMappingImageUI(self):
    index = bpy.context.scene.Simplygon_940808fbd692477d841bb3f7f100af6a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_940808fbd692477d841bb3f7f100af6a_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_790ea9d5a0844dabaf3e3ead38b4d7e7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_f0d5986a941c4869bff99504ba3a485d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_06323fa7b82f4712af93ede1d7467b80_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_8ceaf1f250964c9484f092bee7149146_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8ceaf1f250964c9484f092bee7149146_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_dc4ef4a5b0a440b085b70aff825c1d6f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_492e786486d7452082c29654ebc71d22_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_492e786486d7452082c29654ebc71d22_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_5339d2ade0724968bf8c63df97023e7a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_b780e5cfdb0f4c6dab55a7fe6a0a0720_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_cebb95dc0fbe486d836a7d5a8499b996_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_b31d1395b4c74e3492b93d4d59966df7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_b1aad01dbfc64d2784d4122aba64407f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_02daa099344548a697c7c165d1d48648_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_02daa099344548a697c7c165d1d48648_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_2e27ebeabaac4f1dbd1df3c7525ac01b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_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_a97e996253e8466e888be1b01d6e2e64_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_940808fbd692477d841bb3f7f100af6a_List.add()
    GenerateMappingImageUI.Init(self.name)
    GenerateMappingImageUI.name = self.name
    GenerateTexCoordsUI = bpy.context.scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List.add()
    GenerateTexCoordsUI.Init(self.name)
    GenerateTexCoordsUI.name = self.name
    GenerateTangentsUI = bpy.context.scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List.add()
    GenerateTangentsUI.Init(self.name)
    GenerateTangentsUI.name = self.name
    UseFullRetexturingUI = bpy.context.scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List.add()
    UseFullRetexturingUI.Init(self.name)
    UseFullRetexturingUI.name = self.name
    ApplyNewMaterialIdsUI = bpy.context.scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List.add()
    ApplyNewMaterialIdsUI.Init(self.name)
    ApplyNewMaterialIdsUI.name = self.name
    UseAutomaticTextureSizeUI = bpy.context.scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List.add()
    UseAutomaticTextureSizeUI.Init(self.name)
    UseAutomaticTextureSizeUI.name = self.name
    AutomaticTextureSizeMultiplierUI = bpy.context.scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List.add()
    AutomaticTextureSizeMultiplierUI.Init(self.name)
    AutomaticTextureSizeMultiplierUI.name = self.name
    ForcePower2TextureUI = bpy.context.scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List.add()
    ForcePower2TextureUI.Init(self.name)
    ForcePower2TextureUI.name = self.name
    OnlyParameterizeInvalidUVsUI = bpy.context.scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List.add()
    OnlyParameterizeInvalidUVsUI.Init(self.name)
    OnlyParameterizeInvalidUVsUI.name = self.name
    AllowTransparencyMappingUI = bpy.context.scene.Simplygon_492e786486d7452082c29654ebc71d22_List.add()
    AllowTransparencyMappingUI.Init(self.name)
    AllowTransparencyMappingUI.name = self.name
    MaximumLayersUI = bpy.context.scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List.add()
    MaximumLayersUI.Init(self.name)
    MaximumLayersUI.name = self.name
    TexCoordLevelUI = bpy.context.scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List.add()
    TexCoordLevelUI.Init(self.name)
    TexCoordLevelUI.name = self.name
    TexCoordNameUI = bpy.context.scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List.add()
    TexCoordNameUI.Init(self.name)
    TexCoordNameUI.name = self.name
    TexCoordGeneratorTypeUI = bpy.context.scene.Simplygon_02daa099344548a697c7c165d1d48648_List.add()
    TexCoordGeneratorTypeUI.Init(self.name)
    TexCoordGeneratorTypeUI.name = self.name
    ChartAggregatorSettings = bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.add()
    ChartAggregatorSettings.Init(self.name)
    self.ChartAggregatorSettings_id = ChartAggregatorSettings.name
    ParameterizerSettings = bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.add()
    ParameterizerSettings.Init(self.name)
    self.ParameterizerSettings_id = ParameterizerSettings.name
    InputMaterialSettings = bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List.add()
    InputMaterialSettings.Init(self.name)
    self.InputMaterialSettings_id = InputMaterialSettings.name
    OutputMaterialSettings = bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_940808fbd692477d841bb3f7f100af6a_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_790ea9d5a0844dabaf3e3ead38b4d7e7_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_f0d5986a941c4869bff99504ba3a485d_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_8ceaf1f250964c9484f092bee7149146_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_dc4ef4a5b0a440b085b70aff825c1d6f_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_cebb95dc0fbe486d836a7d5a8499b996_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_b31d1395b4c74e3492b93d4d59966df7_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_b1aad01dbfc64d2784d4122aba64407f_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_2e27ebeabaac4f1dbd1df3c7525ac01b_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_492e786486d7452082c29654ebc71d22_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_06323fa7b82f4712af93ede1d7467b80_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_5339d2ade0724968bf8c63df97023e7a_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_b780e5cfdb0f4c6dab55a7fe6a0a0720_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_02daa099344548a697c7c165d1d48648_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_db2b212c3d5f44118acd5cf6bc91c17c_List.add()
      ChartAggregatorSettings.InitJson(self.name, jsonData['ChartAggregatorSettings'])
      self.ChartAggregatorSettings_id = ChartAggregatorSettings.name

    if jsonData['ParameterizerSettings'] is not None:
      ParameterizerSettings = bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_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_b2306ec831084863a1f7996679eb2c38_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_93f40d6d1c6e47e9ac1e98a4bdabb612_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_940808fbd692477d841bb3f7f100af6a_List.find(self.name)
    bpy.context.scene.Simplygon_940808fbd692477d841bb3f7f100af6a_List.remove(GenerateMappingImageUI_index)
    GenerateTexCoordsUI_index = bpy.context.scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List.find(self.name)
    bpy.context.scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List.remove(GenerateTexCoordsUI_index)
    GenerateTangentsUI_index = bpy.context.scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List.find(self.name)
    bpy.context.scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List.remove(GenerateTangentsUI_index)
    UseFullRetexturingUI_index = bpy.context.scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List.find(self.name)
    bpy.context.scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List.remove(UseFullRetexturingUI_index)
    ApplyNewMaterialIdsUI_index = bpy.context.scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List.find(self.name)
    bpy.context.scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List.remove(ApplyNewMaterialIdsUI_index)
    UseAutomaticTextureSizeUI_index = bpy.context.scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List.find(self.name)
    bpy.context.scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List.remove(UseAutomaticTextureSizeUI_index)
    AutomaticTextureSizeMultiplierUI_index = bpy.context.scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List.find(self.name)
    bpy.context.scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List.remove(AutomaticTextureSizeMultiplierUI_index)
    ForcePower2TextureUI_index = bpy.context.scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List.find(self.name)
    bpy.context.scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List.remove(ForcePower2TextureUI_index)
    OnlyParameterizeInvalidUVsUI_index = bpy.context.scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List.find(self.name)
    bpy.context.scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List.remove(OnlyParameterizeInvalidUVsUI_index)
    AllowTransparencyMappingUI_index = bpy.context.scene.Simplygon_492e786486d7452082c29654ebc71d22_List.find(self.name)
    bpy.context.scene.Simplygon_492e786486d7452082c29654ebc71d22_List.remove(AllowTransparencyMappingUI_index)
    MaximumLayersUI_index = bpy.context.scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List.find(self.name)
    bpy.context.scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List.remove(MaximumLayersUI_index)
    TexCoordLevelUI_index = bpy.context.scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List.find(self.name)
    bpy.context.scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List.remove(TexCoordLevelUI_index)
    TexCoordNameUI_index = bpy.context.scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List.find(self.name)
    bpy.context.scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List.remove(TexCoordNameUI_index)
    TexCoordGeneratorTypeUI_index = bpy.context.scene.Simplygon_02daa099344548a697c7c165d1d48648_List.find(self.name)
    bpy.context.scene.Simplygon_02daa099344548a697c7c165d1d48648_List.remove(TexCoordGeneratorTypeUI_index)
    ChartAggregatorSettings_index = bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.ChartAggregatorSettings_id)
    bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.remove(ChartAggregatorSettings_index)
    ParameterizerSettings_index = bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.find(self.ParameterizerSettings_id)
    bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.remove(ParameterizerSettings_index)
    InputMaterialSettings_index = bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List.find(self.InputMaterialSettings_id)
    bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List.remove(InputMaterialSettings_index)
    OutputMaterialSettings_index = bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.OutputMaterialSettings_id)
    bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_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_6fca3ae71a044031942a0368a81a0a39_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6fca3ae71a044031942a0368a81a0a39_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_7e6f83eed81e415f8e35c420793d1435_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_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_6fca3ae71a044031942a0368a81a0a39_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_6fca3ae71a044031942a0368a81a0a39_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_6fca3ae71a044031942a0368a81a0a39_List.find(self.name)
    bpy.context.scene.Simplygon_6fca3ae71a044031942a0368a81a0a39_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_121d6d0e38a44c4a9dfd908fa60db8cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_121d6d0e38a44c4a9dfd908fa60db8cf_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_d29f50b4569840ed8f8ac4825f0125a7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_e0ff7d24a37942d28a698d22dd88acf7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_0b7f7cbadf85454abaaf4cbce22a1186_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_22339b313f5c40f28bc0e10930a6f3f0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_2e2ca92733c54a31b6aa02d838ae35ed_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_e59494b82a6b45eb9f10c9774f5c8f76_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_84067fe459334187a2a61986355eb870_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_84067fe459334187a2a61986355eb870_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_e673b3ccfac2472bb4a69f7ff1f33bfc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_c356cf677f614104a4b0bad6411d4ddc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_e8671d10922c49debbf49800b96e72ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e8671d10922c49debbf49800b96e72ec_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_466c176a9ee8446b9a364a6d49eb4f28_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_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_2fb6435a021c471199d7f44cb20a45c7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_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_121d6d0e38a44c4a9dfd908fa60db8cf_List.add()
    RemeshingModeManualPositionZUI.Init(self.name)
    RemeshingModeManualPositionZUI.name = self.name
    RemeshingModeManualPositionYUI = bpy.context.scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List.add()
    RemeshingModeManualPositionYUI.Init(self.name)
    RemeshingModeManualPositionYUI.name = self.name
    RemeshingModeManualPositionXUI = bpy.context.scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List.add()
    RemeshingModeManualPositionXUI.Init(self.name)
    RemeshingModeManualPositionXUI.name = self.name
    OnScreenSizeUI = bpy.context.scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    HoleFillingUI = bpy.context.scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List.add()
    HoleFillingUI.Init(self.name)
    HoleFillingUI.name = self.name
    RemeshingModeUI = bpy.context.scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List.add()
    RemeshingModeUI.Init(self.name)
    RemeshingModeUI.name = self.name
    SurfaceTransferModeUI = bpy.context.scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List.add()
    SurfaceTransferModeUI.Init(self.name)
    SurfaceTransferModeUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_84067fe459334187a2a61986355eb870_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    TransferNormalsUI = bpy.context.scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List.add()
    TransferNormalsUI.Init(self.name)
    TransferNormalsUI.name = self.name
    TransferColorsUI = bpy.context.scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List.add()
    TransferColorsUI.Init(self.name)
    TransferColorsUI.name = self.name
    ForceSoftEdgesWithinTextureChartsUI = bpy.context.scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List.add()
    ForceSoftEdgesWithinTextureChartsUI.Init(self.name)
    ForceSoftEdgesWithinTextureChartsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_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_121d6d0e38a44c4a9dfd908fa60db8cf_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_d29f50b4569840ed8f8ac4825f0125a7_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_e0ff7d24a37942d28a698d22dd88acf7_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_0b7f7cbadf85454abaaf4cbce22a1186_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_22339b313f5c40f28bc0e10930a6f3f0_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_2e2ca92733c54a31b6aa02d838ae35ed_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_e59494b82a6b45eb9f10c9774f5c8f76_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_84067fe459334187a2a61986355eb870_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_c356cf677f614104a4b0bad6411d4ddc_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_e8671d10922c49debbf49800b96e72ec_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_e673b3ccfac2472bb4a69f7ff1f33bfc_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_466c176a9ee8446b9a364a6d49eb4f28_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_121d6d0e38a44c4a9dfd908fa60db8cf_List.find(self.name)
    bpy.context.scene.Simplygon_121d6d0e38a44c4a9dfd908fa60db8cf_List.remove(RemeshingModeManualPositionZUI_index)
    RemeshingModeManualPositionYUI_index = bpy.context.scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List.find(self.name)
    bpy.context.scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List.remove(RemeshingModeManualPositionYUI_index)
    RemeshingModeManualPositionXUI_index = bpy.context.scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List.find(self.name)
    bpy.context.scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List.remove(RemeshingModeManualPositionXUI_index)
    OnScreenSizeUI_index = bpy.context.scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List.find(self.name)
    bpy.context.scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List.remove(OnScreenSizeUI_index)
    HoleFillingUI_index = bpy.context.scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List.find(self.name)
    bpy.context.scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List.remove(HoleFillingUI_index)
    RemeshingModeUI_index = bpy.context.scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List.find(self.name)
    bpy.context.scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List.remove(RemeshingModeUI_index)
    SurfaceTransferModeUI_index = bpy.context.scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List.find(self.name)
    bpy.context.scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List.remove(SurfaceTransferModeUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_84067fe459334187a2a61986355eb870_List.find(self.name)
    bpy.context.scene.Simplygon_84067fe459334187a2a61986355eb870_List.remove(HardEdgeAngleUI_index)
    TransferNormalsUI_index = bpy.context.scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List.find(self.name)
    bpy.context.scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List.remove(TransferNormalsUI_index)
    TransferColorsUI_index = bpy.context.scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List.find(self.name)
    bpy.context.scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List.remove(TransferColorsUI_index)
    ForceSoftEdgesWithinTextureChartsUI_index = bpy.context.scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List.find(self.name)
    bpy.context.scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List.remove(ForceSoftEdgesWithinTextureChartsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_List.find(self.name)
    bpy.context.scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_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_bb2a582f5a4347319256845fac7294ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bb2a582f5a4347319256845fac7294ec_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_1a64da47aa7f44b68f8442886826dc05_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_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_29d61deec1664fedaf3f0a85612f1072_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_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_1a64da47aa7f44b68f8442886826dc05_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_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_bb2a582f5a4347319256845fac7294ec_List.add()
    UseClippingGeometryUI.Init(self.name)
    UseClippingGeometryUI.name = self.name
    ClippingGeometrySelectionSetNameUI = bpy.context.scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_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_bb2a582f5a4347319256845fac7294ec_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_29d61deec1664fedaf3f0a85612f1072_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_bb2a582f5a4347319256845fac7294ec_List.find(self.name)
    bpy.context.scene.Simplygon_bb2a582f5a4347319256845fac7294ec_List.remove(UseClippingGeometryUI_index)
    ClippingGeometrySelectionSetNameUI_index = bpy.context.scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_List.find(self.name)
    bpy.context.scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_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_814855cb16434c1eb9ba4ce5f5bca63a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_814855cb16434c1eb9ba4ce5f5bca63a_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_5ed0eb55b676443e815be0a0ca62c570_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_16b372584d6d47c79c7a4953abbdaab3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_f8fac606a13b4867999e37850d419960_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f8fac606a13b4867999e37850d419960_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_0730bfc1fa6b46f39f7360edc41a3a88_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_776e7f08edbe4a8682d5ff74f00dd395_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_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_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_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_814855cb16434c1eb9ba4ce5f5bca63a_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    EnableGeometryCullingUI = bpy.context.scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List.add()
    EnableGeometryCullingUI.Init(self.name)
    EnableGeometryCullingUI.name = self.name
    GeometryCullingPrecisionUI = bpy.context.scene.Simplygon_f8fac606a13b4867999e37850d419960_List.add()
    GeometryCullingPrecisionUI.Init(self.name)
    GeometryCullingPrecisionUI.name = self.name
    SubdivideGeometryBasedOnUVTilesUI = bpy.context.scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List.add()
    SubdivideGeometryBasedOnUVTilesUI.Init(self.name)
    SubdivideGeometryBasedOnUVTilesUI.name = self.name
    SubdivisionTileSizeUI = bpy.context.scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List.add()
    SubdivisionTileSizeUI.Init(self.name)
    SubdivisionTileSizeUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_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_814855cb16434c1eb9ba4ce5f5bca63a_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_16b372584d6d47c79c7a4953abbdaab3_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_f8fac606a13b4867999e37850d419960_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_0730bfc1fa6b46f39f7360edc41a3a88_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_776e7f08edbe4a8682d5ff74f00dd395_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_5ed0eb55b676443e815be0a0ca62c570_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_814855cb16434c1eb9ba4ce5f5bca63a_List.find(self.name)
    bpy.context.scene.Simplygon_814855cb16434c1eb9ba4ce5f5bca63a_List.remove(MergeGeometriesUI_index)
    EnableGeometryCullingUI_index = bpy.context.scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List.find(self.name)
    bpy.context.scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List.remove(EnableGeometryCullingUI_index)
    GeometryCullingPrecisionUI_index = bpy.context.scene.Simplygon_f8fac606a13b4867999e37850d419960_List.find(self.name)
    bpy.context.scene.Simplygon_f8fac606a13b4867999e37850d419960_List.remove(GeometryCullingPrecisionUI_index)
    SubdivideGeometryBasedOnUVTilesUI_index = bpy.context.scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List.find(self.name)
    bpy.context.scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List.remove(SubdivideGeometryBasedOnUVTilesUI_index)
    SubdivisionTileSizeUI_index = bpy.context.scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List.find(self.name)
    bpy.context.scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List.remove(SubdivisionTileSizeUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_List.find(self.name)
    bpy.context.scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_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_bf5d959226dc44c6ab20cf6229591cf2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bf5d959226dc44c6ab20cf6229591cf2_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_9a254cc17d534473a2322db7795e4e52_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9a254cc17d534473a2322db7795e4e52_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_998e5e576cf648d592f6ffa9e26b4077_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_61a04a919b0844bf9ae4f87eda08b240_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_ac0e8bec6cd34e16b22fefe8ec3b06c9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_195420bbc27c493584690e0b02e1832d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_195420bbc27c493584690e0b02e1832d_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_abb6850b72f34cf0b6f552a4d9687733_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_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_72ef0df0801945b1bf50b84293212f92_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_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_bf5d959226dc44c6ab20cf6229591cf2_List.add()
    GenerateLightmapTexCoordUI.Init(self.name)
    GenerateLightmapTexCoordUI.name = self.name
    LightmapTexCoordLevelUI = bpy.context.scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List.add()
    LightmapTexCoordLevelUI.Init(self.name)
    LightmapTexCoordLevelUI.name = self.name
    LightmapTexCoordNameUI = bpy.context.scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List.add()
    LightmapTexCoordNameUI.Init(self.name)
    LightmapTexCoordNameUI.name = self.name
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    TextureWidthUI = bpy.context.scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_195420bbc27c493584690e0b02e1832d_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_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_bf5d959226dc44c6ab20cf6229591cf2_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_9a254cc17d534473a2322db7795e4e52_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_998e5e576cf648d592f6ffa9e26b4077_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_61a04a919b0844bf9ae4f87eda08b240_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_ac0e8bec6cd34e16b22fefe8ec3b06c9_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_195420bbc27c493584690e0b02e1832d_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_abb6850b72f34cf0b6f552a4d9687733_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_bf5d959226dc44c6ab20cf6229591cf2_List.find(self.name)
    bpy.context.scene.Simplygon_bf5d959226dc44c6ab20cf6229591cf2_List.remove(GenerateLightmapTexCoordUI_index)
    LightmapTexCoordLevelUI_index = bpy.context.scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List.find(self.name)
    bpy.context.scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List.remove(LightmapTexCoordLevelUI_index)
    LightmapTexCoordNameUI_index = bpy.context.scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List.find(self.name)
    bpy.context.scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List.remove(LightmapTexCoordNameUI_index)
    ChartAggregatorModeUI_index = bpy.context.scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List.find(self.name)
    bpy.context.scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List.remove(ChartAggregatorModeUI_index)
    TextureWidthUI_index = bpy.context.scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List.find(self.name)
    bpy.context.scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_195420bbc27c493584690e0b02e1832d_List.find(self.name)
    bpy.context.scene.Simplygon_195420bbc27c493584690e0b02e1832d_List.remove(TextureHeightUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_List.find(self.name)
    bpy.context.scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List[index]

    return None

  @property
  def SeparateTrunkAndFoliageUI(self):
    index = bpy.context.scene.Simplygon_5756458a8700406980a7d48746b7d199_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5756458a8700406980a7d48746b7d199_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_239af4cc6e3341e89a97b9372929e959_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_239af4cc6e3341e89a97b9372929e959_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_326ad3e5d6b2460fac848bbc5ab68c9a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_4134a231ac62402e97fb0089e0f85c04_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_677df482374b4807b3fe471b00c9c553_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_677df482374b4807b3fe471b00c9c553_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_32c4343ddddf4bbfb8a12f3379656e09_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_5756458a8700406980a7d48746b7d199_List.add()
    SeparateTrunkAndFoliageUI.Init(self.name)
    SeparateTrunkAndFoliageUI.name = self.name
    SeparateFoliageTriangleRatioUI = bpy.context.scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List.add()
    SeparateFoliageTriangleRatioUI.Init(self.name)
    SeparateFoliageTriangleRatioUI.name = self.name
    SeparateFoliageTriangleThresholdUI = bpy.context.scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List.add()
    SeparateFoliageTriangleThresholdUI.Init(self.name)
    SeparateFoliageTriangleThresholdUI.name = self.name
    SeparateFoliageAreaThresholdUI = bpy.context.scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List.add()
    SeparateFoliageAreaThresholdUI.Init(self.name)
    SeparateFoliageAreaThresholdUI.name = self.name
    SeparateFoliageSizeThresholdUI = bpy.context.scene.Simplygon_677df482374b4807b3fe471b00c9c553_List.add()
    SeparateFoliageSizeThresholdUI.Init(self.name)
    SeparateFoliageSizeThresholdUI.name = self.name
    TrunkReductionRatioUI = bpy.context.scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_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_5756458a8700406980a7d48746b7d199_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_239af4cc6e3341e89a97b9372929e959_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_326ad3e5d6b2460fac848bbc5ab68c9a_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_4134a231ac62402e97fb0089e0f85c04_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_677df482374b4807b3fe471b00c9c553_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_32c4343ddddf4bbfb8a12f3379656e09_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_5756458a8700406980a7d48746b7d199_List.find(self.name)
    bpy.context.scene.Simplygon_5756458a8700406980a7d48746b7d199_List.remove(SeparateTrunkAndFoliageUI_index)
    SeparateFoliageTriangleRatioUI_index = bpy.context.scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List.find(self.name)
    bpy.context.scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List.remove(SeparateFoliageTriangleRatioUI_index)
    SeparateFoliageTriangleThresholdUI_index = bpy.context.scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List.find(self.name)
    bpy.context.scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List.remove(SeparateFoliageTriangleThresholdUI_index)
    SeparateFoliageAreaThresholdUI_index = bpy.context.scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List.find(self.name)
    bpy.context.scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List.remove(SeparateFoliageAreaThresholdUI_index)
    SeparateFoliageSizeThresholdUI_index = bpy.context.scene.Simplygon_677df482374b4807b3fe471b00c9c553_List.find(self.name)
    bpy.context.scene.Simplygon_677df482374b4807b3fe471b00c9c553_List.remove(SeparateFoliageSizeThresholdUI_index)
    TrunkReductionRatioUI_index = bpy.context.scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_List.find(self.name)
    bpy.context.scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_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_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.FoliageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List[index]

    return None

  @property
  def BillboardModeUI(self):
    index = bpy.context.scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_addd218de8834e57a3ac30de5e7b75f3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_0e8aef207f014034abecb465aa4a0d9a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_8652507465b04a899809bf5afee40532_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8652507465b04a899809bf5afee40532_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_5c450331bf93404d90ccf019bd3aa78e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_a6a273f7526746e2866274c9d5489f78_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a6a273f7526746e2866274c9d5489f78_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_5b1a8ae9de7948618cf7fa4472857107_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_d5b6093ec7c042639e34fdad84e7663a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_f722d455be544713abbc00004971eab2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f722d455be544713abbc00004971eab2_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_b03bbd2b09454bc08e118ade12db0bfc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_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_9f3178091fc341f6bd04fb82d42ac545_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_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_c926ef9a6e52494db0e73bae6f709918_List.add()
    BillboardModeUI.Init(self.name)
    BillboardModeUI.name = self.name
    FavorVerticalPlanesUI = bpy.context.scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List.add()
    FavorVerticalPlanesUI.Init(self.name)
    FavorVerticalPlanesUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    UseVisibilityWeightsUI = bpy.context.scene.Simplygon_8652507465b04a899809bf5afee40532_List.add()
    UseVisibilityWeightsUI.Init(self.name)
    UseVisibilityWeightsUI.name = self.name
    BillboardDensityUI = bpy.context.scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List.add()
    BillboardDensityUI.Init(self.name)
    BillboardDensityUI.name = self.name
    MaxPlaneCountUI = bpy.context.scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List.add()
    MaxPlaneCountUI.Init(self.name)
    MaxPlaneCountUI.name = self.name
    GeometricComplexityUI = bpy.context.scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List.add()
    GeometricComplexityUI.Init(self.name)
    GeometricComplexityUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_f722d455be544713abbc00004971eab2_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List.add()
    UpVectorZUI.Init(self.name)
    UpVectorZUI.name = self.name
    FoliageSettings = bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_c926ef9a6e52494db0e73bae6f709918_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_addd218de8834e57a3ac30de5e7b75f3_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_0e8aef207f014034abecb465aa4a0d9a_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_8652507465b04a899809bf5afee40532_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_5c450331bf93404d90ccf019bd3aa78e_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_a6a273f7526746e2866274c9d5489f78_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_5b1a8ae9de7948618cf7fa4472857107_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_d5b6093ec7c042639e34fdad84e7663a_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_f722d455be544713abbc00004971eab2_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_b03bbd2b09454bc08e118ade12db0bfc_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_88e8b41b56d346499fea03d8a91c6cc6_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_c926ef9a6e52494db0e73bae6f709918_List.find(self.name)
    bpy.context.scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_List.remove(BillboardModeUI_index)
    FavorVerticalPlanesUI_index = bpy.context.scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List.find(self.name)
    bpy.context.scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List.remove(FavorVerticalPlanesUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List.find(self.name)
    bpy.context.scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List.remove(TwoSidedUI_index)
    UseVisibilityWeightsUI_index = bpy.context.scene.Simplygon_8652507465b04a899809bf5afee40532_List.find(self.name)
    bpy.context.scene.Simplygon_8652507465b04a899809bf5afee40532_List.remove(UseVisibilityWeightsUI_index)
    BillboardDensityUI_index = bpy.context.scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List.find(self.name)
    bpy.context.scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List.remove(BillboardDensityUI_index)
    MaxPlaneCountUI_index = bpy.context.scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List.find(self.name)
    bpy.context.scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List.remove(MaxPlaneCountUI_index)
    GeometricComplexityUI_index = bpy.context.scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List.find(self.name)
    bpy.context.scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List.remove(GeometricComplexityUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List.find(self.name)
    bpy.context.scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_f722d455be544713abbc00004971eab2_List.find(self.name)
    bpy.context.scene.Simplygon_f722d455be544713abbc00004971eab2_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List.find(self.name)
    bpy.context.scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List.remove(UpVectorZUI_index)
    FoliageSettings_index = bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.FoliageSettings_id)
    bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_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_9aa1f4afbe894b4c9e8e2de0527a0d32_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9aa1f4afbe894b4c9e8e2de0527a0d32_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_e9af005625eb443b97a3267ee05f9a9e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_1639ae510e2345289ed3be21e9f32601_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1639ae510e2345289ed3be21e9f32601_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_47c949cf795c4949bab299088c7e06cc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_47c949cf795c4949bab299088c7e06cc_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_12344274dbb345adb8cadf1355d0c584_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12344274dbb345adb8cadf1355d0c584_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_61d865c61b5b415da4aa5dac0df18a75_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_c853cfea58124ba7b608d936439a2518_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c853cfea58124ba7b608d936439a2518_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_170d3696bb644181b6dbce0f02ab5d81_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_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_9aa1f4afbe894b4c9e8e2de0527a0d32_List.add()
    NumberOfViewsUI.Init(self.name)
    NumberOfViewsUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_c853cfea58124ba7b608d936439a2518_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_9aa1f4afbe894b4c9e8e2de0527a0d32_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_e9af005625eb443b97a3267ee05f9a9e_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_1639ae510e2345289ed3be21e9f32601_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_47c949cf795c4949bab299088c7e06cc_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_12344274dbb345adb8cadf1355d0c584_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_61d865c61b5b415da4aa5dac0df18a75_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_c853cfea58124ba7b608d936439a2518_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_9aa1f4afbe894b4c9e8e2de0527a0d32_List.find(self.name)
    bpy.context.scene.Simplygon_9aa1f4afbe894b4c9e8e2de0527a0d32_List.remove(NumberOfViewsUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List.find(self.name)
    bpy.context.scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List.find(self.name)
    bpy.context.scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List.find(self.name)
    bpy.context.scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List.remove(ViewDirectionZUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List.find(self.name)
    bpy.context.scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List.find(self.name)
    bpy.context.scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_c853cfea58124ba7b608d936439a2518_List.find(self.name)
    bpy.context.scene.Simplygon_c853cfea58124ba7b608d936439a2518_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_6df6e643bd9d43c388071cabbee126af_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6df6e643bd9d43c388071cabbee126af_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_f6030a8090af41b1ba80e7509b51fb5a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_71a84f9667554413a8a44b625bdc592b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_71a84f9667554413a8a44b625bdc592b_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_d747956bad3944818273b2cffe1c3ec4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_c83524828a8b4d46afa4d3a456041344_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c83524828a8b4d46afa4d3a456041344_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_43f788e21471401ab85e27c3a72d8517_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_43f788e21471401ab85e27c3a72d8517_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_e237565689074e43bddd3cb21f34aefb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e237565689074e43bddd3cb21f34aefb_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_4f0fcb2c189a4f40afea192d62e56477_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_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_6df6e643bd9d43c388071cabbee126af_List.add()
    UseTightFittingUI.Init(self.name)
    UseTightFittingUI.name = self.name
    TightFittingDepthOffsetUI = bpy.context.scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List.add()
    TightFittingDepthOffsetUI.Init(self.name)
    TightFittingDepthOffsetUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    TexCoordPaddingUI = bpy.context.scene.Simplygon_e237565689074e43bddd3cb21f34aefb_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_6df6e643bd9d43c388071cabbee126af_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_f6030a8090af41b1ba80e7509b51fb5a_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_71a84f9667554413a8a44b625bdc592b_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_d747956bad3944818273b2cffe1c3ec4_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_c83524828a8b4d46afa4d3a456041344_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_43f788e21471401ab85e27c3a72d8517_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_e237565689074e43bddd3cb21f34aefb_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_6df6e643bd9d43c388071cabbee126af_List.find(self.name)
    bpy.context.scene.Simplygon_6df6e643bd9d43c388071cabbee126af_List.remove(UseTightFittingUI_index)
    TightFittingDepthOffsetUI_index = bpy.context.scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List.find(self.name)
    bpy.context.scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List.remove(TightFittingDepthOffsetUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List.find(self.name)
    bpy.context.scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List.remove(TwoSidedUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List.find(self.name)
    bpy.context.scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List.find(self.name)
    bpy.context.scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List.find(self.name)
    bpy.context.scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List.remove(ViewDirectionZUI_index)
    TexCoordPaddingUI_index = bpy.context.scene.Simplygon_e237565689074e43bddd3cb21f34aefb_List.find(self.name)
    bpy.context.scene.Simplygon_e237565689074e43bddd3cb21f34aefb_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_353ef644c1414e39a13c4ac7d460a3e2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_353ef644c1414e39a13c4ac7d460a3e2_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_80300edce7834ddda48ba1104593d297_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_80300edce7834ddda48ba1104593d297_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_b085a9fef24845f4bab3348feb1f6166_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_d52296aefba24645b58be1227496416e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d52296aefba24645b58be1227496416e_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_09006e413dd34826b9aae4979b17e706_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_09006e413dd34826b9aae4979b17e706_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_e76d42138b2f439d8ef513a40a42012b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_41a13694eae94b15a4a152234f57c113_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_41a13694eae94b15a4a152234f57c113_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_d38367a66547400c89422cae4cc6956e_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_353ef644c1414e39a13c4ac7d460a3e2_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    OnScreenErrorToleranceUI = bpy.context.scene.Simplygon_80300edce7834ddda48ba1104593d297_List.add()
    OnScreenErrorToleranceUI.Init(self.name)
    OnScreenErrorToleranceUI.name = self.name
    InvertOutputMeshUI = bpy.context.scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List.add()
    InvertOutputMeshUI.Init(self.name)
    InvertOutputMeshUI.name = self.name
    TransferSkinningUI = bpy.context.scene.Simplygon_d52296aefba24645b58be1227496416e_List.add()
    TransferSkinningUI.Init(self.name)
    TransferSkinningUI.name = self.name
    UseCamerasUI = bpy.context.scene.Simplygon_09006e413dd34826b9aae4979b17e706_List.add()
    UseCamerasUI.Init(self.name)
    UseCamerasUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OcclusionModeUI = bpy.context.scene.Simplygon_41a13694eae94b15a4a152234f57c113_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_353ef644c1414e39a13c4ac7d460a3e2_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_80300edce7834ddda48ba1104593d297_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_b085a9fef24845f4bab3348feb1f6166_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_d52296aefba24645b58be1227496416e_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_09006e413dd34826b9aae4979b17e706_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_e76d42138b2f439d8ef513a40a42012b_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_41a13694eae94b15a4a152234f57c113_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_353ef644c1414e39a13c4ac7d460a3e2_List.find(self.name)
    bpy.context.scene.Simplygon_353ef644c1414e39a13c4ac7d460a3e2_List.remove(OnScreenSizeUI_index)
    OnScreenErrorToleranceUI_index = bpy.context.scene.Simplygon_80300edce7834ddda48ba1104593d297_List.find(self.name)
    bpy.context.scene.Simplygon_80300edce7834ddda48ba1104593d297_List.remove(OnScreenErrorToleranceUI_index)
    InvertOutputMeshUI_index = bpy.context.scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List.find(self.name)
    bpy.context.scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List.remove(InvertOutputMeshUI_index)
    TransferSkinningUI_index = bpy.context.scene.Simplygon_d52296aefba24645b58be1227496416e_List.find(self.name)
    bpy.context.scene.Simplygon_d52296aefba24645b58be1227496416e_List.remove(TransferSkinningUI_index)
    UseCamerasUI_index = bpy.context.scene.Simplygon_09006e413dd34826b9aae4979b17e706_List.find(self.name)
    bpy.context.scene.Simplygon_09006e413dd34826b9aae4979b17e706_List.remove(UseCamerasUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List.find(self.name)
    bpy.context.scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List.remove(CameraSelectionSetNameUI_index)
    OcclusionModeUI_index = bpy.context.scene.Simplygon_41a13694eae94b15a4a152234f57c113_List.find(self.name)
    bpy.context.scene.Simplygon_41a13694eae94b15a4a152234f57c113_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_475357d1738a44eead0e8bac56cc6f4a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_475357d1738a44eead0e8bac56cc6f4a_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_2bcd2f87403b49c98ea415cca3714286_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_04061333add241b49cddd073bcb6e870_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_04061333add241b49cddd073bcb6e870_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_c80fe05c9ffa4e6788afaebdfe144444_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_f2fa6ecd7947429b93e9d4dc2dbe3160_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_d4bacde7e0584b179a17459abda51db9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d4bacde7e0584b179a17459abda51db9_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_5fa150b9af33438ca0b0caf6dcd24be3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_b2a12266952b4954b0f833123b2f3824_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_7e87581ce747499885b263dad0d41797_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e87581ce747499885b263dad0d41797_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_152e1778720241f48f67d2eb1f3ad3b9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_3488bd3c6a26418ea6f333526aa53f95_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_0f0c296b6e9243c1a9d6db60a51dab52_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_10859959d6db48ffa381312dbda46ffd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_10859959d6db48ffa381312dbda46ffd_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_06a7c681195043b9adbac3ab587524a6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_06a7c681195043b9adbac3ab587524a6_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_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_475357d1738a44eead0e8bac56cc6f4a_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_04061333add241b49cddd073bcb6e870_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_7e87581ce747499885b263dad0d41797_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    BakeOpacityInAlphaUI = bpy.context.scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List.add()
    BakeOpacityInAlphaUI.Init(self.name)
    BakeOpacityInAlphaUI.name = self.name
    SkipCastingIfNoInputChannelUI = bpy.context.scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List.add()
    SkipCastingIfNoInputChannelUI.Init(self.name)
    SkipCastingIfNoInputChannelUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_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_475357d1738a44eead0e8bac56cc6f4a_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_2bcd2f87403b49c98ea415cca3714286_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_f2fa6ecd7947429b93e9d4dc2dbe3160_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_04061333add241b49cddd073bcb6e870_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_c80fe05c9ffa4e6788afaebdfe144444_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_152e1778720241f48f67d2eb1f3ad3b9_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_d4bacde7e0584b179a17459abda51db9_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_0f0c296b6e9243c1a9d6db60a51dab52_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_06a7c681195043b9adbac3ab587524a6_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_b2a12266952b4954b0f833123b2f3824_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_7e87581ce747499885b263dad0d41797_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_5fa150b9af33438ca0b0caf6dcd24be3_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_10859959d6db48ffa381312dbda46ffd_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_3488bd3c6a26418ea6f333526aa53f95_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_475357d1738a44eead0e8bac56cc6f4a_List.find(self.name)
    bpy.context.scene.Simplygon_475357d1738a44eead0e8bac56cc6f4a_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List.find(self.name)
    bpy.context.scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List.find(self.name)
    bpy.context.scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_04061333add241b49cddd073bcb6e870_List.find(self.name)
    bpy.context.scene.Simplygon_04061333add241b49cddd073bcb6e870_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List.find(self.name)
    bpy.context.scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List.find(self.name)
    bpy.context.scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List.find(self.name)
    bpy.context.scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List.find(self.name)
    bpy.context.scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List.remove(OutputPixelFormatUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List.find(self.name)
    bpy.context.scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List.remove(OutputSRGBUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List.find(self.name)
    bpy.context.scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_7e87581ce747499885b263dad0d41797_List.find(self.name)
    bpy.context.scene.Simplygon_7e87581ce747499885b263dad0d41797_List.remove(OutputDDSCompressionTypeUI_index)
    BakeOpacityInAlphaUI_index = bpy.context.scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List.find(self.name)
    bpy.context.scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List.remove(BakeOpacityInAlphaUI_index)
    SkipCastingIfNoInputChannelUI_index = bpy.context.scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List.find(self.name)
    bpy.context.scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List.remove(SkipCastingIfNoInputChannelUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_List.find(self.name)
    bpy.context.scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_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_52cbbffdfd98405a8a3a62a3fc3b8a01_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_52cbbffdfd98405a8a3a62a3fc3b8a01_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_d9e870c7de464fe3a08129e5c7253d8b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_9998d1040558409ba6fb45a1b849ff68_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_2c81e4f149684e0388b4c662281b10ac_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_685315d5f13c45ee9dc95b2de4c0f609_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_db5a93f5c76b463e9764b6a8273e8cde_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_703638d9ab1e47df95626a7831cef1bb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_afbd32870d594cca9c35137cce8a7805_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_d748dec8888543848b56c1e2388f58e8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d748dec8888543848b56c1e2388f58e8_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_f51e1ed792054215a1b30cd30e735143_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f51e1ed792054215a1b30cd30e735143_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_23c8ba2bcc2d46498112f624e0d684dd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_ebf49b96138c4ec19f982ea9b6eb4ed4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_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_5715138f0e9f4622909aa0bf43c568ff_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_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_52cbbffdfd98405a8a3a62a3fc3b8a01_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_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_52cbbffdfd98405a8a3a62a3fc3b8a01_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_d9e870c7de464fe3a08129e5c7253d8b_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_685315d5f13c45ee9dc95b2de4c0f609_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_9998d1040558409ba6fb45a1b849ff68_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_2c81e4f149684e0388b4c662281b10ac_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_f51e1ed792054215a1b30cd30e735143_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_db5a93f5c76b463e9764b6a8273e8cde_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_703638d9ab1e47df95626a7831cef1bb_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_ebf49b96138c4ec19f982ea9b6eb4ed4_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_afbd32870d594cca9c35137cce8a7805_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_d748dec8888543848b56c1e2388f58e8_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_23c8ba2bcc2d46498112f624e0d684dd_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_52cbbffdfd98405a8a3a62a3fc3b8a01_List.find(self.name)
    bpy.context.scene.Simplygon_52cbbffdfd98405a8a3a62a3fc3b8a01_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List.find(self.name)
    bpy.context.scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List.find(self.name)
    bpy.context.scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List.find(self.name)
    bpy.context.scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List.find(self.name)
    bpy.context.scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List.find(self.name)
    bpy.context.scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List.find(self.name)
    bpy.context.scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List.remove(UseMultisamplingUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List.find(self.name)
    bpy.context.scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List.remove(OutputSRGBUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List.find(self.name)
    bpy.context.scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List.find(self.name)
    bpy.context.scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List.find(self.name)
    bpy.context.scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List.remove(OutputDDSCompressionTypeUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_List.find(self.name)
    bpy.context.scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_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_2807969c2c174af3ba43f4889db6d81a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2807969c2c174af3ba43f4889db6d81a_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_9b1d7a4bd6ac4078ae1268f4db856909_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_5772db55b4134984b3bbb71e281d2dfb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_5e35a77f33114e6ab241001eae48073b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5e35a77f33114e6ab241001eae48073b_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_cacb4f46dc7d4352a2498233dcd846f7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_7d2f92198b804a09926088f9b76e6a76_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_f28423742727421381bd75b8a60944f6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f28423742727421381bd75b8a60944f6_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_30d0cbad380c4395aca7ea6318d4561e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_a58126ed6d0e4dd88d43ac60fb40d293_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_db031278bfb44e9086aa287793175102_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_db031278bfb44e9086aa287793175102_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_5ee56b98fb05499ea337b1f4a11a6727_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_59520a3fcca444c9aabd5f9465006002_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_59520a3fcca444c9aabd5f9465006002_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_bd9d78d98fff47c484ea7313dd4fd2cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_55cf517886354b72ba2679d711e84844_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_55cf517886354b72ba2679d711e84844_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_362a73a647d64e3b92c874546c8188a7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_362a73a647d64e3b92c874546c8188a7_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_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_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_2807969c2c174af3ba43f4889db6d81a_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_db031278bfb44e9086aa287793175102_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    FlipBackfacingNormalsUI = bpy.context.scene.Simplygon_f28423742727421381bd75b8a60944f6_List.add()
    FlipBackfacingNormalsUI.Init(self.name)
    FlipBackfacingNormalsUI.name = self.name
    GenerateTangentSpaceNormalsUI = bpy.context.scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List.add()
    GenerateTangentSpaceNormalsUI.Init(self.name)
    GenerateTangentSpaceNormalsUI.name = self.name
    FlipGreenUI = bpy.context.scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List.add()
    FlipGreenUI.Init(self.name)
    FlipGreenUI.name = self.name
    CalculateBitangentPerFragmentUI = bpy.context.scene.Simplygon_55cf517886354b72ba2679d711e84844_List.add()
    CalculateBitangentPerFragmentUI.Init(self.name)
    CalculateBitangentPerFragmentUI.name = self.name
    NormalizeInterpolatedTangentSpaceUI = bpy.context.scene.Simplygon_362a73a647d64e3b92c874546c8188a7_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_2807969c2c174af3ba43f4889db6d81a_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_9b1d7a4bd6ac4078ae1268f4db856909_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_cacb4f46dc7d4352a2498233dcd846f7_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_5772db55b4134984b3bbb71e281d2dfb_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_5e35a77f33114e6ab241001eae48073b_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_db031278bfb44e9086aa287793175102_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_7d2f92198b804a09926088f9b76e6a76_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_59520a3fcca444c9aabd5f9465006002_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_30d0cbad380c4395aca7ea6318d4561e_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_a58126ed6d0e4dd88d43ac60fb40d293_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_f28423742727421381bd75b8a60944f6_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_5ee56b98fb05499ea337b1f4a11a6727_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_bd9d78d98fff47c484ea7313dd4fd2cf_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_55cf517886354b72ba2679d711e84844_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_362a73a647d64e3b92c874546c8188a7_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_2807969c2c174af3ba43f4889db6d81a_List.find(self.name)
    bpy.context.scene.Simplygon_2807969c2c174af3ba43f4889db6d81a_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List.find(self.name)
    bpy.context.scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List.find(self.name)
    bpy.context.scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List.find(self.name)
    bpy.context.scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List.find(self.name)
    bpy.context.scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_db031278bfb44e9086aa287793175102_List.find(self.name)
    bpy.context.scene.Simplygon_db031278bfb44e9086aa287793175102_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List.find(self.name)
    bpy.context.scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List.find(self.name)
    bpy.context.scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List.find(self.name)
    bpy.context.scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List.find(self.name)
    bpy.context.scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List.remove(OutputDDSCompressionTypeUI_index)
    FlipBackfacingNormalsUI_index = bpy.context.scene.Simplygon_f28423742727421381bd75b8a60944f6_List.find(self.name)
    bpy.context.scene.Simplygon_f28423742727421381bd75b8a60944f6_List.remove(FlipBackfacingNormalsUI_index)
    GenerateTangentSpaceNormalsUI_index = bpy.context.scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List.find(self.name)
    bpy.context.scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List.remove(GenerateTangentSpaceNormalsUI_index)
    FlipGreenUI_index = bpy.context.scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List.find(self.name)
    bpy.context.scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List.remove(FlipGreenUI_index)
    CalculateBitangentPerFragmentUI_index = bpy.context.scene.Simplygon_55cf517886354b72ba2679d711e84844_List.find(self.name)
    bpy.context.scene.Simplygon_55cf517886354b72ba2679d711e84844_List.remove(CalculateBitangentPerFragmentUI_index)
    NormalizeInterpolatedTangentSpaceUI_index = bpy.context.scene.Simplygon_362a73a647d64e3b92c874546c8188a7_List.find(self.name)
    bpy.context.scene.Simplygon_362a73a647d64e3b92c874546c8188a7_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_cb4c127c3c134264bd6e284805d37749_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cb4c127c3c134264bd6e284805d37749_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_6f3b411b280e40bda333e1c4bef955f6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_d2a3e1d37c604104a2784f78c1d83432_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_24cf9e5d83ff4c18975dc80b3c35a315_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_cccce7c337be43ee9903abbc222f7e41_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_ecc59c43447e42ffb7b31fca6c35c456_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_96bad38087f0408bbee2953b834784da_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_96bad38087f0408bbee2953b834784da_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_287d073634244b2b86623c74f3747ead_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_287d073634244b2b86623c74f3747ead_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_a7d6f43d933d4c9597c51cf75b9610b7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_e474a09e6a8246cea50cc8badb74de82_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_5bea39b93c0c422a9b481287f73f5dba_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_203e4335d389425d9b5d78f9b410fea5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_e34f6310cfa648ac920c62c1a4ae0bb2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_a80cb1fbadbf4f98954877091be4df30_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_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_3df6d9fb49c84e798940823dc164bef0_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_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_cb4c127c3c134264bd6e284805d37749_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_287d073634244b2b86623c74f3747ead_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    DistanceScalingUI = bpy.context.scene.Simplygon_96bad38087f0408bbee2953b834784da_List.add()
    DistanceScalingUI.Init(self.name)
    DistanceScalingUI.name = self.name
    GenerateScalarDisplacementUI = bpy.context.scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List.add()
    GenerateScalarDisplacementUI.Init(self.name)
    GenerateScalarDisplacementUI.name = self.name
    GenerateTangentSpaceDisplacementUI = bpy.context.scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List.add()
    GenerateTangentSpaceDisplacementUI.Init(self.name)
    GenerateTangentSpaceDisplacementUI.name = self.name
    NormalMapTexCoordLevelUI = bpy.context.scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_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_cb4c127c3c134264bd6e284805d37749_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_6f3b411b280e40bda333e1c4bef955f6_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_cccce7c337be43ee9903abbc222f7e41_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_d2a3e1d37c604104a2784f78c1d83432_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_24cf9e5d83ff4c18975dc80b3c35a315_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_e474a09e6a8246cea50cc8badb74de82_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_ecc59c43447e42ffb7b31fca6c35c456_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_203e4335d389425d9b5d78f9b410fea5_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_287d073634244b2b86623c74f3747ead_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_a7d6f43d933d4c9597c51cf75b9610b7_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_96bad38087f0408bbee2953b834784da_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_5bea39b93c0c422a9b481287f73f5dba_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_e34f6310cfa648ac920c62c1a4ae0bb2_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_a80cb1fbadbf4f98954877091be4df30_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_cb4c127c3c134264bd6e284805d37749_List.find(self.name)
    bpy.context.scene.Simplygon_cb4c127c3c134264bd6e284805d37749_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List.find(self.name)
    bpy.context.scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List.find(self.name)
    bpy.context.scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List.find(self.name)
    bpy.context.scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List.find(self.name)
    bpy.context.scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List.find(self.name)
    bpy.context.scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List.find(self.name)
    bpy.context.scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List.find(self.name)
    bpy.context.scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_287d073634244b2b86623c74f3747ead_List.find(self.name)
    bpy.context.scene.Simplygon_287d073634244b2b86623c74f3747ead_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List.find(self.name)
    bpy.context.scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List.remove(OutputDDSCompressionTypeUI_index)
    DistanceScalingUI_index = bpy.context.scene.Simplygon_96bad38087f0408bbee2953b834784da_List.find(self.name)
    bpy.context.scene.Simplygon_96bad38087f0408bbee2953b834784da_List.remove(DistanceScalingUI_index)
    GenerateScalarDisplacementUI_index = bpy.context.scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List.find(self.name)
    bpy.context.scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List.remove(GenerateScalarDisplacementUI_index)
    GenerateTangentSpaceDisplacementUI_index = bpy.context.scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List.find(self.name)
    bpy.context.scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List.remove(GenerateTangentSpaceDisplacementUI_index)
    NormalMapTexCoordLevelUI_index = bpy.context.scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_List.find(self.name)
    bpy.context.scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_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_16c19fe6d95d4a318fae3b51648ef56d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_16c19fe6d95d4a318fae3b51648ef56d_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_1570003843324c0593cdb84fb10f32a2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1570003843324c0593cdb84fb10f32a2_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_6f74eeb3e75940a888ec766922aa1be2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_c6734a934a9d49a7aa87b3ab1c6e7e93_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_ef088c9660ba4a5f9d99fe3744edea5e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_7948468210e5421b970e7c7423024047_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7948468210e5421b970e7c7423024047_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_a6b0f9434608401e89952068df3386f2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a6b0f9434608401e89952068df3386f2_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_a7f04a6a9fac47ddbd06dd4fbcc1728a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_cdcccab814f54a0989f918e2f311c2b8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_3bcad42e441049a6acf402185af0da45_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3bcad42e441049a6acf402185af0da45_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_af4eaffe18db4581be55133bbceefcc1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_356e400f6f8e4f5a86f1e49bad86cc6f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_c469d63b1c2c437b8f29b72c1c82238d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_c4d981a44685407a9fd042d2d7f0a179_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_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_f32e8fa037e44801ad81f6284a02aed4_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_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_16c19fe6d95d4a318fae3b51648ef56d_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_3bcad42e441049a6acf402185af0da45_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_7948468210e5421b970e7c7423024047_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    RaysPerPixelUI = bpy.context.scene.Simplygon_a6b0f9434608401e89952068df3386f2_List.add()
    RaysPerPixelUI.Init(self.name)
    RaysPerPixelUI.name = self.name
    OcclusionFalloffUI = bpy.context.scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List.add()
    OcclusionFalloffUI.Init(self.name)
    OcclusionFalloffUI.name = self.name
    OcclusionMultiplierUI = bpy.context.scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List.add()
    OcclusionMultiplierUI.Init(self.name)
    OcclusionMultiplierUI.name = self.name
    UseSimpleOcclusionModeUI = bpy.context.scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_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_16c19fe6d95d4a318fae3b51648ef56d_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_1570003843324c0593cdb84fb10f32a2_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_ef088c9660ba4a5f9d99fe3744edea5e_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_6f74eeb3e75940a888ec766922aa1be2_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_c6734a934a9d49a7aa87b3ab1c6e7e93_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_3bcad42e441049a6acf402185af0da45_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_7948468210e5421b970e7c7423024047_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_356e400f6f8e4f5a86f1e49bad86cc6f_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_a7f04a6a9fac47ddbd06dd4fbcc1728a_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_cdcccab814f54a0989f918e2f311c2b8_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_a6b0f9434608401e89952068df3386f2_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_af4eaffe18db4581be55133bbceefcc1_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_c469d63b1c2c437b8f29b72c1c82238d_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_c4d981a44685407a9fd042d2d7f0a179_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_16c19fe6d95d4a318fae3b51648ef56d_List.find(self.name)
    bpy.context.scene.Simplygon_16c19fe6d95d4a318fae3b51648ef56d_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List.find(self.name)
    bpy.context.scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List.find(self.name)
    bpy.context.scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List.find(self.name)
    bpy.context.scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List.find(self.name)
    bpy.context.scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_3bcad42e441049a6acf402185af0da45_List.find(self.name)
    bpy.context.scene.Simplygon_3bcad42e441049a6acf402185af0da45_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_7948468210e5421b970e7c7423024047_List.find(self.name)
    bpy.context.scene.Simplygon_7948468210e5421b970e7c7423024047_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List.find(self.name)
    bpy.context.scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List.find(self.name)
    bpy.context.scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List.find(self.name)
    bpy.context.scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List.remove(OutputDDSCompressionTypeUI_index)
    RaysPerPixelUI_index = bpy.context.scene.Simplygon_a6b0f9434608401e89952068df3386f2_List.find(self.name)
    bpy.context.scene.Simplygon_a6b0f9434608401e89952068df3386f2_List.remove(RaysPerPixelUI_index)
    OcclusionFalloffUI_index = bpy.context.scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List.find(self.name)
    bpy.context.scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List.remove(OcclusionFalloffUI_index)
    OcclusionMultiplierUI_index = bpy.context.scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List.find(self.name)
    bpy.context.scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List.remove(OcclusionMultiplierUI_index)
    UseSimpleOcclusionModeUI_index = bpy.context.scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_List.find(self.name)
    bpy.context.scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_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.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_0d6cdf4028a34606bdf32b3af889d8ce_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0d6cdf4028a34606bdf32b3af889d8ce_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_f9fed3ad0e604a45b0650534c4ebe688_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_e801b945e55e4688866f83f39aea645f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e801b945e55e4688866f83f39aea645f_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_8e4a547547f141ada6fb7a933421e2eb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_26cbf2be37e34fa99092dbd8e43819c8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_ca8c86c639444a34a6100bcf1d77765d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_b39a0ef3f9e34e2a9d951271e1a9fbd3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_6799ec87f5a14871a3a9347a5d7fbc76_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_ff9eca0fc9134de7b88afc51a6ab2382_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_de997f4db50948c6a8bac7bf18bdf43f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_ecfb7e436f2c4e298447e00f56538bef_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_0d2f6fda99a345f6b707c15144d4947f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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 MappingInfRUI(self):
    index = bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_ef80786c094847b295cb4855e20935bb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ef80786c094847b295cb4855e20935bb_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_05e52c22d61f4c178e6e08b4a9adf10f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_c21a801ae75146be8045606bc0657c1c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c21a801ae75146be8045606bc0657c1c_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_44e451be55244b4eacbeac467e1366df_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_44e451be55244b4eacbeac467e1366df_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_3dc64e2d8bd24e4ab483d4f782c8170a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_3c4d7da58f77435e82d4463a5d7c26c6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_84a46524ee8b4cd89bb2f614ba6504c5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_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_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_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_0d6cdf4028a34606bdf32b3af889d8ce_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_e801b945e55e4688866f83f39aea645f_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    GeometryDataFieldTypeUI = bpy.context.scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List.add()
    GeometryDataFieldTypeUI.Init(self.name)
    GeometryDataFieldTypeUI.name = self.name
    GeometryDataFieldIndexUI = bpy.context.scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List.add()
    GeometryDataFieldIndexUI.Init(self.name)
    GeometryDataFieldIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List.add()
    MappingInfRUI.Init(self.name)
    MappingInfRUI.name = self.name
    MappingSupRUI = bpy.context.scene.Simplygon_ef80786c094847b295cb4855e20935bb_List.add()
    MappingSupRUI.Init(self.name)
    MappingSupRUI.name = self.name
    MappingInfGUI = bpy.context.scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List.add()
    MappingInfGUI.Init(self.name)
    MappingInfGUI.name = self.name
    MappingSupGUI = bpy.context.scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List.add()
    MappingSupGUI.Init(self.name)
    MappingSupGUI.name = self.name
    MappingInfBUI = bpy.context.scene.Simplygon_44e451be55244b4eacbeac467e1366df_List.add()
    MappingInfBUI.Init(self.name)
    MappingInfBUI.name = self.name
    MappingSupBUI = bpy.context.scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List.add()
    MappingSupBUI.Init(self.name)
    MappingSupBUI.name = self.name
    MappingInfAUI = bpy.context.scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List.add()
    MappingInfAUI.Init(self.name)
    MappingInfAUI.name = self.name
    MappingSupAUI = bpy.context.scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_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_0d6cdf4028a34606bdf32b3af889d8ce_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_f9fed3ad0e604a45b0650534c4ebe688_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_26cbf2be37e34fa99092dbd8e43819c8_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_e801b945e55e4688866f83f39aea645f_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_8e4a547547f141ada6fb7a933421e2eb_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_de997f4db50948c6a8bac7bf18bdf43f_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_ca8c86c639444a34a6100bcf1d77765d_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_0d2f6fda99a345f6b707c15144d4947f_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_6799ec87f5a14871a3a9347a5d7fbc76_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_ff9eca0fc9134de7b88afc51a6ab2382_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_b39a0ef3f9e34e2a9d951271e1a9fbd3_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_ecfb7e436f2c4e298447e00f56538bef_List.add()
    GeometryDataFieldIndexUI.InitJson(self.name, jsonData['GeometryDataFieldIndexUI'] if jsonData is not None and 'GeometryDataFieldIndexUI' in jsonData else None)
    GeometryDataFieldIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_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_ef80786c094847b295cb4855e20935bb_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_05e52c22d61f4c178e6e08b4a9adf10f_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_c21a801ae75146be8045606bc0657c1c_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_44e451be55244b4eacbeac467e1366df_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_3dc64e2d8bd24e4ab483d4f782c8170a_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_3c4d7da58f77435e82d4463a5d7c26c6_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_84a46524ee8b4cd89bb2f614ba6504c5_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_0d6cdf4028a34606bdf32b3af889d8ce_List.find(self.name)
    bpy.context.scene.Simplygon_0d6cdf4028a34606bdf32b3af889d8ce_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List.find(self.name)
    bpy.context.scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List.find(self.name)
    bpy.context.scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_e801b945e55e4688866f83f39aea645f_List.find(self.name)
    bpy.context.scene.Simplygon_e801b945e55e4688866f83f39aea645f_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List.find(self.name)
    bpy.context.scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List.find(self.name)
    bpy.context.scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List.find(self.name)
    bpy.context.scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List.find(self.name)
    bpy.context.scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List.find(self.name)
    bpy.context.scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List.find(self.name)
    bpy.context.scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List.remove(OutputDDSCompressionTypeUI_index)
    GeometryDataFieldTypeUI_index = bpy.context.scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List.find(self.name)
    bpy.context.scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List.remove(GeometryDataFieldTypeUI_index)
    GeometryDataFieldIndexUI_index = bpy.context.scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List.find(self.name)
    bpy.context.scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List.remove(GeometryDataFieldIndexUI_index)
    MappingInfRUI_index = bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List.find(self.name)
    bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List.remove(MappingInfRUI_index)
    MappingSupRUI_index = bpy.context.scene.Simplygon_ef80786c094847b295cb4855e20935bb_List.find(self.name)
    bpy.context.scene.Simplygon_ef80786c094847b295cb4855e20935bb_List.remove(MappingSupRUI_index)
    MappingInfGUI_index = bpy.context.scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List.find(self.name)
    bpy.context.scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List.remove(MappingInfGUI_index)
    MappingSupGUI_index = bpy.context.scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List.find(self.name)
    bpy.context.scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List.remove(MappingSupGUI_index)
    MappingInfBUI_index = bpy.context.scene.Simplygon_44e451be55244b4eacbeac467e1366df_List.find(self.name)
    bpy.context.scene.Simplygon_44e451be55244b4eacbeac467e1366df_List.remove(MappingInfBUI_index)
    MappingSupBUI_index = bpy.context.scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List.find(self.name)
    bpy.context.scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List.remove(MappingSupBUI_index)
    MappingInfAUI_index = bpy.context.scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List.find(self.name)
    bpy.context.scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List.remove(MappingInfAUI_index)
    MappingSupAUI_index = bpy.context.scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_List.find(self.name)
    bpy.context.scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_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['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 '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.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.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.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.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_1e5b690f1e6a48509d45d91ce1d14a12_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1e5b690f1e6a48509d45d91ce1d14a12_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_4085cec26d7a4f50870cc68ea655855c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_e88678622aea452b9cdd597af927e971_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e88678622aea452b9cdd597af927e971_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_3a245fd0af434115b72ff28169063063_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3a245fd0af434115b72ff28169063063_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_c70e6a077b5146aaa1861acb731ff54f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_9f4500d047464776b964350f79e37be0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9f4500d047464776b964350f79e37be0_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_c7a1041236c045f080ff34866d59cdb7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_79afd131c272450599560ca8451339b3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_79afd131c272450599560ca8451339b3_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),],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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_1d0806debcde432c8fba850e5fa346c4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_96fa9c525cdf4ed2a8b8d3300aab3f34_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_3088c636f28c494ea71965b8907da0de_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3088c636f28c494ea71965b8907da0de_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_b1f9ca1c1efc4f41b44cb483d67592d5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_b3573e078fb140709f1f98a27fa4f6a7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_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_f16f20e16d474f05908c2daba631696d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_1e5b690f1e6a48509d45d91ce1d14a12_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_e88678622aea452b9cdd597af927e971_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_3a245fd0af434115b72ff28169063063_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_9f4500d047464776b964350f79e37be0_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_79afd131c272450599560ca8451339b3_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputColorLevelUI = bpy.context.scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List.add()
    OutputColorLevelUI.Init(self.name)
    OutputColorLevelUI.name = self.name
    OutputColorNameUI = bpy.context.scene.Simplygon_3088c636f28c494ea71965b8907da0de_List.add()
    OutputColorNameUI.Init(self.name)
    OutputColorNameUI.name = self.name
    ColorSpaceEdgeThresholdUI = bpy.context.scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_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_1e5b690f1e6a48509d45d91ce1d14a12_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_4085cec26d7a4f50870cc68ea655855c_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_c70e6a077b5146aaa1861acb731ff54f_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_e88678622aea452b9cdd597af927e971_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_3a245fd0af434115b72ff28169063063_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_96fa9c525cdf4ed2a8b8d3300aab3f34_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_9f4500d047464776b964350f79e37be0_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_b1f9ca1c1efc4f41b44cb483d67592d5_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_79afd131c272450599560ca8451339b3_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_1d0806debcde432c8fba850e5fa346c4_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_c7a1041236c045f080ff34866d59cdb7_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_3088c636f28c494ea71965b8907da0de_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_b3573e078fb140709f1f98a27fa4f6a7_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_1e5b690f1e6a48509d45d91ce1d14a12_List.find(self.name)
    bpy.context.scene.Simplygon_1e5b690f1e6a48509d45d91ce1d14a12_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List.find(self.name)
    bpy.context.scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List.find(self.name)
    bpy.context.scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_e88678622aea452b9cdd597af927e971_List.find(self.name)
    bpy.context.scene.Simplygon_e88678622aea452b9cdd597af927e971_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_3a245fd0af434115b72ff28169063063_List.find(self.name)
    bpy.context.scene.Simplygon_3a245fd0af434115b72ff28169063063_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List.find(self.name)
    bpy.context.scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_9f4500d047464776b964350f79e37be0_List.find(self.name)
    bpy.context.scene.Simplygon_9f4500d047464776b964350f79e37be0_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List.find(self.name)
    bpy.context.scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_79afd131c272450599560ca8451339b3_List.find(self.name)
    bpy.context.scene.Simplygon_79afd131c272450599560ca8451339b3_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List.find(self.name)
    bpy.context.scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List.remove(OutputDDSCompressionTypeUI_index)
    OutputColorLevelUI_index = bpy.context.scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List.find(self.name)
    bpy.context.scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List.remove(OutputColorLevelUI_index)
    OutputColorNameUI_index = bpy.context.scene.Simplygon_3088c636f28c494ea71965b8907da0de_List.find(self.name)
    bpy.context.scene.Simplygon_3088c636f28c494ea71965b8907da0de_List.remove(OutputColorNameUI_index)
    ColorSpaceEdgeThresholdUI_index = bpy.context.scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_List.find(self.name)
    bpy.context.scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.ColorCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_List[index]

    return None

  OpacityCasterSettings_id: bpy.props.StringProperty()
  @property
  def OpacityCasterSettings(self):
    index = bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.find(self.OpacityCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List[index]

    return None

  NormalCasterSettings_id: bpy.props.StringProperty()
  @property
  def NormalCasterSettings(self):
    index = bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.NormalCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List[index]

    return None

  DisplacementCasterSettings_id: bpy.props.StringProperty()
  @property
  def DisplacementCasterSettings(self):
    index = bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.find(self.DisplacementCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List[index]

    return None

  AmbientOcclusionCasterSettings_id: bpy.props.StringProperty()
  @property
  def AmbientOcclusionCasterSettings(self):
    index = bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.find(self.AmbientOcclusionCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List[index]

    return None

  GeometryDataCasterSettings_id: bpy.props.StringProperty()
  @property
  def GeometryDataCasterSettings(self):
    index = bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.GeometryDataCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List[index]

    return None

  VertexColorCasterSettings_id: bpy.props.StringProperty()
  @property
  def VertexColorCasterSettings(self):
    index = bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_List.find(self.VertexColorCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_c16be913cc2240e6b5bb01b3b340ed55_List.add()
      ColorCasterSettings.Init()
      ColorCasterSettings.MaterialChannel = materialChannelName
      self.ColorCasterSettings_id = ColorCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      OpacityCasterSettings = bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.add()
      OpacityCasterSettings.Init()
      OpacityCasterSettings.MaterialChannel = materialChannelName
      self.OpacityCasterSettings_id = OpacityCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      NormalCasterSettings = bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.add()
      NormalCasterSettings.Init()
      NormalCasterSettings.MaterialChannel = materialChannelName
      self.NormalCasterSettings_id = NormalCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      DisplacementCasterSettings = bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.add()
      DisplacementCasterSettings.Init()
      DisplacementCasterSettings.MaterialChannel = materialChannelName
      self.DisplacementCasterSettings_id = DisplacementCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      AmbientOcclusionCasterSettings = bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.add()
      AmbientOcclusionCasterSettings.Init()
      AmbientOcclusionCasterSettings.MaterialChannel = materialChannelName
      self.AmbientOcclusionCasterSettings_id = AmbientOcclusionCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      GeometryDataCasterSettings = bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.add()
      GeometryDataCasterSettings.Init()
      GeometryDataCasterSettings.MaterialChannel = materialChannelName
      self.GeometryDataCasterSettings_id = GeometryDataCasterSettings.name

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      VertexColorCasterSettings = bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_c16be913cc2240e6b5bb01b3b340ed55_List.find(self.ColorCasterSettings_id)
      bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_List.remove(ColorCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.OpacityCaster:
      self.OpacityCasterSettings.Deinit()
      OpacityCasterSettings_index = bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.find(self.OpacityCasterSettings_id)
      bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.remove(OpacityCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.NormalCaster:
      self.NormalCasterSettings.Deinit()
      NormalCasterSettings_index = bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.find(self.NormalCasterSettings_id)
      bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.remove(NormalCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.DisplacementCaster:
      self.DisplacementCasterSettings.Deinit()
      DisplacementCasterSettings_index = bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.find(self.DisplacementCasterSettings_id)
      bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.remove(DisplacementCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.AmbientOcclusionCaster:
      self.AmbientOcclusionCasterSettings.Deinit()
      AmbientOcclusionCasterSettings_index = bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.find(self.AmbientOcclusionCasterSettings_id)
      bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.remove(AmbientOcclusionCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.GeometryDataCaster:
      self.GeometryDataCasterSettings.Deinit()
      GeometryDataCasterSettings_index = bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.find(self.GeometryDataCasterSettings_id)
      bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.remove(GeometryDataCasterSettings_index)

    if self.MaterialCasterType == ESimplygonMaterialCaster.VertexColorCaster:
      self.VertexColorCasterSettings.Deinit()
      VertexColorCasterSettings_index = bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_List.find(self.VertexColorCasterSettings_id)
      bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_c16be913cc2240e6b5bb01b3b340ed55_List.add()
      ColorCasterSettings.InitJson(jsonData['ColorCasterSettings'])
      self.ColorCasterSettings_id = ColorCasterSettings.name

    if 'OpacityCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.OpacityCaster
      OpacityCasterSettings = bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.add()
      OpacityCasterSettings.InitJson(jsonData['OpacityCasterSettings'])
      self.OpacityCasterSettings_id = OpacityCasterSettings.name

    if 'NormalCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.NormalCaster
      NormalCasterSettings = bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.add()
      NormalCasterSettings.InitJson(jsonData['NormalCasterSettings'])
      self.NormalCasterSettings_id = NormalCasterSettings.name

    if 'DisplacementCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.DisplacementCaster
      DisplacementCasterSettings = bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.add()
      DisplacementCasterSettings.InitJson(jsonData['DisplacementCasterSettings'])
      self.DisplacementCasterSettings_id = DisplacementCasterSettings.name

    if 'AmbientOcclusionCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.AmbientOcclusionCaster
      AmbientOcclusionCasterSettings = bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.add()
      AmbientOcclusionCasterSettings.InitJson(jsonData['AmbientOcclusionCasterSettings'])
      self.AmbientOcclusionCasterSettings_id = AmbientOcclusionCasterSettings.name

    if 'GeometryDataCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.GeometryDataCaster
      GeometryDataCasterSettings = bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.add()
      GeometryDataCasterSettings.InitJson(jsonData['GeometryDataCasterSettings'])
      self.GeometryDataCasterSettings_id = GeometryDataCasterSettings.name

    if 'VertexColorCasterSettings' in jsonData:
      self.MaterialCasterType = ESimplygonMaterialCaster.VertexColorCaster
      VertexColorCasterSettings = bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_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_7e6f83eed81e415f8e35c420793d1435_List.find(self.GlobalSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List[index]

    return None

  @property
  def PipelineSettings(self):
    index = bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_List.find(self.PipelineSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.ReductionSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_List[index]

    return None

  RepairSettings_id : bpy.props.StringProperty()
  @property
  def RepairSettings(self):
    index = bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List.find(self.RepairSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List[index]

    return None

  NormalCalculationSettings_id : bpy.props.StringProperty()
  @property
  def NormalCalculationSettings(self):
    index = bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.NormalCalculationSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List[index]

    return None

  VisibilitySettings_id : bpy.props.StringProperty()
  @property
  def VisibilitySettings(self):
    index = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.VisibilitySettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List[index]

    return None

  BoneSettings_id : bpy.props.StringProperty()
  @property
  def BoneSettings(self):
    index = bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.find(self.BoneSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List[index]

    return None

  VertexWeightSettings_id : bpy.props.StringProperty()
  @property
  def VertexWeightSettings(self):
    index = bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.find(self.VertexWeightSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List[index]

    return None

  MappingImageInputMaterialSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageInputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List.find(self.MappingImageInputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List[index]

    return None

  MappingImageOutputMaterialSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageOutputMaterialSettings(self):
    index = bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List.find(self.MappingImageOutputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List[index]

    return None

  ChartAggregatorSettings_id : bpy.props.StringProperty()
  @property
  def ChartAggregatorSettings(self):
    index = bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.find(self.ChartAggregatorSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List[index]

    return None

  ParameterizerSettings_id : bpy.props.StringProperty()
  @property
  def ParameterizerSettings(self):
    index = bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.find(self.ParameterizerSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List[index]

    return None

  MappingImageSettings_id : bpy.props.StringProperty()
  @property
  def MappingImageSettings(self):
    index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List[index]

    return None

  RemeshingSettings_id : bpy.props.StringProperty()
  @property
  def RemeshingSettings(self):
    index = bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List.find(self.RemeshingSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List[index]

    return None

  GeometryCullingSettings_id : bpy.props.StringProperty()
  @property
  def GeometryCullingSettings(self):
    index = bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.find(self.GeometryCullingSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List[index]

    return None

  AggregationSettings_id : bpy.props.StringProperty()
  @property
  def AggregationSettings(self):
    index = bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.AggregationSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List[index]

    return None

  GenerateLightmapTexCoordSettings_id : bpy.props.StringProperty()
  @property
  def GenerateLightmapTexCoordSettings(self):
    index = bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_List.find(self.GenerateLightmapTexCoordSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_List[index]

    return None

  FoliageSettings_id : bpy.props.StringProperty()
  @property
  def FoliageSettings(self):
    index = bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List.find(self.FoliageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List[index]

    return None

  BillboardCloudSettings_id : bpy.props.StringProperty()
  @property
  def BillboardCloudSettings(self):
    index = bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.find(self.BillboardCloudSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List[index]

    return None

  FlipbookSettings_id : bpy.props.StringProperty()
  @property
  def FlipbookSettings(self):
    index = bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List.find(self.FlipbookSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List[index]

    return None

  ImpostorFromSingleViewSettings_id : bpy.props.StringProperty()
  @property
  def ImpostorFromSingleViewSettings(self):
    index = bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List.find(self.ImpostorFromSingleViewSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List[index]

    return None

  OcclusionMeshSettings_id : bpy.props.StringProperty()
  @property
  def OcclusionMeshSettings(self):
    index = bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_List.find(self.OcclusionMeshSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_7e6f83eed81e415f8e35c420793d1435_List.add()
    globalSettings.Init()
    self.GlobalSettings_id = globalSettings.name
    pipelineSettings = bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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_5f18aad20ad949e49b89958e3afdccf8_List.add()
      ReductionSettings.Init()
      self.ReductionSettings_id = ReductionSettings.name
      RepairSettings = bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List.add()
      RepairSettings.Init()
      self.RepairSettings_id = RepairSettings.name
      NormalCalculationSettings = bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List.add()
      NormalCalculationSettings.Init()
      self.NormalCalculationSettings_id = NormalCalculationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      BoneSettings = bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      RemeshingSettings = bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List.add()
      RemeshingSettings.Init()
      self.RemeshingSettings_id = RemeshingSettings.name
      BoneSettings = bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      AggregationSettings = bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List.add()
      AggregationSettings.Init()
      self.AggregationSettings_id = AggregationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      BillboardCloudSettings = bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.add()
      BillboardCloudSettings.Init()
      self.BillboardCloudSettings_id = BillboardCloudSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      BillboardCloudSettings = bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.add()
      BillboardCloudSettings.Init()
      self.BillboardCloudSettings_id = BillboardCloudSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      FlipbookSettings = bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List.add()
      FlipbookSettings.Init()
      self.FlipbookSettings_id = FlipbookSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      ImpostorFromSingleViewSettings = bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List.add()
      ImpostorFromSingleViewSettings.Init()
      self.ImpostorFromSingleViewSettings_id = ImpostorFromSingleViewSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      OcclusionMeshSettings = bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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_5f18aad20ad949e49b89958e3afdccf8_List.find(self.ReductionSettings_id)
      bpy.context.scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_List.remove(ReductionSettings_index)
      self.RepairSettings.Deinit()
      RepairSettings_index = bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List.find(self.RepairSettings_id)
      bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List.remove(RepairSettings_index)
      self.NormalCalculationSettings.Deinit()
      NormalCalculationSettings_index = bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List.find(self.NormalCalculationSettings_id)
      bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List.remove(NormalCalculationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.remove(VisibilitySettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.remove(BoneSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      self.RemeshingSettings.Deinit()
      RemeshingSettings_index = bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List.find(self.RemeshingSettings_id)
      bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List.remove(RemeshingSettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.remove(BoneSettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.remove(GeometryCullingSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.remove(VisibilitySettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      self.AggregationSettings.Deinit()
      AggregationSettings_index = bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List.find(self.AggregationSettings_id)
      bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List.remove(AggregationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.remove(VisibilitySettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.remove(GeometryCullingSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      self.BillboardCloudSettings.Deinit()
      BillboardCloudSettings_index = bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.find(self.BillboardCloudSettings_id)
      bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.remove(BillboardCloudSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      self.BillboardCloudSettings.Deinit()
      BillboardCloudSettings_index = bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.find(self.BillboardCloudSettings_id)
      bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.remove(BillboardCloudSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      self.FlipbookSettings.Deinit()
      FlipbookSettings_index = bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List.find(self.FlipbookSettings_id)
      bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List.remove(FlipbookSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      self.ImpostorFromSingleViewSettings.Deinit()
      ImpostorFromSingleViewSettings_index = bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List.find(self.ImpostorFromSingleViewSettings_id)
      bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List.remove(ImpostorFromSingleViewSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      self.OcclusionMeshSettings.Deinit()
      OcclusionMeshSettings_index = bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_List.find(self.OcclusionMeshSettings_id)
      bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_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.1400.0"
    jsonData['Commit'] = "c47d3175d00ec884bd836442df285bc06f7754eb"
    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'] is jsonData:
      globalSettings = bpy.context.scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List.add()
      globalSettings.InitJson(jsonData['Settings']['GlobalSettings'])
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_List.add()
      pipelineSettings.InitJson(jsonData['Settings']['PipelineSettings'])
      self.PipelineSettings_id = pipelineSettings.name

    else:
      globalSettings = bpy.context.scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List.add()
      globalSettings.Init()
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_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 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 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_5f18aad20ad949e49b89958e3afdccf8_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_41ba6b11934d4e54857bed8da14257bb_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_2bc44d4845bb4138b2c826f9bc0a2d70_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_d84be78d9e4e4a2dbe280feba1553bfe_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_8200dd0e95e74876998049ed30ec0263_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_fd216bc817b84579b610ab179b262905_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_a97e996253e8466e888be1b01d6e2e64_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_2fb6435a021c471199d7f44cb20a45c7_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_8200dd0e95e74876998049ed30ec0263_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_1a64da47aa7f44b68f8442886826dc05_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_d84be78d9e4e4a2dbe280feba1553bfe_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_a97e996253e8466e888be1b01d6e2e64_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_1e821d86652846e8a9daea3ec5a27bc2_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_d84be78d9e4e4a2dbe280feba1553bfe_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_1a64da47aa7f44b68f8442886826dc05_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_fd216bc817b84579b610ab179b262905_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_a97e996253e8466e888be1b01d6e2e64_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_9f3178091fc341f6bd04fb82d42ac545_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_9f3178091fc341f6bd04fb82d42ac545_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_170d3696bb644181b6dbce0f02ab5d81_List.add()
    FlipbookSettings.InitJson(jsonData['ImpostorSettings']['FlipbookSettings'])
    self.FlipbookSettings_id = FlipbookSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_4f0fcb2c189a4f40afea192d62e56477_List.add()
    ImpostorFromSingleViewSettings.InitJson(jsonData['ImpostorSettings']['ImpostorFromSingleViewSettings'])
    self.ImpostorFromSingleViewSettings_id = ImpostorFromSingleViewSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_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_d38367a66547400c89422cae4cc6956e_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.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_5f18aad20ad949e49b89958e3afdccf8_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings)
  bpy.types.Scene.Simplygon_fbc44824ef4e4aac8f456030c35cf553_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEnabledEx)
  bpy.types.Scene.Simplygon_a4af02e90048402bad216470900eec75_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEx)
  bpy.types.Scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEnabledEx)
  bpy.types.Scene.Simplygon_56f944938f8540328d8d79540274abda_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEx)
  bpy.types.Scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionHeuristicsEx)
  bpy.types.Scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGeometryImportanceEx)
  bpy.types.Scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMaterialImportanceEx)
  bpy.types.Scene.Simplygon_f567169898ad4e9197074702a3782349_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonTextureImportanceEx)
  bpy.types.Scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonShadingImportanceEx)
  bpy.types.Scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGroupImportanceEx)
  bpy.types.Scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonVertexColorImportanceEx)
  bpy.types.Scene.Simplygon_d373871262384f3499290c4b9d683151_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonEdgeSetImportanceEx)
  bpy.types.Scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSkinningImportanceEx)
  bpy.types.Scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCurvatureImportanceEx)
  bpy.types.Scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCreateGeomorphGeometryEx)
  bpy.types.Scene.Simplygon_4f93851dde594909ad9789a583525cc9_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonAllowDegenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_851df449a09d46e59989f6018cca8107_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepSymmetryEx)
  bpy.types.Scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseAutomaticSymmetryDetectionEx)
  bpy.types.Scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseSymmetryQuadRetriangulatorEx)
  bpy.types.Scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryAxisEx)
  bpy.types.Scene.Simplygon_94b6a06089324bddb303fefa7473339b_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryOffsetEx)
  bpy.types.Scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryDetectionToleranceEx)
  bpy.types.Scene.Simplygon_aab663677985458790e54d1623678472_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonDataCreationPreferencesEx)
  bpy.types.Scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonOutwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonInwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseHighQualityNormalCalculationEx)
  bpy.types.Scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonLockGeometricBorderEx)
  bpy.types.Scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings)
  bpy.types.Scene.Simplygon_26dd05c605394866992534074e041988_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseTJunctionRemoverEx)
  bpy.types.Scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonTJuncDistEx)
  bpy.types.Scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldDistEx)
  bpy.types.Scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBorderVerticesEx)
  bpy.types.Scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinMaterialEx)
  bpy.types.Scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinSceneNodeEx)
  bpy.types.Scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBetweenSceneNodesEx)
  bpy.types.Scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseWeldingEx)
  bpy.types.Scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonProgressivePassesEx)
  bpy.types.Scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings)
  bpy.types.Scene.Simplygon_c0ae98c2511d4b6295af224b41d8f009_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceNormalsEx)
  bpy.types.Scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceTangentsEx)
  bpy.types.Scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonRepairInvalidNormalsEx)
  bpy.types.Scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReorthogonalizeTangentSpaceEx)
  bpy.types.Scene.Simplygon_64207287ee154f4f9a128abffb96a726_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAreaEx)
  bpy.types.Scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAngleEx)
  bpy.types.Scene.Simplygon_536892a45c48434eb07af0049883ea9e_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonSnapNormalsToFlatSurfacesEx)
  bpy.types.Scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings)
  bpy.types.Scene.Simplygon_33621a67d25b470baf54ec43e0b96ea4_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInReducerEx)
  bpy.types.Scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonVisibilityWeightsPowerEx)
  bpy.types.Scene.Simplygon_a105498780c34420be674224e82c3a97_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCullOccludedGeometryEx)
  bpy.types.Scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonForceVisibilityCalculationEx)
  bpy.types.Scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseBackfaceCullingEx)
  bpy.types.Scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonOccluderSelectionSetNameEx)
  bpy.types.Scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonFillNonVisibleAreaThresholdEx)
  bpy.types.Scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx)
  bpy.types.Scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonConservativeModeEx)
  bpy.types.Scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonComputeVisibilityModeEx)
  bpy.types.Scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings)
  bpy.types.Scene.Simplygon_8c3862f0c1664de0b0a72bacfc5be1c3_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonUseBoneReducerEx)
  bpy.types.Scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEnabledEx)
  bpy.types.Scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveUnusedBonesEx)
  bpy.types.Scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLimitBonesPerVertexEx)
  bpy.types.Scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEnabledEx)
  bpy.types.Scene.Simplygon_62e27828b1d542e58578137388482842_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonMaxBonePerVertexEx)
  bpy.types.Scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEx)
  bpy.types.Scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEx)
  bpy.types.Scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLockBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_92a06cac8990426c9a878f1092e2402c_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_fd216bc817b84579b610ab179b262905_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings)
  bpy.types.Scene.Simplygon_e7a6d67fc1644a7d88a3e2d103bcd939_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInReducerEx)
  bpy.types.Scene.Simplygon_947c293161fb4efcbee117658007d9ee_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorNameEx)
  bpy.types.Scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorLevelEx)
  bpy.types.Scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorComponentEx)
  bpy.types.Scene.Simplygon_76183fd974084f78aec71167d9eab64f_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorMultiplierEx)
  bpy.types.Scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorModeEx)
  bpy.types.Scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings)
  bpy.types.Scene.Simplygon_f44fd961d8f340d2a17c27e9bab932f8_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonTextureOutputPathEx)
  bpy.types.Scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonSimplygonBatchPathEx)
  bpy.types.Scene.Simplygon_06a265dd8559414184f5614ddf781962_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputMaterialNameEx)
  bpy.types.Scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputUniqueMaterialNamesEx)
  bpy.types.Scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonEmbedReferencesEx)
  bpy.types.Scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonIntermediateStepEx)
  bpy.types.Scene.Simplygon_4921f127f6724e249db64c3c11051f87_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonCascadedRunModeEx)
  bpy.types.Scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings)
  bpy.types.Scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings.SimplygonMaterialMappingEx)
  bpy.types.Scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings)
  bpy.types.Scene.Simplygon_e9f5594d331546ef802731f7cc35531e_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonMultisamplingLevelEx)
  bpy.types.Scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings)
  bpy.types.Scene.Simplygon_12c524753d9d462db791625f7678b9e6_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSurfaceAreaScaleEx)
  bpy.types.Scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordLevelEx)
  bpy.types.Scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordNameEx)
  bpy.types.Scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSeparateOverlappingChartsEx)
  bpy.types.Scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalChartProportionsChannelEx)
  bpy.types.Scene.Simplygon_7425f454f7d7452ca97e385605f195b3_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonLockUVRotationEx)
  bpy.types.Scene.Simplygon_2378c68f0bf94636a15206135242c538_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings)
  bpy.types.Scene.Simplygon_cb773b650dd341c2944806862007bfd6_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonMaxStretchEx)
  bpy.types.Scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonLargeChartsImportanceEx)
  bpy.types.Scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings)
  bpy.types.Scene.Simplygon_940808fbd692477d841bb3f7f100af6a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateMappingImageEx)
  bpy.types.Scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTangentsEx)
  bpy.types.Scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonMaximumLayersEx)
  bpy.types.Scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseFullRetexturingEx)
  bpy.types.Scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonApplyNewMaterialIdsEx)
  bpy.types.Scene.Simplygon_492e786486d7452082c29654ebc71d22_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAllowTransparencyMappingEx)
  bpy.types.Scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordLevelEx)
  bpy.types.Scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordNameEx)
  bpy.types.Scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseAutomaticTextureSizeEx)
  bpy.types.Scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAutomaticTextureSizeMultiplierEx)
  bpy.types.Scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonForcePower2TextureEx)
  bpy.types.Scene.Simplygon_02daa099344548a697c7c165d1d48648_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordGeneratorTypeEx)
  bpy.types.Scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonOnlyParameterizeInvalidUVsEx)
  bpy.types.Scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings)
  bpy.types.Scene.Simplygon_6fca3ae71a044031942a0368a81a0a39_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings.SimplygonDefaultTangentCalculatorTypeEx)
  bpy.types.Scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings)
  bpy.types.Scene.Simplygon_121d6d0e38a44c4a9dfd908fa60db8cf_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionZEx)
  bpy.types.Scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionYEx)
  bpy.types.Scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionXEx)
  bpy.types.Scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHoleFillingEx)
  bpy.types.Scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeEx)
  bpy.types.Scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonSurfaceTransferModeEx)
  bpy.types.Scene.Simplygon_84067fe459334187a2a61986355eb870_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonForceSoftEdgesWithinTextureChartsEx)
  bpy.types.Scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferNormalsEx)
  bpy.types.Scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferColorsEx)
  bpy.types.Scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings)
  bpy.types.Scene.Simplygon_bb2a582f5a4347319256845fac7294ec_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonUseClippingGeometryEx)
  bpy.types.Scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonClippingGeometrySelectionSetNameEx)
  bpy.types.Scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings)
  bpy.types.Scene.Simplygon_814855cb16434c1eb9ba4ce5f5bca63a_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonEnableGeometryCullingEx)
  bpy.types.Scene.Simplygon_f8fac606a13b4867999e37850d419960_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonGeometryCullingPrecisionEx)
  bpy.types.Scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivideGeometryBasedOnUVTilesEx)
  bpy.types.Scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivisionTileSizeEx)
  bpy.types.Scene.Simplygon_72ef0df0801945b1bf50b84293212f92_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings)
  bpy.types.Scene.Simplygon_bf5d959226dc44c6ab20cf6229591cf2_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGenerateLightmapTexCoordEx)
  bpy.types.Scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordNameEx)
  bpy.types.Scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_195420bbc27c493584690e0b02e1832d_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings)
  bpy.types.Scene.Simplygon_5756458a8700406980a7d48746b7d199_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateTrunkAndFoliageEx)
  bpy.types.Scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleRatioEx)
  bpy.types.Scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleThresholdEx)
  bpy.types.Scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageAreaThresholdEx)
  bpy.types.Scene.Simplygon_677df482374b4807b3fe471b00c9c553_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageSizeThresholdEx)
  bpy.types.Scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonTrunkReductionRatioEx)
  bpy.types.Scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings)
  bpy.types.Scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardModeEx)
  bpy.types.Scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonFavorVerticalPlanesEx)
  bpy.types.Scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_8652507465b04a899809bf5afee40532_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUseVisibilityWeightsEx)
  bpy.types.Scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardDensityEx)
  bpy.types.Scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonMaxPlaneCountEx)
  bpy.types.Scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonGeometricComplexityEx)
  bpy.types.Scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_f722d455be544713abbc00004971eab2_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings)
  bpy.types.Scene.Simplygon_9aa1f4afbe894b4c9e8e2de0527a0d32_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonNumberOfViewsEx)
  bpy.types.Scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_c853cfea58124ba7b608d936439a2518_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings)
  bpy.types.Scene.Simplygon_6df6e643bd9d43c388071cabbee126af_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonUseTightFittingEx)
  bpy.types.Scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTightFittingDepthOffsetEx)
  bpy.types.Scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_e237565689074e43bddd3cb21f34aefb_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTexCoordPaddingEx)
  bpy.types.Scene.Simplygon_d38367a66547400c89422cae4cc6956e_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings)
  bpy.types.Scene.Simplygon_353ef644c1414e39a13c4ac7d460a3e2_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_80300edce7834ddda48ba1104593d297_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenErrorToleranceEx)
  bpy.types.Scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonInvertOutputMeshEx)
  bpy.types.Scene.Simplygon_d52296aefba24645b58be1227496416e_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonTransferSkinningEx)
  bpy.types.Scene.Simplygon_09006e413dd34826b9aae4979b17e706_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonUseCamerasEx)
  bpy.types.Scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_41a13694eae94b15a4a152234f57c113_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOcclusionModeEx)
  bpy.types.Scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings)
  bpy.types.Scene.Simplygon_475357d1738a44eead0e8bac56cc6f4a_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_04061333add241b49cddd073bcb6e870_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonBakeOpacityInAlphaEx)
  bpy.types.Scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_7e87581ce747499885b263dad0d41797_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonSkipCastingIfNoInputChannelEx)
  bpy.types.Scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings)
  bpy.types.Scene.Simplygon_52cbbffdfd98405a8a3a62a3fc3b8a01_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings)
  bpy.types.Scene.Simplygon_2807969c2c174af3ba43f4889db6d81a_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_f28423742727421381bd75b8a60944f6_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipBackfacingNormalsEx)
  bpy.types.Scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_db031278bfb44e9086aa287793175102_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonGenerateTangentSpaceNormalsEx)
  bpy.types.Scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipGreenEx)
  bpy.types.Scene.Simplygon_55cf517886354b72ba2679d711e84844_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonCalculateBitangentPerFragmentEx)
  bpy.types.Scene.Simplygon_362a73a647d64e3b92c874546c8188a7_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonNormalizeInterpolatedTangentSpaceEx)
  bpy.types.Scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings)
  bpy.types.Scene.Simplygon_cb4c127c3c134264bd6e284805d37749_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_96bad38087f0408bbee2953b834784da_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDistanceScalingEx)
  bpy.types.Scene.Simplygon_287d073634244b2b86623c74f3747ead_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateScalarDisplacementEx)
  bpy.types.Scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateTangentSpaceDisplacementEx)
  bpy.types.Scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonNormalMapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings)
  bpy.types.Scene.Simplygon_16c19fe6d95d4a318fae3b51648ef56d_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_7948468210e5421b970e7c7423024047_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_a6b0f9434608401e89952068df3386f2_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonRaysPerPixelEx)
  bpy.types.Scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_3bcad42e441049a6acf402185af0da45_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionFalloffEx)
  bpy.types.Scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionMultiplierEx)
  bpy.types.Scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseSimpleOcclusionModeEx)
  bpy.types.Scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings)
  bpy.types.Scene.Simplygon_0d6cdf4028a34606bdf32b3af889d8ce_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_e801b945e55e4688866f83f39aea645f_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldTypeEx)
  bpy.types.Scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldIndexEx)
  bpy.types.Scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfREx)
  bpy.types.Scene.Simplygon_ef80786c094847b295cb4855e20935bb_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupREx)
  bpy.types.Scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfGEx)
  bpy.types.Scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupGEx)
  bpy.types.Scene.Simplygon_44e451be55244b4eacbeac467e1366df_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfBEx)
  bpy.types.Scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupBEx)
  bpy.types.Scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfAEx)
  bpy.types.Scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupAEx)
  bpy.types.Scene.Simplygon_f16f20e16d474f05908c2daba631696d_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings)
  bpy.types.Scene.Simplygon_1e5b690f1e6a48509d45d91ce1d14a12_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_e88678622aea452b9cdd597af927e971_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_3a245fd0af434115b72ff28169063063_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_9f4500d047464776b964350f79e37be0_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorLevelEx)
  bpy.types.Scene.Simplygon_79afd131c272450599560ca8451339b3_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_3088c636f28c494ea71965b8907da0de_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorNameEx)
  bpy.types.Scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_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_5f18aad20ad949e49b89958e3afdccf8_List.clear()
  del bpy.types.Scene.Simplygon_5f18aad20ad949e49b89958e3afdccf8_List
  bpy.context.scene.Simplygon_fbc44824ef4e4aac8f456030c35cf553_List.clear()
  del bpy.types.Scene.Simplygon_fbc44824ef4e4aac8f456030c35cf553_List
  bpy.context.scene.Simplygon_a4af02e90048402bad216470900eec75_List.clear()
  del bpy.types.Scene.Simplygon_a4af02e90048402bad216470900eec75_List
  bpy.context.scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List.clear()
  del bpy.types.Scene.Simplygon_e178facd203d4f8dbbf5c853c2d75778_List
  bpy.context.scene.Simplygon_56f944938f8540328d8d79540274abda_List.clear()
  del bpy.types.Scene.Simplygon_56f944938f8540328d8d79540274abda_List
  bpy.context.scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List.clear()
  del bpy.types.Scene.Simplygon_853b198e3bdd45908af0bdac708db2f0_List
  bpy.context.scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List.clear()
  del bpy.types.Scene.Simplygon_7a2c37ef1cac4b1a851360776c233c3f_List
  bpy.context.scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List.clear()
  del bpy.types.Scene.Simplygon_34ff94d6cce24f9dab3d4fad7496522f_List
  bpy.context.scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List.clear()
  del bpy.types.Scene.Simplygon_3704d88de7794de694ca97cfa91f85fd_List
  bpy.context.scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List.clear()
  del bpy.types.Scene.Simplygon_74fe44f0caa944d481e6ef29afbf1c60_List
  bpy.context.scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List.clear()
  del bpy.types.Scene.Simplygon_649d2a12f54a490c98b52307e0b13926_List
  bpy.context.scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List.clear()
  del bpy.types.Scene.Simplygon_542d6c6369674140b14c7bf9007274fe_List
  bpy.context.scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List.clear()
  del bpy.types.Scene.Simplygon_a2a77dd216b24d20893d834f450e502e_List
  bpy.context.scene.Simplygon_f567169898ad4e9197074702a3782349_List.clear()
  del bpy.types.Scene.Simplygon_f567169898ad4e9197074702a3782349_List
  bpy.context.scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List.clear()
  del bpy.types.Scene.Simplygon_56e9a47eb8424c3989951308c7bcc2ee_List
  bpy.context.scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List.clear()
  del bpy.types.Scene.Simplygon_bf0ba9dfe02b48d790335d5fb3f29f23_List
  bpy.context.scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List.clear()
  del bpy.types.Scene.Simplygon_d8c772fcf642440ebe3309cec4d1f108_List
  bpy.context.scene.Simplygon_d373871262384f3499290c4b9d683151_List.clear()
  del bpy.types.Scene.Simplygon_d373871262384f3499290c4b9d683151_List
  bpy.context.scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List.clear()
  del bpy.types.Scene.Simplygon_937162aad69c4cd8942abbb2408e8365_List
  bpy.context.scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List.clear()
  del bpy.types.Scene.Simplygon_d0aae8b607424e9eac1e0aaecd8f7c31_List
  bpy.context.scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List.clear()
  del bpy.types.Scene.Simplygon_2e401281a1514dac9d73592b9889d7ec_List
  bpy.context.scene.Simplygon_4f93851dde594909ad9789a583525cc9_List.clear()
  del bpy.types.Scene.Simplygon_4f93851dde594909ad9789a583525cc9_List
  bpy.context.scene.Simplygon_851df449a09d46e59989f6018cca8107_List.clear()
  del bpy.types.Scene.Simplygon_851df449a09d46e59989f6018cca8107_List
  bpy.context.scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List.clear()
  del bpy.types.Scene.Simplygon_12339c1d93ac4e4c8575d097b915ee56_List
  bpy.context.scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List.clear()
  del bpy.types.Scene.Simplygon_0ea692bee3dd4b889065dc98c7767367_List
  bpy.context.scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List.clear()
  del bpy.types.Scene.Simplygon_640ac49a6e584b86af88d1fe040267fc_List
  bpy.context.scene.Simplygon_94b6a06089324bddb303fefa7473339b_List.clear()
  del bpy.types.Scene.Simplygon_94b6a06089324bddb303fefa7473339b_List
  bpy.context.scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List.clear()
  del bpy.types.Scene.Simplygon_c717fe26288b4a2da4ee228eeb6fdb10_List
  bpy.context.scene.Simplygon_aab663677985458790e54d1623678472_List.clear()
  del bpy.types.Scene.Simplygon_aab663677985458790e54d1623678472_List
  bpy.context.scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List.clear()
  del bpy.types.Scene.Simplygon_ffb84b55d4c749679aa980aeeb25251a_List
  bpy.context.scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List.clear()
  del bpy.types.Scene.Simplygon_68354f2509a34c08b0438de369f2ee60_List
  bpy.context.scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List.clear()
  del bpy.types.Scene.Simplygon_c68c46621fbb4eb09a316b308c951719_List
  bpy.context.scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List.clear()
  del bpy.types.Scene.Simplygon_1d6340120f964efe9d4168a3f9560de9_List
  bpy.context.scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_List.clear()
  del bpy.types.Scene.Simplygon_3bd1b46542854b78968fd920dfd55cec_List
  bpy.context.scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List.clear()
  del bpy.types.Scene.Simplygon_4dc789ea7c20495899cf7621b051b2e7_List
  bpy.context.scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List.clear()
  del bpy.types.Scene.Simplygon_41ba6b11934d4e54857bed8da14257bb_List
  bpy.context.scene.Simplygon_26dd05c605394866992534074e041988_List.clear()
  del bpy.types.Scene.Simplygon_26dd05c605394866992534074e041988_List
  bpy.context.scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List.clear()
  del bpy.types.Scene.Simplygon_aed4d0c5e27c46458beaf448dcdca81d_List
  bpy.context.scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List.clear()
  del bpy.types.Scene.Simplygon_aeadc5b4b0994868a171c6f300092dfa_List
  bpy.context.scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List.clear()
  del bpy.types.Scene.Simplygon_434e9b9aec1848068515fc55aab42e5e_List
  bpy.context.scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List.clear()
  del bpy.types.Scene.Simplygon_20f47d60346d4db39a45ceab76e7b1af_List
  bpy.context.scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List.clear()
  del bpy.types.Scene.Simplygon_6fb522ed84a14c3c9a86aaaa306a4c6c_List
  bpy.context.scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List.clear()
  del bpy.types.Scene.Simplygon_82985558c5cb42579bdb8c6530fe08c3_List
  bpy.context.scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List.clear()
  del bpy.types.Scene.Simplygon_f5577ffc397c414e83c7111b15e9f4ad_List
  bpy.context.scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_List.clear()
  del bpy.types.Scene.Simplygon_18e826f8fb204cffa55e43ba5aeacac3_List
  bpy.context.scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List.clear()
  del bpy.types.Scene.Simplygon_2bc44d4845bb4138b2c826f9bc0a2d70_List
  bpy.context.scene.Simplygon_c0ae98c2511d4b6295af224b41d8f009_List.clear()
  del bpy.types.Scene.Simplygon_c0ae98c2511d4b6295af224b41d8f009_List
  bpy.context.scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List.clear()
  del bpy.types.Scene.Simplygon_7e21c0f8c71340db9fd6e61b10c54f0d_List
  bpy.context.scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List.clear()
  del bpy.types.Scene.Simplygon_80d331b2728e45d6bf5ab73f4617b97c_List
  bpy.context.scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List.clear()
  del bpy.types.Scene.Simplygon_b1b72be41ffa4c14a072de1b0b0710d7_List
  bpy.context.scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List.clear()
  del bpy.types.Scene.Simplygon_33549acbc5464a98a63847ebaa5714d6_List
  bpy.context.scene.Simplygon_64207287ee154f4f9a128abffb96a726_List.clear()
  del bpy.types.Scene.Simplygon_64207287ee154f4f9a128abffb96a726_List
  bpy.context.scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List.clear()
  del bpy.types.Scene.Simplygon_aa9b3091e54c493ba3dfc5d7fbf1b24d_List
  bpy.context.scene.Simplygon_536892a45c48434eb07af0049883ea9e_List.clear()
  del bpy.types.Scene.Simplygon_536892a45c48434eb07af0049883ea9e_List
  bpy.context.scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List.clear()
  del bpy.types.Scene.Simplygon_d84be78d9e4e4a2dbe280feba1553bfe_List
  bpy.context.scene.Simplygon_33621a67d25b470baf54ec43e0b96ea4_List.clear()
  del bpy.types.Scene.Simplygon_33621a67d25b470baf54ec43e0b96ea4_List
  bpy.context.scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List.clear()
  del bpy.types.Scene.Simplygon_bdae79fc0afb45fba3b0631aa6d766cf_List
  bpy.context.scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List.clear()
  del bpy.types.Scene.Simplygon_4d6081e538884b38b93df13d9e99157b_List
  bpy.context.scene.Simplygon_a105498780c34420be674224e82c3a97_List.clear()
  del bpy.types.Scene.Simplygon_a105498780c34420be674224e82c3a97_List
  bpy.context.scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List.clear()
  del bpy.types.Scene.Simplygon_ed33e5345cd1429b8759ad9851405455_List
  bpy.context.scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List.clear()
  del bpy.types.Scene.Simplygon_40ca7a8a6d824075adcd2b53b794bf50_List
  bpy.context.scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List.clear()
  del bpy.types.Scene.Simplygon_013faa1b2ee942d69dd22ecc1707cc8b_List
  bpy.context.scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List.clear()
  del bpy.types.Scene.Simplygon_12907e1aa06247388621a8d5bc0de0df_List
  bpy.context.scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List.clear()
  del bpy.types.Scene.Simplygon_c183866041db42eca8181e3e019f3a9f_List
  bpy.context.scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List.clear()
  del bpy.types.Scene.Simplygon_b4daa8167ff24b05bf2b6d6fae972d5a_List
  bpy.context.scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List.clear()
  del bpy.types.Scene.Simplygon_25198057a02940fa8526eba6ed6ca140_List
  bpy.context.scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_List.clear()
  del bpy.types.Scene.Simplygon_0f9b5b7887814a6a8c7ef854deaf1945_List
  bpy.context.scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List.clear()
  del bpy.types.Scene.Simplygon_8200dd0e95e74876998049ed30ec0263_List
  bpy.context.scene.Simplygon_8c3862f0c1664de0b0a72bacfc5be1c3_List.clear()
  del bpy.types.Scene.Simplygon_8c3862f0c1664de0b0a72bacfc5be1c3_List
  bpy.context.scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List.clear()
  del bpy.types.Scene.Simplygon_3a89430e94a141429e4098cdf0367cbc_List
  bpy.context.scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List.clear()
  del bpy.types.Scene.Simplygon_93705df2e8d446ebb8dae1f1071a7546_List
  bpy.context.scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List.clear()
  del bpy.types.Scene.Simplygon_8671fa08cf834590a84c9322bb201dbf_List
  bpy.context.scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List.clear()
  del bpy.types.Scene.Simplygon_c7aaf2cc767b4aaeb57a76671288d72f_List
  bpy.context.scene.Simplygon_62e27828b1d542e58578137388482842_List.clear()
  del bpy.types.Scene.Simplygon_62e27828b1d542e58578137388482842_List
  bpy.context.scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List.clear()
  del bpy.types.Scene.Simplygon_fe0386e987f74a15bbf1a5b11231f951_List
  bpy.context.scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List.clear()
  del bpy.types.Scene.Simplygon_f4e939a227bc47239d4ff1704b12193b_List
  bpy.context.scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List.clear()
  del bpy.types.Scene.Simplygon_0b9fbfe3edc24dd6a61aed4b70523f3c_List
  bpy.context.scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List.clear()
  del bpy.types.Scene.Simplygon_d3e2561b20c2458bbb241b6b94f96cc5_List
  bpy.context.scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List.clear()
  del bpy.types.Scene.Simplygon_e97465fb17b94744ad033c3855a6e0d3_List
  bpy.context.scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List.clear()
  del bpy.types.Scene.Simplygon_2af10eddc0ab4f9cbcd2f272de23c13c_List
  bpy.context.scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List.clear()
  del bpy.types.Scene.Simplygon_92947a97f0ce4eb1959d7e3137b3115e_List
  bpy.context.scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List.clear()
  del bpy.types.Scene.Simplygon_b5b128ce84fb4a0695a35450b74f6b37_List
  bpy.context.scene.Simplygon_92a06cac8990426c9a878f1092e2402c_List.clear()
  del bpy.types.Scene.Simplygon_92a06cac8990426c9a878f1092e2402c_List
  bpy.context.scene.Simplygon_fd216bc817b84579b610ab179b262905_List.clear()
  del bpy.types.Scene.Simplygon_fd216bc817b84579b610ab179b262905_List
  bpy.context.scene.Simplygon_e7a6d67fc1644a7d88a3e2d103bcd939_List.clear()
  del bpy.types.Scene.Simplygon_e7a6d67fc1644a7d88a3e2d103bcd939_List
  bpy.context.scene.Simplygon_947c293161fb4efcbee117658007d9ee_List.clear()
  del bpy.types.Scene.Simplygon_947c293161fb4efcbee117658007d9ee_List
  bpy.context.scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List.clear()
  del bpy.types.Scene.Simplygon_3570292dd70344bf80c4f852aabaf8d2_List
  bpy.context.scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List.clear()
  del bpy.types.Scene.Simplygon_30db0e6970484606913cabf9d09e2de3_List
  bpy.context.scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List.clear()
  del bpy.types.Scene.Simplygon_b01b959123c7468cb66f3d8ab19881da_List
  bpy.context.scene.Simplygon_76183fd974084f78aec71167d9eab64f_List.clear()
  del bpy.types.Scene.Simplygon_76183fd974084f78aec71167d9eab64f_List
  bpy.context.scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_List.clear()
  del bpy.types.Scene.Simplygon_e68854a1f4b04c2d9d67394fb6440158_List
  bpy.context.scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_List.clear()
  del bpy.types.Scene.Simplygon_de8573c1bc6347269a1b2b65b58c6b22_List
  bpy.context.scene.Simplygon_f44fd961d8f340d2a17c27e9bab932f8_List.clear()
  del bpy.types.Scene.Simplygon_f44fd961d8f340d2a17c27e9bab932f8_List
  bpy.context.scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List.clear()
  del bpy.types.Scene.Simplygon_7d4127a6bc5d4c45bd7444d05038072b_List
  bpy.context.scene.Simplygon_06a265dd8559414184f5614ddf781962_List.clear()
  del bpy.types.Scene.Simplygon_06a265dd8559414184f5614ddf781962_List
  bpy.context.scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List.clear()
  del bpy.types.Scene.Simplygon_ec34b13153cb47a48e1986a30ee5ac10_List
  bpy.context.scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List.clear()
  del bpy.types.Scene.Simplygon_05825192fab84ce9bd92cf51d5bc5b7d_List
  bpy.context.scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List.clear()
  del bpy.types.Scene.Simplygon_cf538cd7ae9b4695a8b275e918451cf2_List
  bpy.context.scene.Simplygon_4921f127f6724e249db64c3c11051f87_List.clear()
  del bpy.types.Scene.Simplygon_4921f127f6724e249db64c3c11051f87_List
  bpy.context.scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List.clear()
  del bpy.types.Scene.Simplygon_b2306ec831084863a1f7996679eb2c38_List
  bpy.context.scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_List.clear()
  del bpy.types.Scene.Simplygon_cb7245fdd4d945f2bcea63c1a16e8ef6_List
  bpy.context.scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List.clear()
  del bpy.types.Scene.Simplygon_93f40d6d1c6e47e9ac1e98a4bdabb612_List
  bpy.context.scene.Simplygon_e9f5594d331546ef802731f7cc35531e_List.clear()
  del bpy.types.Scene.Simplygon_e9f5594d331546ef802731f7cc35531e_List
  bpy.context.scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List.clear()
  del bpy.types.Scene.Simplygon_b88525500e74481aad1cfd97c3af8524_List
  bpy.context.scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List.clear()
  del bpy.types.Scene.Simplygon_ee1eb2a919b84b3d996f4d85115e4a91_List
  bpy.context.scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_List.clear()
  del bpy.types.Scene.Simplygon_925f86d5713c46fb82c9bb9a8983ee40_List
  bpy.context.scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List.clear()
  del bpy.types.Scene.Simplygon_db2b212c3d5f44118acd5cf6bc91c17c_List
  bpy.context.scene.Simplygon_12c524753d9d462db791625f7678b9e6_List.clear()
  del bpy.types.Scene.Simplygon_12c524753d9d462db791625f7678b9e6_List
  bpy.context.scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List.clear()
  del bpy.types.Scene.Simplygon_fef7d49d90b746a09af7af99725e606f_List
  bpy.context.scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List.clear()
  del bpy.types.Scene.Simplygon_cc5e3ce3283e4f809d42b0076b588e35_List
  bpy.context.scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List.clear()
  del bpy.types.Scene.Simplygon_0702e40f7d8b4513b901b8ca4f62a2de_List
  bpy.context.scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List.clear()
  del bpy.types.Scene.Simplygon_177b6c196e4a499d90e93a6dafeef360_List
  bpy.context.scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List.clear()
  del bpy.types.Scene.Simplygon_2bdb06bd16524477a3ddea6b0bc9df62_List
  bpy.context.scene.Simplygon_7425f454f7d7452ca97e385605f195b3_List.clear()
  del bpy.types.Scene.Simplygon_7425f454f7d7452ca97e385605f195b3_List
  bpy.context.scene.Simplygon_2378c68f0bf94636a15206135242c538_List.clear()
  del bpy.types.Scene.Simplygon_2378c68f0bf94636a15206135242c538_List
  bpy.context.scene.Simplygon_cb773b650dd341c2944806862007bfd6_List.clear()
  del bpy.types.Scene.Simplygon_cb773b650dd341c2944806862007bfd6_List
  bpy.context.scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_List.clear()
  del bpy.types.Scene.Simplygon_795c21a4422b42d5aafedcab3f7b1596_List
  bpy.context.scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List.clear()
  del bpy.types.Scene.Simplygon_a97e996253e8466e888be1b01d6e2e64_List
  bpy.context.scene.Simplygon_940808fbd692477d841bb3f7f100af6a_List.clear()
  del bpy.types.Scene.Simplygon_940808fbd692477d841bb3f7f100af6a_List
  bpy.context.scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List.clear()
  del bpy.types.Scene.Simplygon_790ea9d5a0844dabaf3e3ead38b4d7e7_List
  bpy.context.scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List.clear()
  del bpy.types.Scene.Simplygon_f0d5986a941c4869bff99504ba3a485d_List
  bpy.context.scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List.clear()
  del bpy.types.Scene.Simplygon_06323fa7b82f4712af93ede1d7467b80_List
  bpy.context.scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List.clear()
  del bpy.types.Scene.Simplygon_8ceaf1f250964c9484f092bee7149146_List
  bpy.context.scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List.clear()
  del bpy.types.Scene.Simplygon_dc4ef4a5b0a440b085b70aff825c1d6f_List
  bpy.context.scene.Simplygon_492e786486d7452082c29654ebc71d22_List.clear()
  del bpy.types.Scene.Simplygon_492e786486d7452082c29654ebc71d22_List
  bpy.context.scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List.clear()
  del bpy.types.Scene.Simplygon_5339d2ade0724968bf8c63df97023e7a_List
  bpy.context.scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List.clear()
  del bpy.types.Scene.Simplygon_b780e5cfdb0f4c6dab55a7fe6a0a0720_List
  bpy.context.scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List.clear()
  del bpy.types.Scene.Simplygon_cebb95dc0fbe486d836a7d5a8499b996_List
  bpy.context.scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List.clear()
  del bpy.types.Scene.Simplygon_b31d1395b4c74e3492b93d4d59966df7_List
  bpy.context.scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List.clear()
  del bpy.types.Scene.Simplygon_b1aad01dbfc64d2784d4122aba64407f_List
  bpy.context.scene.Simplygon_02daa099344548a697c7c165d1d48648_List.clear()
  del bpy.types.Scene.Simplygon_02daa099344548a697c7c165d1d48648_List
  bpy.context.scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List.clear()
  del bpy.types.Scene.Simplygon_2e27ebeabaac4f1dbd1df3c7525ac01b_List
  bpy.context.scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List.clear()
  del bpy.types.Scene.Simplygon_7e6f83eed81e415f8e35c420793d1435_List
  bpy.context.scene.Simplygon_6fca3ae71a044031942a0368a81a0a39_List.clear()
  del bpy.types.Scene.Simplygon_6fca3ae71a044031942a0368a81a0a39_List
  bpy.context.scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List.clear()
  del bpy.types.Scene.Simplygon_2fb6435a021c471199d7f44cb20a45c7_List
  bpy.context.scene.Simplygon_121d6d0e38a44c4a9dfd908fa60db8cf_List.clear()
  del bpy.types.Scene.Simplygon_121d6d0e38a44c4a9dfd908fa60db8cf_List
  bpy.context.scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List.clear()
  del bpy.types.Scene.Simplygon_d29f50b4569840ed8f8ac4825f0125a7_List
  bpy.context.scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List.clear()
  del bpy.types.Scene.Simplygon_e0ff7d24a37942d28a698d22dd88acf7_List
  bpy.context.scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List.clear()
  del bpy.types.Scene.Simplygon_0b7f7cbadf85454abaaf4cbce22a1186_List
  bpy.context.scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List.clear()
  del bpy.types.Scene.Simplygon_22339b313f5c40f28bc0e10930a6f3f0_List
  bpy.context.scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List.clear()
  del bpy.types.Scene.Simplygon_2e2ca92733c54a31b6aa02d838ae35ed_List
  bpy.context.scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List.clear()
  del bpy.types.Scene.Simplygon_e59494b82a6b45eb9f10c9774f5c8f76_List
  bpy.context.scene.Simplygon_84067fe459334187a2a61986355eb870_List.clear()
  del bpy.types.Scene.Simplygon_84067fe459334187a2a61986355eb870_List
  bpy.context.scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List.clear()
  del bpy.types.Scene.Simplygon_e673b3ccfac2472bb4a69f7ff1f33bfc_List
  bpy.context.scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List.clear()
  del bpy.types.Scene.Simplygon_c356cf677f614104a4b0bad6411d4ddc_List
  bpy.context.scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List.clear()
  del bpy.types.Scene.Simplygon_e8671d10922c49debbf49800b96e72ec_List
  bpy.context.scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_List.clear()
  del bpy.types.Scene.Simplygon_466c176a9ee8446b9a364a6d49eb4f28_List
  bpy.context.scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List.clear()
  del bpy.types.Scene.Simplygon_1a64da47aa7f44b68f8442886826dc05_List
  bpy.context.scene.Simplygon_bb2a582f5a4347319256845fac7294ec_List.clear()
  del bpy.types.Scene.Simplygon_bb2a582f5a4347319256845fac7294ec_List
  bpy.context.scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_List.clear()
  del bpy.types.Scene.Simplygon_29d61deec1664fedaf3f0a85612f1072_List
  bpy.context.scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List.clear()
  del bpy.types.Scene.Simplygon_1e821d86652846e8a9daea3ec5a27bc2_List
  bpy.context.scene.Simplygon_814855cb16434c1eb9ba4ce5f5bca63a_List.clear()
  del bpy.types.Scene.Simplygon_814855cb16434c1eb9ba4ce5f5bca63a_List
  bpy.context.scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_List.clear()
  del bpy.types.Scene.Simplygon_5ed0eb55b676443e815be0a0ca62c570_List
  bpy.context.scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List.clear()
  del bpy.types.Scene.Simplygon_16b372584d6d47c79c7a4953abbdaab3_List
  bpy.context.scene.Simplygon_f8fac606a13b4867999e37850d419960_List.clear()
  del bpy.types.Scene.Simplygon_f8fac606a13b4867999e37850d419960_List
  bpy.context.scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List.clear()
  del bpy.types.Scene.Simplygon_0730bfc1fa6b46f39f7360edc41a3a88_List
  bpy.context.scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List.clear()
  del bpy.types.Scene.Simplygon_776e7f08edbe4a8682d5ff74f00dd395_List
  bpy.context.scene.Simplygon_72ef0df0801945b1bf50b84293212f92_List.clear()
  del bpy.types.Scene.Simplygon_72ef0df0801945b1bf50b84293212f92_List
  bpy.context.scene.Simplygon_bf5d959226dc44c6ab20cf6229591cf2_List.clear()
  del bpy.types.Scene.Simplygon_bf5d959226dc44c6ab20cf6229591cf2_List
  bpy.context.scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List.clear()
  del bpy.types.Scene.Simplygon_9a254cc17d534473a2322db7795e4e52_List
  bpy.context.scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List.clear()
  del bpy.types.Scene.Simplygon_998e5e576cf648d592f6ffa9e26b4077_List
  bpy.context.scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List.clear()
  del bpy.types.Scene.Simplygon_61a04a919b0844bf9ae4f87eda08b240_List
  bpy.context.scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List.clear()
  del bpy.types.Scene.Simplygon_ac0e8bec6cd34e16b22fefe8ec3b06c9_List
  bpy.context.scene.Simplygon_195420bbc27c493584690e0b02e1832d_List.clear()
  del bpy.types.Scene.Simplygon_195420bbc27c493584690e0b02e1832d_List
  bpy.context.scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_List.clear()
  del bpy.types.Scene.Simplygon_abb6850b72f34cf0b6f552a4d9687733_List
  bpy.context.scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List.clear()
  del bpy.types.Scene.Simplygon_88e8b41b56d346499fea03d8a91c6cc6_List
  bpy.context.scene.Simplygon_5756458a8700406980a7d48746b7d199_List.clear()
  del bpy.types.Scene.Simplygon_5756458a8700406980a7d48746b7d199_List
  bpy.context.scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List.clear()
  del bpy.types.Scene.Simplygon_239af4cc6e3341e89a97b9372929e959_List
  bpy.context.scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List.clear()
  del bpy.types.Scene.Simplygon_326ad3e5d6b2460fac848bbc5ab68c9a_List
  bpy.context.scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List.clear()
  del bpy.types.Scene.Simplygon_4134a231ac62402e97fb0089e0f85c04_List
  bpy.context.scene.Simplygon_677df482374b4807b3fe471b00c9c553_List.clear()
  del bpy.types.Scene.Simplygon_677df482374b4807b3fe471b00c9c553_List
  bpy.context.scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_List.clear()
  del bpy.types.Scene.Simplygon_32c4343ddddf4bbfb8a12f3379656e09_List
  bpy.context.scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List.clear()
  del bpy.types.Scene.Simplygon_9f3178091fc341f6bd04fb82d42ac545_List
  bpy.context.scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_List.clear()
  del bpy.types.Scene.Simplygon_c926ef9a6e52494db0e73bae6f709918_List
  bpy.context.scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List.clear()
  del bpy.types.Scene.Simplygon_addd218de8834e57a3ac30de5e7b75f3_List
  bpy.context.scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List.clear()
  del bpy.types.Scene.Simplygon_0e8aef207f014034abecb465aa4a0d9a_List
  bpy.context.scene.Simplygon_8652507465b04a899809bf5afee40532_List.clear()
  del bpy.types.Scene.Simplygon_8652507465b04a899809bf5afee40532_List
  bpy.context.scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List.clear()
  del bpy.types.Scene.Simplygon_5c450331bf93404d90ccf019bd3aa78e_List
  bpy.context.scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List.clear()
  del bpy.types.Scene.Simplygon_a6a273f7526746e2866274c9d5489f78_List
  bpy.context.scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List.clear()
  del bpy.types.Scene.Simplygon_5b1a8ae9de7948618cf7fa4472857107_List
  bpy.context.scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List.clear()
  del bpy.types.Scene.Simplygon_d5b6093ec7c042639e34fdad84e7663a_List
  bpy.context.scene.Simplygon_f722d455be544713abbc00004971eab2_List.clear()
  del bpy.types.Scene.Simplygon_f722d455be544713abbc00004971eab2_List
  bpy.context.scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List.clear()
  del bpy.types.Scene.Simplygon_b03bbd2b09454bc08e118ade12db0bfc_List
  bpy.context.scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List.clear()
  del bpy.types.Scene.Simplygon_170d3696bb644181b6dbce0f02ab5d81_List
  bpy.context.scene.Simplygon_9aa1f4afbe894b4c9e8e2de0527a0d32_List.clear()
  del bpy.types.Scene.Simplygon_9aa1f4afbe894b4c9e8e2de0527a0d32_List
  bpy.context.scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List.clear()
  del bpy.types.Scene.Simplygon_e9af005625eb443b97a3267ee05f9a9e_List
  bpy.context.scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List.clear()
  del bpy.types.Scene.Simplygon_1639ae510e2345289ed3be21e9f32601_List
  bpy.context.scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List.clear()
  del bpy.types.Scene.Simplygon_47c949cf795c4949bab299088c7e06cc_List
  bpy.context.scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List.clear()
  del bpy.types.Scene.Simplygon_12344274dbb345adb8cadf1355d0c584_List
  bpy.context.scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List.clear()
  del bpy.types.Scene.Simplygon_61d865c61b5b415da4aa5dac0df18a75_List
  bpy.context.scene.Simplygon_c853cfea58124ba7b608d936439a2518_List.clear()
  del bpy.types.Scene.Simplygon_c853cfea58124ba7b608d936439a2518_List
  bpy.context.scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List.clear()
  del bpy.types.Scene.Simplygon_4f0fcb2c189a4f40afea192d62e56477_List
  bpy.context.scene.Simplygon_6df6e643bd9d43c388071cabbee126af_List.clear()
  del bpy.types.Scene.Simplygon_6df6e643bd9d43c388071cabbee126af_List
  bpy.context.scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List.clear()
  del bpy.types.Scene.Simplygon_f6030a8090af41b1ba80e7509b51fb5a_List
  bpy.context.scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List.clear()
  del bpy.types.Scene.Simplygon_71a84f9667554413a8a44b625bdc592b_List
  bpy.context.scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List.clear()
  del bpy.types.Scene.Simplygon_d747956bad3944818273b2cffe1c3ec4_List
  bpy.context.scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List.clear()
  del bpy.types.Scene.Simplygon_c83524828a8b4d46afa4d3a456041344_List
  bpy.context.scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List.clear()
  del bpy.types.Scene.Simplygon_43f788e21471401ab85e27c3a72d8517_List
  bpy.context.scene.Simplygon_e237565689074e43bddd3cb21f34aefb_List.clear()
  del bpy.types.Scene.Simplygon_e237565689074e43bddd3cb21f34aefb_List
  bpy.context.scene.Simplygon_d38367a66547400c89422cae4cc6956e_List.clear()
  del bpy.types.Scene.Simplygon_d38367a66547400c89422cae4cc6956e_List
  bpy.context.scene.Simplygon_353ef644c1414e39a13c4ac7d460a3e2_List.clear()
  del bpy.types.Scene.Simplygon_353ef644c1414e39a13c4ac7d460a3e2_List
  bpy.context.scene.Simplygon_80300edce7834ddda48ba1104593d297_List.clear()
  del bpy.types.Scene.Simplygon_80300edce7834ddda48ba1104593d297_List
  bpy.context.scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List.clear()
  del bpy.types.Scene.Simplygon_b085a9fef24845f4bab3348feb1f6166_List
  bpy.context.scene.Simplygon_d52296aefba24645b58be1227496416e_List.clear()
  del bpy.types.Scene.Simplygon_d52296aefba24645b58be1227496416e_List
  bpy.context.scene.Simplygon_09006e413dd34826b9aae4979b17e706_List.clear()
  del bpy.types.Scene.Simplygon_09006e413dd34826b9aae4979b17e706_List
  bpy.context.scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List.clear()
  del bpy.types.Scene.Simplygon_e76d42138b2f439d8ef513a40a42012b_List
  bpy.context.scene.Simplygon_41a13694eae94b15a4a152234f57c113_List.clear()
  del bpy.types.Scene.Simplygon_41a13694eae94b15a4a152234f57c113_List
  bpy.context.scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_List.clear()
  del bpy.types.Scene.Simplygon_c16be913cc2240e6b5bb01b3b340ed55_List
  bpy.context.scene.Simplygon_475357d1738a44eead0e8bac56cc6f4a_List.clear()
  del bpy.types.Scene.Simplygon_475357d1738a44eead0e8bac56cc6f4a_List
  bpy.context.scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List.clear()
  del bpy.types.Scene.Simplygon_2bcd2f87403b49c98ea415cca3714286_List
  bpy.context.scene.Simplygon_04061333add241b49cddd073bcb6e870_List.clear()
  del bpy.types.Scene.Simplygon_04061333add241b49cddd073bcb6e870_List
  bpy.context.scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List.clear()
  del bpy.types.Scene.Simplygon_c80fe05c9ffa4e6788afaebdfe144444_List
  bpy.context.scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List.clear()
  del bpy.types.Scene.Simplygon_f2fa6ecd7947429b93e9d4dc2dbe3160_List
  bpy.context.scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List.clear()
  del bpy.types.Scene.Simplygon_d4bacde7e0584b179a17459abda51db9_List
  bpy.context.scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List.clear()
  del bpy.types.Scene.Simplygon_5fa150b9af33438ca0b0caf6dcd24be3_List
  bpy.context.scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List.clear()
  del bpy.types.Scene.Simplygon_b2a12266952b4954b0f833123b2f3824_List
  bpy.context.scene.Simplygon_7e87581ce747499885b263dad0d41797_List.clear()
  del bpy.types.Scene.Simplygon_7e87581ce747499885b263dad0d41797_List
  bpy.context.scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List.clear()
  del bpy.types.Scene.Simplygon_152e1778720241f48f67d2eb1f3ad3b9_List
  bpy.context.scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_List.clear()
  del bpy.types.Scene.Simplygon_3488bd3c6a26418ea6f333526aa53f95_List
  bpy.context.scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List.clear()
  del bpy.types.Scene.Simplygon_0f0c296b6e9243c1a9d6db60a51dab52_List
  bpy.context.scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List.clear()
  del bpy.types.Scene.Simplygon_10859959d6db48ffa381312dbda46ffd_List
  bpy.context.scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List.clear()
  del bpy.types.Scene.Simplygon_06a7c681195043b9adbac3ab587524a6_List
  bpy.context.scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List.clear()
  del bpy.types.Scene.Simplygon_5715138f0e9f4622909aa0bf43c568ff_List
  bpy.context.scene.Simplygon_52cbbffdfd98405a8a3a62a3fc3b8a01_List.clear()
  del bpy.types.Scene.Simplygon_52cbbffdfd98405a8a3a62a3fc3b8a01_List
  bpy.context.scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List.clear()
  del bpy.types.Scene.Simplygon_d9e870c7de464fe3a08129e5c7253d8b_List
  bpy.context.scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List.clear()
  del bpy.types.Scene.Simplygon_9998d1040558409ba6fb45a1b849ff68_List
  bpy.context.scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List.clear()
  del bpy.types.Scene.Simplygon_2c81e4f149684e0388b4c662281b10ac_List
  bpy.context.scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List.clear()
  del bpy.types.Scene.Simplygon_685315d5f13c45ee9dc95b2de4c0f609_List
  bpy.context.scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List.clear()
  del bpy.types.Scene.Simplygon_db5a93f5c76b463e9764b6a8273e8cde_List
  bpy.context.scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List.clear()
  del bpy.types.Scene.Simplygon_703638d9ab1e47df95626a7831cef1bb_List
  bpy.context.scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List.clear()
  del bpy.types.Scene.Simplygon_afbd32870d594cca9c35137cce8a7805_List
  bpy.context.scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List.clear()
  del bpy.types.Scene.Simplygon_d748dec8888543848b56c1e2388f58e8_List
  bpy.context.scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List.clear()
  del bpy.types.Scene.Simplygon_f51e1ed792054215a1b30cd30e735143_List
  bpy.context.scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_List.clear()
  del bpy.types.Scene.Simplygon_23c8ba2bcc2d46498112f624e0d684dd_List
  bpy.context.scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List.clear()
  del bpy.types.Scene.Simplygon_ebf49b96138c4ec19f982ea9b6eb4ed4_List
  bpy.context.scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List.clear()
  del bpy.types.Scene.Simplygon_1fe7e918c14c4f66b33653ba97a58e1c_List
  bpy.context.scene.Simplygon_2807969c2c174af3ba43f4889db6d81a_List.clear()
  del bpy.types.Scene.Simplygon_2807969c2c174af3ba43f4889db6d81a_List
  bpy.context.scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List.clear()
  del bpy.types.Scene.Simplygon_9b1d7a4bd6ac4078ae1268f4db856909_List
  bpy.context.scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List.clear()
  del bpy.types.Scene.Simplygon_5772db55b4134984b3bbb71e281d2dfb_List
  bpy.context.scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List.clear()
  del bpy.types.Scene.Simplygon_5e35a77f33114e6ab241001eae48073b_List
  bpy.context.scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List.clear()
  del bpy.types.Scene.Simplygon_cacb4f46dc7d4352a2498233dcd846f7_List
  bpy.context.scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List.clear()
  del bpy.types.Scene.Simplygon_7d2f92198b804a09926088f9b76e6a76_List
  bpy.context.scene.Simplygon_f28423742727421381bd75b8a60944f6_List.clear()
  del bpy.types.Scene.Simplygon_f28423742727421381bd75b8a60944f6_List
  bpy.context.scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List.clear()
  del bpy.types.Scene.Simplygon_30d0cbad380c4395aca7ea6318d4561e_List
  bpy.context.scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List.clear()
  del bpy.types.Scene.Simplygon_a58126ed6d0e4dd88d43ac60fb40d293_List
  bpy.context.scene.Simplygon_db031278bfb44e9086aa287793175102_List.clear()
  del bpy.types.Scene.Simplygon_db031278bfb44e9086aa287793175102_List
  bpy.context.scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List.clear()
  del bpy.types.Scene.Simplygon_5ee56b98fb05499ea337b1f4a11a6727_List
  bpy.context.scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List.clear()
  del bpy.types.Scene.Simplygon_59520a3fcca444c9aabd5f9465006002_List
  bpy.context.scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List.clear()
  del bpy.types.Scene.Simplygon_bd9d78d98fff47c484ea7313dd4fd2cf_List
  bpy.context.scene.Simplygon_55cf517886354b72ba2679d711e84844_List.clear()
  del bpy.types.Scene.Simplygon_55cf517886354b72ba2679d711e84844_List
  bpy.context.scene.Simplygon_362a73a647d64e3b92c874546c8188a7_List.clear()
  del bpy.types.Scene.Simplygon_362a73a647d64e3b92c874546c8188a7_List
  bpy.context.scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List.clear()
  del bpy.types.Scene.Simplygon_3df6d9fb49c84e798940823dc164bef0_List
  bpy.context.scene.Simplygon_cb4c127c3c134264bd6e284805d37749_List.clear()
  del bpy.types.Scene.Simplygon_cb4c127c3c134264bd6e284805d37749_List
  bpy.context.scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List.clear()
  del bpy.types.Scene.Simplygon_6f3b411b280e40bda333e1c4bef955f6_List
  bpy.context.scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List.clear()
  del bpy.types.Scene.Simplygon_d2a3e1d37c604104a2784f78c1d83432_List
  bpy.context.scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List.clear()
  del bpy.types.Scene.Simplygon_24cf9e5d83ff4c18975dc80b3c35a315_List
  bpy.context.scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List.clear()
  del bpy.types.Scene.Simplygon_cccce7c337be43ee9903abbc222f7e41_List
  bpy.context.scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List.clear()
  del bpy.types.Scene.Simplygon_ecc59c43447e42ffb7b31fca6c35c456_List
  bpy.context.scene.Simplygon_96bad38087f0408bbee2953b834784da_List.clear()
  del bpy.types.Scene.Simplygon_96bad38087f0408bbee2953b834784da_List
  bpy.context.scene.Simplygon_287d073634244b2b86623c74f3747ead_List.clear()
  del bpy.types.Scene.Simplygon_287d073634244b2b86623c74f3747ead_List
  bpy.context.scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List.clear()
  del bpy.types.Scene.Simplygon_a7d6f43d933d4c9597c51cf75b9610b7_List
  bpy.context.scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List.clear()
  del bpy.types.Scene.Simplygon_e474a09e6a8246cea50cc8badb74de82_List
  bpy.context.scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List.clear()
  del bpy.types.Scene.Simplygon_5bea39b93c0c422a9b481287f73f5dba_List
  bpy.context.scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List.clear()
  del bpy.types.Scene.Simplygon_203e4335d389425d9b5d78f9b410fea5_List
  bpy.context.scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List.clear()
  del bpy.types.Scene.Simplygon_e34f6310cfa648ac920c62c1a4ae0bb2_List
  bpy.context.scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_List.clear()
  del bpy.types.Scene.Simplygon_a80cb1fbadbf4f98954877091be4df30_List
  bpy.context.scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List.clear()
  del bpy.types.Scene.Simplygon_f32e8fa037e44801ad81f6284a02aed4_List
  bpy.context.scene.Simplygon_16c19fe6d95d4a318fae3b51648ef56d_List.clear()
  del bpy.types.Scene.Simplygon_16c19fe6d95d4a318fae3b51648ef56d_List
  bpy.context.scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List.clear()
  del bpy.types.Scene.Simplygon_1570003843324c0593cdb84fb10f32a2_List
  bpy.context.scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List.clear()
  del bpy.types.Scene.Simplygon_6f74eeb3e75940a888ec766922aa1be2_List
  bpy.context.scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List.clear()
  del bpy.types.Scene.Simplygon_c6734a934a9d49a7aa87b3ab1c6e7e93_List
  bpy.context.scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List.clear()
  del bpy.types.Scene.Simplygon_ef088c9660ba4a5f9d99fe3744edea5e_List
  bpy.context.scene.Simplygon_7948468210e5421b970e7c7423024047_List.clear()
  del bpy.types.Scene.Simplygon_7948468210e5421b970e7c7423024047_List
  bpy.context.scene.Simplygon_a6b0f9434608401e89952068df3386f2_List.clear()
  del bpy.types.Scene.Simplygon_a6b0f9434608401e89952068df3386f2_List
  bpy.context.scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List.clear()
  del bpy.types.Scene.Simplygon_a7f04a6a9fac47ddbd06dd4fbcc1728a_List
  bpy.context.scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List.clear()
  del bpy.types.Scene.Simplygon_cdcccab814f54a0989f918e2f311c2b8_List
  bpy.context.scene.Simplygon_3bcad42e441049a6acf402185af0da45_List.clear()
  del bpy.types.Scene.Simplygon_3bcad42e441049a6acf402185af0da45_List
  bpy.context.scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List.clear()
  del bpy.types.Scene.Simplygon_af4eaffe18db4581be55133bbceefcc1_List
  bpy.context.scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List.clear()
  del bpy.types.Scene.Simplygon_356e400f6f8e4f5a86f1e49bad86cc6f_List
  bpy.context.scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List.clear()
  del bpy.types.Scene.Simplygon_c469d63b1c2c437b8f29b72c1c82238d_List
  bpy.context.scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_List.clear()
  del bpy.types.Scene.Simplygon_c4d981a44685407a9fd042d2d7f0a179_List
  bpy.context.scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List.clear()
  del bpy.types.Scene.Simplygon_cfb799296cd34622932e9e0c3ec9b7ca_List
  bpy.context.scene.Simplygon_0d6cdf4028a34606bdf32b3af889d8ce_List.clear()
  del bpy.types.Scene.Simplygon_0d6cdf4028a34606bdf32b3af889d8ce_List
  bpy.context.scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List.clear()
  del bpy.types.Scene.Simplygon_f9fed3ad0e604a45b0650534c4ebe688_List
  bpy.context.scene.Simplygon_e801b945e55e4688866f83f39aea645f_List.clear()
  del bpy.types.Scene.Simplygon_e801b945e55e4688866f83f39aea645f_List
  bpy.context.scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List.clear()
  del bpy.types.Scene.Simplygon_8e4a547547f141ada6fb7a933421e2eb_List
  bpy.context.scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List.clear()
  del bpy.types.Scene.Simplygon_26cbf2be37e34fa99092dbd8e43819c8_List
  bpy.context.scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List.clear()
  del bpy.types.Scene.Simplygon_ca8c86c639444a34a6100bcf1d77765d_List
  bpy.context.scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List.clear()
  del bpy.types.Scene.Simplygon_b39a0ef3f9e34e2a9d951271e1a9fbd3_List
  bpy.context.scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List.clear()
  del bpy.types.Scene.Simplygon_6799ec87f5a14871a3a9347a5d7fbc76_List
  bpy.context.scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List.clear()
  del bpy.types.Scene.Simplygon_ff9eca0fc9134de7b88afc51a6ab2382_List
  bpy.context.scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List.clear()
  del bpy.types.Scene.Simplygon_de997f4db50948c6a8bac7bf18bdf43f_List
  bpy.context.scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List.clear()
  del bpy.types.Scene.Simplygon_ecfb7e436f2c4e298447e00f56538bef_List
  bpy.context.scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List.clear()
  del bpy.types.Scene.Simplygon_0d2f6fda99a345f6b707c15144d4947f_List
  bpy.context.scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List.clear()
  del bpy.types.Scene.Simplygon_28facbc1916f44f5a7250ba225b53860_List
  bpy.context.scene.Simplygon_ef80786c094847b295cb4855e20935bb_List.clear()
  del bpy.types.Scene.Simplygon_ef80786c094847b295cb4855e20935bb_List
  bpy.context.scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List.clear()
  del bpy.types.Scene.Simplygon_05e52c22d61f4c178e6e08b4a9adf10f_List
  bpy.context.scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List.clear()
  del bpy.types.Scene.Simplygon_c21a801ae75146be8045606bc0657c1c_List
  bpy.context.scene.Simplygon_44e451be55244b4eacbeac467e1366df_List.clear()
  del bpy.types.Scene.Simplygon_44e451be55244b4eacbeac467e1366df_List
  bpy.context.scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List.clear()
  del bpy.types.Scene.Simplygon_3dc64e2d8bd24e4ab483d4f782c8170a_List
  bpy.context.scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List.clear()
  del bpy.types.Scene.Simplygon_3c4d7da58f77435e82d4463a5d7c26c6_List
  bpy.context.scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_List.clear()
  del bpy.types.Scene.Simplygon_84a46524ee8b4cd89bb2f614ba6504c5_List
  bpy.context.scene.Simplygon_f16f20e16d474f05908c2daba631696d_List.clear()
  del bpy.types.Scene.Simplygon_f16f20e16d474f05908c2daba631696d_List
  bpy.context.scene.Simplygon_1e5b690f1e6a48509d45d91ce1d14a12_List.clear()
  del bpy.types.Scene.Simplygon_1e5b690f1e6a48509d45d91ce1d14a12_List
  bpy.context.scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List.clear()
  del bpy.types.Scene.Simplygon_4085cec26d7a4f50870cc68ea655855c_List
  bpy.context.scene.Simplygon_e88678622aea452b9cdd597af927e971_List.clear()
  del bpy.types.Scene.Simplygon_e88678622aea452b9cdd597af927e971_List
  bpy.context.scene.Simplygon_3a245fd0af434115b72ff28169063063_List.clear()
  del bpy.types.Scene.Simplygon_3a245fd0af434115b72ff28169063063_List
  bpy.context.scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List.clear()
  del bpy.types.Scene.Simplygon_c70e6a077b5146aaa1861acb731ff54f_List
  bpy.context.scene.Simplygon_9f4500d047464776b964350f79e37be0_List.clear()
  del bpy.types.Scene.Simplygon_9f4500d047464776b964350f79e37be0_List
  bpy.context.scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List.clear()
  del bpy.types.Scene.Simplygon_c7a1041236c045f080ff34866d59cdb7_List
  bpy.context.scene.Simplygon_79afd131c272450599560ca8451339b3_List.clear()
  del bpy.types.Scene.Simplygon_79afd131c272450599560ca8451339b3_List
  bpy.context.scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List.clear()
  del bpy.types.Scene.Simplygon_1d0806debcde432c8fba850e5fa346c4_List
  bpy.context.scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List.clear()
  del bpy.types.Scene.Simplygon_96fa9c525cdf4ed2a8b8d3300aab3f34_List
  bpy.context.scene.Simplygon_3088c636f28c494ea71965b8907da0de_List.clear()
  del bpy.types.Scene.Simplygon_3088c636f28c494ea71965b8907da0de_List
  bpy.context.scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List.clear()
  del bpy.types.Scene.Simplygon_b1f9ca1c1efc4f41b44cb483d67592d5_List
  bpy.context.scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_List.clear()
  del bpy.types.Scene.Simplygon_b3573e078fb140709f1f98a27fa4f6a7_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()

