Location: Spine @ 2dd18be3bc21 / generate_argon_document2.py

Author:
vickieshim <v.shim@auckland.ac.nz>
Date:
2023-01-12 12:47:40+13:00
Desc:
spine2
Permanent Source URI:
https://models.physiomeproject.org/workspace/ab8/rawfile/2dd18be3bc2172036b417bfeafddd644f77ec212/generate_argon_document2.py

import copy
import json
import os

EXPORT_RELATIVE_PATH = True

#Change this to match the root directory to generate the new file
DIR_2 = 'C:\\Users\\bshi013\\ab8'

#The name of the newly generated argon document
EXPORT_NAME = 'test_file.json'

VERSION_INFO = {
    "OpenCMISS-Argon Version": [
        "0",
        "2",
        "2"
    ],
}


#Settings for scene viewport, not used a this moment
SCENEVIEWER = {
  "Sceneviewer": {
    "AntialiasSampling": 0,
    "BackgroundColourRGB": [
      1,
      1,
      1
    ],
    "EyePosition": [
      295.78381273359287,
      2742.141219539055,
      -486.04315158466096
    ],
    "FarClippingPlane": 6485.082381619184,
    "LightingLocalViewer": False,
    "LightingTwoSided": True,
    "LookatPosition": [
      133.9595184326172,
      128.9081916809082,
      -829.2242584228516
    ],
    "NearClippingPlane": 132.03169346983802,
    "PerturbLinesFlag": False,
    "ProjectionMode": "PERSPECTIVE",
    "Scene": "",
    "Scenefilter": "default",
    "TranslationRate": 1,
    "TransparencyMode": "FAST",
    "TumbleRate": 1.5,
    "UpVector": [
      0,
      0,
      1
    ],
    "ViewAngle": 0.6981317007976229,
    "ZoomRate": 1
  }
}

SCENE_GRAPHICS = {
    "Scene": {
        "Graphics": [
            {
                "BoundaryMode": "ALL",
                "CoordinateField": "coordinates",
                "ElementFaceType": "ALL",
                "FieldDomainType": "MESH2D",
                "Material": "black",
                "RenderLineWidth": 1,
                "RenderPointSize": 1,
                "RenderPolygonMode": "SHADED",
                "Scenecoordinatesystem": "LOCAL",
                "SelectMode": "ON", 
                "SelectedMaterial": "default_selected",
                "Surfaces": {},
                "Tessellation": "default",
                "Type": "SURFACES",
                "VisibilityFlag": True
            }
        ],
        "VisibilityFlag": True
    }
}

TESSELLATION = {
    "Tessellations": {
    "DefaultPointsTessellation": "default_points",
    "DefaultTessellation": "default",
    "Tessellations": [
      {
        "CircleDivisions": 12,
        "MinimumDivisions": [
          1
        ],
        "Name": "default",
        "RefinementFactors": [
          3
        ]
      },
      {
        "CircleDivisions": 12,
        "MinimumDivisions": [
          1
        ],
        "Name": "default_points",
        "RefinementFactors": [
          1
        ]
      },
      {
        "CircleDivisions": 48,
        "MinimumDivisions": [
          1
        ],
        "Name": "material_preview",
        "RefinementFactors": [
          1
        ]
      },
      {
        "CircleDivisions": 12,
        "MinimumDivisions": [
          16
        ],
        "Name": "update_vis",
        "RefinementFactors": [
          1
        ]
      }
    ]
  }
}

FIELD_MODULE = {
    "Fieldmodule": {
        "Fields": [
            {
                "CoordinateSystemType": "RECTANGULAR_CARTESIAN",
                "FieldFiniteElement": {
                    "ComponentNames": [
                        "x",
                        "y",
                        "z"
                    ],
                    "NumberOfComponents": 3
                },
                "IsManaged": True,
                "IsTypeCoordinate": True,
                "Name": "coordinates"
            },
            {
                "CoordinateSystemType": "FIBRE",
                "FieldFiniteElement": {
                    "ComponentNames": [
                        "fibre angle",
                        "imbrication angle",
                        "sheet angle"
                    ],
                    "NumberOfComponents": 3
                },
                "IsManaged": True,
                "IsTypeCoordinate": False,
                "Name": "fibres"
            }
        ]
    },
}

EMPTY_REGION = {
    "Fieldmodule": None,
    "Scene": {
        "Graphics": None,
        "VisibilityFlag": True
    }
}

SKIP_REGIONS = ['maxilla', ]


