bl_info = {
  'name': 'Simplygon',
  'blender': (2, 90, 0),
  'version': (9, 2, 4200, 0),
  'location': 'View3D',
  'category': '3D Optimization',
  'author': 'Microsoft Corporation',
  'doc_url': 'https://documentation.simplygon.com/SimplygonSDK_9.2.4200.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.4200.0'
  jsonData['Commit'] = '5e344672a8a2e674301feb7b4a9c30e9dc565f34'

  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.4200.0"
  Commit = "5e344672a8a2e674301feb7b4a9c30e9dc565f34"

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))
        if pipeline.PipelineType == ESimplygonPipeline.Passthrough:
          for cascadedPipeline in GetSimplygonPipelines(pipeline.CascadedPipelineIds):
            context.scene.Simplygon_PipelineIds += cascadedPipeline.name + ';'


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


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


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


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

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



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

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



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

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



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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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



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



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

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

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


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


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



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

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

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

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



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


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


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


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

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



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

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



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

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


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

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



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



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

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

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

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

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


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

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



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

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


    row = layout.row()
    row.label(text='Simplygon version: 9.2.4200.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_894bbf9757d44ed88212e463d96d7ed6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_894bbf9757d44ed88212e463d96d7ed6_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_5ac119edc2bc406fa6d79f529aed9e38_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_271e90d2209f451ba9a0038ce0a07f9d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_5662c6e3e1cf422987829a2f42b5fb83_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_f206c265e9c44926977d24e4e906d55c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f206c265e9c44926977d24e4e906d55c_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_1a882d0584fc4cd3b0bfd4add0e114a8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_9ebcd2c6bdaa44fe87164aa9df686026_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_c477490697ec43e4afb62c8f70348192_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c477490697ec43e4afb62c8f70348192_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_e5d8537181344693a30163fbd55961cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e5d8537181344693a30163fbd55961cf_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_a998a03c232d4e6b97f31a077425f963_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a998a03c232d4e6b97f31a077425f963_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_ac9ce832490b40fbad5e069f519b99dd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_7dae24d7718b45a9b6885347241f5775_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7dae24d7718b45a9b6885347241f5775_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_00186a86f08d43b29abcf1b9535eef0e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_946245d79f9042aba2fece382ee7c1d5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_d63976ecc6944dc2a7235d07b60cb653_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_5c8c981460cc4ebebdc8a20f6fab7bd4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_c80c9e1a50bb4883aeecb98fe0889710_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_c9c85cd57278415eb384454377299e70_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c9c85cd57278415eb384454377299e70_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_f0e0075ce3604467a0dbb80e62b012fd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_9310989163b54b5992f5c44ae211c740_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9310989163b54b5992f5c44ae211c740_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_6dc90b7f3f054192b0ce53ed73c3c6a6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_d21ec2b7680440e88ab6e70b755796e0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_c3d7eade9212427ba77c4b471d85f22a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_f7736a2c9d9342fc92a7c3c179ff6ee5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_8a55cbaa6be349129af5d00a4077c21e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_8d34c158b8294a288fc32efce18eb39a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_539aaa27fe694c6a8536a688d3e9f748_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_a41b8ddca70944cfa41514922031df7b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a41b8ddca70944cfa41514922031df7b_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_ed1910c968784ffd9964cea94997f52f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ed1910c968784ffd9964cea94997f52f_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_54d4f46422de48d7819ef17d558f090f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_54d4f46422de48d7819ef17d558f090f_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_3c46ab010128409a91a444ec6aa6e943_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_7e7fc955fbb64ba7a447c99029d9c1f0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_d0688c3dc873441a9cc952918b3ee928_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_07f812c0431c4f3ca94db611ee24bc4b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_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_a6005dada0834aa88611f4701efa22cf_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_894bbf9757d44ed88212e463d96d7ed6_List.add()
    ReductionTargetTriangleRatioEnabledUI.Init(self.name)
    ReductionTargetTriangleRatioEnabledUI.name = self.name
    ReductionTargetTriangleRatioUI = bpy.context.scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List.add()
    ReductionTargetTriangleRatioUI.Init(self.name)
    ReductionTargetTriangleRatioUI.name = self.name
    ReductionTargetTriangleCountEnabledUI = bpy.context.scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List.add()
    ReductionTargetTriangleCountEnabledUI.Init(self.name)
    ReductionTargetTriangleCountEnabledUI.name = self.name
    ReductionTargetTriangleCountUI = bpy.context.scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List.add()
    ReductionTargetTriangleCountUI.Init(self.name)
    ReductionTargetTriangleCountUI.name = self.name
    ReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List.add()
    ReductionTargetMaxDeviationEnabledUI.Init(self.name)
    ReductionTargetMaxDeviationEnabledUI.name = self.name
    ReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List.add()
    ReductionTargetMaxDeviationUI.Init(self.name)
    ReductionTargetMaxDeviationUI.name = self.name
    ReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List.add()
    ReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    ReductionTargetOnScreenSizeEnabledUI.name = self.name
    ReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_c477490697ec43e4afb62c8f70348192_List.add()
    ReductionTargetOnScreenSizeUI.Init(self.name)
    ReductionTargetOnScreenSizeUI.name = self.name
    ReductionTargetStopConditionUI = bpy.context.scene.Simplygon_e5d8537181344693a30163fbd55961cf_List.add()
    ReductionTargetStopConditionUI.Init(self.name)
    ReductionTargetStopConditionUI.name = self.name
    ReductionHeuristicsUI = bpy.context.scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List.add()
    ReductionHeuristicsUI.Init(self.name)
    ReductionHeuristicsUI.name = self.name
    GeometryImportanceUI = bpy.context.scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List.add()
    GeometryImportanceUI.Init(self.name)
    GeometryImportanceUI.name = self.name
    MaterialImportanceUI = bpy.context.scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List.add()
    MaterialImportanceUI.Init(self.name)
    MaterialImportanceUI.name = self.name
    TextureImportanceUI = bpy.context.scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List.add()
    TextureImportanceUI.Init(self.name)
    TextureImportanceUI.name = self.name
    ShadingImportanceUI = bpy.context.scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List.add()
    ShadingImportanceUI.Init(self.name)
    ShadingImportanceUI.name = self.name
    GroupImportanceUI = bpy.context.scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List.add()
    GroupImportanceUI.Init(self.name)
    GroupImportanceUI.name = self.name
    VertexColorImportanceUI = bpy.context.scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List.add()
    VertexColorImportanceUI.Init(self.name)
    VertexColorImportanceUI.name = self.name
    EdgeSetImportanceUI = bpy.context.scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List.add()
    EdgeSetImportanceUI.Init(self.name)
    EdgeSetImportanceUI.name = self.name
    SkinningImportanceUI = bpy.context.scene.Simplygon_c9c85cd57278415eb384454377299e70_List.add()
    SkinningImportanceUI.Init(self.name)
    SkinningImportanceUI.name = self.name
    CurvatureImportanceUI = bpy.context.scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List.add()
    CurvatureImportanceUI.Init(self.name)
    CurvatureImportanceUI.name = self.name
    OutwardMoveMultiplierUI = bpy.context.scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List.add()
    OutwardMoveMultiplierUI.Init(self.name)
    OutwardMoveMultiplierUI.name = self.name
    InwardMoveMultiplierUI = bpy.context.scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List.add()
    InwardMoveMultiplierUI.Init(self.name)
    InwardMoveMultiplierUI.name = self.name
    KeepSymmetryUI = bpy.context.scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List.add()
    KeepSymmetryUI.Init(self.name)
    KeepSymmetryUI.name = self.name
    UseSymmetryQuadRetriangulatorUI = bpy.context.scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List.add()
    UseSymmetryQuadRetriangulatorUI.Init(self.name)
    UseSymmetryQuadRetriangulatorUI.name = self.name
    UseAutomaticSymmetryDetectionUI = bpy.context.scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List.add()
    UseAutomaticSymmetryDetectionUI.Init(self.name)
    UseAutomaticSymmetryDetectionUI.name = self.name
    SymmetryDetectionToleranceUI = bpy.context.scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List.add()
    SymmetryDetectionToleranceUI.Init(self.name)
    SymmetryDetectionToleranceUI.name = self.name
    SymmetryAxisUI = bpy.context.scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List.add()
    SymmetryAxisUI.Init(self.name)
    SymmetryAxisUI.name = self.name
    SymmetryOffsetUI = bpy.context.scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List.add()
    SymmetryOffsetUI.Init(self.name)
    SymmetryOffsetUI.name = self.name
    CreateGeomorphGeometryUI = bpy.context.scene.Simplygon_9310989163b54b5992f5c44ae211c740_List.add()
    CreateGeomorphGeometryUI.Init(self.name)
    CreateGeomorphGeometryUI.name = self.name
    DataCreationPreferencesUI = bpy.context.scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List.add()
    DataCreationPreferencesUI.Init(self.name)
    DataCreationPreferencesUI.name = self.name
    UseHighQualityNormalCalculationUI = bpy.context.scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List.add()
    UseHighQualityNormalCalculationUI.Init(self.name)
    UseHighQualityNormalCalculationUI.name = self.name
    LockGeometricBorderUI = bpy.context.scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List.add()
    LockGeometricBorderUI.Init(self.name)
    LockGeometricBorderUI.name = self.name
    MergeGeometriesUI = bpy.context.scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    AllowDegenerateTexCoordsUI = bpy.context.scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List.add()
    AllowDegenerateTexCoordsUI.Init(self.name)
    AllowDegenerateTexCoordsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_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_894bbf9757d44ed88212e463d96d7ed6_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_5ac119edc2bc406fa6d79f529aed9e38_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_271e90d2209f451ba9a0038ce0a07f9d_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_5662c6e3e1cf422987829a2f42b5fb83_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_f206c265e9c44926977d24e4e906d55c_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_1a882d0584fc4cd3b0bfd4add0e114a8_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_9ebcd2c6bdaa44fe87164aa9df686026_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_c477490697ec43e4afb62c8f70348192_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_e5d8537181344693a30163fbd55961cf_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_a998a03c232d4e6b97f31a077425f963_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_ac9ce832490b40fbad5e069f519b99dd_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_7dae24d7718b45a9b6885347241f5775_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_00186a86f08d43b29abcf1b9535eef0e_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_946245d79f9042aba2fece382ee7c1d5_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_d63976ecc6944dc2a7235d07b60cb653_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_5c8c981460cc4ebebdc8a20f6fab7bd4_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_c80c9e1a50bb4883aeecb98fe0889710_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_c9c85cd57278415eb384454377299e70_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_f0e0075ce3604467a0dbb80e62b012fd_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_ed1910c968784ffd9964cea94997f52f_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_54d4f46422de48d7819ef17d558f090f_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_d21ec2b7680440e88ab6e70b755796e0_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_f7736a2c9d9342fc92a7c3c179ff6ee5_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_c3d7eade9212427ba77c4b471d85f22a_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_539aaa27fe694c6a8536a688d3e9f748_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_8a55cbaa6be349129af5d00a4077c21e_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_8d34c158b8294a288fc32efce18eb39a_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_9310989163b54b5992f5c44ae211c740_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_a41b8ddca70944cfa41514922031df7b_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_3c46ab010128409a91a444ec6aa6e943_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_07f812c0431c4f3ca94db611ee24bc4b_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_7e7fc955fbb64ba7a447c99029d9c1f0_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_6dc90b7f3f054192b0ce53ed73c3c6a6_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_d0688c3dc873441a9cc952918b3ee928_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_894bbf9757d44ed88212e463d96d7ed6_List.find(self.name)
    bpy.context.scene.Simplygon_894bbf9757d44ed88212e463d96d7ed6_List.remove(ReductionTargetTriangleRatioEnabledUI_index)
    ReductionTargetTriangleRatioUI_index = bpy.context.scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List.find(self.name)
    bpy.context.scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List.remove(ReductionTargetTriangleRatioUI_index)
    ReductionTargetTriangleCountEnabledUI_index = bpy.context.scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List.find(self.name)
    bpy.context.scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List.remove(ReductionTargetTriangleCountEnabledUI_index)
    ReductionTargetTriangleCountUI_index = bpy.context.scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List.find(self.name)
    bpy.context.scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List.remove(ReductionTargetTriangleCountUI_index)
    ReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List.find(self.name)
    bpy.context.scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List.remove(ReductionTargetMaxDeviationEnabledUI_index)
    ReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List.find(self.name)
    bpy.context.scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List.remove(ReductionTargetMaxDeviationUI_index)
    ReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List.find(self.name)
    bpy.context.scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List.remove(ReductionTargetOnScreenSizeEnabledUI_index)
    ReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_c477490697ec43e4afb62c8f70348192_List.find(self.name)
    bpy.context.scene.Simplygon_c477490697ec43e4afb62c8f70348192_List.remove(ReductionTargetOnScreenSizeUI_index)
    ReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_e5d8537181344693a30163fbd55961cf_List.find(self.name)
    bpy.context.scene.Simplygon_e5d8537181344693a30163fbd55961cf_List.remove(ReductionTargetStopConditionUI_index)
    ReductionHeuristicsUI_index = bpy.context.scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List.find(self.name)
    bpy.context.scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List.remove(ReductionHeuristicsUI_index)
    GeometryImportanceUI_index = bpy.context.scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List.find(self.name)
    bpy.context.scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List.remove(GeometryImportanceUI_index)
    MaterialImportanceUI_index = bpy.context.scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List.find(self.name)
    bpy.context.scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List.remove(MaterialImportanceUI_index)
    TextureImportanceUI_index = bpy.context.scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List.find(self.name)
    bpy.context.scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List.remove(TextureImportanceUI_index)
    ShadingImportanceUI_index = bpy.context.scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List.find(self.name)
    bpy.context.scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List.remove(ShadingImportanceUI_index)
    GroupImportanceUI_index = bpy.context.scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List.find(self.name)
    bpy.context.scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List.remove(GroupImportanceUI_index)
    VertexColorImportanceUI_index = bpy.context.scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List.find(self.name)
    bpy.context.scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List.remove(VertexColorImportanceUI_index)
    EdgeSetImportanceUI_index = bpy.context.scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List.find(self.name)
    bpy.context.scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List.remove(EdgeSetImportanceUI_index)
    SkinningImportanceUI_index = bpy.context.scene.Simplygon_c9c85cd57278415eb384454377299e70_List.find(self.name)
    bpy.context.scene.Simplygon_c9c85cd57278415eb384454377299e70_List.remove(SkinningImportanceUI_index)
    CurvatureImportanceUI_index = bpy.context.scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List.find(self.name)
    bpy.context.scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List.remove(CurvatureImportanceUI_index)
    OutwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List.find(self.name)
    bpy.context.scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List.remove(OutwardMoveMultiplierUI_index)
    InwardMoveMultiplierUI_index = bpy.context.scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List.find(self.name)
    bpy.context.scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List.remove(InwardMoveMultiplierUI_index)
    KeepSymmetryUI_index = bpy.context.scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List.find(self.name)
    bpy.context.scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List.remove(KeepSymmetryUI_index)
    UseSymmetryQuadRetriangulatorUI_index = bpy.context.scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List.find(self.name)
    bpy.context.scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List.remove(UseSymmetryQuadRetriangulatorUI_index)
    UseAutomaticSymmetryDetectionUI_index = bpy.context.scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List.find(self.name)
    bpy.context.scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List.remove(UseAutomaticSymmetryDetectionUI_index)
    SymmetryDetectionToleranceUI_index = bpy.context.scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List.find(self.name)
    bpy.context.scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List.remove(SymmetryDetectionToleranceUI_index)
    SymmetryAxisUI_index = bpy.context.scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List.find(self.name)
    bpy.context.scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List.remove(SymmetryAxisUI_index)
    SymmetryOffsetUI_index = bpy.context.scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List.find(self.name)
    bpy.context.scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List.remove(SymmetryOffsetUI_index)
    CreateGeomorphGeometryUI_index = bpy.context.scene.Simplygon_9310989163b54b5992f5c44ae211c740_List.find(self.name)
    bpy.context.scene.Simplygon_9310989163b54b5992f5c44ae211c740_List.remove(CreateGeomorphGeometryUI_index)
    DataCreationPreferencesUI_index = bpy.context.scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List.find(self.name)
    bpy.context.scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List.remove(DataCreationPreferencesUI_index)
    UseHighQualityNormalCalculationUI_index = bpy.context.scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List.find(self.name)
    bpy.context.scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List.remove(UseHighQualityNormalCalculationUI_index)
    LockGeometricBorderUI_index = bpy.context.scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List.find(self.name)
    bpy.context.scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List.remove(LockGeometricBorderUI_index)
    MergeGeometriesUI_index = bpy.context.scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List.find(self.name)
    bpy.context.scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List.remove(MergeGeometriesUI_index)
    AllowDegenerateTexCoordsUI_index = bpy.context.scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List.find(self.name)
    bpy.context.scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List.remove(AllowDegenerateTexCoordsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_List.find(self.name)
    bpy.context.scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_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_ce31fc405d934b038cdeca2682f7e21d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ce31fc405d934b038cdeca2682f7e21d_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_6406174b7c3a4d35bf4ba839adecbce0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_e80268ef29334712833e486d58a14d11_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e80268ef29334712833e486d58a14d11_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_5820d2bdabeb4fb19bf2043fcf51a39f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_ee1971b9095e41f3b0e4648c50d309e1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_98125e10fd354a45870ec5e6c3be1756_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_4ba25994d640457497818ecdb7584982_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4ba25994d640457497818ecdb7584982_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_19d1fcf48461416fa48b83e31d90490a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_bec47e03b49e4fb4b9b186a9f1f01a53_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_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_02b30ecae28245dea2083e2a7e9e919b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_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_ce31fc405d934b038cdeca2682f7e21d_List.add()
    UseTJunctionRemoverUI.Init(self.name)
    UseTJunctionRemoverUI.name = self.name
    TJuncDistUI = bpy.context.scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List.add()
    TJuncDistUI.Init(self.name)
    TJuncDistUI.name = self.name
    UseWeldingUI = bpy.context.scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List.add()
    UseWeldingUI.Init(self.name)
    UseWeldingUI.name = self.name
    WeldOnlyBorderVerticesUI = bpy.context.scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List.add()
    WeldOnlyBorderVerticesUI.Init(self.name)
    WeldOnlyBorderVerticesUI.name = self.name
    WeldOnlyWithinMaterialUI = bpy.context.scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List.add()
    WeldOnlyWithinMaterialUI.Init(self.name)
    WeldOnlyWithinMaterialUI.name = self.name
    WeldOnlyWithinSceneNodeUI = bpy.context.scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List.add()
    WeldOnlyWithinSceneNodeUI.Init(self.name)
    WeldOnlyWithinSceneNodeUI.name = self.name
    WeldOnlyBetweenSceneNodesUI = bpy.context.scene.Simplygon_4ba25994d640457497818ecdb7584982_List.add()
    WeldOnlyBetweenSceneNodesUI.Init(self.name)
    WeldOnlyBetweenSceneNodesUI.name = self.name
    WeldDistUI = bpy.context.scene.Simplygon_e80268ef29334712833e486d58a14d11_List.add()
    WeldDistUI.Init(self.name)
    WeldDistUI.name = self.name
    ProgressivePassesUI = bpy.context.scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_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_ce31fc405d934b038cdeca2682f7e21d_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_6406174b7c3a4d35bf4ba839adecbce0_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_19d1fcf48461416fa48b83e31d90490a_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_5820d2bdabeb4fb19bf2043fcf51a39f_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_ee1971b9095e41f3b0e4648c50d309e1_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_98125e10fd354a45870ec5e6c3be1756_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_4ba25994d640457497818ecdb7584982_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_e80268ef29334712833e486d58a14d11_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_bec47e03b49e4fb4b9b186a9f1f01a53_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_ce31fc405d934b038cdeca2682f7e21d_List.find(self.name)
    bpy.context.scene.Simplygon_ce31fc405d934b038cdeca2682f7e21d_List.remove(UseTJunctionRemoverUI_index)
    TJuncDistUI_index = bpy.context.scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List.find(self.name)
    bpy.context.scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List.remove(TJuncDistUI_index)
    UseWeldingUI_index = bpy.context.scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List.find(self.name)
    bpy.context.scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List.remove(UseWeldingUI_index)
    WeldOnlyBorderVerticesUI_index = bpy.context.scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List.find(self.name)
    bpy.context.scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List.remove(WeldOnlyBorderVerticesUI_index)
    WeldOnlyWithinMaterialUI_index = bpy.context.scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List.find(self.name)
    bpy.context.scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List.remove(WeldOnlyWithinMaterialUI_index)
    WeldOnlyWithinSceneNodeUI_index = bpy.context.scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List.find(self.name)
    bpy.context.scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List.remove(WeldOnlyWithinSceneNodeUI_index)
    WeldOnlyBetweenSceneNodesUI_index = bpy.context.scene.Simplygon_4ba25994d640457497818ecdb7584982_List.find(self.name)
    bpy.context.scene.Simplygon_4ba25994d640457497818ecdb7584982_List.remove(WeldOnlyBetweenSceneNodesUI_index)
    WeldDistUI_index = bpy.context.scene.Simplygon_e80268ef29334712833e486d58a14d11_List.find(self.name)
    bpy.context.scene.Simplygon_e80268ef29334712833e486d58a14d11_List.remove(WeldDistUI_index)
    ProgressivePassesUI_index = bpy.context.scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_List.find(self.name)
    bpy.context.scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_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_12e292b056d14243a72ee283546890a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12e292b056d14243a72ee283546890a9_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_c3846f294d8b47a9bf59aa399a1fb0a0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_e59bd63e16c34389b495b37ea5f0c7dc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_49f72ab5b9cf41668595436b2fe15602_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_0e9e2419f89440ccbccbf50864a5ec47_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_4e6847a5e4074b90a89366c53ff001a2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_57f4add074b54a1b98c6727116e6c851_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_57f4add074b54a1b98c6727116e6c851_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_7174c1b4e3454d82b21eee55be4c6434_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_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_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_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_12e292b056d14243a72ee283546890a9_List.add()
    ReplaceNormalsUI.Init(self.name)
    ReplaceNormalsUI.name = self.name
    RepairInvalidNormalsUI = bpy.context.scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List.add()
    RepairInvalidNormalsUI.Init(self.name)
    RepairInvalidNormalsUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    ReplaceTangentsUI = bpy.context.scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List.add()
    ReplaceTangentsUI.Init(self.name)
    ReplaceTangentsUI.name = self.name
    ReorthogonalizeTangentSpaceUI = bpy.context.scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List.add()
    ReorthogonalizeTangentSpaceUI.Init(self.name)
    ReorthogonalizeTangentSpaceUI.name = self.name
    ScaleByAreaUI = bpy.context.scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List.add()
    ScaleByAreaUI.Init(self.name)
    ScaleByAreaUI.name = self.name
    ScaleByAngleUI = bpy.context.scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List.add()
    ScaleByAngleUI.Init(self.name)
    ScaleByAngleUI.name = self.name
    SnapNormalsToFlatSurfacesUI = bpy.context.scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_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_12e292b056d14243a72ee283546890a9_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_49f72ab5b9cf41668595436b2fe15602_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_e59bd63e16c34389b495b37ea5f0c7dc_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_c3846f294d8b47a9bf59aa399a1fb0a0_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_0e9e2419f89440ccbccbf50864a5ec47_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_4e6847a5e4074b90a89366c53ff001a2_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_57f4add074b54a1b98c6727116e6c851_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_7174c1b4e3454d82b21eee55be4c6434_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_12e292b056d14243a72ee283546890a9_List.find(self.name)
    bpy.context.scene.Simplygon_12e292b056d14243a72ee283546890a9_List.remove(ReplaceNormalsUI_index)
    RepairInvalidNormalsUI_index = bpy.context.scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List.find(self.name)
    bpy.context.scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List.remove(RepairInvalidNormalsUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List.find(self.name)
    bpy.context.scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List.remove(HardEdgeAngleUI_index)
    ReplaceTangentsUI_index = bpy.context.scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List.find(self.name)
    bpy.context.scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List.remove(ReplaceTangentsUI_index)
    ReorthogonalizeTangentSpaceUI_index = bpy.context.scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List.find(self.name)
    bpy.context.scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List.remove(ReorthogonalizeTangentSpaceUI_index)
    ScaleByAreaUI_index = bpy.context.scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List.find(self.name)
    bpy.context.scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List.remove(ScaleByAreaUI_index)
    ScaleByAngleUI_index = bpy.context.scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List.find(self.name)
    bpy.context.scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List.remove(ScaleByAngleUI_index)
    SnapNormalsToFlatSurfacesUI_index = bpy.context.scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_List.find(self.name)
    bpy.context.scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_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_c2d65b4bd72e4e4aa21f683ccefd52dc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c2d65b4bd72e4e4aa21f683ccefd52dc_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_4a77878fc25c45898e0f413de09fcbce_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_c9f5f61a7c1f483c869c61fd047e56fa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_d099f5f18c02460496b68d892a0392af_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d099f5f18c02460496b68d892a0392af_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_b91405d297ff477f8c7ffd998326fcb3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_26c56048fcb2428c88e0a125e2f08d61_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_a0bc97dc07f244139d67c2004da767be_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a0bc97dc07f244139d67c2004da767be_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_88c0e40dcd9d4dd29b063caacf501420_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_c78af5118aa241cb8227993f861c0091_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c78af5118aa241cb8227993f861c0091_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_22cac1d5bf684ab2b87bc9c14f303ad4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_030ba379ddb045b7990cee5ef56462a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_77c24175ebda4d8e9896ca56a6536fe3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_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_877dd0090fef4cea86e3a1944253dc29_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_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_c2d65b4bd72e4e4aa21f683ccefd52dc_List.add()
    UseVisibilityWeightsInReducerUI.Init(self.name)
    UseVisibilityWeightsInReducerUI.name = self.name
    UseVisibilityWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List.add()
    UseVisibilityWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVisibilityWeightsInTexcoordGeneratorUI.name = self.name
    VisibilityWeightsPowerUI = bpy.context.scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List.add()
    VisibilityWeightsPowerUI.Init(self.name)
    VisibilityWeightsPowerUI.name = self.name
    CullOccludedGeometryUI = bpy.context.scene.Simplygon_d099f5f18c02460496b68d892a0392af_List.add()
    CullOccludedGeometryUI.Init(self.name)
    CullOccludedGeometryUI.name = self.name
    ForceVisibilityCalculationUI = bpy.context.scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List.add()
    ForceVisibilityCalculationUI.Init(self.name)
    ForceVisibilityCalculationUI.name = self.name
    UseBackfaceCullingUI = bpy.context.scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List.add()
    UseBackfaceCullingUI.Init(self.name)
    UseBackfaceCullingUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OccluderSelectionSetNameUI = bpy.context.scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List.add()
    OccluderSelectionSetNameUI.Init(self.name)
    OccluderSelectionSetNameUI.name = self.name
    FillNonVisibleAreaThresholdUI = bpy.context.scene.Simplygon_c78af5118aa241cb8227993f861c0091_List.add()
    FillNonVisibleAreaThresholdUI.Init(self.name)
    FillNonVisibleAreaThresholdUI.name = self.name
    RemoveTrianglesNotOccludingOtherTrianglesUI = bpy.context.scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List.add()
    RemoveTrianglesNotOccludingOtherTrianglesUI.Init(self.name)
    RemoveTrianglesNotOccludingOtherTrianglesUI.name = self.name
    ConservativeModeUI = bpy.context.scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List.add()
    ConservativeModeUI.Init(self.name)
    ConservativeModeUI.name = self.name
    ComputeVisibilityModeUI = bpy.context.scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_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_c2d65b4bd72e4e4aa21f683ccefd52dc_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_4a77878fc25c45898e0f413de09fcbce_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_c9f5f61a7c1f483c869c61fd047e56fa_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_d099f5f18c02460496b68d892a0392af_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_b91405d297ff477f8c7ffd998326fcb3_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_26c56048fcb2428c88e0a125e2f08d61_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_a0bc97dc07f244139d67c2004da767be_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_88c0e40dcd9d4dd29b063caacf501420_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_c78af5118aa241cb8227993f861c0091_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_22cac1d5bf684ab2b87bc9c14f303ad4_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_030ba379ddb045b7990cee5ef56462a9_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_77c24175ebda4d8e9896ca56a6536fe3_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_c2d65b4bd72e4e4aa21f683ccefd52dc_List.find(self.name)
    bpy.context.scene.Simplygon_c2d65b4bd72e4e4aa21f683ccefd52dc_List.remove(UseVisibilityWeightsInReducerUI_index)
    UseVisibilityWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List.find(self.name)
    bpy.context.scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List.remove(UseVisibilityWeightsInTexcoordGeneratorUI_index)
    VisibilityWeightsPowerUI_index = bpy.context.scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List.find(self.name)
    bpy.context.scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List.remove(VisibilityWeightsPowerUI_index)
    CullOccludedGeometryUI_index = bpy.context.scene.Simplygon_d099f5f18c02460496b68d892a0392af_List.find(self.name)
    bpy.context.scene.Simplygon_d099f5f18c02460496b68d892a0392af_List.remove(CullOccludedGeometryUI_index)
    ForceVisibilityCalculationUI_index = bpy.context.scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List.find(self.name)
    bpy.context.scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List.remove(ForceVisibilityCalculationUI_index)
    UseBackfaceCullingUI_index = bpy.context.scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List.find(self.name)
    bpy.context.scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List.remove(UseBackfaceCullingUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List.find(self.name)
    bpy.context.scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List.remove(CameraSelectionSetNameUI_index)
    OccluderSelectionSetNameUI_index = bpy.context.scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List.find(self.name)
    bpy.context.scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List.remove(OccluderSelectionSetNameUI_index)
    FillNonVisibleAreaThresholdUI_index = bpy.context.scene.Simplygon_c78af5118aa241cb8227993f861c0091_List.find(self.name)
    bpy.context.scene.Simplygon_c78af5118aa241cb8227993f861c0091_List.remove(FillNonVisibleAreaThresholdUI_index)
    RemoveTrianglesNotOccludingOtherTrianglesUI_index = bpy.context.scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List.find(self.name)
    bpy.context.scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List.remove(RemoveTrianglesNotOccludingOtherTrianglesUI_index)
    ConservativeModeUI_index = bpy.context.scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List.find(self.name)
    bpy.context.scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List.remove(ConservativeModeUI_index)
    ComputeVisibilityModeUI_index = bpy.context.scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_List.find(self.name)
    bpy.context.scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_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_fddf00e9bf104521ab1187fc1aadc5bf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fddf00e9bf104521ab1187fc1aadc5bf_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_788cee6116744dbf9a78382013b091a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_788cee6116744dbf9a78382013b091a9_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_402188f3d4c249228054160c84916976_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_402188f3d4c249228054160c84916976_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_c6cfa9f1e24e45c3a92a189d8737a09b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_330570d69c4d4d67b7bc72889cd53f3d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_e8900f0d1af44da5bc7e6fca07e89b92_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_e5bfb692d8b340e39a3d1a2f96050bbb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_914a968868994f21ae18988aa7c0c546_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_914a968868994f21ae18988aa7c0c546_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_ccc02bf07c894bd684389fe926f55d22_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_b2e8602e2ad54c36a45cbaa31a73832e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_5f0b12865f0d40c693da07921cb5bffa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_e8db6689e1844e5b9cae58d298fe838f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_ee2c3b441905423cabb9a6483051482a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ee2c3b441905423cabb9a6483051482a_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_d177d604f01847af9c3d7419ce03021a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d177d604f01847af9c3d7419ce03021a_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_2d3949355a8a42359bb6f9b8bb8871b6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_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_01a906caea954ec39635af1918fd3162_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_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_fddf00e9bf104521ab1187fc1aadc5bf_List.add()
    UseBoneReducerUI.Init(self.name)
    UseBoneReducerUI.name = self.name
    RemoveUnusedBonesUI = bpy.context.scene.Simplygon_402188f3d4c249228054160c84916976_List.add()
    RemoveUnusedBonesUI.Init(self.name)
    RemoveUnusedBonesUI.name = self.name
    LimitBonesPerVertexUI = bpy.context.scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List.add()
    LimitBonesPerVertexUI.Init(self.name)
    LimitBonesPerVertexUI.name = self.name
    MaxBonePerVertexUI = bpy.context.scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List.add()
    MaxBonePerVertexUI.Init(self.name)
    MaxBonePerVertexUI.name = self.name
    BoneReductionTargetBoneRatioEnabledUI = bpy.context.scene.Simplygon_788cee6116744dbf9a78382013b091a9_List.add()
    BoneReductionTargetBoneRatioEnabledUI.Init(self.name)
    BoneReductionTargetBoneRatioEnabledUI.name = self.name
    BoneReductionTargetBoneRatioUI = bpy.context.scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List.add()
    BoneReductionTargetBoneRatioUI.Init(self.name)
    BoneReductionTargetBoneRatioUI.name = self.name
    BoneReductionTargetBoneCountEnabledUI = bpy.context.scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List.add()
    BoneReductionTargetBoneCountEnabledUI.Init(self.name)
    BoneReductionTargetBoneCountEnabledUI.name = self.name
    BoneReductionTargetBoneCountUI = bpy.context.scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List.add()
    BoneReductionTargetBoneCountUI.Init(self.name)
    BoneReductionTargetBoneCountUI.name = self.name
    BoneReductionTargetMaxDeviationEnabledUI = bpy.context.scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List.add()
    BoneReductionTargetMaxDeviationEnabledUI.Init(self.name)
    BoneReductionTargetMaxDeviationEnabledUI.name = self.name
    BoneReductionTargetMaxDeviationUI = bpy.context.scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List.add()
    BoneReductionTargetMaxDeviationUI.Init(self.name)
    BoneReductionTargetMaxDeviationUI.name = self.name
    BoneReductionTargetOnScreenSizeEnabledUI = bpy.context.scene.Simplygon_914a968868994f21ae18988aa7c0c546_List.add()
    BoneReductionTargetOnScreenSizeEnabledUI.Init(self.name)
    BoneReductionTargetOnScreenSizeEnabledUI.name = self.name
    BoneReductionTargetOnScreenSizeUI = bpy.context.scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List.add()
    BoneReductionTargetOnScreenSizeUI.Init(self.name)
    BoneReductionTargetOnScreenSizeUI.name = self.name
    BoneReductionTargetStopConditionUI = bpy.context.scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List.add()
    BoneReductionTargetStopConditionUI.Init(self.name)
    BoneReductionTargetStopConditionUI.name = self.name
    LockBoneSelectionSetNameUI = bpy.context.scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List.add()
    LockBoneSelectionSetNameUI.Init(self.name)
    LockBoneSelectionSetNameUI.name = self.name
    RemoveBoneSelectionSetNameUI = bpy.context.scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_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_fddf00e9bf104521ab1187fc1aadc5bf_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_402188f3d4c249228054160c84916976_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_c6cfa9f1e24e45c3a92a189d8737a09b_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_e5bfb692d8b340e39a3d1a2f96050bbb_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_788cee6116744dbf9a78382013b091a9_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_b2e8602e2ad54c36a45cbaa31a73832e_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_330570d69c4d4d67b7bc72889cd53f3d_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_5f0b12865f0d40c693da07921cb5bffa_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_e8900f0d1af44da5bc7e6fca07e89b92_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_e8db6689e1844e5b9cae58d298fe838f_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_914a968868994f21ae18988aa7c0c546_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_ee2c3b441905423cabb9a6483051482a_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_ccc02bf07c894bd684389fe926f55d22_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_d177d604f01847af9c3d7419ce03021a_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_2d3949355a8a42359bb6f9b8bb8871b6_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_fddf00e9bf104521ab1187fc1aadc5bf_List.find(self.name)
    bpy.context.scene.Simplygon_fddf00e9bf104521ab1187fc1aadc5bf_List.remove(UseBoneReducerUI_index)
    RemoveUnusedBonesUI_index = bpy.context.scene.Simplygon_402188f3d4c249228054160c84916976_List.find(self.name)
    bpy.context.scene.Simplygon_402188f3d4c249228054160c84916976_List.remove(RemoveUnusedBonesUI_index)
    LimitBonesPerVertexUI_index = bpy.context.scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List.find(self.name)
    bpy.context.scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List.remove(LimitBonesPerVertexUI_index)
    MaxBonePerVertexUI_index = bpy.context.scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List.find(self.name)
    bpy.context.scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List.remove(MaxBonePerVertexUI_index)
    BoneReductionTargetBoneRatioEnabledUI_index = bpy.context.scene.Simplygon_788cee6116744dbf9a78382013b091a9_List.find(self.name)
    bpy.context.scene.Simplygon_788cee6116744dbf9a78382013b091a9_List.remove(BoneReductionTargetBoneRatioEnabledUI_index)
    BoneReductionTargetBoneRatioUI_index = bpy.context.scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List.find(self.name)
    bpy.context.scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List.remove(BoneReductionTargetBoneRatioUI_index)
    BoneReductionTargetBoneCountEnabledUI_index = bpy.context.scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List.find(self.name)
    bpy.context.scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List.remove(BoneReductionTargetBoneCountEnabledUI_index)
    BoneReductionTargetBoneCountUI_index = bpy.context.scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List.find(self.name)
    bpy.context.scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List.remove(BoneReductionTargetBoneCountUI_index)
    BoneReductionTargetMaxDeviationEnabledUI_index = bpy.context.scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List.find(self.name)
    bpy.context.scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List.remove(BoneReductionTargetMaxDeviationEnabledUI_index)
    BoneReductionTargetMaxDeviationUI_index = bpy.context.scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List.find(self.name)
    bpy.context.scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List.remove(BoneReductionTargetMaxDeviationUI_index)
    BoneReductionTargetOnScreenSizeEnabledUI_index = bpy.context.scene.Simplygon_914a968868994f21ae18988aa7c0c546_List.find(self.name)
    bpy.context.scene.Simplygon_914a968868994f21ae18988aa7c0c546_List.remove(BoneReductionTargetOnScreenSizeEnabledUI_index)
    BoneReductionTargetOnScreenSizeUI_index = bpy.context.scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List.find(self.name)
    bpy.context.scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List.remove(BoneReductionTargetOnScreenSizeUI_index)
    BoneReductionTargetStopConditionUI_index = bpy.context.scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List.find(self.name)
    bpy.context.scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List.remove(BoneReductionTargetStopConditionUI_index)
    LockBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List.find(self.name)
    bpy.context.scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List.remove(LockBoneSelectionSetNameUI_index)
    RemoveBoneSelectionSetNameUI_index = bpy.context.scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_List.find(self.name)
    bpy.context.scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_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_00829a412db14649835f5aa01b650044_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00829a412db14649835f5aa01b650044_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_50684d58a6bc4902b601a285ed2133a0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_754292c8b38247aaa32c0f26f0ded8f1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_b4d97992a56d4ee09592145789ec0ac9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_77d14b7c5d7e4b3cb90a1fd122abb296_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_c6b7dc69d0a146dab0a197dcc68b2a55_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_013a900fcb1b4c3aa823b08fd6216aaa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_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_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_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_00829a412db14649835f5aa01b650044_List.add()
    UseVertexWeightsInReducerUI.Init(self.name)
    UseVertexWeightsInReducerUI.name = self.name
    UseVertexWeightsInTexcoordGeneratorUI = bpy.context.scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List.add()
    UseVertexWeightsInTexcoordGeneratorUI.Init(self.name)
    UseVertexWeightsInTexcoordGeneratorUI.name = self.name
    WeightsFromColorLevelUI = bpy.context.scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List.add()
    WeightsFromColorLevelUI.Init(self.name)
    WeightsFromColorLevelUI.name = self.name
    WeightsFromColorNameUI = bpy.context.scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List.add()
    WeightsFromColorNameUI.Init(self.name)
    WeightsFromColorNameUI.name = self.name
    WeightsFromColorComponentUI = bpy.context.scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List.add()
    WeightsFromColorComponentUI.Init(self.name)
    WeightsFromColorComponentUI.name = self.name
    WeightsFromColorMultiplierUI = bpy.context.scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List.add()
    WeightsFromColorMultiplierUI.Init(self.name)
    WeightsFromColorMultiplierUI.name = self.name
    WeightsFromColorModeUI = bpy.context.scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_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_00829a412db14649835f5aa01b650044_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_50684d58a6bc4902b601a285ed2133a0_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_b4d97992a56d4ee09592145789ec0ac9_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_754292c8b38247aaa32c0f26f0ded8f1_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_77d14b7c5d7e4b3cb90a1fd122abb296_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_c6b7dc69d0a146dab0a197dcc68b2a55_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_013a900fcb1b4c3aa823b08fd6216aaa_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_00829a412db14649835f5aa01b650044_List.find(self.name)
    bpy.context.scene.Simplygon_00829a412db14649835f5aa01b650044_List.remove(UseVertexWeightsInReducerUI_index)
    UseVertexWeightsInTexcoordGeneratorUI_index = bpy.context.scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List.find(self.name)
    bpy.context.scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List.remove(UseVertexWeightsInTexcoordGeneratorUI_index)
    WeightsFromColorLevelUI_index = bpy.context.scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List.find(self.name)
    bpy.context.scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List.remove(WeightsFromColorLevelUI_index)
    WeightsFromColorNameUI_index = bpy.context.scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List.find(self.name)
    bpy.context.scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List.remove(WeightsFromColorNameUI_index)
    WeightsFromColorComponentUI_index = bpy.context.scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List.find(self.name)
    bpy.context.scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List.remove(WeightsFromColorComponentUI_index)
    WeightsFromColorMultiplierUI_index = bpy.context.scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List.find(self.name)
    bpy.context.scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List.remove(WeightsFromColorMultiplierUI_index)
    WeightsFromColorModeUI_index = bpy.context.scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_List.find(self.name)
    bpy.context.scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_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_00b50e162c124b27892a0291c2282aeb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_00b50e162c124b27892a0291c2282aeb_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_bf388ad7a1be40779c86df2fe2de3aeb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_78ef591e0ac748af9ad8c4d97fc1d6df_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_43dfffce3fd940c7af8b411b43b27926_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_e318db1fb0fb409383531c21bf736362_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e318db1fb0fb409383531c21bf736362_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_ba25232f9291454781e8a9088e741dc3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ba25232f9291454781e8a9088e741dc3_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_facb0623db79421083de08e5270d2c5d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_facb0623db79421083de08e5270d2c5d_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_a8c78a47094a48799ae7e54c080fe661_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_00b50e162c124b27892a0291c2282aeb_List.add()
    TextureOutputPathUI.Init(self.name)
    TextureOutputPathUI.name = self.name
    SimplygonBatchPathUI = bpy.context.scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List.add()
    SimplygonBatchPathUI.Init(self.name)
    SimplygonBatchPathUI.name = self.name
    OutputMaterialNameUI = bpy.context.scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List.add()
    OutputMaterialNameUI.Init(self.name)
    OutputMaterialNameUI.name = self.name
    OutputUniqueMaterialNamesUI = bpy.context.scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List.add()
    OutputUniqueMaterialNamesUI.Init(self.name)
    OutputUniqueMaterialNamesUI.name = self.name
    EmbedReferencesUI = bpy.context.scene.Simplygon_e318db1fb0fb409383531c21bf736362_List.add()
    EmbedReferencesUI.Init(self.name)
    EmbedReferencesUI.name = self.name
    IntermediateStepUI = bpy.context.scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List.add()
    IntermediateStepUI.Init(self.name)
    IntermediateStepUI.name = self.name
    CascadedRunModeUI = bpy.context.scene.Simplygon_facb0623db79421083de08e5270d2c5d_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_00b50e162c124b27892a0291c2282aeb_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_bf388ad7a1be40779c86df2fe2de3aeb_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_78ef591e0ac748af9ad8c4d97fc1d6df_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_43dfffce3fd940c7af8b411b43b27926_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_e318db1fb0fb409383531c21bf736362_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_ba25232f9291454781e8a9088e741dc3_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_facb0623db79421083de08e5270d2c5d_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_00b50e162c124b27892a0291c2282aeb_List.find(self.name)
    bpy.context.scene.Simplygon_00b50e162c124b27892a0291c2282aeb_List.remove(TextureOutputPathUI_index)
    SimplygonBatchPathUI_index = bpy.context.scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List.find(self.name)
    bpy.context.scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List.remove(SimplygonBatchPathUI_index)
    OutputMaterialNameUI_index = bpy.context.scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List.find(self.name)
    bpy.context.scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List.remove(OutputMaterialNameUI_index)
    OutputUniqueMaterialNamesUI_index = bpy.context.scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List.find(self.name)
    bpy.context.scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List.remove(OutputUniqueMaterialNamesUI_index)
    EmbedReferencesUI_index = bpy.context.scene.Simplygon_e318db1fb0fb409383531c21bf736362_List.find(self.name)
    bpy.context.scene.Simplygon_e318db1fb0fb409383531c21bf736362_List.remove(EmbedReferencesUI_index)
    IntermediateStepUI_index = bpy.context.scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List.find(self.name)
    bpy.context.scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List.remove(IntermediateStepUI_index)
    CascadedRunModeUI_index = bpy.context.scene.Simplygon_facb0623db79421083de08e5270d2c5d_List.find(self.name)
    bpy.context.scene.Simplygon_facb0623db79421083de08e5270d2c5d_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List[index]

    return None

  @property
  def MaterialMappingUI(self):
    index = bpy.context.scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_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_65a27c54b60b4941b91868635144e22a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_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_9eed97ab5ac04811b434275fd2f2336a_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_9eed97ab5ac04811b434275fd2f2336a_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_9eed97ab5ac04811b434275fd2f2336a_List.find(self.name)
    bpy.context.scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List[index]

    return None

  @property
  def TextureWidthUI(self):
    index = bpy.context.scene.Simplygon_445935aaf24e4683adb03078a8187332_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_445935aaf24e4683adb03078a8187332_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_a38087b22f284ef8a89445b13059dafd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_eea56bc017d344edac31852fdbe3b23a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_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_a38087b22f284ef8a89445b13059dafd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_eeeac7eac46048a39537a79629794d37_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_eeeac7eac46048a39537a79629794d37_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_a38087b22f284ef8a89445b13059dafd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_730ab7dc1294413a9b3d7824c83597aa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_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_a38087b22f284ef8a89445b13059dafd_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_445935aaf24e4683adb03078a8187332_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    MultisamplingLevelUI = bpy.context.scene.Simplygon_eeeac7eac46048a39537a79629794d37_List.add()
    MultisamplingLevelUI.Init(self.name)
    MultisamplingLevelUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_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_445935aaf24e4683adb03078a8187332_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_eea56bc017d344edac31852fdbe3b23a_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_eeeac7eac46048a39537a79629794d37_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_730ab7dc1294413a9b3d7824c83597aa_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_445935aaf24e4683adb03078a8187332_List.find(self.name)
    bpy.context.scene.Simplygon_445935aaf24e4683adb03078a8187332_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List.find(self.name)
    bpy.context.scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List.remove(TextureHeightUI_index)
    MultisamplingLevelUI_index = bpy.context.scene.Simplygon_eeeac7eac46048a39537a79629794d37_List.find(self.name)
    bpy.context.scene.Simplygon_eeeac7eac46048a39537a79629794d37_List.remove(MultisamplingLevelUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_List.find(self.name)
    bpy.context.scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List[index]

    return None

  @property
  def ChartAggregatorModeUI(self):
    index = bpy.context.scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_71de27302f264195a7776186f75b846e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_71de27302f264195a7776186f75b846e_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_d673cbed45ea43cea71dccef2ce650a0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_01e160d19ffc45fc8d485c9d90b6ed40_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_7c4289f4724d4b188a592fde27661666_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7c4289f4724d4b188a592fde27661666_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_68ab3d7ec62f44f4bed1fff7614283e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_a784109c676c49f4a06d24cd8ac79a5c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_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_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_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_7c41c749521c4ac0b798bf884dcf93c2_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    SurfaceAreaScaleUI = bpy.context.scene.Simplygon_71de27302f264195a7776186f75b846e_List.add()
    SurfaceAreaScaleUI.Init(self.name)
    SurfaceAreaScaleUI.name = self.name
    OriginalTexCoordLevelUI = bpy.context.scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List.add()
    OriginalTexCoordLevelUI.Init(self.name)
    OriginalTexCoordLevelUI.name = self.name
    OriginalTexCoordNameUI = bpy.context.scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List.add()
    OriginalTexCoordNameUI.Init(self.name)
    OriginalTexCoordNameUI.name = self.name
    SeparateOverlappingChartsUI = bpy.context.scene.Simplygon_7c4289f4724d4b188a592fde27661666_List.add()
    SeparateOverlappingChartsUI.Init(self.name)
    SeparateOverlappingChartsUI.name = self.name
    OriginalChartProportionsChannelUI = bpy.context.scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List.add()
    OriginalChartProportionsChannelUI.Init(self.name)
    OriginalChartProportionsChannelUI.name = self.name
    LockUVRotationUI = bpy.context.scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_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_7c41c749521c4ac0b798bf884dcf93c2_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_71de27302f264195a7776186f75b846e_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_d673cbed45ea43cea71dccef2ce650a0_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_01e160d19ffc45fc8d485c9d90b6ed40_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_7c4289f4724d4b188a592fde27661666_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_68ab3d7ec62f44f4bed1fff7614283e6_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_a784109c676c49f4a06d24cd8ac79a5c_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_7c41c749521c4ac0b798bf884dcf93c2_List.find(self.name)
    bpy.context.scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_List.remove(ChartAggregatorModeUI_index)
    SurfaceAreaScaleUI_index = bpy.context.scene.Simplygon_71de27302f264195a7776186f75b846e_List.find(self.name)
    bpy.context.scene.Simplygon_71de27302f264195a7776186f75b846e_List.remove(SurfaceAreaScaleUI_index)
    OriginalTexCoordLevelUI_index = bpy.context.scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List.find(self.name)
    bpy.context.scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List.remove(OriginalTexCoordLevelUI_index)
    OriginalTexCoordNameUI_index = bpy.context.scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List.find(self.name)
    bpy.context.scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List.remove(OriginalTexCoordNameUI_index)
    SeparateOverlappingChartsUI_index = bpy.context.scene.Simplygon_7c4289f4724d4b188a592fde27661666_List.find(self.name)
    bpy.context.scene.Simplygon_7c4289f4724d4b188a592fde27661666_List.remove(SeparateOverlappingChartsUI_index)
    OriginalChartProportionsChannelUI_index = bpy.context.scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List.find(self.name)
    bpy.context.scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List.remove(OriginalChartProportionsChannelUI_index)
    LockUVRotationUI_index = bpy.context.scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_List.find(self.name)
    bpy.context.scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List[index]

    return None

  @property
  def MaxStretchUI(self):
    index = bpy.context.scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_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_265adc076ff54cf98c905f83268b2f6f_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_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_e1960dd1b97844c7b6f7b6580a4757b2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_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_265adc076ff54cf98c905f83268b2f6f_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_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_0a2bbbf46f304d30992a165c0d05db6d_List.add()
    MaxStretchUI.Init(self.name)
    MaxStretchUI.name = self.name
    LargeChartsImportanceUI = bpy.context.scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_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_0a2bbbf46f304d30992a165c0d05db6d_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_e1960dd1b97844c7b6f7b6580a4757b2_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_0a2bbbf46f304d30992a165c0d05db6d_List.find(self.name)
    bpy.context.scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_List.remove(MaxStretchUI_index)
    LargeChartsImportanceUI_index = bpy.context.scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_List.find(self.name)
    bpy.context.scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_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_65a27c54b60b4941b91868635144e22a_List.find(self.InputMaterialSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_List[index]

    return None

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

    return None

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

    return None

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

    return None

  @property
  def GenerateMappingImageUI(self):
    index = bpy.context.scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_2b1b0c6704ef41ac804c97613992a0be_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_d3ea5e106dd6421fb54049b6eee20711_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_0eb6e0e1b77d49929ecc6b7b6b9abc80_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_8730f59be323411fa2185895a2460276_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8730f59be323411fa2185895a2460276_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_50d8b40d24a4401ca94fbee9ee4e275e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_4ad81a28d0204eea883cd392c03d3cc1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_1da2287c72264cdb8d239d8970d25a38_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_a5dc1ef680394c77befba694b16d8382_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a5dc1ef680394c77befba694b16d8382_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_a750d906c55f410ab7cb0b315afe4b14_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_8f34e2b739714ef5baf76f95c5f2d0e3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_b35fbac341354b448deab2e5840244f4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b35fbac341354b448deab2e5840244f4_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_366cd451dae64011b60d01322235f79e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_366cd451dae64011b60d01322235f79e_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_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_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_fc397ebd2f22466a827bb0baaeaf5dbe_List.add()
    GenerateMappingImageUI.Init(self.name)
    GenerateMappingImageUI.name = self.name
    GenerateTexCoordsUI = bpy.context.scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List.add()
    GenerateTexCoordsUI.Init(self.name)
    GenerateTexCoordsUI.name = self.name
    GenerateTangentsUI = bpy.context.scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List.add()
    GenerateTangentsUI.Init(self.name)
    GenerateTangentsUI.name = self.name
    UseFullRetexturingUI = bpy.context.scene.Simplygon_8730f59be323411fa2185895a2460276_List.add()
    UseFullRetexturingUI.Init(self.name)
    UseFullRetexturingUI.name = self.name
    ApplyNewMaterialIdsUI = bpy.context.scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List.add()
    ApplyNewMaterialIdsUI.Init(self.name)
    ApplyNewMaterialIdsUI.name = self.name
    UseAutomaticTextureSizeUI = bpy.context.scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List.add()
    UseAutomaticTextureSizeUI.Init(self.name)
    UseAutomaticTextureSizeUI.name = self.name
    AutomaticTextureSizeMultiplierUI = bpy.context.scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List.add()
    AutomaticTextureSizeMultiplierUI.Init(self.name)
    AutomaticTextureSizeMultiplierUI.name = self.name
    ForcePower2TextureUI = bpy.context.scene.Simplygon_b35fbac341354b448deab2e5840244f4_List.add()
    ForcePower2TextureUI.Init(self.name)
    ForcePower2TextureUI.name = self.name
    OnlyParameterizeInvalidUVsUI = bpy.context.scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List.add()
    OnlyParameterizeInvalidUVsUI.Init(self.name)
    OnlyParameterizeInvalidUVsUI.name = self.name
    AllowTransparencyMappingUI = bpy.context.scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List.add()
    AllowTransparencyMappingUI.Init(self.name)
    AllowTransparencyMappingUI.name = self.name
    MaximumLayersUI = bpy.context.scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List.add()
    MaximumLayersUI.Init(self.name)
    MaximumLayersUI.name = self.name
    TexCoordLevelUI = bpy.context.scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List.add()
    TexCoordLevelUI.Init(self.name)
    TexCoordLevelUI.name = self.name
    TexCoordNameUI = bpy.context.scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List.add()
    TexCoordNameUI.Init(self.name)
    TexCoordNameUI.name = self.name
    TexCoordGeneratorTypeUI = bpy.context.scene.Simplygon_366cd451dae64011b60d01322235f79e_List.add()
    TexCoordGeneratorTypeUI.Init(self.name)
    TexCoordGeneratorTypeUI.name = self.name
    ChartAggregatorSettings = bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List.add()
    ChartAggregatorSettings.Init(self.name)
    self.ChartAggregatorSettings_id = ChartAggregatorSettings.name
    ParameterizerSettings = bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List.add()
    ParameterizerSettings.Init(self.name)
    self.ParameterizerSettings_id = ParameterizerSettings.name
    InputMaterialSettings = bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_List.add()
    InputMaterialSettings.Init(self.name)
    self.InputMaterialSettings_id = InputMaterialSettings.name
    OutputMaterialSettings = bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_fc397ebd2f22466a827bb0baaeaf5dbe_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_2b1b0c6704ef41ac804c97613992a0be_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_d3ea5e106dd6421fb54049b6eee20711_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_8730f59be323411fa2185895a2460276_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_50d8b40d24a4401ca94fbee9ee4e275e_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_a750d906c55f410ab7cb0b315afe4b14_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_8f34e2b739714ef5baf76f95c5f2d0e3_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_b35fbac341354b448deab2e5840244f4_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_fb6f4994a0534af5a6ea5fb2cbf2f5e6_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_4ad81a28d0204eea883cd392c03d3cc1_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_0eb6e0e1b77d49929ecc6b7b6b9abc80_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_1da2287c72264cdb8d239d8970d25a38_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_a5dc1ef680394c77befba694b16d8382_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_366cd451dae64011b60d01322235f79e_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_c9a3599453c14a54a5bbf08b2e5571dc_List.add()
      ChartAggregatorSettings.InitJson(self.name, jsonData['ChartAggregatorSettings'])
      self.ChartAggregatorSettings_id = ChartAggregatorSettings.name

    if jsonData['ParameterizerSettings'] is not None:
      ParameterizerSettings = bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_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_65a27c54b60b4941b91868635144e22a_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_a38087b22f284ef8a89445b13059dafd_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_fc397ebd2f22466a827bb0baaeaf5dbe_List.find(self.name)
    bpy.context.scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_List.remove(GenerateMappingImageUI_index)
    GenerateTexCoordsUI_index = bpy.context.scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List.find(self.name)
    bpy.context.scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List.remove(GenerateTexCoordsUI_index)
    GenerateTangentsUI_index = bpy.context.scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List.find(self.name)
    bpy.context.scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List.remove(GenerateTangentsUI_index)
    UseFullRetexturingUI_index = bpy.context.scene.Simplygon_8730f59be323411fa2185895a2460276_List.find(self.name)
    bpy.context.scene.Simplygon_8730f59be323411fa2185895a2460276_List.remove(UseFullRetexturingUI_index)
    ApplyNewMaterialIdsUI_index = bpy.context.scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List.find(self.name)
    bpy.context.scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List.remove(ApplyNewMaterialIdsUI_index)
    UseAutomaticTextureSizeUI_index = bpy.context.scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List.find(self.name)
    bpy.context.scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List.remove(UseAutomaticTextureSizeUI_index)
    AutomaticTextureSizeMultiplierUI_index = bpy.context.scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List.find(self.name)
    bpy.context.scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List.remove(AutomaticTextureSizeMultiplierUI_index)
    ForcePower2TextureUI_index = bpy.context.scene.Simplygon_b35fbac341354b448deab2e5840244f4_List.find(self.name)
    bpy.context.scene.Simplygon_b35fbac341354b448deab2e5840244f4_List.remove(ForcePower2TextureUI_index)
    OnlyParameterizeInvalidUVsUI_index = bpy.context.scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List.find(self.name)
    bpy.context.scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List.remove(OnlyParameterizeInvalidUVsUI_index)
    AllowTransparencyMappingUI_index = bpy.context.scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List.find(self.name)
    bpy.context.scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List.remove(AllowTransparencyMappingUI_index)
    MaximumLayersUI_index = bpy.context.scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List.find(self.name)
    bpy.context.scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List.remove(MaximumLayersUI_index)
    TexCoordLevelUI_index = bpy.context.scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List.find(self.name)
    bpy.context.scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List.remove(TexCoordLevelUI_index)
    TexCoordNameUI_index = bpy.context.scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List.find(self.name)
    bpy.context.scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List.remove(TexCoordNameUI_index)
    TexCoordGeneratorTypeUI_index = bpy.context.scene.Simplygon_366cd451dae64011b60d01322235f79e_List.find(self.name)
    bpy.context.scene.Simplygon_366cd451dae64011b60d01322235f79e_List.remove(TexCoordGeneratorTypeUI_index)
    ChartAggregatorSettings_index = bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List.find(self.ChartAggregatorSettings_id)
    bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List.remove(ChartAggregatorSettings_index)
    ParameterizerSettings_index = bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List.find(self.ParameterizerSettings_id)
    bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List.remove(ParameterizerSettings_index)
    InputMaterialSettings_index = bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_List.find(self.InputMaterialSettings_id)
    bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_List.remove(InputMaterialSettings_index)
    OutputMaterialSettings_index = bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_List.find(self.OutputMaterialSettings_id)
    bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_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_792c5d3c5c70426daff2cb56ed40bdda_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_792c5d3c5c70426daff2cb56ed40bdda_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_fdfae22ff4364467a92af8ed83bc7389_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_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_792c5d3c5c70426daff2cb56ed40bdda_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_792c5d3c5c70426daff2cb56ed40bdda_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_792c5d3c5c70426daff2cb56ed40bdda_List.find(self.name)
    bpy.context.scene.Simplygon_792c5d3c5c70426daff2cb56ed40bdda_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_f03bd4d1bfca4fdcaa3324c72407b8cf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f03bd4d1bfca4fdcaa3324c72407b8cf_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_cd202a180457487ba845f8f34103c399_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cd202a180457487ba845f8f34103c399_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_31fff921883149379a7146417cbd6bc3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_31fff921883149379a7146417cbd6bc3_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_b6dacefd29664359b7e2489c8438ed0a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_cde3901891dd4e29a2599a887585e057_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cde3901891dd4e29a2599a887585e057_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_fc576d6d6c1449d7ac42d33aa7a823ca_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_a09b88d66ad548adb04baa0d4b615682_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_137258d883a6450cb0e719295a206964_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_137258d883a6450cb0e719295a206964_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_8214d2db8e834166aeee297e3c99a52e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_61578c033a714d45b50a8299c958af2f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_61578c033a714d45b50a8299c958af2f_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_f4ab04cef74e4ee0af287a5e4f9a5299_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_7e566bf1698b484cb76a21f05773871c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e566bf1698b484cb76a21f05773871c_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_c1439674219045dcb26a08a537b9ae20_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_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_f03bd4d1bfca4fdcaa3324c72407b8cf_List.add()
    RemeshingModeManualPositionZUI.Init(self.name)
    RemeshingModeManualPositionZUI.name = self.name
    RemeshingModeManualPositionYUI = bpy.context.scene.Simplygon_cd202a180457487ba845f8f34103c399_List.add()
    RemeshingModeManualPositionYUI.Init(self.name)
    RemeshingModeManualPositionYUI.name = self.name
    RemeshingModeManualPositionXUI = bpy.context.scene.Simplygon_31fff921883149379a7146417cbd6bc3_List.add()
    RemeshingModeManualPositionXUI.Init(self.name)
    RemeshingModeManualPositionXUI.name = self.name
    OnScreenSizeUI = bpy.context.scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    HoleFillingUI = bpy.context.scene.Simplygon_cde3901891dd4e29a2599a887585e057_List.add()
    HoleFillingUI.Init(self.name)
    HoleFillingUI.name = self.name
    RemeshingModeUI = bpy.context.scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List.add()
    RemeshingModeUI.Init(self.name)
    RemeshingModeUI.name = self.name
    SurfaceTransferModeUI = bpy.context.scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List.add()
    SurfaceTransferModeUI.Init(self.name)
    SurfaceTransferModeUI.name = self.name
    HardEdgeAngleUI = bpy.context.scene.Simplygon_137258d883a6450cb0e719295a206964_List.add()
    HardEdgeAngleUI.Init(self.name)
    HardEdgeAngleUI.name = self.name
    TransferNormalsUI = bpy.context.scene.Simplygon_61578c033a714d45b50a8299c958af2f_List.add()
    TransferNormalsUI.Init(self.name)
    TransferNormalsUI.name = self.name
    TransferColorsUI = bpy.context.scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List.add()
    TransferColorsUI.Init(self.name)
    TransferColorsUI.name = self.name
    ForceSoftEdgesWithinTextureChartsUI = bpy.context.scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List.add()
    ForceSoftEdgesWithinTextureChartsUI.Init(self.name)
    ForceSoftEdgesWithinTextureChartsUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_7e566bf1698b484cb76a21f05773871c_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_f03bd4d1bfca4fdcaa3324c72407b8cf_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_cd202a180457487ba845f8f34103c399_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_31fff921883149379a7146417cbd6bc3_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_b6dacefd29664359b7e2489c8438ed0a_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_cde3901891dd4e29a2599a887585e057_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_fc576d6d6c1449d7ac42d33aa7a823ca_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_a09b88d66ad548adb04baa0d4b615682_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_137258d883a6450cb0e719295a206964_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_61578c033a714d45b50a8299c958af2f_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_f4ab04cef74e4ee0af287a5e4f9a5299_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_8214d2db8e834166aeee297e3c99a52e_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_7e566bf1698b484cb76a21f05773871c_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_f03bd4d1bfca4fdcaa3324c72407b8cf_List.find(self.name)
    bpy.context.scene.Simplygon_f03bd4d1bfca4fdcaa3324c72407b8cf_List.remove(RemeshingModeManualPositionZUI_index)
    RemeshingModeManualPositionYUI_index = bpy.context.scene.Simplygon_cd202a180457487ba845f8f34103c399_List.find(self.name)
    bpy.context.scene.Simplygon_cd202a180457487ba845f8f34103c399_List.remove(RemeshingModeManualPositionYUI_index)
    RemeshingModeManualPositionXUI_index = bpy.context.scene.Simplygon_31fff921883149379a7146417cbd6bc3_List.find(self.name)
    bpy.context.scene.Simplygon_31fff921883149379a7146417cbd6bc3_List.remove(RemeshingModeManualPositionXUI_index)
    OnScreenSizeUI_index = bpy.context.scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List.find(self.name)
    bpy.context.scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List.remove(OnScreenSizeUI_index)
    HoleFillingUI_index = bpy.context.scene.Simplygon_cde3901891dd4e29a2599a887585e057_List.find(self.name)
    bpy.context.scene.Simplygon_cde3901891dd4e29a2599a887585e057_List.remove(HoleFillingUI_index)
    RemeshingModeUI_index = bpy.context.scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List.find(self.name)
    bpy.context.scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List.remove(RemeshingModeUI_index)
    SurfaceTransferModeUI_index = bpy.context.scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List.find(self.name)
    bpy.context.scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List.remove(SurfaceTransferModeUI_index)
    HardEdgeAngleUI_index = bpy.context.scene.Simplygon_137258d883a6450cb0e719295a206964_List.find(self.name)
    bpy.context.scene.Simplygon_137258d883a6450cb0e719295a206964_List.remove(HardEdgeAngleUI_index)
    TransferNormalsUI_index = bpy.context.scene.Simplygon_61578c033a714d45b50a8299c958af2f_List.find(self.name)
    bpy.context.scene.Simplygon_61578c033a714d45b50a8299c958af2f_List.remove(TransferNormalsUI_index)
    TransferColorsUI_index = bpy.context.scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List.find(self.name)
    bpy.context.scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List.remove(TransferColorsUI_index)
    ForceSoftEdgesWithinTextureChartsUI_index = bpy.context.scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List.find(self.name)
    bpy.context.scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List.remove(ForceSoftEdgesWithinTextureChartsUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_7e566bf1698b484cb76a21f05773871c_List.find(self.name)
    bpy.context.scene.Simplygon_7e566bf1698b484cb76a21f05773871c_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_db7addf4c9674a5f82838c4274cb59e6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_db7addf4c9674a5f82838c4274cb59e6_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_8b1f8baa45314cb08edd063a29c7b51b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_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_02692e13ae874a1fb0c359759928a306_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_02692e13ae874a1fb0c359759928a306_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_8b1f8baa45314cb08edd063a29c7b51b_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_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_db7addf4c9674a5f82838c4274cb59e6_List.add()
    UseClippingGeometryUI.Init(self.name)
    UseClippingGeometryUI.name = self.name
    ClippingGeometrySelectionSetNameUI = bpy.context.scene.Simplygon_02692e13ae874a1fb0c359759928a306_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_db7addf4c9674a5f82838c4274cb59e6_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_02692e13ae874a1fb0c359759928a306_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_db7addf4c9674a5f82838c4274cb59e6_List.find(self.name)
    bpy.context.scene.Simplygon_db7addf4c9674a5f82838c4274cb59e6_List.remove(UseClippingGeometryUI_index)
    ClippingGeometrySelectionSetNameUI_index = bpy.context.scene.Simplygon_02692e13ae874a1fb0c359759928a306_List.find(self.name)
    bpy.context.scene.Simplygon_02692e13ae874a1fb0c359759928a306_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_4d57b61c7c3a453a853df54f5c7a1b0b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4d57b61c7c3a453a853df54f5c7a1b0b_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_3115a5b581ff4acb838c08120f1ce81c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_56ece8b3a9e7468485fc450ac60a3fdf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_0ff7dddf226243bca69371ba8eae9725_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_67836407f62b47be96c65715e5c9c805_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_67836407f62b47be96c65715e5c9c805_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_e3dd7962d33e41859601bfc1b82a9d13_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_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_da272c1503024c6da2115cb330932104_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_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_4d57b61c7c3a453a853df54f5c7a1b0b_List.add()
    MergeGeometriesUI.Init(self.name)
    MergeGeometriesUI.name = self.name
    EnableGeometryCullingUI = bpy.context.scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List.add()
    EnableGeometryCullingUI.Init(self.name)
    EnableGeometryCullingUI.name = self.name
    GeometryCullingPrecisionUI = bpy.context.scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List.add()
    GeometryCullingPrecisionUI.Init(self.name)
    GeometryCullingPrecisionUI.name = self.name
    SubdivideGeometryBasedOnUVTilesUI = bpy.context.scene.Simplygon_67836407f62b47be96c65715e5c9c805_List.add()
    SubdivideGeometryBasedOnUVTilesUI.Init(self.name)
    SubdivideGeometryBasedOnUVTilesUI.name = self.name
    SubdivisionTileSizeUI = bpy.context.scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List.add()
    SubdivisionTileSizeUI.Init(self.name)
    SubdivisionTileSizeUI.name = self.name
    KeepUnprocessedSceneMeshesUI = bpy.context.scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_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_4d57b61c7c3a453a853df54f5c7a1b0b_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_56ece8b3a9e7468485fc450ac60a3fdf_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_0ff7dddf226243bca69371ba8eae9725_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_67836407f62b47be96c65715e5c9c805_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_e3dd7962d33e41859601bfc1b82a9d13_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_3115a5b581ff4acb838c08120f1ce81c_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_4d57b61c7c3a453a853df54f5c7a1b0b_List.find(self.name)
    bpy.context.scene.Simplygon_4d57b61c7c3a453a853df54f5c7a1b0b_List.remove(MergeGeometriesUI_index)
    EnableGeometryCullingUI_index = bpy.context.scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List.find(self.name)
    bpy.context.scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List.remove(EnableGeometryCullingUI_index)
    GeometryCullingPrecisionUI_index = bpy.context.scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List.find(self.name)
    bpy.context.scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List.remove(GeometryCullingPrecisionUI_index)
    SubdivideGeometryBasedOnUVTilesUI_index = bpy.context.scene.Simplygon_67836407f62b47be96c65715e5c9c805_List.find(self.name)
    bpy.context.scene.Simplygon_67836407f62b47be96c65715e5c9c805_List.remove(SubdivideGeometryBasedOnUVTilesUI_index)
    SubdivisionTileSizeUI_index = bpy.context.scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List.find(self.name)
    bpy.context.scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List.remove(SubdivisionTileSizeUI_index)
    KeepUnprocessedSceneMeshesUI_index = bpy.context.scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_List.find(self.name)
    bpy.context.scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_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_346c4f85429d48118de1da0d92cdad81_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_346c4f85429d48118de1da0d92cdad81_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_0c86d08966e6483a958916ac2b851877_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0c86d08966e6483a958916ac2b851877_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_fa9dc9de4d2a454ba38ea7e55ed612ed_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_ac36fa290b6c43ed8bd119ecd5771119_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_a06c72fe34a749d0b566aad2f367f74e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_90c88ded4c574b27b447d6dafc52986f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_e3ee096267a64149ad5d4ee6b07fec3a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_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_4e7b76c5fbd34bb0aaa0ef41915d0866_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_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_346c4f85429d48118de1da0d92cdad81_List.add()
    GenerateLightmapTexCoordUI.Init(self.name)
    GenerateLightmapTexCoordUI.name = self.name
    LightmapTexCoordLevelUI = bpy.context.scene.Simplygon_0c86d08966e6483a958916ac2b851877_List.add()
    LightmapTexCoordLevelUI.Init(self.name)
    LightmapTexCoordLevelUI.name = self.name
    LightmapTexCoordNameUI = bpy.context.scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List.add()
    LightmapTexCoordNameUI.Init(self.name)
    LightmapTexCoordNameUI.name = self.name
    ChartAggregatorModeUI = bpy.context.scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List.add()
    ChartAggregatorModeUI.Init(self.name)
    ChartAggregatorModeUI.name = self.name
    TextureWidthUI = bpy.context.scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List.add()
    TextureWidthUI.Init(self.name)
    TextureWidthUI.name = self.name
    TextureHeightUI = bpy.context.scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List.add()
    TextureHeightUI.Init(self.name)
    TextureHeightUI.name = self.name
    GutterSpaceUI = bpy.context.scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_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_346c4f85429d48118de1da0d92cdad81_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_0c86d08966e6483a958916ac2b851877_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_fa9dc9de4d2a454ba38ea7e55ed612ed_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_ac36fa290b6c43ed8bd119ecd5771119_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_a06c72fe34a749d0b566aad2f367f74e_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_90c88ded4c574b27b447d6dafc52986f_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_e3ee096267a64149ad5d4ee6b07fec3a_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_346c4f85429d48118de1da0d92cdad81_List.find(self.name)
    bpy.context.scene.Simplygon_346c4f85429d48118de1da0d92cdad81_List.remove(GenerateLightmapTexCoordUI_index)
    LightmapTexCoordLevelUI_index = bpy.context.scene.Simplygon_0c86d08966e6483a958916ac2b851877_List.find(self.name)
    bpy.context.scene.Simplygon_0c86d08966e6483a958916ac2b851877_List.remove(LightmapTexCoordLevelUI_index)
    LightmapTexCoordNameUI_index = bpy.context.scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List.find(self.name)
    bpy.context.scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List.remove(LightmapTexCoordNameUI_index)
    ChartAggregatorModeUI_index = bpy.context.scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List.find(self.name)
    bpy.context.scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List.remove(ChartAggregatorModeUI_index)
    TextureWidthUI_index = bpy.context.scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List.find(self.name)
    bpy.context.scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List.remove(TextureWidthUI_index)
    TextureHeightUI_index = bpy.context.scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List.find(self.name)
    bpy.context.scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List.remove(TextureHeightUI_index)
    GutterSpaceUI_index = bpy.context.scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_List.find(self.name)
    bpy.context.scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_List[index]

    return None

  @property
  def SeparateTrunkAndFoliageUI(self):
    index = bpy.context.scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_5a443e7c2632462582f1e3ad995fdcd5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_b9cc4f43d31d42368539aa78ec155165_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_85b9ede119b2418eb69ac838ce9b954f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_64cda5368b394e60b2ff60f98d7d8150_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_6b19c174a26d47289263b742eaeef24a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6b19c174a26d47289263b742eaeef24a_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_9bee93678363425ca050f9cafd2d8515_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_7b772e790b28490ab3d4502c4d4bf3e1_List.add()
    SeparateTrunkAndFoliageUI.Init(self.name)
    SeparateTrunkAndFoliageUI.name = self.name
    SeparateFoliageTriangleRatioUI = bpy.context.scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List.add()
    SeparateFoliageTriangleRatioUI.Init(self.name)
    SeparateFoliageTriangleRatioUI.name = self.name
    SeparateFoliageTriangleThresholdUI = bpy.context.scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List.add()
    SeparateFoliageTriangleThresholdUI.Init(self.name)
    SeparateFoliageTriangleThresholdUI.name = self.name
    SeparateFoliageAreaThresholdUI = bpy.context.scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List.add()
    SeparateFoliageAreaThresholdUI.Init(self.name)
    SeparateFoliageAreaThresholdUI.name = self.name
    SeparateFoliageSizeThresholdUI = bpy.context.scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List.add()
    SeparateFoliageSizeThresholdUI.Init(self.name)
    SeparateFoliageSizeThresholdUI.name = self.name
    TrunkReductionRatioUI = bpy.context.scene.Simplygon_6b19c174a26d47289263b742eaeef24a_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_7b772e790b28490ab3d4502c4d4bf3e1_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_5a443e7c2632462582f1e3ad995fdcd5_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_b9cc4f43d31d42368539aa78ec155165_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_85b9ede119b2418eb69ac838ce9b954f_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_64cda5368b394e60b2ff60f98d7d8150_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_6b19c174a26d47289263b742eaeef24a_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_7b772e790b28490ab3d4502c4d4bf3e1_List.find(self.name)
    bpy.context.scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_List.remove(SeparateTrunkAndFoliageUI_index)
    SeparateFoliageTriangleRatioUI_index = bpy.context.scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List.find(self.name)
    bpy.context.scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List.remove(SeparateFoliageTriangleRatioUI_index)
    SeparateFoliageTriangleThresholdUI_index = bpy.context.scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List.find(self.name)
    bpy.context.scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List.remove(SeparateFoliageTriangleThresholdUI_index)
    SeparateFoliageAreaThresholdUI_index = bpy.context.scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List.find(self.name)
    bpy.context.scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List.remove(SeparateFoliageAreaThresholdUI_index)
    SeparateFoliageSizeThresholdUI_index = bpy.context.scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List.find(self.name)
    bpy.context.scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List.remove(SeparateFoliageSizeThresholdUI_index)
    TrunkReductionRatioUI_index = bpy.context.scene.Simplygon_6b19c174a26d47289263b742eaeef24a_List.find(self.name)
    bpy.context.scene.Simplygon_6b19c174a26d47289263b742eaeef24a_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_9bee93678363425ca050f9cafd2d8515_List.find(self.FoliageSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_List[index]

    return None

  @property
  def BillboardModeUI(self):
    index = bpy.context.scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_3b24da6701404ea08a3cc8e520d50336_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_f8403f62ff0b4c118d38549c248907d1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_5f4fb3f3b33e499eae53f7f582ad5101_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_dfb1e84a11e54fde8c884f6f59812611_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_14a376a65081487aaf0959a995734fef_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_14a376a65081487aaf0959a995734fef_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_ecc104cf517b400bbba5945fc0cf956f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_98b5b87a30b842d0bee4050be3253b68_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_2dea6c2a3a414b3b8551ad0b82b23a5e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_b373a1388c1b4201af48b5edddb6bf63_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_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_6a4f17a6f82d4932a1628674e7e15760_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_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_681a02bc9c8f44a9af4d5f14cb48ebb0_List.add()
    BillboardModeUI.Init(self.name)
    BillboardModeUI.name = self.name
    FavorVerticalPlanesUI = bpy.context.scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List.add()
    FavorVerticalPlanesUI.Init(self.name)
    FavorVerticalPlanesUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    UseVisibilityWeightsUI = bpy.context.scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List.add()
    UseVisibilityWeightsUI.Init(self.name)
    UseVisibilityWeightsUI.name = self.name
    BillboardDensityUI = bpy.context.scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List.add()
    BillboardDensityUI.Init(self.name)
    BillboardDensityUI.name = self.name
    MaxPlaneCountUI = bpy.context.scene.Simplygon_14a376a65081487aaf0959a995734fef_List.add()
    MaxPlaneCountUI.Init(self.name)
    MaxPlaneCountUI.name = self.name
    GeometricComplexityUI = bpy.context.scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List.add()
    GeometricComplexityUI.Init(self.name)
    GeometricComplexityUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List.add()
    UpVectorZUI.Init(self.name)
    UpVectorZUI.name = self.name
    FoliageSettings = bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_681a02bc9c8f44a9af4d5f14cb48ebb0_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_3b24da6701404ea08a3cc8e520d50336_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_f8403f62ff0b4c118d38549c248907d1_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_5f4fb3f3b33e499eae53f7f582ad5101_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_dfb1e84a11e54fde8c884f6f59812611_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_14a376a65081487aaf0959a995734fef_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_ecc104cf517b400bbba5945fc0cf956f_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_98b5b87a30b842d0bee4050be3253b68_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_2dea6c2a3a414b3b8551ad0b82b23a5e_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_b373a1388c1b4201af48b5edddb6bf63_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_9bee93678363425ca050f9cafd2d8515_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_681a02bc9c8f44a9af4d5f14cb48ebb0_List.find(self.name)
    bpy.context.scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_List.remove(BillboardModeUI_index)
    FavorVerticalPlanesUI_index = bpy.context.scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List.find(self.name)
    bpy.context.scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List.remove(FavorVerticalPlanesUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List.find(self.name)
    bpy.context.scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List.remove(TwoSidedUI_index)
    UseVisibilityWeightsUI_index = bpy.context.scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List.find(self.name)
    bpy.context.scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List.remove(UseVisibilityWeightsUI_index)
    BillboardDensityUI_index = bpy.context.scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List.find(self.name)
    bpy.context.scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List.remove(BillboardDensityUI_index)
    MaxPlaneCountUI_index = bpy.context.scene.Simplygon_14a376a65081487aaf0959a995734fef_List.find(self.name)
    bpy.context.scene.Simplygon_14a376a65081487aaf0959a995734fef_List.remove(MaxPlaneCountUI_index)
    GeometricComplexityUI_index = bpy.context.scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List.find(self.name)
    bpy.context.scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List.remove(GeometricComplexityUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List.find(self.name)
    bpy.context.scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List.find(self.name)
    bpy.context.scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List.find(self.name)
    bpy.context.scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List.remove(UpVectorZUI_index)
    FoliageSettings_index = bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_List.find(self.FoliageSettings_id)
    bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_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_cda4cae79f5444c29525c66e2c014276_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cda4cae79f5444c29525c66e2c014276_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_48c55afdcc864ee8879f0fb9a0e65e38_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_c26f08a112344ab682cfccd906e5cc19_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_3c23b8d193314ff6bb95ec4bc4491a89_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_b392d590bd194504a879eb24c8a2b5bb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_bd06777db3734aa58b1de2fb68bd7b64_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_7700fc5eb8a744e9b2632286c6ec26fd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_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_cda4cae79f5444c29525c66e2c014276_List.add()
    NumberOfViewsUI.Init(self.name)
    NumberOfViewsUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    UpVectorXUI = bpy.context.scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List.add()
    UpVectorXUI.Init(self.name)
    UpVectorXUI.name = self.name
    UpVectorYUI = bpy.context.scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List.add()
    UpVectorYUI.Init(self.name)
    UpVectorYUI.name = self.name
    UpVectorZUI = bpy.context.scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_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_cda4cae79f5444c29525c66e2c014276_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_48c55afdcc864ee8879f0fb9a0e65e38_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_c26f08a112344ab682cfccd906e5cc19_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_3c23b8d193314ff6bb95ec4bc4491a89_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_b392d590bd194504a879eb24c8a2b5bb_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_bd06777db3734aa58b1de2fb68bd7b64_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_7700fc5eb8a744e9b2632286c6ec26fd_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_cda4cae79f5444c29525c66e2c014276_List.find(self.name)
    bpy.context.scene.Simplygon_cda4cae79f5444c29525c66e2c014276_List.remove(NumberOfViewsUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List.find(self.name)
    bpy.context.scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List.find(self.name)
    bpy.context.scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List.find(self.name)
    bpy.context.scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List.remove(ViewDirectionZUI_index)
    UpVectorXUI_index = bpy.context.scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List.find(self.name)
    bpy.context.scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List.remove(UpVectorXUI_index)
    UpVectorYUI_index = bpy.context.scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List.find(self.name)
    bpy.context.scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List.remove(UpVectorYUI_index)
    UpVectorZUI_index = bpy.context.scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_List.find(self.name)
    bpy.context.scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_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_961ca13bbcd2491784441c22d782f571_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_961ca13bbcd2491784441c22d782f571_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_ad8a722c80d14bb8b3e4bf0a25bd0caa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_ca1205222c5c4399b306c48f65c7298c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_5f42a5c1a2824c4d864bf7ad8e11e816_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_12f35c6bc537460393a54985c8d6adb1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_495cd2830ce34da381d9897ccf61e4bb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_973c63772da44a96bfa8c4bd2dd469b1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_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_c152e178c003473b92a471317fa2ab60_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_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_961ca13bbcd2491784441c22d782f571_List.add()
    UseTightFittingUI.Init(self.name)
    UseTightFittingUI.name = self.name
    TightFittingDepthOffsetUI = bpy.context.scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List.add()
    TightFittingDepthOffsetUI.Init(self.name)
    TightFittingDepthOffsetUI.name = self.name
    TwoSidedUI = bpy.context.scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List.add()
    TwoSidedUI.Init(self.name)
    TwoSidedUI.name = self.name
    ViewDirectionXUI = bpy.context.scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List.add()
    ViewDirectionXUI.Init(self.name)
    ViewDirectionXUI.name = self.name
    ViewDirectionYUI = bpy.context.scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List.add()
    ViewDirectionYUI.Init(self.name)
    ViewDirectionYUI.name = self.name
    ViewDirectionZUI = bpy.context.scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List.add()
    ViewDirectionZUI.Init(self.name)
    ViewDirectionZUI.name = self.name
    TexCoordPaddingUI = bpy.context.scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_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_961ca13bbcd2491784441c22d782f571_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_ad8a722c80d14bb8b3e4bf0a25bd0caa_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_ca1205222c5c4399b306c48f65c7298c_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_5f42a5c1a2824c4d864bf7ad8e11e816_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_12f35c6bc537460393a54985c8d6adb1_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_495cd2830ce34da381d9897ccf61e4bb_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_973c63772da44a96bfa8c4bd2dd469b1_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_961ca13bbcd2491784441c22d782f571_List.find(self.name)
    bpy.context.scene.Simplygon_961ca13bbcd2491784441c22d782f571_List.remove(UseTightFittingUI_index)
    TightFittingDepthOffsetUI_index = bpy.context.scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List.find(self.name)
    bpy.context.scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List.remove(TightFittingDepthOffsetUI_index)
    TwoSidedUI_index = bpy.context.scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List.find(self.name)
    bpy.context.scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List.remove(TwoSidedUI_index)
    ViewDirectionXUI_index = bpy.context.scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List.find(self.name)
    bpy.context.scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List.remove(ViewDirectionXUI_index)
    ViewDirectionYUI_index = bpy.context.scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List.find(self.name)
    bpy.context.scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List.remove(ViewDirectionYUI_index)
    ViewDirectionZUI_index = bpy.context.scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List.find(self.name)
    bpy.context.scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List.remove(ViewDirectionZUI_index)
    TexCoordPaddingUI_index = bpy.context.scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_List.find(self.name)
    bpy.context.scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_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_64815387f4464c35adf889635e8a5b1c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_64815387f4464c35adf889635e8a5b1c_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_f5b59fc3ca214516b5c30d8eebc5090d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_3c040057977540c4bfa1e1ac14f82187_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_c513a271e1e145088f09a4f03964e2a1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_3b9cf62040634d2cae427a10f5e8a506_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_ec888b7196044227b803c73fff4ce08b_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ec888b7196044227b803c73fff4ce08b_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_96124c81fa5143698501556bee0e2857_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_96124c81fa5143698501556bee0e2857_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_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_64815387f4464c35adf889635e8a5b1c_List.add()
    OnScreenSizeUI.Init(self.name)
    OnScreenSizeUI.name = self.name
    OnScreenErrorToleranceUI = bpy.context.scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List.add()
    OnScreenErrorToleranceUI.Init(self.name)
    OnScreenErrorToleranceUI.name = self.name
    InvertOutputMeshUI = bpy.context.scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List.add()
    InvertOutputMeshUI.Init(self.name)
    InvertOutputMeshUI.name = self.name
    TransferSkinningUI = bpy.context.scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List.add()
    TransferSkinningUI.Init(self.name)
    TransferSkinningUI.name = self.name
    UseCamerasUI = bpy.context.scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List.add()
    UseCamerasUI.Init(self.name)
    UseCamerasUI.name = self.name
    CameraSelectionSetNameUI = bpy.context.scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List.add()
    CameraSelectionSetNameUI.Init(self.name)
    CameraSelectionSetNameUI.name = self.name
    OcclusionModeUI = bpy.context.scene.Simplygon_96124c81fa5143698501556bee0e2857_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_64815387f4464c35adf889635e8a5b1c_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_f5b59fc3ca214516b5c30d8eebc5090d_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_3c040057977540c4bfa1e1ac14f82187_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_c513a271e1e145088f09a4f03964e2a1_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_3b9cf62040634d2cae427a10f5e8a506_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_ec888b7196044227b803c73fff4ce08b_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_96124c81fa5143698501556bee0e2857_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_64815387f4464c35adf889635e8a5b1c_List.find(self.name)
    bpy.context.scene.Simplygon_64815387f4464c35adf889635e8a5b1c_List.remove(OnScreenSizeUI_index)
    OnScreenErrorToleranceUI_index = bpy.context.scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List.find(self.name)
    bpy.context.scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List.remove(OnScreenErrorToleranceUI_index)
    InvertOutputMeshUI_index = bpy.context.scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List.find(self.name)
    bpy.context.scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List.remove(InvertOutputMeshUI_index)
    TransferSkinningUI_index = bpy.context.scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List.find(self.name)
    bpy.context.scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List.remove(TransferSkinningUI_index)
    UseCamerasUI_index = bpy.context.scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List.find(self.name)
    bpy.context.scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List.remove(UseCamerasUI_index)
    CameraSelectionSetNameUI_index = bpy.context.scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List.find(self.name)
    bpy.context.scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List.remove(CameraSelectionSetNameUI_index)
    OcclusionModeUI_index = bpy.context.scene.Simplygon_96124c81fa5143698501556bee0e2857_List.find(self.name)
    bpy.context.scene.Simplygon_96124c81fa5143698501556bee0e2857_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_576ba6cb0f264c5c862f7347ee5a9b3f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_576ba6cb0f264c5c862f7347ee5a9b3f_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_443f64db019a470a840ab78a090ac28d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_443f64db019a470a840ab78a090ac28d_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_11ee2f0f2fd7496192f3817c0607bb89_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_ade3366b35ca4a5b8511cec8ccd0f49d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_f8a311e9a5c5452da13c5ed7614ad8b6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_dfd61efba55c424db4d4731bbf5a1c43_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_bef007822fd943759e6262a7579054f6_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bef007822fd943759e6262a7579054f6_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_4d0bb310a63e4ff8b1c7b290a70cd0b9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_820a145ead9d43299a00e4a17d643069_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_820a145ead9d43299a00e4a17d643069_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_23a46b520a82493ea1ecda07a1c026d1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_cfc6341776e94e68bb8608dff8f5de79_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_8e2495b7ca5e470a941682dc32ce0c8d_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_4b3fb67d0b004df480146a1844afabc4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_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_576ba6cb0f264c5c862f7347ee5a9b3f_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_443f64db019a470a840ab78a090ac28d_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_820a145ead9d43299a00e4a17d643069_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_bef007822fd943759e6262a7579054f6_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    BakeOpacityInAlphaUI = bpy.context.scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List.add()
    BakeOpacityInAlphaUI.Init(self.name)
    BakeOpacityInAlphaUI.name = self.name
    SkipCastingIfNoInputChannelUI = bpy.context.scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List.add()
    SkipCastingIfNoInputChannelUI.Init(self.name)
    SkipCastingIfNoInputChannelUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_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_576ba6cb0f264c5c862f7347ee5a9b3f_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_1dc3d6ff46ae4ec986e5d5b4801f2c9a_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_ade3366b35ca4a5b8511cec8ccd0f49d_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_443f64db019a470a840ab78a090ac28d_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_11ee2f0f2fd7496192f3817c0607bb89_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_820a145ead9d43299a00e4a17d643069_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_f8a311e9a5c5452da13c5ed7614ad8b6_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_cfc6341776e94e68bb8608dff8f5de79_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_4b3fb67d0b004df480146a1844afabc4_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_bef007822fd943759e6262a7579054f6_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_4d0bb310a63e4ff8b1c7b290a70cd0b9_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_dfd61efba55c424db4d4731bbf5a1c43_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_8e2495b7ca5e470a941682dc32ce0c8d_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_23a46b520a82493ea1ecda07a1c026d1_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_576ba6cb0f264c5c862f7347ee5a9b3f_List.find(self.name)
    bpy.context.scene.Simplygon_576ba6cb0f264c5c862f7347ee5a9b3f_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List.find(self.name)
    bpy.context.scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List.find(self.name)
    bpy.context.scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_443f64db019a470a840ab78a090ac28d_List.find(self.name)
    bpy.context.scene.Simplygon_443f64db019a470a840ab78a090ac28d_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List.find(self.name)
    bpy.context.scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_820a145ead9d43299a00e4a17d643069_List.find(self.name)
    bpy.context.scene.Simplygon_820a145ead9d43299a00e4a17d643069_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List.find(self.name)
    bpy.context.scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List.find(self.name)
    bpy.context.scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List.remove(OutputPixelFormatUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List.find(self.name)
    bpy.context.scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List.remove(OutputSRGBUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_bef007822fd943759e6262a7579054f6_List.find(self.name)
    bpy.context.scene.Simplygon_bef007822fd943759e6262a7579054f6_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List.find(self.name)
    bpy.context.scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List.remove(OutputDDSCompressionTypeUI_index)
    BakeOpacityInAlphaUI_index = bpy.context.scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List.find(self.name)
    bpy.context.scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List.remove(BakeOpacityInAlphaUI_index)
    SkipCastingIfNoInputChannelUI_index = bpy.context.scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List.find(self.name)
    bpy.context.scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List.remove(SkipCastingIfNoInputChannelUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_List.find(self.name)
    bpy.context.scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_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_b26e9a02b2c249cfba81e072acb175ba_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b26e9a02b2c249cfba81e072acb175ba_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_860763afed7546208847945790bb6cbf_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_860763afed7546208847945790bb6cbf_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_e52ac65b3d34428a95aa2b5ab0db6baa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_9fb3e562f8624ff48abd73855f3611dc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_3c72df183b7d45c1a562f182d8d96e9a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_61ad2607cb7644b485dcf6ec293eebc9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_220863737f854c81b410e6e5746f3296_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_220863737f854c81b410e6e5746f3296_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_6c05b0283f4f4c1895705860f09dd2c9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_6102f4fb2a2140b3b3bc807ed123c449_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_449b9bf740804d1f88b82f9322587404_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_449b9bf740804d1f88b82f9322587404_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_795f677a1e8843b19b10d1dbf898ecbe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_c79732a44b5346ba9db745e0bfef72e0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_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_3de188d0ac3247cc95c5ba9b967d83fe_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_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_b26e9a02b2c249cfba81e072acb175ba_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_860763afed7546208847945790bb6cbf_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_449b9bf740804d1f88b82f9322587404_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputSRGBUI = bpy.context.scene.Simplygon_220863737f854c81b410e6e5746f3296_List.add()
    OutputSRGBUI.Init(self.name)
    OutputSRGBUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputOpacityTypeUI = bpy.context.scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_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_b26e9a02b2c249cfba81e072acb175ba_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_860763afed7546208847945790bb6cbf_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_3c72df183b7d45c1a562f182d8d96e9a_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_e52ac65b3d34428a95aa2b5ab0db6baa_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_9fb3e562f8624ff48abd73855f3611dc_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_449b9bf740804d1f88b82f9322587404_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_61ad2607cb7644b485dcf6ec293eebc9_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_220863737f854c81b410e6e5746f3296_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_c79732a44b5346ba9db745e0bfef72e0_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_6c05b0283f4f4c1895705860f09dd2c9_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_6102f4fb2a2140b3b3bc807ed123c449_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_795f677a1e8843b19b10d1dbf898ecbe_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_b26e9a02b2c249cfba81e072acb175ba_List.find(self.name)
    bpy.context.scene.Simplygon_b26e9a02b2c249cfba81e072acb175ba_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_860763afed7546208847945790bb6cbf_List.find(self.name)
    bpy.context.scene.Simplygon_860763afed7546208847945790bb6cbf_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List.find(self.name)
    bpy.context.scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List.find(self.name)
    bpy.context.scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List.find(self.name)
    bpy.context.scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_449b9bf740804d1f88b82f9322587404_List.find(self.name)
    bpy.context.scene.Simplygon_449b9bf740804d1f88b82f9322587404_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List.find(self.name)
    bpy.context.scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List.remove(UseMultisamplingUI_index)
    OutputSRGBUI_index = bpy.context.scene.Simplygon_220863737f854c81b410e6e5746f3296_List.find(self.name)
    bpy.context.scene.Simplygon_220863737f854c81b410e6e5746f3296_List.remove(OutputSRGBUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List.find(self.name)
    bpy.context.scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List.find(self.name)
    bpy.context.scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List.find(self.name)
    bpy.context.scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List.remove(OutputDDSCompressionTypeUI_index)
    OutputOpacityTypeUI_index = bpy.context.scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_List.find(self.name)
    bpy.context.scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_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_b661ac80510842b68dcad6fe287ed3ae_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b661ac80510842b68dcad6fe287ed3ae_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_c7048cfb6bb045de9958c4f9a7ccb832_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_2f80c122fa23435f8e3c1c12f60f7f72_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_7e0e45d7e2c2412c86961240655cfc12_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_b38d04536cff47828e96350126f4c0ee_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b38d04536cff47828e96350126f4c0ee_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_20332a716b3040e4af2095c3d0462908_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_20332a716b3040e4af2095c3d0462908_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_b53cc227f8b64ca191af91869fa099ed_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_afd66569c5614aeeac54b1e9fed2b258_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_f8187f8c20b740b8a844fecb5cb92f07_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_e592caf5a4e041b29bfc9c8da92449dd_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_63c7e18fb7f14bfcbffe8ea559e49e63_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_88c996112bb24640b997199e2eb088b2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_88c996112bb24640b997199e2eb088b2_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_60bdd5323b8f4b5097bbb6e40f9f464c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_09e10fcb2a034f30a92ba33eda92e444_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_8623b5e294de4b949caca7cafc96f333_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8623b5e294de4b949caca7cafc96f333_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_85e34027d1ac409280fac65b96e7fdfb_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_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_b661ac80510842b68dcad6fe287ed3ae_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_20332a716b3040e4af2095c3d0462908_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_88c996112bb24640b997199e2eb088b2_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    FlipBackfacingNormalsUI = bpy.context.scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List.add()
    FlipBackfacingNormalsUI.Init(self.name)
    FlipBackfacingNormalsUI.name = self.name
    GenerateTangentSpaceNormalsUI = bpy.context.scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List.add()
    GenerateTangentSpaceNormalsUI.Init(self.name)
    GenerateTangentSpaceNormalsUI.name = self.name
    FlipGreenUI = bpy.context.scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List.add()
    FlipGreenUI.Init(self.name)
    FlipGreenUI.name = self.name
    CalculateBitangentPerFragmentUI = bpy.context.scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List.add()
    CalculateBitangentPerFragmentUI.Init(self.name)
    CalculateBitangentPerFragmentUI.name = self.name
    NormalizeInterpolatedTangentSpaceUI = bpy.context.scene.Simplygon_8623b5e294de4b949caca7cafc96f333_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_b661ac80510842b68dcad6fe287ed3ae_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_c7048cfb6bb045de9958c4f9a7ccb832_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_b38d04536cff47828e96350126f4c0ee_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_2f80c122fa23435f8e3c1c12f60f7f72_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_7e0e45d7e2c2412c86961240655cfc12_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_e592caf5a4e041b29bfc9c8da92449dd_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_20332a716b3040e4af2095c3d0462908_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_88c996112bb24640b997199e2eb088b2_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_afd66569c5614aeeac54b1e9fed2b258_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_f8187f8c20b740b8a844fecb5cb92f07_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_b53cc227f8b64ca191af91869fa099ed_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_63c7e18fb7f14bfcbffe8ea559e49e63_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_60bdd5323b8f4b5097bbb6e40f9f464c_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_09e10fcb2a034f30a92ba33eda92e444_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_8623b5e294de4b949caca7cafc96f333_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_b661ac80510842b68dcad6fe287ed3ae_List.find(self.name)
    bpy.context.scene.Simplygon_b661ac80510842b68dcad6fe287ed3ae_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List.find(self.name)
    bpy.context.scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List.find(self.name)
    bpy.context.scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List.find(self.name)
    bpy.context.scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List.find(self.name)
    bpy.context.scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List.find(self.name)
    bpy.context.scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_20332a716b3040e4af2095c3d0462908_List.find(self.name)
    bpy.context.scene.Simplygon_20332a716b3040e4af2095c3d0462908_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_88c996112bb24640b997199e2eb088b2_List.find(self.name)
    bpy.context.scene.Simplygon_88c996112bb24640b997199e2eb088b2_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List.find(self.name)
    bpy.context.scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List.find(self.name)
    bpy.context.scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List.remove(OutputDDSCompressionTypeUI_index)
    FlipBackfacingNormalsUI_index = bpy.context.scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List.find(self.name)
    bpy.context.scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List.remove(FlipBackfacingNormalsUI_index)
    GenerateTangentSpaceNormalsUI_index = bpy.context.scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List.find(self.name)
    bpy.context.scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List.remove(GenerateTangentSpaceNormalsUI_index)
    FlipGreenUI_index = bpy.context.scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List.find(self.name)
    bpy.context.scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List.remove(FlipGreenUI_index)
    CalculateBitangentPerFragmentUI_index = bpy.context.scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List.find(self.name)
    bpy.context.scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List.remove(CalculateBitangentPerFragmentUI_index)
    NormalizeInterpolatedTangentSpaceUI_index = bpy.context.scene.Simplygon_8623b5e294de4b949caca7cafc96f333_List.find(self.name)
    bpy.context.scene.Simplygon_8623b5e294de4b949caca7cafc96f333_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_e26167bb2b14409c8c3de75147f66bcb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_e26167bb2b14409c8c3de75147f66bcb_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_482023697a8d42eab36ac9824aca7470_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_482023697a8d42eab36ac9824aca7470_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_5eaebeb65d3d4272838ead207f1b9514_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_3bd5609947c244fda3fcd7e8b67a4833_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_4a6749150f4a4b108d3bac6d407f97e8_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_b8e3f22b9a094c16bf3eac6ff39bd96a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_efb04c5da8f44a108abd018b9a818654_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_efb04c5da8f44a108abd018b9a818654_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_98077c04f7c0499b91dc0bc2f4b31beb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_b443f28ee70449b4a18ee24aeab437ec_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_4f6e2b1a5030438385974fc1bbe61aaa_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_7206a8aa6baa421b8261f86188c0e9a3_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_f44cc2b9eaed428898c57aa7bd2a7c87_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_bbf82510dab54b27824c36bc432a5afc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_cdb57aba384747a588c159e5752253ef_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cdb57aba384747a588c159e5752253ef_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_0fd8bb63a9294c9f98a8ac3182f8f376_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_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_e26167bb2b14409c8c3de75147f66bcb_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_482023697a8d42eab36ac9824aca7470_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    DistanceScalingUI = bpy.context.scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List.add()
    DistanceScalingUI.Init(self.name)
    DistanceScalingUI.name = self.name
    GenerateScalarDisplacementUI = bpy.context.scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List.add()
    GenerateScalarDisplacementUI.Init(self.name)
    GenerateScalarDisplacementUI.name = self.name
    GenerateTangentSpaceDisplacementUI = bpy.context.scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List.add()
    GenerateTangentSpaceDisplacementUI.Init(self.name)
    GenerateTangentSpaceDisplacementUI.name = self.name
    NormalMapTexCoordLevelUI = bpy.context.scene.Simplygon_cdb57aba384747a588c159e5752253ef_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_e26167bb2b14409c8c3de75147f66bcb_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_482023697a8d42eab36ac9824aca7470_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_4a6749150f4a4b108d3bac6d407f97e8_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_5eaebeb65d3d4272838ead207f1b9514_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_3bd5609947c244fda3fcd7e8b67a4833_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_4f6e2b1a5030438385974fc1bbe61aaa_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_b8e3f22b9a094c16bf3eac6ff39bd96a_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_f44cc2b9eaed428898c57aa7bd2a7c87_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_98077c04f7c0499b91dc0bc2f4b31beb_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_b443f28ee70449b4a18ee24aeab437ec_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_efb04c5da8f44a108abd018b9a818654_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_7206a8aa6baa421b8261f86188c0e9a3_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_bbf82510dab54b27824c36bc432a5afc_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_cdb57aba384747a588c159e5752253ef_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_e26167bb2b14409c8c3de75147f66bcb_List.find(self.name)
    bpy.context.scene.Simplygon_e26167bb2b14409c8c3de75147f66bcb_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_482023697a8d42eab36ac9824aca7470_List.find(self.name)
    bpy.context.scene.Simplygon_482023697a8d42eab36ac9824aca7470_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List.find(self.name)
    bpy.context.scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List.find(self.name)
    bpy.context.scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List.find(self.name)
    bpy.context.scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List.find(self.name)
    bpy.context.scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List.find(self.name)
    bpy.context.scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List.find(self.name)
    bpy.context.scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List.find(self.name)
    bpy.context.scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List.find(self.name)
    bpy.context.scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List.remove(OutputDDSCompressionTypeUI_index)
    DistanceScalingUI_index = bpy.context.scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List.find(self.name)
    bpy.context.scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List.remove(DistanceScalingUI_index)
    GenerateScalarDisplacementUI_index = bpy.context.scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List.find(self.name)
    bpy.context.scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List.remove(GenerateScalarDisplacementUI_index)
    GenerateTangentSpaceDisplacementUI_index = bpy.context.scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List.find(self.name)
    bpy.context.scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List.remove(GenerateTangentSpaceDisplacementUI_index)
    NormalMapTexCoordLevelUI_index = bpy.context.scene.Simplygon_cdb57aba384747a588c159e5752253ef_List.find(self.name)
    bpy.context.scene.Simplygon_cdb57aba384747a588c159e5752253ef_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_5d17fe16881f472d865976248f423933_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5d17fe16881f472d865976248f423933_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_f6ad8cd6ec5f474eb4f9752c57e7658c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_0b1508e913d94cfe9f73366cfecb33c4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_672ccb99eb72409f8a7005a4c303686f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_aff994000bd94d03a10ba3f411390cd4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_ced0a11aa23642cb9556ecca1bc37e82_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_2638751937a0404092475ce5f0259e67_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2638751937a0404092475ce5f0259e67_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_ad0bab0ac43f402f8f11863a440c1462_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_335ed61dc0c14f87ab79f1d861b9d1c7_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_b43028ae3fd64838866876a150d1ac72_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b43028ae3fd64838866876a150d1ac72_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_ec1e749256e5489381364eaa7f3bf48e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_2d6b107baa9d418fb2108049a34d2ce5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_c7a48592fc974e13a028487f29c7a005_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c7a48592fc974e13a028487f29c7a005_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_cd76d73b57b04d2493dbe37e6209a2f7_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_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_5d17fe16881f472d865976248f423933_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    RaysPerPixelUI = bpy.context.scene.Simplygon_2638751937a0404092475ce5f0259e67_List.add()
    RaysPerPixelUI.Init(self.name)
    RaysPerPixelUI.name = self.name
    OcclusionFalloffUI = bpy.context.scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List.add()
    OcclusionFalloffUI.Init(self.name)
    OcclusionFalloffUI.name = self.name
    OcclusionMultiplierUI = bpy.context.scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List.add()
    OcclusionMultiplierUI.Init(self.name)
    OcclusionMultiplierUI.name = self.name
    UseSimpleOcclusionModeUI = bpy.context.scene.Simplygon_c7a48592fc974e13a028487f29c7a005_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_5d17fe16881f472d865976248f423933_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_f6ad8cd6ec5f474eb4f9752c57e7658c_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_aff994000bd94d03a10ba3f411390cd4_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_0b1508e913d94cfe9f73366cfecb33c4_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_672ccb99eb72409f8a7005a4c303686f_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_b43028ae3fd64838866876a150d1ac72_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_ced0a11aa23642cb9556ecca1bc37e82_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_cf4c4e2e3db84c388bfb3f0ab93ca7fb_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_ad0bab0ac43f402f8f11863a440c1462_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_335ed61dc0c14f87ab79f1d861b9d1c7_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_2638751937a0404092475ce5f0259e67_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_ec1e749256e5489381364eaa7f3bf48e_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_2d6b107baa9d418fb2108049a34d2ce5_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_c7a48592fc974e13a028487f29c7a005_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_5d17fe16881f472d865976248f423933_List.find(self.name)
    bpy.context.scene.Simplygon_5d17fe16881f472d865976248f423933_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List.find(self.name)
    bpy.context.scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List.find(self.name)
    bpy.context.scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List.find(self.name)
    bpy.context.scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List.find(self.name)
    bpy.context.scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List.find(self.name)
    bpy.context.scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List.find(self.name)
    bpy.context.scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List.find(self.name)
    bpy.context.scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List.find(self.name)
    bpy.context.scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List.find(self.name)
    bpy.context.scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List.remove(OutputDDSCompressionTypeUI_index)
    RaysPerPixelUI_index = bpy.context.scene.Simplygon_2638751937a0404092475ce5f0259e67_List.find(self.name)
    bpy.context.scene.Simplygon_2638751937a0404092475ce5f0259e67_List.remove(RaysPerPixelUI_index)
    OcclusionFalloffUI_index = bpy.context.scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List.find(self.name)
    bpy.context.scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List.remove(OcclusionFalloffUI_index)
    OcclusionMultiplierUI_index = bpy.context.scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List.find(self.name)
    bpy.context.scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List.remove(OcclusionMultiplierUI_index)
    UseSimpleOcclusionModeUI_index = bpy.context.scene.Simplygon_c7a48592fc974e13a028487f29c7a005_List.find(self.name)
    bpy.context.scene.Simplygon_c7a48592fc974e13a028487f29c7a005_List.remove(UseSimpleOcclusionModeUI_index)

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

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['RaysPerPixel'] = self.RaysPerPixel
    if serializeUIComponents:
      jsonData['RaysPerPixelUI'] = self.RaysPerPixelUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['OcclusionFalloff'] = self.OcclusionFalloff
    if serializeUIComponents:
      jsonData['OcclusionFalloffUI'] = self.OcclusionFalloffUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['OcclusionMultiplier'] = self.OcclusionMultiplier
    if serializeUIComponents:
      jsonData['OcclusionMultiplierUI'] = self.OcclusionMultiplierUI.SaveJson()

    jsonData['UseSimpleOcclusionMode'] = self.UseSimpleOcclusionMode
    if serializeUIComponents:
      jsonData['UseSimpleOcclusionModeUI'] = self.UseSimpleOcclusionModeUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

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

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

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

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

    if 'RaysPerPixel' in jsonData and jsonData['RaysPerPixel'] is not None:
      newRaysPerPixel = jsonData['RaysPerPixel']
      if newRaysPerPixel >= self.RaysPerPixelUI.DefaultMinValue and newRaysPerPixel <= self.RaysPerPixelUI.DefaultMaxValue:
        self.RaysPerPixel = newRaysPerPixel

      else:
        print("RaysPerPixel: Invalid value", newRaysPerPixel, "using default value", self.RaysPerPixel)


    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'OcclusionFalloff' in jsonData and jsonData['OcclusionFalloff'] is not None:
      newOcclusionFalloff = jsonData['OcclusionFalloff']
      if newOcclusionFalloff >= self.OcclusionFalloffUI.DefaultMinValue and newOcclusionFalloff <= self.OcclusionFalloffUI.DefaultMaxValue:
        self.OcclusionFalloff = newOcclusionFalloff

      else:
        print("OcclusionFalloff: Invalid value", newOcclusionFalloff, "using default value", self.OcclusionFalloff)


    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'OcclusionMultiplier' in jsonData and jsonData['OcclusionMultiplier'] is not None:
      newOcclusionMultiplier = jsonData['OcclusionMultiplier']
      if newOcclusionMultiplier >= self.OcclusionMultiplierUI.DefaultMinValue and newOcclusionMultiplier <= self.OcclusionMultiplierUI.DefaultMaxValue:
        self.OcclusionMultiplier = newOcclusionMultiplier

      else:
        print("OcclusionMultiplier: Invalid value", newOcclusionMultiplier, "using default value", self.OcclusionMultiplier)


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


  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.RaysPerPixelUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.OcclusionFalloffUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.OcclusionMultiplierUI.Reset()
    self.UseSimpleOcclusionModeUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.RaysPerPixelUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.OcclusionFalloffUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.OcclusionMultiplierUI.IsEditEnabled = isEditEnabled
    self.UseSimpleOcclusionModeUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='AmbientOcclusionCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='AmbientOcclusionCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.RaysPerPixelUI.Visible:
          column.prop(self, 'RaysPerPixel')

        if self.OcclusionFalloffUI.Visible:
          column.prop(self, 'OcclusionFalloff')

        if self.OcclusionMultiplierUI.Visible:
          column.prop(self, 'OcclusionMultiplier')

        if self.UseSimpleOcclusionModeUI.Visible:
          column.prop(self, 'UseSimpleOcclusionMode')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.RaysPerPixelUI.Visible:
        column.prop(self, 'RaysPerPixel')

      if self.OcclusionFalloffUI.Visible:
        column.prop(self, 'OcclusionFalloff')

      if self.OcclusionMultiplierUI.Visible:
        column.prop(self, 'OcclusionMultiplier')

      if self.UseSimpleOcclusionModeUI.Visible:
        column.prop(self, 'UseSimpleOcclusionMode')




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

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

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.GeometryDataFieldTypeUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.GeometryDataFieldIndexUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.MappingLayerIndexUI.Visible: return True
    if self.MappingInfRUI.Visible: return True
    if self.MappingSupRUI.Visible: return True
    if self.MappingInfGUI.Visible: return True
    if self.MappingSupGUI.Visible: return True
    if self.MappingInfBUI.Visible: return True
    if self.MappingSupBUI.Visible: return True
    if self.MappingInfAUI.Visible: return True
    if self.MappingSupAUI.Visible: return True

    return False

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

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_7d59fcd872fe450a8050189a9d706f90_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_ccaf65cc545a40cb89e50724881e24fe_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_955c6e3598cd44c48b79111e86f1956e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_c24dbb4dacb541aca922e9907c847e5a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_442f3be5e129439cadda6f78fd67d0be_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_ff33680f043348a8b65aa21bfd4fa4c5_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_7e8fea903dc34a10bcb89150175e8898_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_71ac3677b1514635afd4a3761c8f4268_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_b3de00bb133448b9803f79d1b60d7cde_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_6940108d126549f4afffae73b7a884a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6940108d126549f4afffae73b7a884a9_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_600b2c9b1f30400eba12b922a7b822c0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List[index]

      return None

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

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

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

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

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

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


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

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

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

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


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

    return None

  MappingLayerIndex: bpy.props.IntProperty(default=0,min=0,max=10,description='The MappingLayerIndex setting, which specifies the layer of the mapping image to use for mapping the geometry data. This is useful eg if you have decals which are on layer 0, and the real geometry on layer 1')
  class SimplygonMappingLayerIndexEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List[index]

      return None

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

      else:
        self.TicksFrequencyValue = 1

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

      else:
        self.Visible = True


    def Reset(self):
      self.Value = DefaultValue

    def DeepCopy(self):
      pass

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


  @property
  def MappingInfRUI(self):
    index = bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_bd3d2cf6ddbb436c969ab1f40849e19f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_56d399a99a0a4e99a4260db149ad2981_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_370eab945d924abcbd2f24876a74d12a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_370eab945d924abcbd2f24876a74d12a_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_0224b106b55649d99cf77f522f63f2e4_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_aceabfd9b8e34cfebddee8c5c9b06545_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_c9409b55313e4419a2b3b4fc204da183_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_4264ea56820d471eabe73182529a1913_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4264ea56820d471eabe73182529a1913_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_d998f34e15884be29c46e2b94f53333a_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_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_0d9fcda3afe74c35939726f9c298d00c_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    GeometryDataFieldTypeUI = bpy.context.scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List.add()
    GeometryDataFieldTypeUI.Init(self.name)
    GeometryDataFieldTypeUI.name = self.name
    GeometryDataFieldIndexUI = bpy.context.scene.Simplygon_6940108d126549f4afffae73b7a884a9_List.add()
    GeometryDataFieldIndexUI.Init(self.name)
    GeometryDataFieldIndexUI.name = self.name
    MappingLayerIndexUI = bpy.context.scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List.add()
    MappingLayerIndexUI.Init(self.name)
    MappingLayerIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List.add()
    MappingInfRUI.Init(self.name)
    MappingInfRUI.name = self.name
    MappingSupRUI = bpy.context.scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List.add()
    MappingSupRUI.Init(self.name)
    MappingSupRUI.name = self.name
    MappingInfGUI = bpy.context.scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List.add()
    MappingInfGUI.Init(self.name)
    MappingInfGUI.name = self.name
    MappingSupGUI = bpy.context.scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List.add()
    MappingSupGUI.Init(self.name)
    MappingSupGUI.name = self.name
    MappingInfBUI = bpy.context.scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List.add()
    MappingInfBUI.Init(self.name)
    MappingInfBUI.name = self.name
    MappingSupBUI = bpy.context.scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List.add()
    MappingSupBUI.Init(self.name)
    MappingSupBUI.name = self.name
    MappingInfAUI = bpy.context.scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List.add()
    MappingInfAUI.Init(self.name)
    MappingInfAUI.name = self.name
    MappingSupAUI = bpy.context.scene.Simplygon_4264ea56820d471eabe73182529a1913_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_0d9fcda3afe74c35939726f9c298d00c_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_7d59fcd872fe450a8050189a9d706f90_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_c24dbb4dacb541aca922e9907c847e5a_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_ccaf65cc545a40cb89e50724881e24fe_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_955c6e3598cd44c48b79111e86f1956e_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_b3de00bb133448b9803f79d1b60d7cde_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_442f3be5e129439cadda6f78fd67d0be_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_600b2c9b1f30400eba12b922a7b822c0_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_7e8fea903dc34a10bcb89150175e8898_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_71ac3677b1514635afd4a3761c8f4268_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_ff33680f043348a8b65aa21bfd4fa4c5_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_6940108d126549f4afffae73b7a884a9_List.add()
    GeometryDataFieldIndexUI.InitJson(self.name, jsonData['GeometryDataFieldIndexUI'] if jsonData is not None and 'GeometryDataFieldIndexUI' in jsonData else None)
    GeometryDataFieldIndexUI.name = self.name
    MappingLayerIndexUI = bpy.context.scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List.add()
    MappingLayerIndexUI.InitJson(self.name, jsonData['MappingLayerIndexUI'] if jsonData is not None and 'MappingLayerIndexUI' in jsonData else None)
    MappingLayerIndexUI.name = self.name
    MappingInfRUI = bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_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_bd3d2cf6ddbb436c969ab1f40849e19f_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_56d399a99a0a4e99a4260db149ad2981_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_370eab945d924abcbd2f24876a74d12a_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_0224b106b55649d99cf77f522f63f2e4_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_aceabfd9b8e34cfebddee8c5c9b06545_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_c9409b55313e4419a2b3b4fc204da183_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_4264ea56820d471eabe73182529a1913_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_0d9fcda3afe74c35939726f9c298d00c_List.find(self.name)
    bpy.context.scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List.find(self.name)
    bpy.context.scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List.find(self.name)
    bpy.context.scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List.find(self.name)
    bpy.context.scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List.find(self.name)
    bpy.context.scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List.find(self.name)
    bpy.context.scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List.find(self.name)
    bpy.context.scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List.find(self.name)
    bpy.context.scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List.find(self.name)
    bpy.context.scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List.find(self.name)
    bpy.context.scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List.remove(OutputDDSCompressionTypeUI_index)
    GeometryDataFieldTypeUI_index = bpy.context.scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List.find(self.name)
    bpy.context.scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List.remove(GeometryDataFieldTypeUI_index)
    GeometryDataFieldIndexUI_index = bpy.context.scene.Simplygon_6940108d126549f4afffae73b7a884a9_List.find(self.name)
    bpy.context.scene.Simplygon_6940108d126549f4afffae73b7a884a9_List.remove(GeometryDataFieldIndexUI_index)
    MappingLayerIndexUI_index = bpy.context.scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List.find(self.name)
    bpy.context.scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List.remove(MappingLayerIndexUI_index)
    MappingInfRUI_index = bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List.find(self.name)
    bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List.remove(MappingInfRUI_index)
    MappingSupRUI_index = bpy.context.scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List.find(self.name)
    bpy.context.scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List.remove(MappingSupRUI_index)
    MappingInfGUI_index = bpy.context.scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List.find(self.name)
    bpy.context.scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List.remove(MappingInfGUI_index)
    MappingSupGUI_index = bpy.context.scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List.find(self.name)
    bpy.context.scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List.remove(MappingSupGUI_index)
    MappingInfBUI_index = bpy.context.scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List.find(self.name)
    bpy.context.scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List.remove(MappingInfBUI_index)
    MappingSupBUI_index = bpy.context.scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List.find(self.name)
    bpy.context.scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List.remove(MappingSupBUI_index)
    MappingInfAUI_index = bpy.context.scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List.find(self.name)
    bpy.context.scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List.remove(MappingInfAUI_index)
    MappingSupAUI_index = bpy.context.scene.Simplygon_4264ea56820d471eabe73182529a1913_List.find(self.name)
    bpy.context.scene.Simplygon_4264ea56820d471eabe73182529a1913_List.remove(MappingSupAUI_index)

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

    jsonData['OpacityChannelComponent'] = int(self.OpacityChannelComponent)
    if serializeUIComponents:
      jsonData['OpacityChannelComponentUI'] = self.OpacityChannelComponentUI.SaveJson()

    jsonData['DitherType'] = int(self.DitherType)
    if serializeUIComponents:
      jsonData['DitherTypeUI'] = self.DitherTypeUI.SaveJson()

    jsonData['FillMode'] = int(self.FillMode)
    if serializeUIComponents:
      jsonData['FillModeUI'] = self.FillModeUI.SaveJson()

    jsonData['OpacityChannel'] = self.OpacityChannel
    if serializeUIComponents:
      jsonData['OpacityChannelUI'] = self.OpacityChannelUI.SaveJson()

    jsonData['UseMultisampling'] = self.UseMultisampling
    if serializeUIComponents:
      jsonData['UseMultisamplingUI'] = self.UseMultisamplingUI.SaveJson()

    jsonData['GeometryDataFieldType'] = int(self.GeometryDataFieldType)
    if serializeUIComponents:
      jsonData['GeometryDataFieldTypeUI'] = self.GeometryDataFieldTypeUI.SaveJson()

    jsonData['OutputImageFileFormat'] = int(self.OutputImageFileFormat)
    if serializeUIComponents:
      jsonData['OutputImageFileFormatUI'] = self.OutputImageFileFormatUI.SaveJson()

    jsonData['OutputDDSCompressionType'] = int(self.OutputDDSCompressionType)
    if serializeUIComponents:
      jsonData['OutputDDSCompressionTypeUI'] = self.OutputDDSCompressionTypeUI.SaveJson()

    jsonData['Dilation'] = self.Dilation
    if serializeUIComponents:
      jsonData['DilationUI'] = self.DilationUI.SaveJson()

    jsonData['GeometryDataFieldIndex'] = self.GeometryDataFieldIndex
    if serializeUIComponents:
      jsonData['GeometryDataFieldIndexUI'] = self.GeometryDataFieldIndexUI.SaveJson()

    jsonData['OutputPixelFormat'] = int(self.OutputPixelFormat)
    if serializeUIComponents:
      jsonData['OutputPixelFormatUI'] = self.OutputPixelFormatUI.SaveJson()

    jsonData['MappingLayerIndex'] = self.MappingLayerIndex
    if serializeUIComponents:
      jsonData['MappingLayerIndexUI'] = self.MappingLayerIndexUI.SaveJson()

    jsonData['MappingInfR'] = self.MappingInfR
    if serializeUIComponents:
      jsonData['MappingInfRUI'] = self.MappingInfRUI.SaveJson()

    jsonData['MappingSupR'] = self.MappingSupR
    if serializeUIComponents:
      jsonData['MappingSupRUI'] = self.MappingSupRUI.SaveJson()

    jsonData['MappingInfG'] = self.MappingInfG
    if serializeUIComponents:
      jsonData['MappingInfGUI'] = self.MappingInfGUI.SaveJson()

    jsonData['MappingSupG'] = self.MappingSupG
    if serializeUIComponents:
      jsonData['MappingSupGUI'] = self.MappingSupGUI.SaveJson()

    jsonData['MappingInfB'] = self.MappingInfB
    if serializeUIComponents:
      jsonData['MappingInfBUI'] = self.MappingInfBUI.SaveJson()

    jsonData['MappingSupB'] = self.MappingSupB
    if serializeUIComponents:
      jsonData['MappingSupBUI'] = self.MappingSupBUI.SaveJson()

    jsonData['MappingInfA'] = self.MappingInfA
    if serializeUIComponents:
      jsonData['MappingInfAUI'] = self.MappingInfAUI.SaveJson()

    jsonData['MappingSupA'] = self.MappingSupA
    if serializeUIComponents:
      jsonData['MappingSupAUI'] = self.MappingSupAUI.SaveJson()

    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

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

    if 'OpacityChannelComponent' in jsonData and jsonData['OpacityChannelComponent'] is not None:
      self.OpacityChannelComponent = str(jsonData['OpacityChannelComponent'])

    if 'DitherType' in jsonData and jsonData['DitherType'] is not None:
      self.DitherType = str(jsonData['DitherType'])

    if 'FillMode' in jsonData and jsonData['FillMode'] is not None:
      self.FillMode = str(jsonData['FillMode'])

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

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

    if 'GeometryDataFieldType' in jsonData and jsonData['GeometryDataFieldType'] is not None:
      self.GeometryDataFieldType = str(jsonData['GeometryDataFieldType'])

    if 'OutputImageFileFormat' in jsonData and jsonData['OutputImageFileFormat'] is not None:
      self.OutputImageFileFormat = str(jsonData['OutputImageFileFormat'])

    if 'OutputDDSCompressionType' in jsonData and jsonData['OutputDDSCompressionType'] is not None:
      self.OutputDDSCompressionType = str(jsonData['OutputDDSCompressionType'])

    if 'Dilation' in jsonData and jsonData['Dilation'] is not None:
      newDilation = jsonData['Dilation']
      if newDilation >= self.DilationUI.DefaultMinValue and newDilation <= self.DilationUI.DefaultMaxValue:
        self.Dilation = newDilation

      else:
        print("Dilation: Invalid value", newDilation, "using default value", self.Dilation)


    if 'GeometryDataFieldIndex' in jsonData and jsonData['GeometryDataFieldIndex'] is not None:
      newGeometryDataFieldIndex = jsonData['GeometryDataFieldIndex']
      if newGeometryDataFieldIndex >= self.GeometryDataFieldIndexUI.DefaultMinValue and newGeometryDataFieldIndex <= self.GeometryDataFieldIndexUI.DefaultMaxValue:
        self.GeometryDataFieldIndex = newGeometryDataFieldIndex

      else:
        print("GeometryDataFieldIndex: Invalid value", newGeometryDataFieldIndex, "using default value", self.GeometryDataFieldIndex)


    if 'OutputPixelFormat' in jsonData and jsonData['OutputPixelFormat'] is not None:
      self.OutputPixelFormat = str(jsonData['OutputPixelFormat'])

    if 'MappingLayerIndex' in jsonData and jsonData['MappingLayerIndex'] is not None:
      newMappingLayerIndex = jsonData['MappingLayerIndex']
      if newMappingLayerIndex >= self.MappingLayerIndexUI.DefaultMinValue and newMappingLayerIndex <= self.MappingLayerIndexUI.DefaultMaxValue:
        self.MappingLayerIndex = newMappingLayerIndex

      else:
        print("MappingLayerIndex: Invalid value", newMappingLayerIndex, "using default value", self.MappingLayerIndex)


    if 'MappingInfR' in jsonData and jsonData['MappingInfR'] is not None:
      newMappingInfR = jsonData['MappingInfR']
      if newMappingInfR >= self.MappingInfRUI.DefaultMinValue and newMappingInfR <= self.MappingInfRUI.DefaultMaxValue:
        self.MappingInfR = newMappingInfR

      else:
        print("MappingInfR: Invalid value", newMappingInfR, "using default value", self.MappingInfR)


    if 'MappingSupR' in jsonData and jsonData['MappingSupR'] is not None:
      newMappingSupR = jsonData['MappingSupR']
      if newMappingSupR >= self.MappingSupRUI.DefaultMinValue and newMappingSupR <= self.MappingSupRUI.DefaultMaxValue:
        self.MappingSupR = newMappingSupR

      else:
        print("MappingSupR: Invalid value", newMappingSupR, "using default value", self.MappingSupR)


    if 'MappingInfG' in jsonData and jsonData['MappingInfG'] is not None:
      newMappingInfG = jsonData['MappingInfG']
      if newMappingInfG >= self.MappingInfGUI.DefaultMinValue and newMappingInfG <= self.MappingInfGUI.DefaultMaxValue:
        self.MappingInfG = newMappingInfG

      else:
        print("MappingInfG: Invalid value", newMappingInfG, "using default value", self.MappingInfG)


    if 'MappingSupG' in jsonData and jsonData['MappingSupG'] is not None:
      newMappingSupG = jsonData['MappingSupG']
      if newMappingSupG >= self.MappingSupGUI.DefaultMinValue and newMappingSupG <= self.MappingSupGUI.DefaultMaxValue:
        self.MappingSupG = newMappingSupG

      else:
        print("MappingSupG: Invalid value", newMappingSupG, "using default value", self.MappingSupG)


    if 'MappingInfB' in jsonData and jsonData['MappingInfB'] is not None:
      newMappingInfB = jsonData['MappingInfB']
      if newMappingInfB >= self.MappingInfBUI.DefaultMinValue and newMappingInfB <= self.MappingInfBUI.DefaultMaxValue:
        self.MappingInfB = newMappingInfB

      else:
        print("MappingInfB: Invalid value", newMappingInfB, "using default value", self.MappingInfB)


    if 'MappingSupB' in jsonData and jsonData['MappingSupB'] is not None:
      newMappingSupB = jsonData['MappingSupB']
      if newMappingSupB >= self.MappingSupBUI.DefaultMinValue and newMappingSupB <= self.MappingSupBUI.DefaultMaxValue:
        self.MappingSupB = newMappingSupB

      else:
        print("MappingSupB: Invalid value", newMappingSupB, "using default value", self.MappingSupB)


    if 'MappingInfA' in jsonData and jsonData['MappingInfA'] is not None:
      newMappingInfA = jsonData['MappingInfA']
      if newMappingInfA >= self.MappingInfAUI.DefaultMinValue and newMappingInfA <= self.MappingInfAUI.DefaultMaxValue:
        self.MappingInfA = newMappingInfA

      else:
        print("MappingInfA: Invalid value", newMappingInfA, "using default value", self.MappingInfA)


    if 'MappingSupA' in jsonData and jsonData['MappingSupA'] is not None:
      newMappingSupA = jsonData['MappingSupA']
      if newMappingSupA >= self.MappingSupAUI.DefaultMinValue and newMappingSupA <= self.MappingSupAUI.DefaultMaxValue:
        self.MappingSupA = newMappingSupA

      else:
        print("MappingSupA: Invalid value", newMappingSupA, "using default value", self.MappingSupA)



  def Reset(self):
    self.MaterialChannelUI.Reset()
    self.OpacityChannelComponentUI.Reset()
    self.DitherTypeUI.Reset()
    self.FillModeUI.Reset()
    self.OpacityChannelUI.Reset()
    self.UseMultisamplingUI.Reset()
    self.GeometryDataFieldTypeUI.Reset()
    self.OutputImageFileFormatUI.Reset()
    self.OutputDDSCompressionTypeUI.Reset()
    self.DilationUI.Reset()
    self.GeometryDataFieldIndexUI.Reset()
    self.OutputPixelFormatUI.Reset()
    self.MappingLayerIndexUI.Reset()
    self.MappingInfRUI.Reset()
    self.MappingSupRUI.Reset()
    self.MappingInfGUI.Reset()
    self.MappingSupGUI.Reset()
    self.MappingInfBUI.Reset()
    self.MappingSupBUI.Reset()
    self.MappingInfAUI.Reset()
    self.MappingSupAUI.Reset()

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled
    self.MaterialChannelUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelComponentUI.IsEditEnabled = isEditEnabled
    self.DitherTypeUI.IsEditEnabled = isEditEnabled
    self.FillModeUI.IsEditEnabled = isEditEnabled
    self.OpacityChannelUI.IsEditEnabled = isEditEnabled
    self.UseMultisamplingUI.IsEditEnabled = isEditEnabled
    self.GeometryDataFieldTypeUI.IsEditEnabled = isEditEnabled
    self.OutputImageFileFormatUI.IsEditEnabled = isEditEnabled
    self.OutputDDSCompressionTypeUI.IsEditEnabled = isEditEnabled
    self.DilationUI.IsEditEnabled = isEditEnabled
    self.GeometryDataFieldIndexUI.IsEditEnabled = isEditEnabled
    self.OutputPixelFormatUI.IsEditEnabled = isEditEnabled
    self.MappingLayerIndexUI.IsEditEnabled = isEditEnabled
    self.MappingInfRUI.IsEditEnabled = isEditEnabled
    self.MappingSupRUI.IsEditEnabled = isEditEnabled
    self.MappingInfGUI.IsEditEnabled = isEditEnabled
    self.MappingSupGUI.IsEditEnabled = isEditEnabled
    self.MappingInfBUI.IsEditEnabled = isEditEnabled
    self.MappingSupBUI.IsEditEnabled = isEditEnabled
    self.MappingInfAUI.IsEditEnabled = isEditEnabled
    self.MappingSupAUI.IsEditEnabled = isEditEnabled

  def draw(self, layout, createSubGroup) :
    column = layout.column()
    if createSubGroup :
      if self.visible is False:
        column.prop(self, 'visible', icon='TRIA_RIGHT', text='GeometryDataCasterSettings', emboss=False)

      else:
        column.prop(self, 'visible', icon='TRIA_DOWN', text='GeometryDataCasterSettings', emboss=False)

        if self.MaterialChannelUI.Visible:
          column.prop(self, 'MaterialChannel')

        if self.OpacityChannelComponentUI.Visible:
          column.prop(self, 'OpacityChannelComponent')

        if self.OpacityChannelUI.Visible:
          column.prop(self, 'OpacityChannel')

        if self.DitherTypeUI.Visible:
          column.prop(self, 'DitherType')

        if self.FillModeUI.Visible:
          column.prop(self, 'FillMode')

        if self.DilationUI.Visible:
          column.prop(self, 'Dilation')

        if self.UseMultisamplingUI.Visible:
          column.prop(self, 'UseMultisampling')

        if self.OutputPixelFormatUI.Visible:
          column.prop(self, 'OutputPixelFormat')

        if self.OutputImageFileFormatUI.Visible:
          column.prop(self, 'OutputImageFileFormat')

        if self.OutputDDSCompressionTypeUI.Visible:
          column.prop(self, 'OutputDDSCompressionType')

        if self.GeometryDataFieldTypeUI.Visible:
          column.prop(self, 'GeometryDataFieldType')

        if self.GeometryDataFieldIndexUI.Visible:
          column.prop(self, 'GeometryDataFieldIndex')

        if self.MappingLayerIndexUI.Visible:
          column.prop(self, 'MappingLayerIndex')

        if self.MappingInfRUI.Visible:
          column.prop(self, 'MappingInfR')

        if self.MappingSupRUI.Visible:
          column.prop(self, 'MappingSupR')

        if self.MappingInfGUI.Visible:
          column.prop(self, 'MappingInfG')

        if self.MappingSupGUI.Visible:
          column.prop(self, 'MappingSupG')

        if self.MappingInfBUI.Visible:
          column.prop(self, 'MappingInfB')

        if self.MappingSupBUI.Visible:
          column.prop(self, 'MappingSupB')

        if self.MappingInfAUI.Visible:
          column.prop(self, 'MappingInfA')

        if self.MappingSupAUI.Visible:
          column.prop(self, 'MappingSupA')



    else :
      if self.MaterialChannelUI.Visible:
        column.prop(self, 'MaterialChannel')

      if self.OpacityChannelComponentUI.Visible:
        column.prop(self, 'OpacityChannelComponent')

      if self.OpacityChannelUI.Visible:
        column.prop(self, 'OpacityChannel')

      if self.DitherTypeUI.Visible:
        column.prop(self, 'DitherType')

      if self.FillModeUI.Visible:
        column.prop(self, 'FillMode')

      if self.DilationUI.Visible:
        column.prop(self, 'Dilation')

      if self.UseMultisamplingUI.Visible:
        column.prop(self, 'UseMultisampling')

      if self.OutputPixelFormatUI.Visible:
        column.prop(self, 'OutputPixelFormat')

      if self.OutputImageFileFormatUI.Visible:
        column.prop(self, 'OutputImageFileFormat')

      if self.OutputDDSCompressionTypeUI.Visible:
        column.prop(self, 'OutputDDSCompressionType')

      if self.GeometryDataFieldTypeUI.Visible:
        column.prop(self, 'GeometryDataFieldType')

      if self.GeometryDataFieldIndexUI.Visible:
        column.prop(self, 'GeometryDataFieldIndex')

      if self.MappingLayerIndexUI.Visible:
        column.prop(self, 'MappingLayerIndex')

      if self.MappingInfRUI.Visible:
        column.prop(self, 'MappingInfR')

      if self.MappingSupRUI.Visible:
        column.prop(self, 'MappingSupR')

      if self.MappingInfGUI.Visible:
        column.prop(self, 'MappingInfG')

      if self.MappingSupGUI.Visible:
        column.prop(self, 'MappingSupG')

      if self.MappingInfBUI.Visible:
        column.prop(self, 'MappingInfB')

      if self.MappingSupBUI.Visible:
        column.prop(self, 'MappingSupB')

      if self.MappingInfAUI.Visible:
        column.prop(self, 'MappingInfA')

      if self.MappingSupAUI.Visible:
        column.prop(self, 'MappingSupA')




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

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

  @property
  def Visible(self):
    if not self.VisibleOverride: return False
    if self.settingsName == "InputMaterialSettings": return False
    if self.MaterialChannelUI.Visible: return True
    if self.OpacityChannelComponentUI.Visible: return True
    if self.DitherTypeUI.Visible: return True
    if self.FillModeUI.Visible: return True
    if self.OpacityChannelUI.Visible: return True
    if self.UseMultisamplingUI.Visible: return True
    if self.OutputColorLevelUI.Visible: return True
    if self.OutputImageFileFormatUI.Visible: return True
    if self.OutputDDSCompressionTypeUI.Visible: return True
    if self.DilationUI.Visible: return True
    if self.OutputColorNameUI.Visible: return True
    if self.OutputPixelFormatUI.Visible: return True
    if self.ColorSpaceEdgeThresholdUI.Visible: return True

    return False

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

  @property
  def MaterialChannelUI(self):
    index = bpy.context.scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_cb9ae6c88e5645c2a27680adf878f647_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_4b6a14cf56774c77824846a5fb4cbe8e_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_8193667d6dd84706857b850aec4c92a9_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_8193667d6dd84706857b850aec4c92a9_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_5aaf6011daa84842892bb0b2712f1cf2_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_f0975bff4faa414f86683f8dc2e010b1_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_04dbe73c498441bbb260d34182e45234_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_04dbe73c498441bbb260d34182e45234_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_f24fd307157f4faa969b71fc1420d56a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List[index]

    return None

  OutputImageFileFormat: bpy.props.EnumProperty(items=[('0','BMP', ''),('1','DDS', ''),('2','JPEG', ''),('3','PNG', ''),('4','TGA', ''),('5','TIFF', ''),('8','EXR', ''),],default='3',description='File format for output texture.')
  class SimplygonOutputImageFileFormatEx(bpy.types.PropertyGroup):
    Parent_id: bpy.props.StringProperty()
    @property
    def Parent(self):
      index = bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_1aa0516412b64f9199c3b0cb84b2382a_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_0d18919df0864cf786c40b37622be996_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_0d18919df0864cf786c40b37622be996_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_26a91ea7befd477f9df9f0c9a64911c0_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_684d438875a944e28cb225107200fc4f_List.find(self.name)
    if index >= 0:
      return bpy.context.scene.Simplygon_684d438875a944e28cb225107200fc4f_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_37d24cbb376549c79bca260710893911_List.find(self.Parent_id)
      if index >= 0:
        return bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_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_b6424eed9f8843be8dc24f269a7fe57c_List.add()
    MaterialChannelUI.Init(self.name)
    MaterialChannelUI.name = self.name
    OpacityChannelComponentUI = bpy.context.scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List.add()
    OpacityChannelComponentUI.Init(self.name)
    OpacityChannelComponentUI.name = self.name
    OpacityChannelUI = bpy.context.scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List.add()
    OpacityChannelUI.Init(self.name)
    OpacityChannelUI.name = self.name
    DitherTypeUI = bpy.context.scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List.add()
    DitherTypeUI.Init(self.name)
    DitherTypeUI.name = self.name
    FillModeUI = bpy.context.scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List.add()
    FillModeUI.Init(self.name)
    FillModeUI.name = self.name
    DilationUI = bpy.context.scene.Simplygon_0d18919df0864cf786c40b37622be996_List.add()
    DilationUI.Init(self.name)
    DilationUI.name = self.name
    UseMultisamplingUI = bpy.context.scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List.add()
    UseMultisamplingUI.Init(self.name)
    UseMultisamplingUI.name = self.name
    OutputPixelFormatUI = bpy.context.scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List.add()
    OutputPixelFormatUI.Init(self.name)
    OutputPixelFormatUI.name = self.name
    OutputImageFileFormatUI = bpy.context.scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List.add()
    OutputImageFileFormatUI.Init(self.name)
    OutputImageFileFormatUI.name = self.name
    OutputDDSCompressionTypeUI = bpy.context.scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List.add()
    OutputDDSCompressionTypeUI.Init(self.name)
    OutputDDSCompressionTypeUI.name = self.name
    OutputColorLevelUI = bpy.context.scene.Simplygon_04dbe73c498441bbb260d34182e45234_List.add()
    OutputColorLevelUI.Init(self.name)
    OutputColorLevelUI.name = self.name
    OutputColorNameUI = bpy.context.scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List.add()
    OutputColorNameUI.Init(self.name)
    OutputColorNameUI.name = self.name
    ColorSpaceEdgeThresholdUI = bpy.context.scene.Simplygon_684d438875a944e28cb225107200fc4f_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_b6424eed9f8843be8dc24f269a7fe57c_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_cb9ae6c88e5645c2a27680adf878f647_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_5aaf6011daa84842892bb0b2712f1cf2_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_4b6a14cf56774c77824846a5fb4cbe8e_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_8193667d6dd84706857b850aec4c92a9_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_0d18919df0864cf786c40b37622be996_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_f0975bff4faa414f86683f8dc2e010b1_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_d02f2c4ea48e4a58821ce2a0e5c7cbcc_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_f24fd307157f4faa969b71fc1420d56a_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_1aa0516412b64f9199c3b0cb84b2382a_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_04dbe73c498441bbb260d34182e45234_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_26a91ea7befd477f9df9f0c9a64911c0_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_684d438875a944e28cb225107200fc4f_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_b6424eed9f8843be8dc24f269a7fe57c_List.find(self.name)
    bpy.context.scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_List.remove(MaterialChannelUI_index)
    OpacityChannelComponentUI_index = bpy.context.scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List.find(self.name)
    bpy.context.scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List.remove(OpacityChannelComponentUI_index)
    OpacityChannelUI_index = bpy.context.scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List.find(self.name)
    bpy.context.scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List.remove(OpacityChannelUI_index)
    DitherTypeUI_index = bpy.context.scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List.find(self.name)
    bpy.context.scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List.remove(DitherTypeUI_index)
    FillModeUI_index = bpy.context.scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List.find(self.name)
    bpy.context.scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List.remove(FillModeUI_index)
    DilationUI_index = bpy.context.scene.Simplygon_0d18919df0864cf786c40b37622be996_List.find(self.name)
    bpy.context.scene.Simplygon_0d18919df0864cf786c40b37622be996_List.remove(DilationUI_index)
    UseMultisamplingUI_index = bpy.context.scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List.find(self.name)
    bpy.context.scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List.remove(UseMultisamplingUI_index)
    OutputPixelFormatUI_index = bpy.context.scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List.find(self.name)
    bpy.context.scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List.remove(OutputPixelFormatUI_index)
    OutputImageFileFormatUI_index = bpy.context.scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List.find(self.name)
    bpy.context.scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List.remove(OutputImageFileFormatUI_index)
    OutputDDSCompressionTypeUI_index = bpy.context.scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List.find(self.name)
    bpy.context.scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List.remove(OutputDDSCompressionTypeUI_index)
    OutputColorLevelUI_index = bpy.context.scene.Simplygon_04dbe73c498441bbb260d34182e45234_List.find(self.name)
    bpy.context.scene.Simplygon_04dbe73c498441bbb260d34182e45234_List.remove(OutputColorLevelUI_index)
    OutputColorNameUI_index = bpy.context.scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List.find(self.name)
    bpy.context.scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List.remove(OutputColorNameUI_index)
    ColorSpaceEdgeThresholdUI_index = bpy.context.scene.Simplygon_684d438875a944e28cb225107200fc4f_List.find(self.name)
    bpy.context.scene.Simplygon_684d438875a944e28cb225107200fc4f_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_76581fbc5aac4bc6b1a622b4ffdf39a7_List.find(self.ColorCasterSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_List[index]

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return None

  @property
  def PipelineSettings(self):
    index = bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List.find(self.PipelineSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_a6005dada0834aa88611f4701efa22cf_List.find(self.ReductionSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_List[index]

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

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

    return None

  OcclusionMeshSettings_id : bpy.props.StringProperty()
  @property
  def OcclusionMeshSettings(self):
    index = bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.OcclusionMeshSettings_id)
    if index >= 0:
      return bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_fdfae22ff4364467a92af8ed83bc7389_List.add()
    globalSettings.Init()
    self.GlobalSettings_id = globalSettings.name
    pipelineSettings = bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_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_a6005dada0834aa88611f4701efa22cf_List.add()
      ReductionSettings.Init()
      self.ReductionSettings_id = ReductionSettings.name
      RepairSettings = bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List.add()
      RepairSettings.Init()
      self.RepairSettings_id = RepairSettings.name
      NormalCalculationSettings = bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List.add()
      NormalCalculationSettings.Init()
      self.NormalCalculationSettings_id = NormalCalculationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      BoneSettings = bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      RemeshingSettings = bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List.add()
      RemeshingSettings.Init()
      self.RemeshingSettings_id = RemeshingSettings.name
      BoneSettings = bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.add()
      BoneSettings.Init()
      self.BoneSettings_id = BoneSettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      AggregationSettings = bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_List.add()
      AggregationSettings.Init()
      self.AggregationSettings_id = AggregationSettings.name
      VisibilitySettings = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.add()
      VisibilitySettings.Init()
      self.VisibilitySettings_id = VisibilitySettings.name
      GeometryCullingSettings = bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.add()
      GeometryCullingSettings.Init()
      self.GeometryCullingSettings_id = GeometryCullingSettings.name
      VertexWeightSettings = bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.add()
      VertexWeightSettings.Init()
      self.VertexWeightSettings_id = VertexWeightSettings.name
      MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.add()
      MappingImageSettings.Init()
      self.MappingImageSettings_id = MappingImageSettings.name

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

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

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

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

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      OcclusionMeshSettings = bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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_a6005dada0834aa88611f4701efa22cf_List.find(self.ReductionSettings_id)
      bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_List.remove(ReductionSettings_index)
      self.RepairSettings.Deinit()
      RepairSettings_index = bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List.find(self.RepairSettings_id)
      bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List.remove(RepairSettings_index)
      self.NormalCalculationSettings.Deinit()
      NormalCalculationSettings_index = bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List.find(self.NormalCalculationSettings_id)
      bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List.remove(NormalCalculationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.remove(VisibilitySettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.remove(BoneSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      self.RemeshingSettings.Deinit()
      RemeshingSettings_index = bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List.find(self.RemeshingSettings_id)
      bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List.remove(RemeshingSettings_index)
      self.BoneSettings.Deinit()
      BoneSettings_index = bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.find(self.BoneSettings_id)
      bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.remove(BoneSettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.remove(GeometryCullingSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.remove(VisibilitySettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.remove(MappingImageSettings_index)

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      self.AggregationSettings.Deinit()
      AggregationSettings_index = bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_List.find(self.AggregationSettings_id)
      bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_List.remove(AggregationSettings_index)
      self.VisibilitySettings.Deinit()
      VisibilitySettings_index = bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.find(self.VisibilitySettings_id)
      bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.remove(VisibilitySettings_index)
      self.GeometryCullingSettings.Deinit()
      GeometryCullingSettings_index = bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.find(self.GeometryCullingSettings_id)
      bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.remove(GeometryCullingSettings_index)
      self.VertexWeightSettings.Deinit()
      VertexWeightSettings_index = bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.find(self.VertexWeightSettings_id)
      bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.remove(VertexWeightSettings_index)
      self.MappingImageSettings.Deinit()
      MappingImageSettings_index = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.find(self.MappingImageSettings_id)
      bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.remove(MappingImageSettings_index)

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

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

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

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

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      self.OcclusionMeshSettings.Deinit()
      OcclusionMeshSettings_index = bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_List.find(self.OcclusionMeshSettings_id)
      bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_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.4200.0"
    jsonData['Commit'] = "5e344672a8a2e674301feb7b4a9c30e9dc565f34"
    jsonData['Settings']['GlobalSettings'] = self.GlobalSettings.SaveJson(serializeUIComponents)
    jsonData['Settings']['PipelineSettings'] = self.PipelineSettings.SaveJson(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      jsonData['Settings']['ReductionProcessor'] = self.SaveJsonReductionPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      jsonData['Settings']['RemeshingProcessor'] = self.SaveJsonRemeshingPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      jsonData['Settings']['AggregationProcessor'] = self.SaveJsonAggregationPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonBillboardCloudPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonBillboardCloudVegetationPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonFlipbookPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      jsonData['Settings']['ImpostorProcessor'] = self.SaveJsonImpostorFromSingleViewPipeline(serializeUIComponents)

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      jsonData['Settings']['OcclusionMeshProcessor'] = self.SaveJsonOcclusionMeshPipeline(serializeUIComponents)

    jsonData['Settings']['MaterialCaster'] = []
    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      jsonData['Settings']['MaterialCaster'].append(materialCaster.SaveJson(serializeUIComponents))

    jsonData['Cascaded'] = []
    for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
      jsonData['Cascaded'].append(cascadedPipeline.SaveJson(serializeUIComponents))

    return jsonData

  def SaveJsonReductionPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ReductionSettings'] = self.ReductionSettings.SaveJson(serializeUIComponents)
    jsonData['RepairSettings'] = self.RepairSettings.SaveJson(serializeUIComponents)
    jsonData['NormalCalculationSettings'] = self.NormalCalculationSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['BoneSettings'] = self.BoneSettings.SaveJson(serializeUIComponents)
    jsonData['VertexWeightSettings'] = self.VertexWeightSettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonRemeshingPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['RemeshingSettings'] = self.RemeshingSettings.SaveJson(serializeUIComponents)
    jsonData['BoneSettings'] = self.BoneSettings.SaveJson(serializeUIComponents)
    jsonData['GeometryCullingSettings'] = self.GeometryCullingSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonAggregationPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['AggregationSettings'] = self.AggregationSettings.SaveJson(serializeUIComponents)
    jsonData['VisibilitySettings'] = self.VisibilitySettings.SaveJson(serializeUIComponents)
    jsonData['GeometryCullingSettings'] = self.GeometryCullingSettings.SaveJson(serializeUIComponents)
    jsonData['VertexWeightSettings'] = self.VertexWeightSettings.SaveJson(serializeUIComponents)
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonBillboardCloudPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['BillboardCloudSettings'] = self.BillboardCloudSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_BillboardCloud
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonBillboardCloudVegetationPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['BillboardCloudSettings'] = self.BillboardCloudSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_BillboardCloud
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonFlipbookPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['FlipbookSettings'] = self.FlipbookSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_Flipbook
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonImpostorFromSingleViewPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['ImpostorSettings'] = {}
    jsonData['ImpostorSettings']['ImpostorFromSingleViewSettings'] = self.ImpostorFromSingleViewSettings.SaveJson(serializeUIComponents)
    jsonData['ImpostorSettings']['ImpostorType'] = Simplygon.EImpostorType_FromSingleView
    jsonData['MappingImageSettings'] = self.MappingImageSettings.SaveJson(serializeUIComponents)
    return jsonData

  def SaveJsonOcclusionMeshPipeline(self, serializeUIComponents):
    jsonData = {}
    jsonData['OcclusionMeshSettings'] = self.OcclusionMeshSettings.SaveJson(serializeUIComponents)
    return jsonData

  def LoadJson(self, jsonData):
    if jsonData is None:
      return

    if jsonData['Pipeline'] == "Passthrough":
      self.PipelineType = ESimplygonPipeline.Passthrough

    if jsonData['Pipeline'] == "Reduction":
      self.PipelineType = ESimplygonPipeline.ReductionPipeline

    if jsonData['Pipeline'] == "Remeshing":
      self.PipelineType = ESimplygonPipeline.RemeshingPipeline

    if jsonData['Pipeline'] == "Aggregation":
      self.PipelineType = ESimplygonPipeline.AggregationPipeline

    if jsonData['Pipeline'] == "BillboardCloud":
      self.PipelineType = ESimplygonPipeline.BillboardCloudPipeline

    if jsonData['Pipeline'] == "BillboardCloudVegetation":
      self.PipelineType = ESimplygonPipeline.BillboardCloudVegetationPipeline

    if jsonData['Pipeline'] == "Flipbook":
      self.PipelineType = ESimplygonPipeline.FlipbookPipeline

    if jsonData['Pipeline'] == "ImpostorFromSingleView":
      self.PipelineType = ESimplygonPipeline.ImpostorFromSingleViewPipeline

    if jsonData['Pipeline'] == "OcclusionMesh":
      self.PipelineType = ESimplygonPipeline.OcclusionMeshPipeline

    if 'Settings' in jsonData and jsonData['Settings'] is not None:
      globalSettings = bpy.context.scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_List.add()
      globalSettings.InitJson(jsonData['Settings']['GlobalSettings'])
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List.add()
      pipelineSettings.InitJson(jsonData['Settings']['PipelineSettings'])
      self.PipelineSettings_id = pipelineSettings.name

    else:
      globalSettings = bpy.context.scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_List.add()
      globalSettings.Init()
      self.GlobalSettings_id = globalSettings.name
      pipelineSettings = bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List.add()
      pipelineSettings.Init()
      self.PipelineSettings_id = pipelineSettings.name

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
      self.LoadJsonReductionPipeline(jsonData['Settings']['ReductionProcessor'])

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
      self.LoadJsonRemeshingPipeline(jsonData['Settings']['RemeshingProcessor'])

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
      self.LoadJsonAggregationPipeline(jsonData['Settings']['AggregationProcessor'])

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
      self.LoadJsonBillboardCloudPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
      self.LoadJsonBillboardCloudVegetationPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
      self.LoadJsonFlipbookPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
      self.LoadJsonImpostorFromSingleViewPipeline(jsonData['Settings']['ImpostorProcessor'])

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
      self.LoadJsonOcclusionMeshPipeline(jsonData['Settings']['OcclusionMeshProcessor'])

    if 'Cascaded' in jsonData and jsonData['Cascaded'] is not None:
      for i in range(0, len(jsonData['Cascaded'])):
        cascadedPipeline = bpy.context.scene.Simplygon_Pipelines.add()
        cascadedPipeline.InitJson(self.name, jsonData['Cascaded'][i])
        self.CascadedPipelineIds += cascadedPipeline.name + ';'
        self.VisibleCascadedPipelines = True


    if 'Settings' in jsonData and jsonData['Settings'] is not None:
      if jsonData['Settings']['MaterialCaster'] is not None:
        for i in range(0, len(jsonData['Settings']['MaterialCaster'])):
          materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
          materialCaster.InitJson(self.name, jsonData['Settings']['MaterialCaster'][i])
          self.MaterialCasterIds += materialCaster.name + ';'
          self.VisibleCascadedPipelines = True





  def LoadJsonReductionPipeline(self, jsonData):
    if jsonData is None:
      return

    ReductionSettings = bpy.context.scene.Simplygon_a6005dada0834aa88611f4701efa22cf_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_02b30ecae28245dea2083e2a7e9e919b_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_af4ba95444d743ce9c67d13ef0420aa7_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_877dd0090fef4cea86e3a1944253dc29_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_01a906caea954ec39635af1918fd3162_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_a872468fd4cd49ecb101e26daf1bdccd_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_e0c2735a35974dd3aa3daee1f8e60d8d_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_c1439674219045dcb26a08a537b9ae20_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_01a906caea954ec39635af1918fd3162_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_8b1f8baa45314cb08edd063a29c7b51b_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_877dd0090fef4cea86e3a1944253dc29_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_e0c2735a35974dd3aa3daee1f8e60d8d_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_da272c1503024c6da2115cb330932104_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_877dd0090fef4cea86e3a1944253dc29_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_8b1f8baa45314cb08edd063a29c7b51b_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_a872468fd4cd49ecb101e26daf1bdccd_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_e0c2735a35974dd3aa3daee1f8e60d8d_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_6a4f17a6f82d4932a1628674e7e15760_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_6a4f17a6f82d4932a1628674e7e15760_List.add()
    BillboardCloudSettings.InitJson(jsonData['ImpostorSettings']['BillboardCloudSettings'])
    self.BillboardCloudSettings_id = BillboardCloudSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_a4cf9be35dcf45ae8fc760e05d10d59d_List.add()
    FlipbookSettings.InitJson(jsonData['ImpostorSettings']['FlipbookSettings'])
    self.FlipbookSettings_id = FlipbookSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_c152e178c003473b92a471317fa2ab60_List.add()
    ImpostorFromSingleViewSettings.InitJson(jsonData['ImpostorSettings']['ImpostorFromSingleViewSettings'])
    self.ImpostorFromSingleViewSettings_id = ImpostorFromSingleViewSettings.name
    MappingImageSettings = bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_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_b92b0736267d4e87a11f7e781a9a31a2_List.add()
    OcclusionMeshSettings.InitJson(jsonData['OcclusionMeshSettings'] if jsonData is not None and 'OcclusionMeshSettings' in jsonData else None)
    self.OcclusionMeshSettings_id = OcclusionMeshSettings.name

  def AddMaterialCaster(self, materialCasterType, materialChannelName, allowMaterialChannelOverride, allowDuplicates) :
    if materialChannelName == '':
      materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
      materialCaster.Init(self.name, materialCasterType, materialChannelName, allowMaterialChannelOverride)
      self.MaterialCasterIds += materialCaster.name + ';'

    else:
      newMaterialChannel = True
      if not allowDuplicates:
        for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
          if materialCaster.MaterialChannelName == materialChannelName:
            newMaterialChannel = False



      if newMaterialChannel:
        materialCaster = bpy.context.scene.Simplygon_MaterialCasters.add()
        materialCaster.Init(self.name, materialCasterType, materialChannelName, allowMaterialChannelOverride)
        self.MaterialCasterIds += materialCaster.name + ';'


    self.VisibleMaterialCasters = True
    self.MappingImageSettings.GenerateMappingImage = True
    self.MappingImageSettings.UseFullRetexturing = True
    self.MappingImageSettings.ApplyNewMaterialIds = True

  def RemoveMaterialCaster(self, id) :
    materialCaster = GetSimplygonMaterialCaster(id)
    materialCaster.Deinit()
    self.MaterialCasterIds = self.MaterialCasterIds.replace(materialCaster.name + ';', '')
    RemoveSimplygonMaterialCaster(materialCaster)

  def RemoveAllMaterialCaster(self) :
    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      materialCaster.Deinit()
      RemoveSimplygonMaterialCaster(materialCaster)

    self.MaterialCasterIds = ''

  def AddCascadedPipeline(self, pipelineType, menuPath, automaticMaterialCastersFromSelection):
    cascadedPipeline = bpy.context.scene.Simplygon_Pipelines.add()
    cascadedPipeline.Init(self.name, pipelineType, menuPath, automaticMaterialCastersFromSelection)
    self.CascadedPipelineIds += cascadedPipeline.name + ';'
    self.VisibleCascadedPipelines = True
    return cascadedPipeline

  def RemoveCascadedPipeline(self, id) :
    pipeline = GetSimplygonPipeline(id)
    pipeline.Deinit()
    self.CascadedPipelineIds = self.CascadedPipelineIds.replace(pipeline.name + ';', '')
    RemoveSimplygonPipeline(pipeline)

  def SetEditMode(self, isEditEnabled):
    self.IsEditEnabled = isEditEnabled

  def SetTemplateOverrides(self):
    if self.FilePath:
      return

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Advanced/Reduction":
      self.VertexWeightSettings.WeightsFromColorLevel = 0
      self.VertexWeightSettings.WeightsFromColorNameUI.VisibleOverride = False
      self.VertexWeightSettings.WeightsFromColorLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline and self.MenuPath == "Template/Advanced/Remeshing":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Advanced/Aggregation":
      self.VertexWeightSettings.WeightsFromColorLevel = 0
      self.VertexWeightSettings.WeightsFromColorNameUI.VisibleOverride = False
      self.VertexWeightSettings.WeightsFromColorLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline and self.MenuPath == "Template/Advanced/Billboard cloud":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.FoliageSettings.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_OuterShell))
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline and self.MenuPath == "Template/Advanced/Billboard cloud for vegetation":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_Foliage))
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline and self.MenuPath == "Template/Advanced/Impostor from single view":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ImpostorFromSingleViewSettings.ViewDirectionX = -1
      self.ImpostorFromSingleViewSettings.ViewDirectionY = 0
      self.ImpostorFromSingleViewSettings.ViewDirectionZ = 0
      self.ImpostorFromSingleViewSettings.TwoSidedUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline and self.MenuPath == "Template/Advanced/Occlusion mesh":
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Basic/Reduction":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ReductionSettings.ReductionTargetTriangleCountUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetMaxDeviationUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetOnScreenSizeUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetStopConditionUI.VisibleOverride = False
      self.ReductionSettings.ReductionHeuristicsUI.VisibleOverride = False
      self.ReductionSettings.GeometryImportanceUI.VisibleOverride = False
      self.ReductionSettings.MaterialImportanceUI.VisibleOverride = False
      self.ReductionSettings.TextureImportanceUI.VisibleOverride = False
      self.ReductionSettings.ShadingImportanceUI.VisibleOverride = False
      self.ReductionSettings.GroupImportanceUI.VisibleOverride = False
      self.ReductionSettings.VertexColorImportanceUI.VisibleOverride = False
      self.ReductionSettings.EdgeSetImportanceUI.VisibleOverride = False
      self.ReductionSettings.SkinningImportanceUI.VisibleOverride = False
      self.ReductionSettings.CurvatureImportanceUI.VisibleOverride = False
      self.ReductionSettings.OutwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.InwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.KeepSymmetryUI.VisibleOverride = False
      self.ReductionSettings.CreateGeomorphGeometryUI.VisibleOverride = False
      self.ReductionSettings.DataCreationPreferencesUI.VisibleOverride = False
      self.ReductionSettings.UseHighQualityNormalCalculationUI.VisibleOverride = False
      self.ReductionSettings.LockGeometricBorderUI.VisibleOverride = False
      self.ReductionSettings.MergeGeometriesUI.VisibleOverride = False
      self.ReductionSettings.AllowDegenerateTexCoordsUI.VisibleOverride = False
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.RepairSettings.VisibleOverride = False
      self.NormalCalculationSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.MappingImageSettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.ReductionPipeline and self.MenuPath == "Template/Basic/Reduction with material baking":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ReductionSettings.ReductionTargetTriangleCountUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetMaxDeviationUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetOnScreenSizeUI.VisibleOverride = False
      self.ReductionSettings.ReductionTargetStopConditionUI.VisibleOverride = False
      self.ReductionSettings.ReductionHeuristicsUI.VisibleOverride = False
      self.ReductionSettings.GeometryImportanceUI.VisibleOverride = False
      self.ReductionSettings.MaterialImportanceUI.VisibleOverride = False
      self.ReductionSettings.TextureImportanceUI.VisibleOverride = False
      self.ReductionSettings.ShadingImportanceUI.VisibleOverride = False
      self.ReductionSettings.GroupImportanceUI.VisibleOverride = False
      self.ReductionSettings.VertexColorImportanceUI.VisibleOverride = False
      self.ReductionSettings.EdgeSetImportanceUI.VisibleOverride = False
      self.ReductionSettings.SkinningImportanceUI.VisibleOverride = False
      self.ReductionSettings.CurvatureImportanceUI.VisibleOverride = False
      self.ReductionSettings.OutwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.InwardMoveMultiplierUI.VisibleOverride = False
      self.ReductionSettings.KeepSymmetryUI.VisibleOverride = False
      self.ReductionSettings.CreateGeomorphGeometryUI.VisibleOverride = False
      self.ReductionSettings.DataCreationPreferencesUI.VisibleOverride = False
      self.ReductionSettings.UseHighQualityNormalCalculationUI.VisibleOverride = False
      self.ReductionSettings.LockGeometricBorderUI.VisibleOverride = False
      self.ReductionSettings.MergeGeometriesUI.VisibleOverride = False
      self.ReductionSettings.AllowDegenerateTexCoordsUI.VisibleOverride = False
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.RepairSettings.VisibleOverride = False
      self.NormalCalculationSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.ReductionSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.RemeshingPipeline and self.MenuPath == "Template/Basic/Remeshing with material baking":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.RemeshingSettings.RemeshingModeManualPositionXUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeManualPositionYUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeManualPositionZUI.VisibleOverride = False
      self.RemeshingSettings.ForceSoftEdgesWithinTextureChartsUI.VisibleOverride = False
      self.RemeshingSettings.HoleFillingUI.VisibleOverride = False
      self.RemeshingSettings.RemeshingModeUI.VisibleOverride = False
      self.RemeshingSettings.SurfaceTransferModeUI.VisibleOverride = False
      self.RemeshingSettings.HardEdgeAngleUI.VisibleOverride = False
      self.RemeshingSettings.TransferNormalsUI.VisibleOverride = False
      self.RemeshingSettings.TransferColorsUI.VisibleOverride = False
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.RemeshingSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.BoneSettings.LockBoneSelectionSetNameUI.VisibleOverride = False
      self.BoneSettings.RemoveBoneSelectionSetNameUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Basic/Aggregation":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.AggregationSettings.SubdivideGeometryBasedOnUVTilesUI.VisibleOverride = False
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.MappingImageSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.AggregationPipeline and self.MenuPath == "Template/Basic/Aggregation with material baking":
      self.MappingImageSettings.TexCoordGeneratorType = str(int(Simplygon.ETexcoordGeneratorType_ChartAggregator))
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.AggregationSettings.SubdivideGeometryBasedOnUVTilesUI.VisibleOverride = False
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.VisibilitySettings.VisibleOverride = False
      self.VertexWeightSettings.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))
      self.AggregationSettings.KeepUnprocessedSceneMeshesUI.VisibleOverride = False
      self.GeometryCullingSettings.VisibleOverride = False
      self.VisibilitySettings.CameraSelectionSetNameUI.VisibleOverride = False
      self.VisibilitySettings.OccluderSelectionSetNameUI.VisibleOverride = False

    if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline and self.MenuPath == "Template/Basic/Billboard cloud":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardDensityUI.VisibleOverride = False
      self.BillboardCloudSettings.MaxPlaneCountUI.VisibleOverride = False
      self.BillboardCloudSettings.GeometricComplexityUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_OuterShell))
      self.BillboardCloudSettings.FoliageSettings.VisibleOverride = False
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline and self.MenuPath == "Template/Basic/Billboard cloud for vegetation":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.BillboardCloudSettings.BillboardModeUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardDensityUI.VisibleOverride = False
      self.BillboardCloudSettings.MaxPlaneCountUI.VisibleOverride = False
      self.BillboardCloudSettings.GeometricComplexityUI.VisibleOverride = False
      self.BillboardCloudSettings.BillboardMode = str(int(Simplygon.EBillboardMode_Foliage))
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.BillboardCloudSettings.UpVectorX = 0
      self.BillboardCloudSettings.UpVectorY = 0
      self.BillboardCloudSettings.UpVectorZ = 1
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline and self.MenuPath == "Template/Basic/Impostor from single view":
      self.MappingImageSettings.ChartAggregatorSettings.OriginalChartProportionsChannel = "Basecolor"
      self.ImpostorFromSingleViewSettings.ViewDirectionX = -1
      self.ImpostorFromSingleViewSettings.ViewDirectionY = 0
      self.ImpostorFromSingleViewSettings.ViewDirectionZ = 0
      self.MappingImageSettings.GenerateMappingImageUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTexCoordsUI.VisibleOverride = False
      self.MappingImageSettings.GenerateTangentsUI.VisibleOverride = False
      self.MappingImageSettings.UseFullRetexturingUI.VisibleOverride = False
      self.MappingImageSettings.ApplyNewMaterialIdsUI.VisibleOverride = False
      self.MappingImageSettings.UseAutomaticTextureSizeUI.VisibleOverride = False
      self.MappingImageSettings.AutomaticTextureSizeMultiplierUI.VisibleOverride = False
      self.MappingImageSettings.ForcePower2TextureUI.VisibleOverride = False
      self.MappingImageSettings.OnlyParameterizeInvalidUVsUI.VisibleOverride = False
      self.MappingImageSettings.AllowTransparencyMappingUI.VisibleOverride = False
      self.MappingImageSettings.MaximumLayersUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordLevelUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordNameUI.VisibleOverride = False
      self.MappingImageSettings.TexCoordGeneratorTypeUI.VisibleOverride = False
      self.MappingImageSettings.ParameterizerSettings.VisibleOverride = False
      self.MappingImageSettings.ChartAggregatorSettings.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.MultisamplingLevelUI.VisibleOverride = False
      self.MappingImageSettings.OutputMaterialSettings.GutterSpaceUI.VisibleOverride = False
      self.ImpostorFromSingleViewSettings.TwoSidedUI.VisibleOverride = False
      self.GlobalSettings.DefaultTangentCalculatorType = str(int(Simplygon.ETangentSpaceMethod_MikkTSpace))

    for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
      materialCaster.SetTemplateOverrides()

    for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
      cascadedPipeline.SetTemplateOverrides()


  def draw(self, layout) :
    cascadedPipelines = GetSimplygonPipelines(self.CascadedPipelineIds)
    if self.PipelineType == ESimplygonPipeline.Passthrough and cascadedPipelines and len(cascadedPipelines) > 0 :
      for cascadedPipeline in cascadedPipelines:
        cascadedPipeline.draw(layout.column())


    else:
      row = layout.row()
      if self.Visible is False:
        row.prop(self, 'Visible', icon='TRIA_RIGHT', text=self.PipelineName, emboss=False)
        row.operator('simplygon.operator_remove_lod_component', text = '', icon = 'TRASH').pipelineId = self.name

      else:
        row.prop(self, 'Visible', icon='TRIA_DOWN', text=self.PipelineName, emboss=False)
        row.operator('simplygon.operator_remove_lod_component', text = '', icon = 'TRASH').pipelineId = self.name

        if self.PipelineType == ESimplygonPipeline.ReductionPipeline:
          self.drawReductionPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.RemeshingPipeline:
          self.drawRemeshingPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.AggregationPipeline:
          self.drawAggregationPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.BillboardCloudPipeline:
          self.drawBillboardCloudPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.BillboardCloudVegetationPipeline:
          self.drawBillboardCloudVegetationPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.FlipbookPipeline:
          self.drawFlipbookPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.ImpostorFromSingleViewPipeline:
          self.drawImpostorFromSingleViewPipeline(layout.column())

        if self.PipelineType == ESimplygonPipeline.OcclusionMeshPipeline:
          self.drawOcclusionMeshPipeline(layout.column())





  def drawReductionPipeline(self, layout) :
    if self.ReductionSettings.Visible:
      self.ReductionSettings.draw(layout.box(), True)

    if self.RepairSettings.Visible:
      self.RepairSettings.draw(layout.box(), True)

    if self.NormalCalculationSettings.Visible:
      self.NormalCalculationSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.BoneSettings.Visible:
      self.BoneSettings.draw(layout.box(), True)

    if self.VertexWeightSettings.Visible:
      self.VertexWeightSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawRemeshingPipeline(self, layout) :
    if self.RemeshingSettings.Visible:
      self.RemeshingSettings.draw(layout.box(), True)

    if self.BoneSettings.Visible:
      self.BoneSettings.draw(layout.box(), True)

    if self.GeometryCullingSettings.Visible:
      self.GeometryCullingSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawAggregationPipeline(self, layout) :
    if self.AggregationSettings.Visible:
      self.AggregationSettings.draw(layout.box(), True)

    if self.VisibilitySettings.Visible:
      self.VisibilitySettings.draw(layout.box(), True)

    if self.GeometryCullingSettings.Visible:
      self.GeometryCullingSettings.draw(layout.box(), True)

    if self.VertexWeightSettings.Visible:
      self.VertexWeightSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawBillboardCloudPipeline(self, layout) :
    if self.BillboardCloudSettings.Visible:
      self.BillboardCloudSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawBillboardCloudVegetationPipeline(self, layout) :
    if self.BillboardCloudSettings.Visible:
      self.BillboardCloudSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawFlipbookPipeline(self, layout) :
    if self.FlipbookSettings.Visible:
      self.FlipbookSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawImpostorFromSingleViewPipeline(self, layout) :
    if self.ImpostorFromSingleViewSettings.Visible:
      self.ImpostorFromSingleViewSettings.draw(layout.box(), True)

    if self.MappingImageSettings.Visible:
      self.MappingImageSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleMaterialCasters is False:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_RIGHT', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


    else:
      row.prop(self, 'VisibleMaterialCasters', icon='TRIA_DOWN', text='Material Casters', emboss=False)
      row.operator('simplygon.operator_add_material_caster_menu', text = '', icon = 'ADD').pipelineId = self.name
      if len(self.MaterialCasterIds) > 0:
        row.operator('simplygon.operator_remove_all_material_caster_menu', text = '', icon = 'TRASH').pipelineId = self.name


      for materialCaster in GetSimplygonMaterialCasters(self.MaterialCasterIds):
        materialCaster.draw(box.box())


    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())



  def drawOcclusionMeshPipeline(self, layout) :
    if self.OcclusionMeshSettings.Visible:
      self.OcclusionMeshSettings.draw(layout.box(), True)

    box = layout.box()
    row = box.row()
    if self.VisibleCascadedPipelines is False:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_RIGHT', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

    else:
      row.prop(self, 'VisibleCascadedPipelines', icon='TRIA_DOWN', text='Cascaded pipelines', emboss=False)
      row.operator('simplygon.operator_add_lod_component_menu', text = '', icon = 'ADD').pipelineId = self.name

      for cascadedPipeline in GetSimplygonPipelines(self.CascadedPipelineIds):
        cascadedPipeline.draw(box.box())




def simplygon_template_menu_draw(self, context):
  self.layout.menu('SIMPLYGON_MT_template_scripts')
simplygon_icons = []

classes = (
  Simplygon_Operator_Process,
  Simplygon_Operator_SettingsMenu,
  Simplygon_Operator_SavePipeline,
  Simplygon_Operator_SavePipelineDialog,
  Simplygon_Operator_LoadPipeline,
  Simplygon_Operator_LoadPipelineDialog,
  Simplygon_Operator_AddMaterialCasterMenu,
  Simplygon_Operator_RemoveAllMaterialCasterMenu,
  Simplygon_Operator_AddMaterialCaster,
  Simplygon_Operator_AddAutomaticMaterialCasters,
  Simplygon_Operator_RemoveMaterialCaster,
  Simplygon_Operator_AddLODComponentMenu,
  Simplygon_Operator_AddLODComponent,
  Simplygon_Operator_RemoveLODComponent,
  Simplygon_Operator_TemplateScript,
  Simplygon_Menu_AdvancedLODComponents,
  Simplygon_Menu_BasicLODComponents,
  Simplygon_Menu_AdvancedMaterialCasters,
  Simplygon_Menu_AddMaterialCaster,
  Simplygon_Menu_AddLODComponent,
  Simplygon_Menu_TemplateScripts,
  Simplygon_Menu_Settings,
  Simplygon_Panel,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEx,
  SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEx,
  SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEnabledEx,
  SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEx,
  SimplygonReductionSettings.SimplygonReductionTargetStopConditionEx,
  SimplygonReductionSettings.SimplygonReductionHeuristicsEx,
  SimplygonReductionSettings.SimplygonGeometryImportanceEx,
  SimplygonReductionSettings.SimplygonMaterialImportanceEx,
  SimplygonReductionSettings.SimplygonTextureImportanceEx,
  SimplygonReductionSettings.SimplygonShadingImportanceEx,
  SimplygonReductionSettings.SimplygonGroupImportanceEx,
  SimplygonReductionSettings.SimplygonVertexColorImportanceEx,
  SimplygonReductionSettings.SimplygonEdgeSetImportanceEx,
  SimplygonReductionSettings.SimplygonSkinningImportanceEx,
  SimplygonReductionSettings.SimplygonCurvatureImportanceEx,
  SimplygonReductionSettings.SimplygonCreateGeomorphGeometryEx,
  SimplygonReductionSettings.SimplygonAllowDegenerateTexCoordsEx,
  SimplygonReductionSettings.SimplygonKeepSymmetryEx,
  SimplygonReductionSettings.SimplygonUseAutomaticSymmetryDetectionEx,
  SimplygonReductionSettings.SimplygonUseSymmetryQuadRetriangulatorEx,
  SimplygonReductionSettings.SimplygonSymmetryAxisEx,
  SimplygonReductionSettings.SimplygonSymmetryOffsetEx,
  SimplygonReductionSettings.SimplygonSymmetryDetectionToleranceEx,
  SimplygonReductionSettings.SimplygonDataCreationPreferencesEx,
  SimplygonReductionSettings.SimplygonOutwardMoveMultiplierEx,
  SimplygonReductionSettings.SimplygonInwardMoveMultiplierEx,
  SimplygonReductionSettings.SimplygonUseHighQualityNormalCalculationEx,
  SimplygonReductionSettings.SimplygonMergeGeometriesEx,
  SimplygonReductionSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonReductionSettings.SimplygonLockGeometricBorderEx,
  SimplygonReductionSettings,
  SimplygonRepairSettings.SimplygonUseTJunctionRemoverEx,
  SimplygonRepairSettings.SimplygonTJuncDistEx,
  SimplygonRepairSettings.SimplygonWeldDistEx,
  SimplygonRepairSettings.SimplygonWeldOnlyBorderVerticesEx,
  SimplygonRepairSettings.SimplygonWeldOnlyWithinMaterialEx,
  SimplygonRepairSettings.SimplygonWeldOnlyWithinSceneNodeEx,
  SimplygonRepairSettings.SimplygonWeldOnlyBetweenSceneNodesEx,
  SimplygonRepairSettings.SimplygonUseWeldingEx,
  SimplygonRepairSettings.SimplygonProgressivePassesEx,
  SimplygonRepairSettings,
  SimplygonNormalCalculationSettings.SimplygonReplaceNormalsEx,
  SimplygonNormalCalculationSettings.SimplygonReplaceTangentsEx,
  SimplygonNormalCalculationSettings.SimplygonHardEdgeAngleEx,
  SimplygonNormalCalculationSettings.SimplygonRepairInvalidNormalsEx,
  SimplygonNormalCalculationSettings.SimplygonReorthogonalizeTangentSpaceEx,
  SimplygonNormalCalculationSettings.SimplygonScaleByAreaEx,
  SimplygonNormalCalculationSettings.SimplygonScaleByAngleEx,
  SimplygonNormalCalculationSettings.SimplygonSnapNormalsToFlatSurfacesEx,
  SimplygonNormalCalculationSettings,
  SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInReducerEx,
  SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInTexcoordGeneratorEx,
  SimplygonVisibilitySettings.SimplygonVisibilityWeightsPowerEx,
  SimplygonVisibilitySettings.SimplygonCullOccludedGeometryEx,
  SimplygonVisibilitySettings.SimplygonForceVisibilityCalculationEx,
  SimplygonVisibilitySettings.SimplygonUseBackfaceCullingEx,
  SimplygonVisibilitySettings.SimplygonCameraSelectionSetNameEx,
  SimplygonVisibilitySettings.SimplygonOccluderSelectionSetNameEx,
  SimplygonVisibilitySettings.SimplygonFillNonVisibleAreaThresholdEx,
  SimplygonVisibilitySettings.SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx,
  SimplygonVisibilitySettings.SimplygonConservativeModeEx,
  SimplygonVisibilitySettings.SimplygonComputeVisibilityModeEx,
  SimplygonVisibilitySettings,
  SimplygonBoneSettings.SimplygonUseBoneReducerEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEnabledEx,
  SimplygonBoneSettings.SimplygonRemoveUnusedBonesEx,
  SimplygonBoneSettings.SimplygonLimitBonesPerVertexEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEnabledEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEnabledEx,
  SimplygonBoneSettings.SimplygonMaxBonePerVertexEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEnabledEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetStopConditionEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEx,
  SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEx,
  SimplygonBoneSettings.SimplygonLockBoneSelectionSetNameEx,
  SimplygonBoneSettings.SimplygonRemoveBoneSelectionSetNameEx,
  SimplygonBoneSettings,
  SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInReducerEx,
  SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInTexcoordGeneratorEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorNameEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorLevelEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorComponentEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorMultiplierEx,
  SimplygonVertexWeightSettings.SimplygonWeightsFromColorModeEx,
  SimplygonVertexWeightSettings,
  SimplygonPipelineSettings.SimplygonTextureOutputPathEx,
  SimplygonPipelineSettings.SimplygonSimplygonBatchPathEx,
  SimplygonPipelineSettings.SimplygonOutputMaterialNameEx,
  SimplygonPipelineSettings.SimplygonOutputUniqueMaterialNamesEx,
  SimplygonPipelineSettings.SimplygonEmbedReferencesEx,
  SimplygonPipelineSettings.SimplygonIntermediateStepEx,
  SimplygonPipelineSettings.SimplygonCascadedRunModeEx,
  SimplygonPipelineSettings,
  SimplygonMappingImageInputMaterialSettings.SimplygonMaterialMappingEx,
  SimplygonMappingImageInputMaterialSettings,
  SimplygonMappingImageOutputMaterialSettings.SimplygonTextureWidthEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonTextureHeightEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonMultisamplingLevelEx,
  SimplygonMappingImageOutputMaterialSettings.SimplygonGutterSpaceEx,
  SimplygonMappingImageOutputMaterialSettings,
  SimplygonChartAggregatorSettings.SimplygonChartAggregatorModeEx,
  SimplygonChartAggregatorSettings.SimplygonSurfaceAreaScaleEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordLevelEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordNameEx,
  SimplygonChartAggregatorSettings.SimplygonSeparateOverlappingChartsEx,
  SimplygonChartAggregatorSettings.SimplygonOriginalChartProportionsChannelEx,
  SimplygonChartAggregatorSettings.SimplygonLockUVRotationEx,
  SimplygonChartAggregatorSettings,
  SimplygonParameterizerSettings.SimplygonMaxStretchEx,
  SimplygonParameterizerSettings.SimplygonLargeChartsImportanceEx,
  SimplygonParameterizerSettings,
  SimplygonMappingImageSettings.SimplygonGenerateMappingImageEx,
  SimplygonMappingImageSettings.SimplygonGenerateTexCoordsEx,
  SimplygonMappingImageSettings.SimplygonGenerateTangentsEx,
  SimplygonMappingImageSettings.SimplygonMaximumLayersEx,
  SimplygonMappingImageSettings.SimplygonUseFullRetexturingEx,
  SimplygonMappingImageSettings.SimplygonApplyNewMaterialIdsEx,
  SimplygonMappingImageSettings.SimplygonAllowTransparencyMappingEx,
  SimplygonMappingImageSettings.SimplygonTexCoordLevelEx,
  SimplygonMappingImageSettings.SimplygonTexCoordNameEx,
  SimplygonMappingImageSettings.SimplygonUseAutomaticTextureSizeEx,
  SimplygonMappingImageSettings.SimplygonAutomaticTextureSizeMultiplierEx,
  SimplygonMappingImageSettings.SimplygonForcePower2TextureEx,
  SimplygonMappingImageSettings.SimplygonTexCoordGeneratorTypeEx,
  SimplygonMappingImageSettings.SimplygonOnlyParameterizeInvalidUVsEx,
  SimplygonMappingImageSettings,
  SimplygonGlobalSettings.SimplygonDefaultTangentCalculatorTypeEx,
  SimplygonGlobalSettings,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionZEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionYEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionXEx,
  SimplygonRemeshingSettings.SimplygonOnScreenSizeEx,
  SimplygonRemeshingSettings.SimplygonHoleFillingEx,
  SimplygonRemeshingSettings.SimplygonRemeshingModeEx,
  SimplygonRemeshingSettings.SimplygonSurfaceTransferModeEx,
  SimplygonRemeshingSettings.SimplygonHardEdgeAngleEx,
  SimplygonRemeshingSettings.SimplygonForceSoftEdgesWithinTextureChartsEx,
  SimplygonRemeshingSettings.SimplygonTransferNormalsEx,
  SimplygonRemeshingSettings.SimplygonTransferColorsEx,
  SimplygonRemeshingSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonRemeshingSettings,
  SimplygonGeometryCullingSettings.SimplygonUseClippingGeometryEx,
  SimplygonGeometryCullingSettings.SimplygonClippingGeometrySelectionSetNameEx,
  SimplygonGeometryCullingSettings,
  SimplygonAggregationSettings.SimplygonMergeGeometriesEx,
  SimplygonAggregationSettings.SimplygonKeepUnprocessedSceneMeshesEx,
  SimplygonAggregationSettings.SimplygonEnableGeometryCullingEx,
  SimplygonAggregationSettings.SimplygonGeometryCullingPrecisionEx,
  SimplygonAggregationSettings.SimplygonSubdivideGeometryBasedOnUVTilesEx,
  SimplygonAggregationSettings.SimplygonSubdivisionTileSizeEx,
  SimplygonAggregationSettings,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonGenerateLightmapTexCoordEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordLevelEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordNameEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonChartAggregatorModeEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureWidthEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureHeightEx,
  SimplygonGenerateLightmapTexCoordSettings.SimplygonGutterSpaceEx,
  SimplygonGenerateLightmapTexCoordSettings,
  SimplygonFoliageSettings.SimplygonSeparateTrunkAndFoliageEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleRatioEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleThresholdEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageAreaThresholdEx,
  SimplygonFoliageSettings.SimplygonSeparateFoliageSizeThresholdEx,
  SimplygonFoliageSettings.SimplygonTrunkReductionRatioEx,
  SimplygonFoliageSettings,
  SimplygonBillboardCloudSettings.SimplygonBillboardModeEx,
  SimplygonBillboardCloudSettings.SimplygonFavorVerticalPlanesEx,
  SimplygonBillboardCloudSettings.SimplygonTwoSidedEx,
  SimplygonBillboardCloudSettings.SimplygonUseVisibilityWeightsEx,
  SimplygonBillboardCloudSettings.SimplygonBillboardDensityEx,
  SimplygonBillboardCloudSettings.SimplygonMaxPlaneCountEx,
  SimplygonBillboardCloudSettings.SimplygonGeometricComplexityEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorXEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorYEx,
  SimplygonBillboardCloudSettings.SimplygonUpVectorZEx,
  SimplygonBillboardCloudSettings,
  SimplygonFlipbookSettings.SimplygonNumberOfViewsEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionXEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionYEx,
  SimplygonFlipbookSettings.SimplygonViewDirectionZEx,
  SimplygonFlipbookSettings.SimplygonUpVectorXEx,
  SimplygonFlipbookSettings.SimplygonUpVectorYEx,
  SimplygonFlipbookSettings.SimplygonUpVectorZEx,
  SimplygonFlipbookSettings,
  SimplygonImpostorFromSingleViewSettings.SimplygonUseTightFittingEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTightFittingDepthOffsetEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTwoSidedEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionXEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionYEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionZEx,
  SimplygonImpostorFromSingleViewSettings.SimplygonTexCoordPaddingEx,
  SimplygonImpostorFromSingleViewSettings,
  SimplygonOcclusionMeshSettings.SimplygonOnScreenSizeEx,
  SimplygonOcclusionMeshSettings.SimplygonOnScreenErrorToleranceEx,
  SimplygonOcclusionMeshSettings.SimplygonInvertOutputMeshEx,
  SimplygonOcclusionMeshSettings.SimplygonTransferSkinningEx,
  SimplygonOcclusionMeshSettings.SimplygonUseCamerasEx,
  SimplygonOcclusionMeshSettings.SimplygonCameraSelectionSetNameEx,
  SimplygonOcclusionMeshSettings.SimplygonOcclusionModeEx,
  SimplygonOcclusionMeshSettings,
  SimplygonColorCasterSettings.SimplygonMaterialChannelEx,
  SimplygonColorCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonColorCasterSettings.SimplygonDitherTypeEx,
  SimplygonColorCasterSettings.SimplygonFillModeEx,
  SimplygonColorCasterSettings.SimplygonOpacityChannelEx,
  SimplygonColorCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonColorCasterSettings.SimplygonBakeOpacityInAlphaEx,
  SimplygonColorCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonColorCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonColorCasterSettings.SimplygonDilationEx,
  SimplygonColorCasterSettings.SimplygonOutputOpacityTypeEx,
  SimplygonColorCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonColorCasterSettings.SimplygonSkipCastingIfNoInputChannelEx,
  SimplygonColorCasterSettings.SimplygonOutputSRGBEx,
  SimplygonColorCasterSettings,
  SimplygonOpacityCasterSettings.SimplygonMaterialChannelEx,
  SimplygonOpacityCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonOpacityCasterSettings.SimplygonDitherTypeEx,
  SimplygonOpacityCasterSettings.SimplygonFillModeEx,
  SimplygonOpacityCasterSettings.SimplygonOpacityChannelEx,
  SimplygonOpacityCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonOpacityCasterSettings.SimplygonOutputSRGBEx,
  SimplygonOpacityCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonOpacityCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonOpacityCasterSettings.SimplygonDilationEx,
  SimplygonOpacityCasterSettings.SimplygonOutputOpacityTypeEx,
  SimplygonOpacityCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonOpacityCasterSettings,
  SimplygonNormalCasterSettings.SimplygonMaterialChannelEx,
  SimplygonNormalCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonNormalCasterSettings.SimplygonDitherTypeEx,
  SimplygonNormalCasterSettings.SimplygonFillModeEx,
  SimplygonNormalCasterSettings.SimplygonOpacityChannelEx,
  SimplygonNormalCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonNormalCasterSettings.SimplygonFlipBackfacingNormalsEx,
  SimplygonNormalCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonNormalCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonNormalCasterSettings.SimplygonDilationEx,
  SimplygonNormalCasterSettings.SimplygonGenerateTangentSpaceNormalsEx,
  SimplygonNormalCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonNormalCasterSettings.SimplygonFlipGreenEx,
  SimplygonNormalCasterSettings.SimplygonCalculateBitangentPerFragmentEx,
  SimplygonNormalCasterSettings.SimplygonNormalizeInterpolatedTangentSpaceEx,
  SimplygonNormalCasterSettings,
  SimplygonDisplacementCasterSettings.SimplygonMaterialChannelEx,
  SimplygonDisplacementCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonDisplacementCasterSettings.SimplygonDitherTypeEx,
  SimplygonDisplacementCasterSettings.SimplygonFillModeEx,
  SimplygonDisplacementCasterSettings.SimplygonOpacityChannelEx,
  SimplygonDisplacementCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonDisplacementCasterSettings.SimplygonDistanceScalingEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonDisplacementCasterSettings.SimplygonDilationEx,
  SimplygonDisplacementCasterSettings.SimplygonGenerateScalarDisplacementEx,
  SimplygonDisplacementCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonDisplacementCasterSettings.SimplygonGenerateTangentSpaceDisplacementEx,
  SimplygonDisplacementCasterSettings.SimplygonNormalMapTexCoordLevelEx,
  SimplygonDisplacementCasterSettings,
  SimplygonAmbientOcclusionCasterSettings.SimplygonMaterialChannelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonDitherTypeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonFillModeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonRaysPerPixelEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonDilationEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionFalloffEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionMultiplierEx,
  SimplygonAmbientOcclusionCasterSettings.SimplygonUseSimpleOcclusionModeEx,
  SimplygonAmbientOcclusionCasterSettings,
  SimplygonGeometryDataCasterSettings.SimplygonMaterialChannelEx,
  SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonGeometryDataCasterSettings.SimplygonDitherTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonFillModeEx,
  SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelEx,
  SimplygonGeometryDataCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonGeometryDataCasterSettings.SimplygonDilationEx,
  SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldIndexEx,
  SimplygonGeometryDataCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingLayerIndexEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfREx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupREx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfGEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupGEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfBEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupBEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingInfAEx,
  SimplygonGeometryDataCasterSettings.SimplygonMappingSupAEx,
  SimplygonGeometryDataCasterSettings,
  SimplygonVertexColorCasterSettings.SimplygonMaterialChannelEx,
  SimplygonVertexColorCasterSettings.SimplygonOpacityChannelComponentEx,
  SimplygonVertexColorCasterSettings.SimplygonDitherTypeEx,
  SimplygonVertexColorCasterSettings.SimplygonFillModeEx,
  SimplygonVertexColorCasterSettings.SimplygonOpacityChannelEx,
  SimplygonVertexColorCasterSettings.SimplygonUseMultisamplingEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputColorLevelEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputImageFileFormatEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputDDSCompressionTypeEx,
  SimplygonVertexColorCasterSettings.SimplygonDilationEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputColorNameEx,
  SimplygonVertexColorCasterSettings.SimplygonOutputPixelFormatEx,
  SimplygonVertexColorCasterSettings.SimplygonColorSpaceEdgeThresholdEx,
  SimplygonVertexColorCasterSettings,
  SimplygonMaterialCaster,
  SimplygonPipeline

)

def register():
  for cls in classes:
    bpy.utils.register_class(cls)


  bpy.types.Scene.Simplygon_Process_Progress = bpy.props.IntProperty(min=-1,max=100,soft_min=-1,soft_max=100)
  bpy.types.Scene.Simplygon_Current_PipelineId = bpy.props.StringProperty()
  bpy.types.Scene.Simplygon_PipelineIds = bpy.props.StringProperty()
  bpy.types.Scene.Simplygon_Pipelines = bpy.props.CollectionProperty(type = SimplygonPipeline)
  bpy.types.Scene.Simplygon_MaterialCasters = bpy.props.CollectionProperty(type = SimplygonMaterialCaster)
  bpy.types.Scene.Simplygon_a6005dada0834aa88611f4701efa22cf_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings)
  bpy.types.Scene.Simplygon_894bbf9757d44ed88212e463d96d7ed6_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEnabledEx)
  bpy.types.Scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleRatioEx)
  bpy.types.Scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEnabledEx)
  bpy.types.Scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetTriangleCountEx)
  bpy.types.Scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_c477490697ec43e4afb62c8f70348192_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_e5d8537181344693a30163fbd55961cf_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonReductionHeuristicsEx)
  bpy.types.Scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGeometryImportanceEx)
  bpy.types.Scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMaterialImportanceEx)
  bpy.types.Scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonTextureImportanceEx)
  bpy.types.Scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonShadingImportanceEx)
  bpy.types.Scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonGroupImportanceEx)
  bpy.types.Scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonVertexColorImportanceEx)
  bpy.types.Scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonEdgeSetImportanceEx)
  bpy.types.Scene.Simplygon_c9c85cd57278415eb384454377299e70_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSkinningImportanceEx)
  bpy.types.Scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCurvatureImportanceEx)
  bpy.types.Scene.Simplygon_9310989163b54b5992f5c44ae211c740_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonCreateGeomorphGeometryEx)
  bpy.types.Scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonAllowDegenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepSymmetryEx)
  bpy.types.Scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseAutomaticSymmetryDetectionEx)
  bpy.types.Scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseSymmetryQuadRetriangulatorEx)
  bpy.types.Scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryAxisEx)
  bpy.types.Scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryOffsetEx)
  bpy.types.Scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonSymmetryDetectionToleranceEx)
  bpy.types.Scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonDataCreationPreferencesEx)
  bpy.types.Scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonOutwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonInwardMoveMultiplierEx)
  bpy.types.Scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonUseHighQualityNormalCalculationEx)
  bpy.types.Scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List = bpy.props.CollectionProperty(type = SimplygonReductionSettings.SimplygonLockGeometricBorderEx)
  bpy.types.Scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings)
  bpy.types.Scene.Simplygon_ce31fc405d934b038cdeca2682f7e21d_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseTJunctionRemoverEx)
  bpy.types.Scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonTJuncDistEx)
  bpy.types.Scene.Simplygon_e80268ef29334712833e486d58a14d11_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldDistEx)
  bpy.types.Scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBorderVerticesEx)
  bpy.types.Scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinMaterialEx)
  bpy.types.Scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyWithinSceneNodeEx)
  bpy.types.Scene.Simplygon_4ba25994d640457497818ecdb7584982_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonWeldOnlyBetweenSceneNodesEx)
  bpy.types.Scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonUseWeldingEx)
  bpy.types.Scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_List = bpy.props.CollectionProperty(type = SimplygonRepairSettings.SimplygonProgressivePassesEx)
  bpy.types.Scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings)
  bpy.types.Scene.Simplygon_12e292b056d14243a72ee283546890a9_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceNormalsEx)
  bpy.types.Scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReplaceTangentsEx)
  bpy.types.Scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonRepairInvalidNormalsEx)
  bpy.types.Scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonReorthogonalizeTangentSpaceEx)
  bpy.types.Scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAreaEx)
  bpy.types.Scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonScaleByAngleEx)
  bpy.types.Scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_List = bpy.props.CollectionProperty(type = SimplygonNormalCalculationSettings.SimplygonSnapNormalsToFlatSurfacesEx)
  bpy.types.Scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings)
  bpy.types.Scene.Simplygon_c2d65b4bd72e4e4aa21f683ccefd52dc_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInReducerEx)
  bpy.types.Scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseVisibilityWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonVisibilityWeightsPowerEx)
  bpy.types.Scene.Simplygon_d099f5f18c02460496b68d892a0392af_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCullOccludedGeometryEx)
  bpy.types.Scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonForceVisibilityCalculationEx)
  bpy.types.Scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonUseBackfaceCullingEx)
  bpy.types.Scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonOccluderSelectionSetNameEx)
  bpy.types.Scene.Simplygon_c78af5118aa241cb8227993f861c0091_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonFillNonVisibleAreaThresholdEx)
  bpy.types.Scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonRemoveTrianglesNotOccludingOtherTrianglesEx)
  bpy.types.Scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonConservativeModeEx)
  bpy.types.Scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_List = bpy.props.CollectionProperty(type = SimplygonVisibilitySettings.SimplygonComputeVisibilityModeEx)
  bpy.types.Scene.Simplygon_01a906caea954ec39635af1918fd3162_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings)
  bpy.types.Scene.Simplygon_fddf00e9bf104521ab1187fc1aadc5bf_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonUseBoneReducerEx)
  bpy.types.Scene.Simplygon_788cee6116744dbf9a78382013b091a9_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEnabledEx)
  bpy.types.Scene.Simplygon_402188f3d4c249228054160c84916976_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveUnusedBonesEx)
  bpy.types.Scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLimitBonesPerVertexEx)
  bpy.types.Scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEnabledEx)
  bpy.types.Scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEnabledEx)
  bpy.types.Scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonMaxBonePerVertexEx)
  bpy.types.Scene.Simplygon_914a968868994f21ae18988aa7c0c546_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEnabledEx)
  bpy.types.Scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetStopConditionEx)
  bpy.types.Scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneRatioEx)
  bpy.types.Scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetBoneCountEx)
  bpy.types.Scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetMaxDeviationEx)
  bpy.types.Scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonBoneReductionTargetOnScreenSizeEx)
  bpy.types.Scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonLockBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_List = bpy.props.CollectionProperty(type = SimplygonBoneSettings.SimplygonRemoveBoneSelectionSetNameEx)
  bpy.types.Scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings)
  bpy.types.Scene.Simplygon_00829a412db14649835f5aa01b650044_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInReducerEx)
  bpy.types.Scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonUseVertexWeightsInTexcoordGeneratorEx)
  bpy.types.Scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorNameEx)
  bpy.types.Scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorLevelEx)
  bpy.types.Scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorComponentEx)
  bpy.types.Scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorMultiplierEx)
  bpy.types.Scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_List = bpy.props.CollectionProperty(type = SimplygonVertexWeightSettings.SimplygonWeightsFromColorModeEx)
  bpy.types.Scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings)
  bpy.types.Scene.Simplygon_00b50e162c124b27892a0291c2282aeb_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonTextureOutputPathEx)
  bpy.types.Scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonSimplygonBatchPathEx)
  bpy.types.Scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputMaterialNameEx)
  bpy.types.Scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonOutputUniqueMaterialNamesEx)
  bpy.types.Scene.Simplygon_e318db1fb0fb409383531c21bf736362_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonEmbedReferencesEx)
  bpy.types.Scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonIntermediateStepEx)
  bpy.types.Scene.Simplygon_facb0623db79421083de08e5270d2c5d_List = bpy.props.CollectionProperty(type = SimplygonPipelineSettings.SimplygonCascadedRunModeEx)
  bpy.types.Scene.Simplygon_65a27c54b60b4941b91868635144e22a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings)
  bpy.types.Scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageInputMaterialSettings.SimplygonMaterialMappingEx)
  bpy.types.Scene.Simplygon_a38087b22f284ef8a89445b13059dafd_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings)
  bpy.types.Scene.Simplygon_445935aaf24e4683adb03078a8187332_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_eeeac7eac46048a39537a79629794d37_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonMultisamplingLevelEx)
  bpy.types.Scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_List = bpy.props.CollectionProperty(type = SimplygonMappingImageOutputMaterialSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings)
  bpy.types.Scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_71de27302f264195a7776186f75b846e_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSurfaceAreaScaleEx)
  bpy.types.Scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordLevelEx)
  bpy.types.Scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalTexCoordNameEx)
  bpy.types.Scene.Simplygon_7c4289f4724d4b188a592fde27661666_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonSeparateOverlappingChartsEx)
  bpy.types.Scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonOriginalChartProportionsChannelEx)
  bpy.types.Scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_List = bpy.props.CollectionProperty(type = SimplygonChartAggregatorSettings.SimplygonLockUVRotationEx)
  bpy.types.Scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings)
  bpy.types.Scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonMaxStretchEx)
  bpy.types.Scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_List = bpy.props.CollectionProperty(type = SimplygonParameterizerSettings.SimplygonLargeChartsImportanceEx)
  bpy.types.Scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings)
  bpy.types.Scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateMappingImageEx)
  bpy.types.Scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTexCoordsEx)
  bpy.types.Scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonGenerateTangentsEx)
  bpy.types.Scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonMaximumLayersEx)
  bpy.types.Scene.Simplygon_8730f59be323411fa2185895a2460276_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseFullRetexturingEx)
  bpy.types.Scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonApplyNewMaterialIdsEx)
  bpy.types.Scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAllowTransparencyMappingEx)
  bpy.types.Scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordLevelEx)
  bpy.types.Scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordNameEx)
  bpy.types.Scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonUseAutomaticTextureSizeEx)
  bpy.types.Scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonAutomaticTextureSizeMultiplierEx)
  bpy.types.Scene.Simplygon_b35fbac341354b448deab2e5840244f4_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonForcePower2TextureEx)
  bpy.types.Scene.Simplygon_366cd451dae64011b60d01322235f79e_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonTexCoordGeneratorTypeEx)
  bpy.types.Scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List = bpy.props.CollectionProperty(type = SimplygonMappingImageSettings.SimplygonOnlyParameterizeInvalidUVsEx)
  bpy.types.Scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings)
  bpy.types.Scene.Simplygon_792c5d3c5c70426daff2cb56ed40bdda_List = bpy.props.CollectionProperty(type = SimplygonGlobalSettings.SimplygonDefaultTangentCalculatorTypeEx)
  bpy.types.Scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings)
  bpy.types.Scene.Simplygon_f03bd4d1bfca4fdcaa3324c72407b8cf_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionZEx)
  bpy.types.Scene.Simplygon_cd202a180457487ba845f8f34103c399_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionYEx)
  bpy.types.Scene.Simplygon_31fff921883149379a7146417cbd6bc3_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeManualPositionXEx)
  bpy.types.Scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_cde3901891dd4e29a2599a887585e057_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHoleFillingEx)
  bpy.types.Scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonRemeshingModeEx)
  bpy.types.Scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonSurfaceTransferModeEx)
  bpy.types.Scene.Simplygon_137258d883a6450cb0e719295a206964_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonHardEdgeAngleEx)
  bpy.types.Scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonForceSoftEdgesWithinTextureChartsEx)
  bpy.types.Scene.Simplygon_61578c033a714d45b50a8299c958af2f_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferNormalsEx)
  bpy.types.Scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonTransferColorsEx)
  bpy.types.Scene.Simplygon_7e566bf1698b484cb76a21f05773871c_List = bpy.props.CollectionProperty(type = SimplygonRemeshingSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings)
  bpy.types.Scene.Simplygon_db7addf4c9674a5f82838c4274cb59e6_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonUseClippingGeometryEx)
  bpy.types.Scene.Simplygon_02692e13ae874a1fb0c359759928a306_List = bpy.props.CollectionProperty(type = SimplygonGeometryCullingSettings.SimplygonClippingGeometrySelectionSetNameEx)
  bpy.types.Scene.Simplygon_da272c1503024c6da2115cb330932104_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings)
  bpy.types.Scene.Simplygon_4d57b61c7c3a453a853df54f5c7a1b0b_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonMergeGeometriesEx)
  bpy.types.Scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonKeepUnprocessedSceneMeshesEx)
  bpy.types.Scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonEnableGeometryCullingEx)
  bpy.types.Scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonGeometryCullingPrecisionEx)
  bpy.types.Scene.Simplygon_67836407f62b47be96c65715e5c9c805_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivideGeometryBasedOnUVTilesEx)
  bpy.types.Scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List = bpy.props.CollectionProperty(type = SimplygonAggregationSettings.SimplygonSubdivisionTileSizeEx)
  bpy.types.Scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings)
  bpy.types.Scene.Simplygon_346c4f85429d48118de1da0d92cdad81_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGenerateLightmapTexCoordEx)
  bpy.types.Scene.Simplygon_0c86d08966e6483a958916ac2b851877_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonLightmapTexCoordNameEx)
  bpy.types.Scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonChartAggregatorModeEx)
  bpy.types.Scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureWidthEx)
  bpy.types.Scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonTextureHeightEx)
  bpy.types.Scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_List = bpy.props.CollectionProperty(type = SimplygonGenerateLightmapTexCoordSettings.SimplygonGutterSpaceEx)
  bpy.types.Scene.Simplygon_9bee93678363425ca050f9cafd2d8515_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings)
  bpy.types.Scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateTrunkAndFoliageEx)
  bpy.types.Scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleRatioEx)
  bpy.types.Scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageTriangleThresholdEx)
  bpy.types.Scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageAreaThresholdEx)
  bpy.types.Scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonSeparateFoliageSizeThresholdEx)
  bpy.types.Scene.Simplygon_6b19c174a26d47289263b742eaeef24a_List = bpy.props.CollectionProperty(type = SimplygonFoliageSettings.SimplygonTrunkReductionRatioEx)
  bpy.types.Scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings)
  bpy.types.Scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardModeEx)
  bpy.types.Scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonFavorVerticalPlanesEx)
  bpy.types.Scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUseVisibilityWeightsEx)
  bpy.types.Scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonBillboardDensityEx)
  bpy.types.Scene.Simplygon_14a376a65081487aaf0959a995734fef_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonMaxPlaneCountEx)
  bpy.types.Scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonGeometricComplexityEx)
  bpy.types.Scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List = bpy.props.CollectionProperty(type = SimplygonBillboardCloudSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings)
  bpy.types.Scene.Simplygon_cda4cae79f5444c29525c66e2c014276_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonNumberOfViewsEx)
  bpy.types.Scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorXEx)
  bpy.types.Scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorYEx)
  bpy.types.Scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_List = bpy.props.CollectionProperty(type = SimplygonFlipbookSettings.SimplygonUpVectorZEx)
  bpy.types.Scene.Simplygon_c152e178c003473b92a471317fa2ab60_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings)
  bpy.types.Scene.Simplygon_961ca13bbcd2491784441c22d782f571_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonUseTightFittingEx)
  bpy.types.Scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTightFittingDepthOffsetEx)
  bpy.types.Scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTwoSidedEx)
  bpy.types.Scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionXEx)
  bpy.types.Scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionYEx)
  bpy.types.Scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonViewDirectionZEx)
  bpy.types.Scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_List = bpy.props.CollectionProperty(type = SimplygonImpostorFromSingleViewSettings.SimplygonTexCoordPaddingEx)
  bpy.types.Scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings)
  bpy.types.Scene.Simplygon_64815387f4464c35adf889635e8a5b1c_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenSizeEx)
  bpy.types.Scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOnScreenErrorToleranceEx)
  bpy.types.Scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonInvertOutputMeshEx)
  bpy.types.Scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonTransferSkinningEx)
  bpy.types.Scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonUseCamerasEx)
  bpy.types.Scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonCameraSelectionSetNameEx)
  bpy.types.Scene.Simplygon_96124c81fa5143698501556bee0e2857_List = bpy.props.CollectionProperty(type = SimplygonOcclusionMeshSettings.SimplygonOcclusionModeEx)
  bpy.types.Scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings)
  bpy.types.Scene.Simplygon_576ba6cb0f264c5c862f7347ee5a9b3f_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_443f64db019a470a840ab78a090ac28d_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonBakeOpacityInAlphaEx)
  bpy.types.Scene.Simplygon_bef007822fd943759e6262a7579054f6_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_820a145ead9d43299a00e4a17d643069_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonSkipCastingIfNoInputChannelEx)
  bpy.types.Scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List = bpy.props.CollectionProperty(type = SimplygonColorCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings)
  bpy.types.Scene.Simplygon_b26e9a02b2c249cfba81e072acb175ba_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_860763afed7546208847945790bb6cbf_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_220863737f854c81b410e6e5746f3296_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputSRGBEx)
  bpy.types.Scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_449b9bf740804d1f88b82f9322587404_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputOpacityTypeEx)
  bpy.types.Scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List = bpy.props.CollectionProperty(type = SimplygonOpacityCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings)
  bpy.types.Scene.Simplygon_b661ac80510842b68dcad6fe287ed3ae_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_20332a716b3040e4af2095c3d0462908_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipBackfacingNormalsEx)
  bpy.types.Scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonGenerateTangentSpaceNormalsEx)
  bpy.types.Scene.Simplygon_88c996112bb24640b997199e2eb088b2_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonFlipGreenEx)
  bpy.types.Scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonCalculateBitangentPerFragmentEx)
  bpy.types.Scene.Simplygon_8623b5e294de4b949caca7cafc96f333_List = bpy.props.CollectionProperty(type = SimplygonNormalCasterSettings.SimplygonNormalizeInterpolatedTangentSpaceEx)
  bpy.types.Scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings)
  bpy.types.Scene.Simplygon_e26167bb2b14409c8c3de75147f66bcb_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_482023697a8d42eab36ac9824aca7470_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDistanceScalingEx)
  bpy.types.Scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateScalarDisplacementEx)
  bpy.types.Scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonGenerateTangentSpaceDisplacementEx)
  bpy.types.Scene.Simplygon_cdb57aba384747a588c159e5752253ef_List = bpy.props.CollectionProperty(type = SimplygonDisplacementCasterSettings.SimplygonNormalMapTexCoordLevelEx)
  bpy.types.Scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings)
  bpy.types.Scene.Simplygon_5d17fe16881f472d865976248f423933_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_2638751937a0404092475ce5f0259e67_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonRaysPerPixelEx)
  bpy.types.Scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionFalloffEx)
  bpy.types.Scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonOcclusionMultiplierEx)
  bpy.types.Scene.Simplygon_c7a48592fc974e13a028487f29c7a005_List = bpy.props.CollectionProperty(type = SimplygonAmbientOcclusionCasterSettings.SimplygonUseSimpleOcclusionModeEx)
  bpy.types.Scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings)
  bpy.types.Scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldTypeEx)
  bpy.types.Scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_6940108d126549f4afffae73b7a884a9_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonGeometryDataFieldIndexEx)
  bpy.types.Scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingLayerIndexEx)
  bpy.types.Scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfREx)
  bpy.types.Scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupREx)
  bpy.types.Scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfGEx)
  bpy.types.Scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupGEx)
  bpy.types.Scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfBEx)
  bpy.types.Scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupBEx)
  bpy.types.Scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingInfAEx)
  bpy.types.Scene.Simplygon_4264ea56820d471eabe73182529a1913_List = bpy.props.CollectionProperty(type = SimplygonGeometryDataCasterSettings.SimplygonMappingSupAEx)
  bpy.types.Scene.Simplygon_37d24cbb376549c79bca260710893911_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings)
  bpy.types.Scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonMaterialChannelEx)
  bpy.types.Scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelComponentEx)
  bpy.types.Scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDitherTypeEx)
  bpy.types.Scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonFillModeEx)
  bpy.types.Scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOpacityChannelEx)
  bpy.types.Scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonUseMultisamplingEx)
  bpy.types.Scene.Simplygon_04dbe73c498441bbb260d34182e45234_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorLevelEx)
  bpy.types.Scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputImageFileFormatEx)
  bpy.types.Scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputDDSCompressionTypeEx)
  bpy.types.Scene.Simplygon_0d18919df0864cf786c40b37622be996_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonDilationEx)
  bpy.types.Scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputColorNameEx)
  bpy.types.Scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List = bpy.props.CollectionProperty(type = SimplygonVertexColorCasterSettings.SimplygonOutputPixelFormatEx)
  bpy.types.Scene.Simplygon_684d438875a944e28cb225107200fc4f_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_a6005dada0834aa88611f4701efa22cf_List.clear()
  del bpy.types.Scene.Simplygon_a6005dada0834aa88611f4701efa22cf_List
  bpy.context.scene.Simplygon_894bbf9757d44ed88212e463d96d7ed6_List.clear()
  del bpy.types.Scene.Simplygon_894bbf9757d44ed88212e463d96d7ed6_List
  bpy.context.scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List.clear()
  del bpy.types.Scene.Simplygon_5ac119edc2bc406fa6d79f529aed9e38_List
  bpy.context.scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List.clear()
  del bpy.types.Scene.Simplygon_271e90d2209f451ba9a0038ce0a07f9d_List
  bpy.context.scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List.clear()
  del bpy.types.Scene.Simplygon_5662c6e3e1cf422987829a2f42b5fb83_List
  bpy.context.scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List.clear()
  del bpy.types.Scene.Simplygon_f206c265e9c44926977d24e4e906d55c_List
  bpy.context.scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List.clear()
  del bpy.types.Scene.Simplygon_1a882d0584fc4cd3b0bfd4add0e114a8_List
  bpy.context.scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List.clear()
  del bpy.types.Scene.Simplygon_9ebcd2c6bdaa44fe87164aa9df686026_List
  bpy.context.scene.Simplygon_c477490697ec43e4afb62c8f70348192_List.clear()
  del bpy.types.Scene.Simplygon_c477490697ec43e4afb62c8f70348192_List
  bpy.context.scene.Simplygon_e5d8537181344693a30163fbd55961cf_List.clear()
  del bpy.types.Scene.Simplygon_e5d8537181344693a30163fbd55961cf_List
  bpy.context.scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List.clear()
  del bpy.types.Scene.Simplygon_a998a03c232d4e6b97f31a077425f963_List
  bpy.context.scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List.clear()
  del bpy.types.Scene.Simplygon_ac9ce832490b40fbad5e069f519b99dd_List
  bpy.context.scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List.clear()
  del bpy.types.Scene.Simplygon_7dae24d7718b45a9b6885347241f5775_List
  bpy.context.scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List.clear()
  del bpy.types.Scene.Simplygon_00186a86f08d43b29abcf1b9535eef0e_List
  bpy.context.scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List.clear()
  del bpy.types.Scene.Simplygon_946245d79f9042aba2fece382ee7c1d5_List
  bpy.context.scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List.clear()
  del bpy.types.Scene.Simplygon_d63976ecc6944dc2a7235d07b60cb653_List
  bpy.context.scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List.clear()
  del bpy.types.Scene.Simplygon_5c8c981460cc4ebebdc8a20f6fab7bd4_List
  bpy.context.scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List.clear()
  del bpy.types.Scene.Simplygon_c80c9e1a50bb4883aeecb98fe0889710_List
  bpy.context.scene.Simplygon_c9c85cd57278415eb384454377299e70_List.clear()
  del bpy.types.Scene.Simplygon_c9c85cd57278415eb384454377299e70_List
  bpy.context.scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List.clear()
  del bpy.types.Scene.Simplygon_f0e0075ce3604467a0dbb80e62b012fd_List
  bpy.context.scene.Simplygon_9310989163b54b5992f5c44ae211c740_List.clear()
  del bpy.types.Scene.Simplygon_9310989163b54b5992f5c44ae211c740_List
  bpy.context.scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List.clear()
  del bpy.types.Scene.Simplygon_6dc90b7f3f054192b0ce53ed73c3c6a6_List
  bpy.context.scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List.clear()
  del bpy.types.Scene.Simplygon_d21ec2b7680440e88ab6e70b755796e0_List
  bpy.context.scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List.clear()
  del bpy.types.Scene.Simplygon_c3d7eade9212427ba77c4b471d85f22a_List
  bpy.context.scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List.clear()
  del bpy.types.Scene.Simplygon_f7736a2c9d9342fc92a7c3c179ff6ee5_List
  bpy.context.scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List.clear()
  del bpy.types.Scene.Simplygon_8a55cbaa6be349129af5d00a4077c21e_List
  bpy.context.scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List.clear()
  del bpy.types.Scene.Simplygon_8d34c158b8294a288fc32efce18eb39a_List
  bpy.context.scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List.clear()
  del bpy.types.Scene.Simplygon_539aaa27fe694c6a8536a688d3e9f748_List
  bpy.context.scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List.clear()
  del bpy.types.Scene.Simplygon_a41b8ddca70944cfa41514922031df7b_List
  bpy.context.scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List.clear()
  del bpy.types.Scene.Simplygon_ed1910c968784ffd9964cea94997f52f_List
  bpy.context.scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List.clear()
  del bpy.types.Scene.Simplygon_54d4f46422de48d7819ef17d558f090f_List
  bpy.context.scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List.clear()
  del bpy.types.Scene.Simplygon_3c46ab010128409a91a444ec6aa6e943_List
  bpy.context.scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List.clear()
  del bpy.types.Scene.Simplygon_7e7fc955fbb64ba7a447c99029d9c1f0_List
  bpy.context.scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_List.clear()
  del bpy.types.Scene.Simplygon_d0688c3dc873441a9cc952918b3ee928_List
  bpy.context.scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List.clear()
  del bpy.types.Scene.Simplygon_07f812c0431c4f3ca94db611ee24bc4b_List
  bpy.context.scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List.clear()
  del bpy.types.Scene.Simplygon_02b30ecae28245dea2083e2a7e9e919b_List
  bpy.context.scene.Simplygon_ce31fc405d934b038cdeca2682f7e21d_List.clear()
  del bpy.types.Scene.Simplygon_ce31fc405d934b038cdeca2682f7e21d_List
  bpy.context.scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List.clear()
  del bpy.types.Scene.Simplygon_6406174b7c3a4d35bf4ba839adecbce0_List
  bpy.context.scene.Simplygon_e80268ef29334712833e486d58a14d11_List.clear()
  del bpy.types.Scene.Simplygon_e80268ef29334712833e486d58a14d11_List
  bpy.context.scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List.clear()
  del bpy.types.Scene.Simplygon_5820d2bdabeb4fb19bf2043fcf51a39f_List
  bpy.context.scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List.clear()
  del bpy.types.Scene.Simplygon_ee1971b9095e41f3b0e4648c50d309e1_List
  bpy.context.scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List.clear()
  del bpy.types.Scene.Simplygon_98125e10fd354a45870ec5e6c3be1756_List
  bpy.context.scene.Simplygon_4ba25994d640457497818ecdb7584982_List.clear()
  del bpy.types.Scene.Simplygon_4ba25994d640457497818ecdb7584982_List
  bpy.context.scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List.clear()
  del bpy.types.Scene.Simplygon_19d1fcf48461416fa48b83e31d90490a_List
  bpy.context.scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_List.clear()
  del bpy.types.Scene.Simplygon_bec47e03b49e4fb4b9b186a9f1f01a53_List
  bpy.context.scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List.clear()
  del bpy.types.Scene.Simplygon_af4ba95444d743ce9c67d13ef0420aa7_List
  bpy.context.scene.Simplygon_12e292b056d14243a72ee283546890a9_List.clear()
  del bpy.types.Scene.Simplygon_12e292b056d14243a72ee283546890a9_List
  bpy.context.scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List.clear()
  del bpy.types.Scene.Simplygon_c3846f294d8b47a9bf59aa399a1fb0a0_List
  bpy.context.scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List.clear()
  del bpy.types.Scene.Simplygon_e59bd63e16c34389b495b37ea5f0c7dc_List
  bpy.context.scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List.clear()
  del bpy.types.Scene.Simplygon_49f72ab5b9cf41668595436b2fe15602_List
  bpy.context.scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List.clear()
  del bpy.types.Scene.Simplygon_0e9e2419f89440ccbccbf50864a5ec47_List
  bpy.context.scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List.clear()
  del bpy.types.Scene.Simplygon_4e6847a5e4074b90a89366c53ff001a2_List
  bpy.context.scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List.clear()
  del bpy.types.Scene.Simplygon_57f4add074b54a1b98c6727116e6c851_List
  bpy.context.scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_List.clear()
  del bpy.types.Scene.Simplygon_7174c1b4e3454d82b21eee55be4c6434_List
  bpy.context.scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List.clear()
  del bpy.types.Scene.Simplygon_877dd0090fef4cea86e3a1944253dc29_List
  bpy.context.scene.Simplygon_c2d65b4bd72e4e4aa21f683ccefd52dc_List.clear()
  del bpy.types.Scene.Simplygon_c2d65b4bd72e4e4aa21f683ccefd52dc_List
  bpy.context.scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List.clear()
  del bpy.types.Scene.Simplygon_4a77878fc25c45898e0f413de09fcbce_List
  bpy.context.scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List.clear()
  del bpy.types.Scene.Simplygon_c9f5f61a7c1f483c869c61fd047e56fa_List
  bpy.context.scene.Simplygon_d099f5f18c02460496b68d892a0392af_List.clear()
  del bpy.types.Scene.Simplygon_d099f5f18c02460496b68d892a0392af_List
  bpy.context.scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List.clear()
  del bpy.types.Scene.Simplygon_b91405d297ff477f8c7ffd998326fcb3_List
  bpy.context.scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List.clear()
  del bpy.types.Scene.Simplygon_26c56048fcb2428c88e0a125e2f08d61_List
  bpy.context.scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List.clear()
  del bpy.types.Scene.Simplygon_a0bc97dc07f244139d67c2004da767be_List
  bpy.context.scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List.clear()
  del bpy.types.Scene.Simplygon_88c0e40dcd9d4dd29b063caacf501420_List
  bpy.context.scene.Simplygon_c78af5118aa241cb8227993f861c0091_List.clear()
  del bpy.types.Scene.Simplygon_c78af5118aa241cb8227993f861c0091_List
  bpy.context.scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List.clear()
  del bpy.types.Scene.Simplygon_22cac1d5bf684ab2b87bc9c14f303ad4_List
  bpy.context.scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List.clear()
  del bpy.types.Scene.Simplygon_030ba379ddb045b7990cee5ef56462a9_List
  bpy.context.scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_List.clear()
  del bpy.types.Scene.Simplygon_77c24175ebda4d8e9896ca56a6536fe3_List
  bpy.context.scene.Simplygon_01a906caea954ec39635af1918fd3162_List.clear()
  del bpy.types.Scene.Simplygon_01a906caea954ec39635af1918fd3162_List
  bpy.context.scene.Simplygon_fddf00e9bf104521ab1187fc1aadc5bf_List.clear()
  del bpy.types.Scene.Simplygon_fddf00e9bf104521ab1187fc1aadc5bf_List
  bpy.context.scene.Simplygon_788cee6116744dbf9a78382013b091a9_List.clear()
  del bpy.types.Scene.Simplygon_788cee6116744dbf9a78382013b091a9_List
  bpy.context.scene.Simplygon_402188f3d4c249228054160c84916976_List.clear()
  del bpy.types.Scene.Simplygon_402188f3d4c249228054160c84916976_List
  bpy.context.scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List.clear()
  del bpy.types.Scene.Simplygon_c6cfa9f1e24e45c3a92a189d8737a09b_List
  bpy.context.scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List.clear()
  del bpy.types.Scene.Simplygon_330570d69c4d4d67b7bc72889cd53f3d_List
  bpy.context.scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List.clear()
  del bpy.types.Scene.Simplygon_e8900f0d1af44da5bc7e6fca07e89b92_List
  bpy.context.scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List.clear()
  del bpy.types.Scene.Simplygon_e5bfb692d8b340e39a3d1a2f96050bbb_List
  bpy.context.scene.Simplygon_914a968868994f21ae18988aa7c0c546_List.clear()
  del bpy.types.Scene.Simplygon_914a968868994f21ae18988aa7c0c546_List
  bpy.context.scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List.clear()
  del bpy.types.Scene.Simplygon_ccc02bf07c894bd684389fe926f55d22_List
  bpy.context.scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List.clear()
  del bpy.types.Scene.Simplygon_b2e8602e2ad54c36a45cbaa31a73832e_List
  bpy.context.scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List.clear()
  del bpy.types.Scene.Simplygon_5f0b12865f0d40c693da07921cb5bffa_List
  bpy.context.scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List.clear()
  del bpy.types.Scene.Simplygon_e8db6689e1844e5b9cae58d298fe838f_List
  bpy.context.scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List.clear()
  del bpy.types.Scene.Simplygon_ee2c3b441905423cabb9a6483051482a_List
  bpy.context.scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List.clear()
  del bpy.types.Scene.Simplygon_d177d604f01847af9c3d7419ce03021a_List
  bpy.context.scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_List.clear()
  del bpy.types.Scene.Simplygon_2d3949355a8a42359bb6f9b8bb8871b6_List
  bpy.context.scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List.clear()
  del bpy.types.Scene.Simplygon_a872468fd4cd49ecb101e26daf1bdccd_List
  bpy.context.scene.Simplygon_00829a412db14649835f5aa01b650044_List.clear()
  del bpy.types.Scene.Simplygon_00829a412db14649835f5aa01b650044_List
  bpy.context.scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List.clear()
  del bpy.types.Scene.Simplygon_50684d58a6bc4902b601a285ed2133a0_List
  bpy.context.scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List.clear()
  del bpy.types.Scene.Simplygon_754292c8b38247aaa32c0f26f0ded8f1_List
  bpy.context.scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List.clear()
  del bpy.types.Scene.Simplygon_b4d97992a56d4ee09592145789ec0ac9_List
  bpy.context.scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List.clear()
  del bpy.types.Scene.Simplygon_77d14b7c5d7e4b3cb90a1fd122abb296_List
  bpy.context.scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List.clear()
  del bpy.types.Scene.Simplygon_c6b7dc69d0a146dab0a197dcc68b2a55_List
  bpy.context.scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_List.clear()
  del bpy.types.Scene.Simplygon_013a900fcb1b4c3aa823b08fd6216aaa_List
  bpy.context.scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List.clear()
  del bpy.types.Scene.Simplygon_a8c78a47094a48799ae7e54c080fe661_List
  bpy.context.scene.Simplygon_00b50e162c124b27892a0291c2282aeb_List.clear()
  del bpy.types.Scene.Simplygon_00b50e162c124b27892a0291c2282aeb_List
  bpy.context.scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List.clear()
  del bpy.types.Scene.Simplygon_bf388ad7a1be40779c86df2fe2de3aeb_List
  bpy.context.scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List.clear()
  del bpy.types.Scene.Simplygon_78ef591e0ac748af9ad8c4d97fc1d6df_List
  bpy.context.scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List.clear()
  del bpy.types.Scene.Simplygon_43dfffce3fd940c7af8b411b43b27926_List
  bpy.context.scene.Simplygon_e318db1fb0fb409383531c21bf736362_List.clear()
  del bpy.types.Scene.Simplygon_e318db1fb0fb409383531c21bf736362_List
  bpy.context.scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List.clear()
  del bpy.types.Scene.Simplygon_ba25232f9291454781e8a9088e741dc3_List
  bpy.context.scene.Simplygon_facb0623db79421083de08e5270d2c5d_List.clear()
  del bpy.types.Scene.Simplygon_facb0623db79421083de08e5270d2c5d_List
  bpy.context.scene.Simplygon_65a27c54b60b4941b91868635144e22a_List.clear()
  del bpy.types.Scene.Simplygon_65a27c54b60b4941b91868635144e22a_List
  bpy.context.scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_List.clear()
  del bpy.types.Scene.Simplygon_9eed97ab5ac04811b434275fd2f2336a_List
  bpy.context.scene.Simplygon_a38087b22f284ef8a89445b13059dafd_List.clear()
  del bpy.types.Scene.Simplygon_a38087b22f284ef8a89445b13059dafd_List
  bpy.context.scene.Simplygon_445935aaf24e4683adb03078a8187332_List.clear()
  del bpy.types.Scene.Simplygon_445935aaf24e4683adb03078a8187332_List
  bpy.context.scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List.clear()
  del bpy.types.Scene.Simplygon_eea56bc017d344edac31852fdbe3b23a_List
  bpy.context.scene.Simplygon_eeeac7eac46048a39537a79629794d37_List.clear()
  del bpy.types.Scene.Simplygon_eeeac7eac46048a39537a79629794d37_List
  bpy.context.scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_List.clear()
  del bpy.types.Scene.Simplygon_730ab7dc1294413a9b3d7824c83597aa_List
  bpy.context.scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List.clear()
  del bpy.types.Scene.Simplygon_c9a3599453c14a54a5bbf08b2e5571dc_List
  bpy.context.scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_List.clear()
  del bpy.types.Scene.Simplygon_7c41c749521c4ac0b798bf884dcf93c2_List
  bpy.context.scene.Simplygon_71de27302f264195a7776186f75b846e_List.clear()
  del bpy.types.Scene.Simplygon_71de27302f264195a7776186f75b846e_List
  bpy.context.scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List.clear()
  del bpy.types.Scene.Simplygon_d673cbed45ea43cea71dccef2ce650a0_List
  bpy.context.scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List.clear()
  del bpy.types.Scene.Simplygon_01e160d19ffc45fc8d485c9d90b6ed40_List
  bpy.context.scene.Simplygon_7c4289f4724d4b188a592fde27661666_List.clear()
  del bpy.types.Scene.Simplygon_7c4289f4724d4b188a592fde27661666_List
  bpy.context.scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List.clear()
  del bpy.types.Scene.Simplygon_68ab3d7ec62f44f4bed1fff7614283e6_List
  bpy.context.scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_List.clear()
  del bpy.types.Scene.Simplygon_a784109c676c49f4a06d24cd8ac79a5c_List
  bpy.context.scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List.clear()
  del bpy.types.Scene.Simplygon_265adc076ff54cf98c905f83268b2f6f_List
  bpy.context.scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_List.clear()
  del bpy.types.Scene.Simplygon_0a2bbbf46f304d30992a165c0d05db6d_List
  bpy.context.scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_List.clear()
  del bpy.types.Scene.Simplygon_e1960dd1b97844c7b6f7b6580a4757b2_List
  bpy.context.scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List.clear()
  del bpy.types.Scene.Simplygon_e0c2735a35974dd3aa3daee1f8e60d8d_List
  bpy.context.scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_List.clear()
  del bpy.types.Scene.Simplygon_fc397ebd2f22466a827bb0baaeaf5dbe_List
  bpy.context.scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List.clear()
  del bpy.types.Scene.Simplygon_2b1b0c6704ef41ac804c97613992a0be_List
  bpy.context.scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List.clear()
  del bpy.types.Scene.Simplygon_d3ea5e106dd6421fb54049b6eee20711_List
  bpy.context.scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List.clear()
  del bpy.types.Scene.Simplygon_0eb6e0e1b77d49929ecc6b7b6b9abc80_List
  bpy.context.scene.Simplygon_8730f59be323411fa2185895a2460276_List.clear()
  del bpy.types.Scene.Simplygon_8730f59be323411fa2185895a2460276_List
  bpy.context.scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List.clear()
  del bpy.types.Scene.Simplygon_50d8b40d24a4401ca94fbee9ee4e275e_List
  bpy.context.scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List.clear()
  del bpy.types.Scene.Simplygon_4ad81a28d0204eea883cd392c03d3cc1_List
  bpy.context.scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List.clear()
  del bpy.types.Scene.Simplygon_1da2287c72264cdb8d239d8970d25a38_List
  bpy.context.scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List.clear()
  del bpy.types.Scene.Simplygon_a5dc1ef680394c77befba694b16d8382_List
  bpy.context.scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List.clear()
  del bpy.types.Scene.Simplygon_a750d906c55f410ab7cb0b315afe4b14_List
  bpy.context.scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List.clear()
  del bpy.types.Scene.Simplygon_8f34e2b739714ef5baf76f95c5f2d0e3_List
  bpy.context.scene.Simplygon_b35fbac341354b448deab2e5840244f4_List.clear()
  del bpy.types.Scene.Simplygon_b35fbac341354b448deab2e5840244f4_List
  bpy.context.scene.Simplygon_366cd451dae64011b60d01322235f79e_List.clear()
  del bpy.types.Scene.Simplygon_366cd451dae64011b60d01322235f79e_List
  bpy.context.scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List.clear()
  del bpy.types.Scene.Simplygon_fb6f4994a0534af5a6ea5fb2cbf2f5e6_List
  bpy.context.scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_List.clear()
  del bpy.types.Scene.Simplygon_fdfae22ff4364467a92af8ed83bc7389_List
  bpy.context.scene.Simplygon_792c5d3c5c70426daff2cb56ed40bdda_List.clear()
  del bpy.types.Scene.Simplygon_792c5d3c5c70426daff2cb56ed40bdda_List
  bpy.context.scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List.clear()
  del bpy.types.Scene.Simplygon_c1439674219045dcb26a08a537b9ae20_List
  bpy.context.scene.Simplygon_f03bd4d1bfca4fdcaa3324c72407b8cf_List.clear()
  del bpy.types.Scene.Simplygon_f03bd4d1bfca4fdcaa3324c72407b8cf_List
  bpy.context.scene.Simplygon_cd202a180457487ba845f8f34103c399_List.clear()
  del bpy.types.Scene.Simplygon_cd202a180457487ba845f8f34103c399_List
  bpy.context.scene.Simplygon_31fff921883149379a7146417cbd6bc3_List.clear()
  del bpy.types.Scene.Simplygon_31fff921883149379a7146417cbd6bc3_List
  bpy.context.scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List.clear()
  del bpy.types.Scene.Simplygon_b6dacefd29664359b7e2489c8438ed0a_List
  bpy.context.scene.Simplygon_cde3901891dd4e29a2599a887585e057_List.clear()
  del bpy.types.Scene.Simplygon_cde3901891dd4e29a2599a887585e057_List
  bpy.context.scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List.clear()
  del bpy.types.Scene.Simplygon_fc576d6d6c1449d7ac42d33aa7a823ca_List
  bpy.context.scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List.clear()
  del bpy.types.Scene.Simplygon_a09b88d66ad548adb04baa0d4b615682_List
  bpy.context.scene.Simplygon_137258d883a6450cb0e719295a206964_List.clear()
  del bpy.types.Scene.Simplygon_137258d883a6450cb0e719295a206964_List
  bpy.context.scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List.clear()
  del bpy.types.Scene.Simplygon_8214d2db8e834166aeee297e3c99a52e_List
  bpy.context.scene.Simplygon_61578c033a714d45b50a8299c958af2f_List.clear()
  del bpy.types.Scene.Simplygon_61578c033a714d45b50a8299c958af2f_List
  bpy.context.scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List.clear()
  del bpy.types.Scene.Simplygon_f4ab04cef74e4ee0af287a5e4f9a5299_List
  bpy.context.scene.Simplygon_7e566bf1698b484cb76a21f05773871c_List.clear()
  del bpy.types.Scene.Simplygon_7e566bf1698b484cb76a21f05773871c_List
  bpy.context.scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List.clear()
  del bpy.types.Scene.Simplygon_8b1f8baa45314cb08edd063a29c7b51b_List
  bpy.context.scene.Simplygon_db7addf4c9674a5f82838c4274cb59e6_List.clear()
  del bpy.types.Scene.Simplygon_db7addf4c9674a5f82838c4274cb59e6_List
  bpy.context.scene.Simplygon_02692e13ae874a1fb0c359759928a306_List.clear()
  del bpy.types.Scene.Simplygon_02692e13ae874a1fb0c359759928a306_List
  bpy.context.scene.Simplygon_da272c1503024c6da2115cb330932104_List.clear()
  del bpy.types.Scene.Simplygon_da272c1503024c6da2115cb330932104_List
  bpy.context.scene.Simplygon_4d57b61c7c3a453a853df54f5c7a1b0b_List.clear()
  del bpy.types.Scene.Simplygon_4d57b61c7c3a453a853df54f5c7a1b0b_List
  bpy.context.scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_List.clear()
  del bpy.types.Scene.Simplygon_3115a5b581ff4acb838c08120f1ce81c_List
  bpy.context.scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List.clear()
  del bpy.types.Scene.Simplygon_56ece8b3a9e7468485fc450ac60a3fdf_List
  bpy.context.scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List.clear()
  del bpy.types.Scene.Simplygon_0ff7dddf226243bca69371ba8eae9725_List
  bpy.context.scene.Simplygon_67836407f62b47be96c65715e5c9c805_List.clear()
  del bpy.types.Scene.Simplygon_67836407f62b47be96c65715e5c9c805_List
  bpy.context.scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List.clear()
  del bpy.types.Scene.Simplygon_e3dd7962d33e41859601bfc1b82a9d13_List
  bpy.context.scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_List.clear()
  del bpy.types.Scene.Simplygon_4e7b76c5fbd34bb0aaa0ef41915d0866_List
  bpy.context.scene.Simplygon_346c4f85429d48118de1da0d92cdad81_List.clear()
  del bpy.types.Scene.Simplygon_346c4f85429d48118de1da0d92cdad81_List
  bpy.context.scene.Simplygon_0c86d08966e6483a958916ac2b851877_List.clear()
  del bpy.types.Scene.Simplygon_0c86d08966e6483a958916ac2b851877_List
  bpy.context.scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List.clear()
  del bpy.types.Scene.Simplygon_fa9dc9de4d2a454ba38ea7e55ed612ed_List
  bpy.context.scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List.clear()
  del bpy.types.Scene.Simplygon_ac36fa290b6c43ed8bd119ecd5771119_List
  bpy.context.scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List.clear()
  del bpy.types.Scene.Simplygon_a06c72fe34a749d0b566aad2f367f74e_List
  bpy.context.scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List.clear()
  del bpy.types.Scene.Simplygon_90c88ded4c574b27b447d6dafc52986f_List
  bpy.context.scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_List.clear()
  del bpy.types.Scene.Simplygon_e3ee096267a64149ad5d4ee6b07fec3a_List
  bpy.context.scene.Simplygon_9bee93678363425ca050f9cafd2d8515_List.clear()
  del bpy.types.Scene.Simplygon_9bee93678363425ca050f9cafd2d8515_List
  bpy.context.scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_List.clear()
  del bpy.types.Scene.Simplygon_7b772e790b28490ab3d4502c4d4bf3e1_List
  bpy.context.scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List.clear()
  del bpy.types.Scene.Simplygon_5a443e7c2632462582f1e3ad995fdcd5_List
  bpy.context.scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List.clear()
  del bpy.types.Scene.Simplygon_b9cc4f43d31d42368539aa78ec155165_List
  bpy.context.scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List.clear()
  del bpy.types.Scene.Simplygon_85b9ede119b2418eb69ac838ce9b954f_List
  bpy.context.scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List.clear()
  del bpy.types.Scene.Simplygon_64cda5368b394e60b2ff60f98d7d8150_List
  bpy.context.scene.Simplygon_6b19c174a26d47289263b742eaeef24a_List.clear()
  del bpy.types.Scene.Simplygon_6b19c174a26d47289263b742eaeef24a_List
  bpy.context.scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_List.clear()
  del bpy.types.Scene.Simplygon_6a4f17a6f82d4932a1628674e7e15760_List
  bpy.context.scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_List.clear()
  del bpy.types.Scene.Simplygon_681a02bc9c8f44a9af4d5f14cb48ebb0_List
  bpy.context.scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List.clear()
  del bpy.types.Scene.Simplygon_3b24da6701404ea08a3cc8e520d50336_List
  bpy.context.scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List.clear()
  del bpy.types.Scene.Simplygon_f8403f62ff0b4c118d38549c248907d1_List
  bpy.context.scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List.clear()
  del bpy.types.Scene.Simplygon_5f4fb3f3b33e499eae53f7f582ad5101_List
  bpy.context.scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List.clear()
  del bpy.types.Scene.Simplygon_dfb1e84a11e54fde8c884f6f59812611_List
  bpy.context.scene.Simplygon_14a376a65081487aaf0959a995734fef_List.clear()
  del bpy.types.Scene.Simplygon_14a376a65081487aaf0959a995734fef_List
  bpy.context.scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List.clear()
  del bpy.types.Scene.Simplygon_ecc104cf517b400bbba5945fc0cf956f_List
  bpy.context.scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List.clear()
  del bpy.types.Scene.Simplygon_98b5b87a30b842d0bee4050be3253b68_List
  bpy.context.scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List.clear()
  del bpy.types.Scene.Simplygon_2dea6c2a3a414b3b8551ad0b82b23a5e_List
  bpy.context.scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List.clear()
  del bpy.types.Scene.Simplygon_b373a1388c1b4201af48b5edddb6bf63_List
  bpy.context.scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_List.clear()
  del bpy.types.Scene.Simplygon_a4cf9be35dcf45ae8fc760e05d10d59d_List
  bpy.context.scene.Simplygon_cda4cae79f5444c29525c66e2c014276_List.clear()
  del bpy.types.Scene.Simplygon_cda4cae79f5444c29525c66e2c014276_List
  bpy.context.scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List.clear()
  del bpy.types.Scene.Simplygon_48c55afdcc864ee8879f0fb9a0e65e38_List
  bpy.context.scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List.clear()
  del bpy.types.Scene.Simplygon_c26f08a112344ab682cfccd906e5cc19_List
  bpy.context.scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List.clear()
  del bpy.types.Scene.Simplygon_3c23b8d193314ff6bb95ec4bc4491a89_List
  bpy.context.scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List.clear()
  del bpy.types.Scene.Simplygon_b392d590bd194504a879eb24c8a2b5bb_List
  bpy.context.scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List.clear()
  del bpy.types.Scene.Simplygon_bd06777db3734aa58b1de2fb68bd7b64_List
  bpy.context.scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_List.clear()
  del bpy.types.Scene.Simplygon_7700fc5eb8a744e9b2632286c6ec26fd_List
  bpy.context.scene.Simplygon_c152e178c003473b92a471317fa2ab60_List.clear()
  del bpy.types.Scene.Simplygon_c152e178c003473b92a471317fa2ab60_List
  bpy.context.scene.Simplygon_961ca13bbcd2491784441c22d782f571_List.clear()
  del bpy.types.Scene.Simplygon_961ca13bbcd2491784441c22d782f571_List
  bpy.context.scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List.clear()
  del bpy.types.Scene.Simplygon_ad8a722c80d14bb8b3e4bf0a25bd0caa_List
  bpy.context.scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List.clear()
  del bpy.types.Scene.Simplygon_ca1205222c5c4399b306c48f65c7298c_List
  bpy.context.scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List.clear()
  del bpy.types.Scene.Simplygon_5f42a5c1a2824c4d864bf7ad8e11e816_List
  bpy.context.scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List.clear()
  del bpy.types.Scene.Simplygon_12f35c6bc537460393a54985c8d6adb1_List
  bpy.context.scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List.clear()
  del bpy.types.Scene.Simplygon_495cd2830ce34da381d9897ccf61e4bb_List
  bpy.context.scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_List.clear()
  del bpy.types.Scene.Simplygon_973c63772da44a96bfa8c4bd2dd469b1_List
  bpy.context.scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_List.clear()
  del bpy.types.Scene.Simplygon_b92b0736267d4e87a11f7e781a9a31a2_List
  bpy.context.scene.Simplygon_64815387f4464c35adf889635e8a5b1c_List.clear()
  del bpy.types.Scene.Simplygon_64815387f4464c35adf889635e8a5b1c_List
  bpy.context.scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List.clear()
  del bpy.types.Scene.Simplygon_f5b59fc3ca214516b5c30d8eebc5090d_List
  bpy.context.scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List.clear()
  del bpy.types.Scene.Simplygon_3c040057977540c4bfa1e1ac14f82187_List
  bpy.context.scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List.clear()
  del bpy.types.Scene.Simplygon_c513a271e1e145088f09a4f03964e2a1_List
  bpy.context.scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List.clear()
  del bpy.types.Scene.Simplygon_3b9cf62040634d2cae427a10f5e8a506_List
  bpy.context.scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List.clear()
  del bpy.types.Scene.Simplygon_ec888b7196044227b803c73fff4ce08b_List
  bpy.context.scene.Simplygon_96124c81fa5143698501556bee0e2857_List.clear()
  del bpy.types.Scene.Simplygon_96124c81fa5143698501556bee0e2857_List
  bpy.context.scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_List.clear()
  del bpy.types.Scene.Simplygon_76581fbc5aac4bc6b1a622b4ffdf39a7_List
  bpy.context.scene.Simplygon_576ba6cb0f264c5c862f7347ee5a9b3f_List.clear()
  del bpy.types.Scene.Simplygon_576ba6cb0f264c5c862f7347ee5a9b3f_List
  bpy.context.scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List.clear()
  del bpy.types.Scene.Simplygon_1dc3d6ff46ae4ec986e5d5b4801f2c9a_List
  bpy.context.scene.Simplygon_443f64db019a470a840ab78a090ac28d_List.clear()
  del bpy.types.Scene.Simplygon_443f64db019a470a840ab78a090ac28d_List
  bpy.context.scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List.clear()
  del bpy.types.Scene.Simplygon_11ee2f0f2fd7496192f3817c0607bb89_List
  bpy.context.scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List.clear()
  del bpy.types.Scene.Simplygon_ade3366b35ca4a5b8511cec8ccd0f49d_List
  bpy.context.scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List.clear()
  del bpy.types.Scene.Simplygon_f8a311e9a5c5452da13c5ed7614ad8b6_List
  bpy.context.scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List.clear()
  del bpy.types.Scene.Simplygon_dfd61efba55c424db4d4731bbf5a1c43_List
  bpy.context.scene.Simplygon_bef007822fd943759e6262a7579054f6_List.clear()
  del bpy.types.Scene.Simplygon_bef007822fd943759e6262a7579054f6_List
  bpy.context.scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List.clear()
  del bpy.types.Scene.Simplygon_4d0bb310a63e4ff8b1c7b290a70cd0b9_List
  bpy.context.scene.Simplygon_820a145ead9d43299a00e4a17d643069_List.clear()
  del bpy.types.Scene.Simplygon_820a145ead9d43299a00e4a17d643069_List
  bpy.context.scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_List.clear()
  del bpy.types.Scene.Simplygon_23a46b520a82493ea1ecda07a1c026d1_List
  bpy.context.scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List.clear()
  del bpy.types.Scene.Simplygon_cfc6341776e94e68bb8608dff8f5de79_List
  bpy.context.scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List.clear()
  del bpy.types.Scene.Simplygon_8e2495b7ca5e470a941682dc32ce0c8d_List
  bpy.context.scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List.clear()
  del bpy.types.Scene.Simplygon_4b3fb67d0b004df480146a1844afabc4_List
  bpy.context.scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_List.clear()
  del bpy.types.Scene.Simplygon_3de188d0ac3247cc95c5ba9b967d83fe_List
  bpy.context.scene.Simplygon_b26e9a02b2c249cfba81e072acb175ba_List.clear()
  del bpy.types.Scene.Simplygon_b26e9a02b2c249cfba81e072acb175ba_List
  bpy.context.scene.Simplygon_860763afed7546208847945790bb6cbf_List.clear()
  del bpy.types.Scene.Simplygon_860763afed7546208847945790bb6cbf_List
  bpy.context.scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List.clear()
  del bpy.types.Scene.Simplygon_e52ac65b3d34428a95aa2b5ab0db6baa_List
  bpy.context.scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List.clear()
  del bpy.types.Scene.Simplygon_9fb3e562f8624ff48abd73855f3611dc_List
  bpy.context.scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List.clear()
  del bpy.types.Scene.Simplygon_3c72df183b7d45c1a562f182d8d96e9a_List
  bpy.context.scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List.clear()
  del bpy.types.Scene.Simplygon_61ad2607cb7644b485dcf6ec293eebc9_List
  bpy.context.scene.Simplygon_220863737f854c81b410e6e5746f3296_List.clear()
  del bpy.types.Scene.Simplygon_220863737f854c81b410e6e5746f3296_List
  bpy.context.scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List.clear()
  del bpy.types.Scene.Simplygon_6c05b0283f4f4c1895705860f09dd2c9_List
  bpy.context.scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List.clear()
  del bpy.types.Scene.Simplygon_6102f4fb2a2140b3b3bc807ed123c449_List
  bpy.context.scene.Simplygon_449b9bf740804d1f88b82f9322587404_List.clear()
  del bpy.types.Scene.Simplygon_449b9bf740804d1f88b82f9322587404_List
  bpy.context.scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_List.clear()
  del bpy.types.Scene.Simplygon_795f677a1e8843b19b10d1dbf898ecbe_List
  bpy.context.scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List.clear()
  del bpy.types.Scene.Simplygon_c79732a44b5346ba9db745e0bfef72e0_List
  bpy.context.scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_List.clear()
  del bpy.types.Scene.Simplygon_85e34027d1ac409280fac65b96e7fdfb_List
  bpy.context.scene.Simplygon_b661ac80510842b68dcad6fe287ed3ae_List.clear()
  del bpy.types.Scene.Simplygon_b661ac80510842b68dcad6fe287ed3ae_List
  bpy.context.scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List.clear()
  del bpy.types.Scene.Simplygon_c7048cfb6bb045de9958c4f9a7ccb832_List
  bpy.context.scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List.clear()
  del bpy.types.Scene.Simplygon_2f80c122fa23435f8e3c1c12f60f7f72_List
  bpy.context.scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List.clear()
  del bpy.types.Scene.Simplygon_7e0e45d7e2c2412c86961240655cfc12_List
  bpy.context.scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List.clear()
  del bpy.types.Scene.Simplygon_b38d04536cff47828e96350126f4c0ee_List
  bpy.context.scene.Simplygon_20332a716b3040e4af2095c3d0462908_List.clear()
  del bpy.types.Scene.Simplygon_20332a716b3040e4af2095c3d0462908_List
  bpy.context.scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List.clear()
  del bpy.types.Scene.Simplygon_b53cc227f8b64ca191af91869fa099ed_List
  bpy.context.scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List.clear()
  del bpy.types.Scene.Simplygon_afd66569c5614aeeac54b1e9fed2b258_List
  bpy.context.scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List.clear()
  del bpy.types.Scene.Simplygon_f8187f8c20b740b8a844fecb5cb92f07_List
  bpy.context.scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List.clear()
  del bpy.types.Scene.Simplygon_e592caf5a4e041b29bfc9c8da92449dd_List
  bpy.context.scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List.clear()
  del bpy.types.Scene.Simplygon_63c7e18fb7f14bfcbffe8ea559e49e63_List
  bpy.context.scene.Simplygon_88c996112bb24640b997199e2eb088b2_List.clear()
  del bpy.types.Scene.Simplygon_88c996112bb24640b997199e2eb088b2_List
  bpy.context.scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List.clear()
  del bpy.types.Scene.Simplygon_60bdd5323b8f4b5097bbb6e40f9f464c_List
  bpy.context.scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List.clear()
  del bpy.types.Scene.Simplygon_09e10fcb2a034f30a92ba33eda92e444_List
  bpy.context.scene.Simplygon_8623b5e294de4b949caca7cafc96f333_List.clear()
  del bpy.types.Scene.Simplygon_8623b5e294de4b949caca7cafc96f333_List
  bpy.context.scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_List.clear()
  del bpy.types.Scene.Simplygon_0fd8bb63a9294c9f98a8ac3182f8f376_List
  bpy.context.scene.Simplygon_e26167bb2b14409c8c3de75147f66bcb_List.clear()
  del bpy.types.Scene.Simplygon_e26167bb2b14409c8c3de75147f66bcb_List
  bpy.context.scene.Simplygon_482023697a8d42eab36ac9824aca7470_List.clear()
  del bpy.types.Scene.Simplygon_482023697a8d42eab36ac9824aca7470_List
  bpy.context.scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List.clear()
  del bpy.types.Scene.Simplygon_5eaebeb65d3d4272838ead207f1b9514_List
  bpy.context.scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List.clear()
  del bpy.types.Scene.Simplygon_3bd5609947c244fda3fcd7e8b67a4833_List
  bpy.context.scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List.clear()
  del bpy.types.Scene.Simplygon_4a6749150f4a4b108d3bac6d407f97e8_List
  bpy.context.scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List.clear()
  del bpy.types.Scene.Simplygon_b8e3f22b9a094c16bf3eac6ff39bd96a_List
  bpy.context.scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List.clear()
  del bpy.types.Scene.Simplygon_efb04c5da8f44a108abd018b9a818654_List
  bpy.context.scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List.clear()
  del bpy.types.Scene.Simplygon_98077c04f7c0499b91dc0bc2f4b31beb_List
  bpy.context.scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List.clear()
  del bpy.types.Scene.Simplygon_b443f28ee70449b4a18ee24aeab437ec_List
  bpy.context.scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List.clear()
  del bpy.types.Scene.Simplygon_4f6e2b1a5030438385974fc1bbe61aaa_List
  bpy.context.scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List.clear()
  del bpy.types.Scene.Simplygon_7206a8aa6baa421b8261f86188c0e9a3_List
  bpy.context.scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List.clear()
  del bpy.types.Scene.Simplygon_f44cc2b9eaed428898c57aa7bd2a7c87_List
  bpy.context.scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List.clear()
  del bpy.types.Scene.Simplygon_bbf82510dab54b27824c36bc432a5afc_List
  bpy.context.scene.Simplygon_cdb57aba384747a588c159e5752253ef_List.clear()
  del bpy.types.Scene.Simplygon_cdb57aba384747a588c159e5752253ef_List
  bpy.context.scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_List.clear()
  del bpy.types.Scene.Simplygon_cd76d73b57b04d2493dbe37e6209a2f7_List
  bpy.context.scene.Simplygon_5d17fe16881f472d865976248f423933_List.clear()
  del bpy.types.Scene.Simplygon_5d17fe16881f472d865976248f423933_List
  bpy.context.scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List.clear()
  del bpy.types.Scene.Simplygon_f6ad8cd6ec5f474eb4f9752c57e7658c_List
  bpy.context.scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List.clear()
  del bpy.types.Scene.Simplygon_0b1508e913d94cfe9f73366cfecb33c4_List
  bpy.context.scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List.clear()
  del bpy.types.Scene.Simplygon_672ccb99eb72409f8a7005a4c303686f_List
  bpy.context.scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List.clear()
  del bpy.types.Scene.Simplygon_aff994000bd94d03a10ba3f411390cd4_List
  bpy.context.scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List.clear()
  del bpy.types.Scene.Simplygon_ced0a11aa23642cb9556ecca1bc37e82_List
  bpy.context.scene.Simplygon_2638751937a0404092475ce5f0259e67_List.clear()
  del bpy.types.Scene.Simplygon_2638751937a0404092475ce5f0259e67_List
  bpy.context.scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List.clear()
  del bpy.types.Scene.Simplygon_ad0bab0ac43f402f8f11863a440c1462_List
  bpy.context.scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List.clear()
  del bpy.types.Scene.Simplygon_335ed61dc0c14f87ab79f1d861b9d1c7_List
  bpy.context.scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List.clear()
  del bpy.types.Scene.Simplygon_b43028ae3fd64838866876a150d1ac72_List
  bpy.context.scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List.clear()
  del bpy.types.Scene.Simplygon_ec1e749256e5489381364eaa7f3bf48e_List
  bpy.context.scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List.clear()
  del bpy.types.Scene.Simplygon_cf4c4e2e3db84c388bfb3f0ab93ca7fb_List
  bpy.context.scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List.clear()
  del bpy.types.Scene.Simplygon_2d6b107baa9d418fb2108049a34d2ce5_List
  bpy.context.scene.Simplygon_c7a48592fc974e13a028487f29c7a005_List.clear()
  del bpy.types.Scene.Simplygon_c7a48592fc974e13a028487f29c7a005_List
  bpy.context.scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List.clear()
  del bpy.types.Scene.Simplygon_d998f34e15884be29c46e2b94f53333a_List
  bpy.context.scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_List.clear()
  del bpy.types.Scene.Simplygon_0d9fcda3afe74c35939726f9c298d00c_List
  bpy.context.scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List.clear()
  del bpy.types.Scene.Simplygon_7d59fcd872fe450a8050189a9d706f90_List
  bpy.context.scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List.clear()
  del bpy.types.Scene.Simplygon_ccaf65cc545a40cb89e50724881e24fe_List
  bpy.context.scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List.clear()
  del bpy.types.Scene.Simplygon_955c6e3598cd44c48b79111e86f1956e_List
  bpy.context.scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List.clear()
  del bpy.types.Scene.Simplygon_c24dbb4dacb541aca922e9907c847e5a_List
  bpy.context.scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List.clear()
  del bpy.types.Scene.Simplygon_442f3be5e129439cadda6f78fd67d0be_List
  bpy.context.scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List.clear()
  del bpy.types.Scene.Simplygon_ff33680f043348a8b65aa21bfd4fa4c5_List
  bpy.context.scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List.clear()
  del bpy.types.Scene.Simplygon_7e8fea903dc34a10bcb89150175e8898_List
  bpy.context.scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List.clear()
  del bpy.types.Scene.Simplygon_71ac3677b1514635afd4a3761c8f4268_List
  bpy.context.scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List.clear()
  del bpy.types.Scene.Simplygon_b3de00bb133448b9803f79d1b60d7cde_List
  bpy.context.scene.Simplygon_6940108d126549f4afffae73b7a884a9_List.clear()
  del bpy.types.Scene.Simplygon_6940108d126549f4afffae73b7a884a9_List
  bpy.context.scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List.clear()
  del bpy.types.Scene.Simplygon_600b2c9b1f30400eba12b922a7b822c0_List
  bpy.context.scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List.clear()
  del bpy.types.Scene.Simplygon_8f6676f235f74b06aa4be46c80cd8f03_List
  bpy.context.scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List.clear()
  del bpy.types.Scene.Simplygon_6156c25b713643589baf9f3e9a0f3336_List
  bpy.context.scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List.clear()
  del bpy.types.Scene.Simplygon_bd3d2cf6ddbb436c969ab1f40849e19f_List
  bpy.context.scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List.clear()
  del bpy.types.Scene.Simplygon_56d399a99a0a4e99a4260db149ad2981_List
  bpy.context.scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List.clear()
  del bpy.types.Scene.Simplygon_370eab945d924abcbd2f24876a74d12a_List
  bpy.context.scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List.clear()
  del bpy.types.Scene.Simplygon_0224b106b55649d99cf77f522f63f2e4_List
  bpy.context.scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List.clear()
  del bpy.types.Scene.Simplygon_aceabfd9b8e34cfebddee8c5c9b06545_List
  bpy.context.scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List.clear()
  del bpy.types.Scene.Simplygon_c9409b55313e4419a2b3b4fc204da183_List
  bpy.context.scene.Simplygon_4264ea56820d471eabe73182529a1913_List.clear()
  del bpy.types.Scene.Simplygon_4264ea56820d471eabe73182529a1913_List
  bpy.context.scene.Simplygon_37d24cbb376549c79bca260710893911_List.clear()
  del bpy.types.Scene.Simplygon_37d24cbb376549c79bca260710893911_List
  bpy.context.scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_List.clear()
  del bpy.types.Scene.Simplygon_b6424eed9f8843be8dc24f269a7fe57c_List
  bpy.context.scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List.clear()
  del bpy.types.Scene.Simplygon_cb9ae6c88e5645c2a27680adf878f647_List
  bpy.context.scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List.clear()
  del bpy.types.Scene.Simplygon_4b6a14cf56774c77824846a5fb4cbe8e_List
  bpy.context.scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List.clear()
  del bpy.types.Scene.Simplygon_8193667d6dd84706857b850aec4c92a9_List
  bpy.context.scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List.clear()
  del bpy.types.Scene.Simplygon_5aaf6011daa84842892bb0b2712f1cf2_List
  bpy.context.scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List.clear()
  del bpy.types.Scene.Simplygon_f0975bff4faa414f86683f8dc2e010b1_List
  bpy.context.scene.Simplygon_04dbe73c498441bbb260d34182e45234_List.clear()
  del bpy.types.Scene.Simplygon_04dbe73c498441bbb260d34182e45234_List
  bpy.context.scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List.clear()
  del bpy.types.Scene.Simplygon_f24fd307157f4faa969b71fc1420d56a_List
  bpy.context.scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List.clear()
  del bpy.types.Scene.Simplygon_1aa0516412b64f9199c3b0cb84b2382a_List
  bpy.context.scene.Simplygon_0d18919df0864cf786c40b37622be996_List.clear()
  del bpy.types.Scene.Simplygon_0d18919df0864cf786c40b37622be996_List
  bpy.context.scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List.clear()
  del bpy.types.Scene.Simplygon_26a91ea7befd477f9df9f0c9a64911c0_List
  bpy.context.scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List.clear()
  del bpy.types.Scene.Simplygon_d02f2c4ea48e4a58821ce2a0e5c7cbcc_List
  bpy.context.scene.Simplygon_684d438875a944e28cb225107200fc4f_List.clear()
  del bpy.types.Scene.Simplygon_684d438875a944e28cb225107200fc4f_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()

