Exemple #1
0
class UpdateShots:
    def __init__(self):
        self.project = Project()

    def update_shots(self):
        shot_list = ShotgunReader().getShotList()
        #print(shot_list)

        list_file = open(
            os.path.join(self.project.get_shots_dir(), ".shot_list"), "w")
        list_file.truncate(0)
        for shot in shot_list:
            #print("shot " + shot)
            list_file.write(shot + "\n")

            self.create_shot(shot)

        list_file.close()

        qd.message("Shots updated successfully.")

    def create_shot(self, shot):
        stage = hou.node("/stage")
        #print(shot)

        #check if there's already a shot hip file, and if so, don't do anything
        body = self.project.get_shot(shot)
        if not body:
            body = self.project.create_shot(shot)
        element = body.get_element(Asset.HIP)
        file_name = os.path.join(element._filepath, shot + "_main.hipnc")
        if os.path.exists(file_name) or element.get_last_version() >= 0:
            #don't save over work already done
            return

        #copy over the template file and publish it
        src = os.path.join(self.project.get_project_dir(), "template.hipnc")
        dst = os.path.join(element._filepath, "temp.hipnc")
        shutil.copyfile(src, dst)

        comment = "blank shot file"
        username = "******"

        element.update_app_ext(".hipnc")
        element.publish(username, dst, comment, shot)
class UpdateAssets:
    def __init__(self):
        self.project = Project()

    def update_assets(self):
        lists = ShotgunReader().getAssetLists()
        asset_list = lists[0]
        assets = lists[1]

        #update .asset_list
        list_file = open(
            os.path.join(self.project.get_assets_dir(), ".asset_list.txt"),
            "w")
        list_file.truncate(0)
        for name in asset_list:
            list_file.write(name + "\n")
        list_file.close()

        #update .short_asset_list
        list_file = open(
            os.path.join(self.project.get_assets_dir(), ".short_asset_list"),
            "w")
        list_file.truncate(0)

        for asset in assets:
            name = asset["name"]
            variants = asset["children"][:]
            print("name: " + name)
            print("variants: ", variants)

            self.build_asset(name, variants)

            list_file.write(name + "\n")

        list_file.close()

        qd.message("Assets updated successfully.")

    def build_asset(self, main_name, variants):
        stage = hou.node("/stage")
        self.primpath = "/" + main_name

        prim = stage.createNode("primitive")
        prim.setName("base_prim", 1)
        prim.parm("primpath").set(self.primpath)

        config = stage.createNode("configurelayer")
        config.setName("set_default_prim", 1)
        config.setInput(0, prim)
        config.parm("defaultprim").set(self.primpath)
        config.parm("setdefaultprim").set(1)

        add_var = stage.createNode("addvariant")
        add_var.parm("primpath").set(self.primpath)

        in_count = 1

        for var in variants:
            self.add_variant(var, config, add_var, in_count)
            in_count += 1

        out_label = stage.createNode("null")
        out_label.setName(main_name + "_OUT", 1)
        out_label.setInput(0, add_var)

        #our asset is now assembled, and just needs to be published
        body = self.project.get_asset(main_name)
        if not body:
            qd.error("Error publishing asset " + main_name +
                     ". Continuing to next asset.")
            return

        element = body.get_element(Asset.USD)
        element.update_app_ext(".usda")

        path = os.path.join(element._filepath, "temp.usda")

        rop = hou.node("/stage").createNode("usd_rop")
        rop.setInput(0, out_label)
        rop.parm("lopoutput").set(path)
        rop.parm("enableoutputprocessor_simplerelativepaths").set(0)
        rop.parm("execute").pressButton()

        stage.layoutChildren()

        comment = "Automatic publish"
        username = "******"
        name = main_name

        element.publish(username, path, comment, name)

        for child in stage.children():
            child.destroy()

    def add_variant(self, var, config, add_var, in_count):
        stage = hou.node("/stage")

        ref1 = stage.createNode("reference")
        ref1.setName(var + "_geo", 1)
        ref1.parm("primpath").set(self.primpath)
        geo_path = self.getGeoPath(var)
        ref1.parm("filepath1").set(geo_path)

        disp = stage.createNode("rendergeometrysettings")
        disp.parm("xn__primvarsdisplacementboundsphere_control_n4br").set(
            "set")
        disp.parm("xn__primvarsdisplacementboundsphere_mrbr").set(1)
        disp.setInput(0, ref1)

        lib1 = stage.createNode("reference")
        lib1.setInput(0, disp)
        lib1.parm("primpath").set("/materials/")
        mat_path = self.getMatPath(var)
        lib1.parm("filepath1").set(mat_path)

        mat_asgn = stage.createNode("assignmaterial")
        mat_asgn.setInput(0, lib1)
        mat_asgn.parm("primpattern1").set(self.primpath)
        usd_stage = mat_asgn.stage()
        mat_prim = usd_stage.GetPrimAtPath("/materials")
        shader_path = mat_prim.GetChildren()[0].GetPath()
        #print("SHADER PATH: " + str(shader_path))
        mat_asgn.parm("matspecpath1").set(str(shader_path))

        label = stage.createNode("null")
        label.setName(var + "_OUT", 1)
        label.setInput(0, mat_asgn)

        graft = stage.createNode("graftstages")
        graft.setName(var, 1)
        graft.parm("primpath").set(self.primpath)
        graft.parm("destpath").set("/")
        graft.setInput(0, config)
        graft.setInput(1, label)

        add_var.setInput(in_count, graft)

    def getGeoPath(self, var):
        body = self.project.get_asset(var)
        if not body:
            body = self.project.create_asset(var)

        element = body.get_element(Asset.GEO)
        if element.get_last_version() >= 0:
            return element.get_last_publish()[3]

        else:
            #copy over the blank usda file
            src = self.project.get_project_dir()
            src = os.path.join(src, "blank.usda")
            dst = os.path.join(element._filepath, var + "_main.usda")

            shutil.copyfile(src, dst)
            pio.set_permissions(dst)

            return dst

    def getMatPath(self, var):
        body = self.project.get_asset(var)
        if not body:
            body = self.project.create_asset(var)

        element = body.get_element(Asset.MATERIALS)
        myPath = os.path.join(element._filepath, var + "_main.usda")
        if os.path.exists(myPath):
            return myPath

        else:
            #create and publish a basic material, return the path
            dst = os.path.join(element._filepath, var + "_main.usda")

            mat_lib = hou.node("/stage").createNode("materiallibrary")
            pink = mat_lib.createNode("usdpreviewsurface")
            pink.setName(var)
            pink.parm("diffuseColorr").set(.6)
            pink.parm("diffuseColorg").set(.6)
            pink.parm("diffuseColorb").set(.6)

            rop = hou.node("/stage").createNode("usd_rop")
            rop.setInput(0, mat_lib)
            rop.parm("lopoutput").set(dst)
            rop.parm("enableoutputprocessor_simplerelativepaths").set(0)
            rop.parm("execute").pressButton()

            mat_lib.destroy()
            rop.destroy()

            pio.set_permissions(dst)

            return dst