def main():
    os.walk(DIR_2)
    data_files = []
    bone_folders = ['a4b','a4d','a4f','a44','a47','a49','a52','a63','a65','a67','a69','a6b','a6d','a6f','a71','a73','a75','a77','a79','a80','a82','a84','a86','a88']
    disc_folders = ['a55','a57','a59','a5b','a5d','a5f','a90','a92','a95','a97','a99','a9b','a9d','a9f','aa1','aa3','aa5','aa7','aab','aad','aaf','ab1','a8b','a8e']
    for root, dirs, files in os.walk(DIR_2, topdown=True):
        transformedFound = False
        current_dir = {
            'node_files': [],
            'elem_files': []
        }

        for file in files:
            print(file)
            if file.endswith('_transformed.exnode'):
                transformedFound = True
                current_dir['node_files'].append(os.path.join(root, file))
            if file.endswith('_transformed.exelem'):
                current_dir['elem_files'].append(os.path.join(root, file))

        if transformedFound == False:
            for file in files:
                if file.endswith('.EXNODE'):
                    current_dir['node_files'].append(os.path.join(root, file))
                if file.endswith('.EXELEM'):
                    current_dir['elem_files'].append(os.path.join(root, file))

        if len(current_dir["node_files"]):
            data_files.append(current_dir)

    common_path = os.path.commonpath([d["node_files"][0] for d in data_files])

    argon_document = {
        **VERSION_INFO,
        **SCENEVIEWER,
        **TESSELLATION
    }

    root_region = copy.deepcopy(EMPTY_REGION)

    bits = []
    for index, data in enumerate(data_files):

        exnode_file = data["node_files"][0]
        region_path = exnode_file.replace(common_path, '')

        print(region_path)

        region_parts = region_path.split('\\')
        region_parts.pop(0)
        base_region = root_region
        for i in range(len(region_parts) - 1):
            current_region = region_parts[i].lower()

            if "ChildRegions" not in base_region:
                base_region["ChildRegions"] = []

            child_region_names = []
            for region_info in base_region["ChildRegions"]:
                child_region_names.append(region_info["Name"])

            if current_region not in child_region_names:
                new_child = copy.deepcopy(EMPTY_REGION)
                new_child['Name'] = current_region
                base_region["ChildRegions"].append(new_child)
                child_region_names.append(current_region)

            j = child_region_names.index(current_region)

            base_region = base_region["ChildRegions"][j]

        # base_region["Fieldmodule"] = copy.deepcopy(FIELD_MODULE["Fieldmodule"])
        base_region["Scene"] = copy.deepcopy(SCENE_GRAPHICS["Scene"])
        bit = f"'{region_parts[-2].lower()}',"
        # if bit not in bits:
        #     bits.append(bit)
        if region_parts[-2].lower() in SKIP_REGIONS:
            continue

        if "Model" not in base_region:
            base_region["Model"] = {"Sources": []}

        for node_file in data['node_files']:
            exnode_path = node_file  # .replace(common_path, '')[1:]
            if EXPORT_RELATIVE_PATH:
                exnode_path = exnode_path.replace(common_path, '')[1:]
            base_region["Model"]["Sources"].insert(
                0,
                {
                    "FileName": exnode_path,
                    "RegionName": os.path.dirname(region_path).lower(),
                    "Type": "FILE"
                }
            )
        for elem_file in data['elem_files']:
            exelem_path = elem_file  # .replace(common_path, '')[1:]
            if EXPORT_RELATIVE_PATH:
                exelem_path = exelem_path.replace(common_path, '')[1:]
            base_region["Model"]["Sources"].append(
                {
                    "FileName": exelem_path,
                    "RegionName": os.path.dirname(region_path).lower(),
                    "Type": "FILE"
                }
            )

        #current_folder = os.path.dirname(region_path).lower()
        if  current_region in bone_folders:
            base_region["Scene"]["Graphics"][0]["Material"] = "bone"
        if  current_region in disc_folders:
            base_region["Scene"]["Graphics"][0]["Material"] = "tissue"           


        #if 'MUSCLES' in region_path or 'NECK' in region_path:
        #    base_region["Scene"]["Graphics"][0]["Material"] = "muscle"
        #if 'BONE' in exnode_file:
        #    base_region["Scene"]["Graphics"][0]["Material"] = "bone"
        #if 'LIGAMENT' in region_path:
        #    base_region["Scene"]["Graphics"][0]["Material"] = "white"
        #if 'SKIN' in region_path:
        #    base_region["Scene"]["Graphics"][0]["Material"] = "brown"

    argon_document["RootRegion"] = root_region

    print('\n'.join(bits))
    with open(os.path.join(DIR_2, EXPORT_NAME), 'w') as f:
        f.write(json.dumps(argon_document, default=lambda o: o.__dict__, sort_keys=True, indent=2))


if __name__ == "__main__":
    main()

model_sources = {
    "Model": {
        "Sources": [
            {
                "FileName": "FEMUR.EXNODE",
                "RegionName": "/left_lower_limb/bones/femur",
                "Type": "FILE"
            },
            {
                "FileName": "FEMUR.EXELEM",
                "RegionName": "/left_lower_limb/bones/femur",
                "Type": "FILE"
            }
        ]
    },
}