Skip to content

extract_model_usd

ExtractModelUSD

Bases: Extractor, OptionalPyblishPluginMixin

Extract Geometry in USDA Format.

Source code in client/ayon_max/plugins/publish/extract_model_usd.py
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class ExtractModelUSD(publish.Extractor,
                      OptionalPyblishPluginMixin):
    """Extract Geometry in USDA Format."""

    order = pyblish.api.ExtractorOrder - 0.05
    label = "Extract Geometry (USD)"
    hosts = ["max"]
    families = ["model"]
    optional = True

    settings_category = "max"

    def process(self, instance):
        if not self.is_active(instance.data):
            return

        self.log.info("Extracting Geometry ...")

        stagingdir = self.staging_dir(instance)
        asset_filename = "{name}.usda".format(**instance.data)
        asset_filepath = os.path.join(stagingdir,
                                      asset_filename)
        self.log.info(f"Writing USD '{asset_filepath}' to '{stagingdir}'")

        log_filename = "{name}.txt".format(**instance.data)
        log_filepath = os.path.join(stagingdir,
                                    log_filename)
        self.log.info(f"Writing log '{log_filepath}' to '{stagingdir}'")

        # get the nodes which need to be exported
        export_options = self.get_export_options(log_filepath)
        with maintained_selection():
            # select and export
            node_list = instance.data["members"]
            rt.Select(node_list)
            rt.USDExporter.ExportFile(asset_filepath,
                                      exportOptions=export_options,
                                      contentSource=rt.Name("selected"),
                                      nodeList=node_list)

        self.log.info("Performing Extraction ...")
        if "representations" not in instance.data:
            instance.data["representations"] = []

        representation = {
            'name': 'usda',
            'ext': 'usda',
            'files': asset_filename,
            "stagingDir": stagingdir,
        }
        instance.data["representations"].append(representation)

        log_representation = {
            'name': 'txt',
            'ext': 'txt',
            'files': log_filename,
            "stagingDir": stagingdir,
        }
        instance.data["representations"].append(log_representation)

        self.log.info(
            f"Extracted instance '{instance.name}' to: {asset_filepath}")

    @staticmethod
    def get_export_options(log_path):
        """Set Export Options for USD Exporter"""

        export_options = rt.USDExporter.createOptions()

        export_options.Meshes = True
        export_options.Shapes = False
        export_options.Lights = False
        export_options.Cameras = False
        export_options.Materials = False
        export_options.MeshFormat = rt.Name('fromScene')
        export_options.FileFormat = rt.Name('ascii')
        export_options.UpAxis = rt.Name('y')
        export_options.LogLevel = rt.Name('info')
        export_options.LogPath = log_path
        export_options.PreserveEdgeOrientation = True
        export_options.TimeMode = rt.Name('current')

        rt.USDexporter.UIOptions = export_options

        return export_options

get_export_options(log_path) staticmethod

Set Export Options for USD Exporter

Source code in client/ayon_max/plugins/publish/extract_model_usd.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
@staticmethod
def get_export_options(log_path):
    """Set Export Options for USD Exporter"""

    export_options = rt.USDExporter.createOptions()

    export_options.Meshes = True
    export_options.Shapes = False
    export_options.Lights = False
    export_options.Cameras = False
    export_options.Materials = False
    export_options.MeshFormat = rt.Name('fromScene')
    export_options.FileFormat = rt.Name('ascii')
    export_options.UpAxis = rt.Name('y')
    export_options.LogLevel = rt.Name('info')
    export_options.LogPath = log_path
    export_options.PreserveEdgeOrientation = True
    export_options.TimeMode = rt.Name('current')

    rt.USDexporter.UIOptions = export_options

    return export_options