def main():
    camera = tde4.getCurrentCamera()
    point_group = tde4.getCurrentPGroup()
    if camera is None or point_group is None:
        msg = 'There is no current Point Group or Camera.'
        tde4.postQuestionRequester(TITLE, msg, 'Ok')
        return

    # check if context menu has been used, and retrieve point...
    point = tde4.getContextMenuObject()
    if point is not None:
        # retrieve point's parent pgroup (not necessarily being the current one!)...
        point_group = tde4.getContextMenuParentObject()
        points = tde4.getPointList(point_group, 1)
    else:
        # otherwise use regular selection...
        points = tde4.getPointList(point_group, 1)
    if len(points) == 0:
        msg = 'There are no selected points.'
        tde4.postQuestionRequester(TITLE, msg, 'Ok')
        return

    # widget default values
    start_frame = 1
    # Backwards compatibility with 3DE4 Release 2.
    if uvtrack_format.SUPPORT_CAMERA_FRAME_OFFSET is True:
        start_frame = tde4.getCameraFrameOffset(camera)
    pattern = '*' + EXT

    # GUI
    req = tde4.createCustomRequester()
    tde4.addFileWidget(req, 'file_browser_widget', 'Filename...', pattern)
    tde4.addTextFieldWidget(req, 'start_frame_widget', 'Start Frame', str(start_frame))
    ret = tde4.postCustomRequester(req, TITLE, 500, 0, 'Ok', 'Cancel')
    if ret == 1:
        # Query GUI Widgets
        path = tde4.getWidgetValue(req, 'file_browser_widget')
        start_frame = tde4.getWidgetValue(req, 'start_frame_widget')
        start_frame = int(start_frame)

        # Generate file contents
        data_str = uvtrack_format.generate(
            point_group, camera, points,
            start_frame=start_frame,
            fmt=uvtrack_format.UV_TRACK_FORMAT_VERSION_PREFERRED,
        )

        # Write file.
        if path.find(EXT, len(path)-3) == -1:
            # Ensure the file path ends with the extension, if not add it.
            path += EXT
        f = open(path, 'w')
        if f.closed:
            msg = "Error, couldn't open file.\n"
            msg += repr(path)
            tde4.postQuestionRequester(TITLE, msg, 'Ok')
            return
        f.write(data_str)
        f.close()
    return
		we_have_set_widget_callback_function = False

# For older releases we cannot do the smart guessing...
	if we_have_set_widget_callback_function:
		widget_default_initial_frame = tde4.addOptionMenuWidget(nuke_node_req,"option_menu_default_initial_frame","Startframe is based on","Nuke Read Node Default","3DE4 Initial Frame","User-defined")
		tde4.setWidgetValue(nuke_node_req,"option_menu_default_initial_frame",str(value_option_menu_default_initial_frame))
		tde4.setWidgetCallbackFunction(nuke_node_req,"option_menu_default_initial_frame","set_initial_frame_widget")
# Without / before smart-guessing we mimick Nuke's Read Node default behaviour.
	tde4.addTextFieldWidget(nuke_node_req,"text_initial_frame_nuke","Startframe in Nuke",str(tde4.getCameraSequenceAttr(id_cam)[0]))

# After creating all widgets we invoke the Callback once explicitly in order to initialize the text widget.
	if we_have_set_widget_callback_function:
		set_initial_frame_widget(widget_default_initial_frame,None,None)

# post requester
	ret	= tde4.postCustomRequester(nuke_node_req,'Export nuke distortion node for camera ' + tde4.getCameraName(id_cam)+' ',700,0,'Ok','Cancel ')
	if ret != 1:
		raise CancelException('Cancelled')
# At this point we know that user has pressed "Ok". Check path and suffix
	nuke_path = tde4.getWidgetValue(nuke_node_req,'file_nuke_path')
	if not nuke_path:
		raise Exception('No path specified')
	if not nuke_path.endswith('.nk'):
		nuke_path += '.nk'
# Update frame values and calculate offset between 3DE4 and Nuke.
	initial_frame_nuke = int(tde4.getWidgetValue(nuke_node_req,"text_initial_frame_nuke"))
# export
	exportNukeDewarpNode(id_cam,initial_frame_nuke,nuke_path)

except CancelException, e:
	pass
		we_have_set_widget_callback_function = False

# For older releases we cannot do the smart guessing...
	if we_have_set_widget_callback_function:
		widget_default_initial_frame = tde4.addOptionMenuWidget(nuke_node_req,"option_menu_default_initial_frame","Startframe is based on","Nuke Read Node Default","3DE4 Initial Frame","User-defined")
		tde4.setWidgetValue(nuke_node_req,"option_menu_default_initial_frame",str(value_option_menu_default_initial_frame))
		tde4.setWidgetCallbackFunction(nuke_node_req,"option_menu_default_initial_frame","set_initial_frame_widget")
# Without / before smart-guessing we mimick Nuke's Read Node default behaviour.
	tde4.addTextFieldWidget(nuke_node_req,"text_initial_frame_nuke","Startframe in Nuke",str(tde4.getCameraSequenceAttr(id_cam)[0]))

# After creating all widgets we invoke the Callback once explicitly in order to initialize the text widget.
	if we_have_set_widget_callback_function:
		set_initial_frame_widget(widget_default_initial_frame,None,None)

# post requester
	ret	= tde4.postCustomRequester(nuke_node_req,'Export nuke distortion node for camera ' + tde4.getCameraName(id_cam)+' ',700,0,'Ok','Cancel ')
	if ret != 1:
		raise CancelException('Cancelled')
# At this point we know that user has pressed "Ok". Check path and suffix
	nuke_path = tde4.getWidgetValue(nuke_node_req,'file_nuke_path')
	if not nuke_path:
		raise Exception('No path specified')
	if not nuke_path.endswith('.nk'):
		nuke_path += '.nk'
# Update frame values and calculate offset between 3DE4 and Nuke.
	initial_frame_nuke = int(tde4.getWidgetValue(nuke_node_req,"text_initial_frame_nuke"))
# export
	exportNukeDewarpNode(id_cam,initial_frame_nuke,nuke_path)

except CancelException, e:
	pass
Пример #4
0
        else:
            if len(cam_ids) == 0:
                msg = 'Error: Please select a camera.'
            elif len(cam_ids) > 1:
                msg = 'Error: Please select only one camera.'
            tde4.postQuestionRequester(TITLE, msg, 'Ok')
        if msg is not None:
            tde4.postQuestionRequester(TITLE, msg, 'Ok')
    return pgroup_id, cam_id, lens_id


# Launch GUI when this script is run.
pgroup_id, cam_id, lens_id = _query_selection_state()
if pgroup_id and cam_id and lens_id:
    try:
        requester = _paste_camera_mmsolver_requester
        _remove_all_dynamic_widgets(requester, '', 0)
        file_path = tde4.getWidgetValue(requester, FILE_BROWSER_WIDGET) or None
    except (ValueError, NameError, TypeError):
        file_path = None

    requester = _build_gui(file_path)
    _paste_camera_mmsolver_requester = requester

    button_pressed = tde4.postCustomRequester(_paste_camera_mmsolver_requester,
                                              TITLE, WIDTH, HEIGHT, 'Paste',
                                              'Cancel')
    if button_pressed == 1:
        # Button index pressed is 1-based; 1=='Paste', 2='Cancel'.
        _run_gui(_paste_camera_mmsolver_requester, pgroup_id, cam_id, lens_id)
    lens = tde4.getCameraLens(cam)
    for id in tde4.getLensList():
        focus = tde4.getLensFocalLength(id)
        lensmodel = tde4.getLensLDModel(id)
        focallength = tde4.getLensFocalLength(id)
        paraNumber = tde4.getLDModelNoParameters(lensmodel)
        for i in range(paraNumber):
            paraName = tde4.getLDModelParameterName(lensmodel, i)
            currentValue = tde4.getLensLDAdjustableParameter(
                id, paraName, focus, focallength)
            defaultValue = tde4.getLDModelParameterDefault(lensmodel, paraName)
            if currentValue != defaultValue:
                LensDistortionValid = True
                break

ret = tde4.postCustomRequester(req, "Export Maya (MEL-Script)...", 600, 0,
                               "Ok", "Cancel")
if ret == 1:
    # yup   = tde4.getWidgetValue(req,"mode_menu")
    # if yup==2: yup = 0
    yup = 1
    path = tde4.getWidgetValue(req, "file_browser")
    frame0 = float(tde4.getWidgetValue(req, "startframe_field"))
    frame0 -= 1
    hide_ref = tde4.getWidgetValue(req, "hide_ref_frames")
    if path != None:
        if not path.endswith('.mel'): path = path + '.mel'
        f = open(path, "w")
        if not f.closed:

            #
            # write some comments...
Пример #6
0
def exportNOID():
    # print 'Start exportNOID'
    req = buildUI()
    ret = tde4.postCustomRequester(req, "Export NOID - (Maya & Nuke)", 0, 0,
                                   "Export", "Cancel")

    if ret == 1:  # Canceled by the user
        # get the parameters selecteds
        params = {}
        params['file_browser'] = tde4.getWidgetValue(req, "file_browser")
        #params['nukeVersion'] = tde4.getWidgetValue(req, "nukeVersion")
        #params['openNuke'] = tde4.getWidgetValue(req, "openNuke")

        params['cameras'] = []
        params['camerasOutSize'] = []
        params['camerasFirstFrame'] = list()

        date = strftime("%y%m%d%H%M%S", gmtime())  # YYMMDDhhmmss
        params['date'] = date

        for cameraIndex in range(tde4.getNoCameras()):
            cameraObj = tde4.getIndexCamera(cameraIndex)
            # cameraName = str(tde4.getCameraName(cameraObj)) # NO USED
            exprtCamWidgetName = "exportCamera" + str(cameraIndex)

            exprtCamWidgetExists = tde4.widgetExists(req, exprtCamWidgetName)
            exprtCamWidgetValue = tde4.getWidgetValue(req, exprtCamWidgetName)

            if exprtCamWidgetExists and exprtCamWidgetValue:

                camResWidgetName = camWidgetPrefix + str(cameraIndex)
                log.debug('camResWidgetName : ' + str(camResWidgetName))
                camResWidgetValue = tde4.getWidgetValue(req, camResWidgetName)

                log.debug('camResWidgetValue: ' + str(camResWidgetValue))

                imageWidth, imageHeight, firstFrame = camResWidgetValue.split(
                    resSpliter)

                imageResolution = tools.Resolution(width=imageWidth,
                                                   height=imageHeight)

                params['cameras'].append(cameraObj)
                params['camerasOutSize'].append(imageResolution)
                params['camerasFirstFrame'].append(firstFrame)

                log.debug('imageResolution : ' + str(imageResolution))

        if params['cameras'] == []:
            message = 'Aborting, Nothing selected to Export'
            log.debug(message)
            return

        # debug params
        for paramName in params:
            paramValue = params[paramName]
            log.debug('param : ' + str(paramName))
            log.debug('value : ' + str(paramValue))

        # Export to Maya
        mayaExporter.toMaya(params)

        # Export to Nuke
        nukeFilesPath = nukeExporter.toNuke(params)

        # open Nuke or not
        #        if params['openNuke']:
        #            for nukeFilePath in nukeFilesPath:
        #                nukeExePath = findNukeExe(int(params['nukeVersion']))
        #                toExecute = [nukeExePath, '-q', nukeFilePath]
        #
        #                log.debug(toExecute)
        #
        #                useSubProcess = True
        #                if useSubProcess:
        #                    subprocess.Popen(toExecute, executable=nukeExePath)
        #                else:
        #                    os.system(toExecute)

        tde4.postQuestionRequester('Export finished',
                                   'All the cameras selected were exported',
                                   'OK')
    else:
        message = 'Canceled by user'
        log.debug(message)

    message = 'End exportCGEV'
    log.debug(message)
Пример #7
0
def compress(cams, ui=False):
    errors = []
    max_steps = 0
    seq_cams = {}

    for cam in cams:
        cam_name = tde4.getCameraName(cam)

        if tde4.getCameraType(cam) != 'SEQUENCE':
            errors.append(
                'Camera {} is not a Sequence Camera.'.format(cam_name))
            continue

        start, end = tde4.getCameraSequenceAttr(cam)[:2]
        frames = abs(end - start + 1)
        steps = frames + frames / 100 + 2
        max_steps += steps
        seq_cams[cam] = {
            'name': cam_name,
            'start': start,
            'end': end,
            'frames': frames,
            'steps': steps
        }

    if cams:
        if ui:
            tde4.postProgressRequesterAndContinue(TITLE, 'Please wait...',
                                                  max_steps, 'Ok')
        else:
            print(TITLE)
    else:
        errors.append('Please choose a camera.')

    steps_done = 0

    for cam in seq_cams:
        cam_name = seq_cams[cam]['name']
        msg = 'Exporting: {} (starting)'.format(cam_name)
        if ui:
            tde4.updateProgressRequester(steps_done, msg)
        else:
            print('  0% ' + msg)
        start = seq_cams[cam]['start']
        end = seq_cams[cam]['end']
        frames = seq_cams[cam]['frames']
        steps = seq_cams[cam]['steps']
        path = tde4.getCameraPath(cam)

        if tde4.getPreferenceValue('ICOMPRESS_BCFILE_IN_DIR') == '1':
            # save buffer in project directory
            project_dir = os.path.dirname(tde4.getProjectPath())
            if project_dir:
                # we have a project directory, it's safe to save
                target_path = os.path.join(project_dir, os.path.basename(path))
            else:
                # no project directory, alert the user
                target_path = ''
                errors.append(
                    'Can not save buffer to project directory. Project is not saved.'
                )
        elif tde4.getPreferenceValue('ICOMPRESS_BCFILE_IN_DIR') == '2':
            # save buffer in custom directory
            custom_dir = tde4.getPreferenceValue('ICOMPRESS_CUSTOM_DIR')
            target_path = os.path.join(custom_dir, os.path.basename(path))
        else:
            # default behavior, save buffer in image path
            target_path = path

        if not path:
            errors.append(
                ("Couldn't process camera {} because it doesn't have "
                 'any Footage loaded.').format(cam_name))
            steps_done += steps
            continue

        gamma = tde4.getCamera8BitColorGamma(cam)
        softclip = tde4.getCamera8BitColorSoftclip(cam)
        black, white = tde4.getCamera8BitColorBlackWhite(cam)
        exr = tde4.getCameraImportEXRDisplayWindowFlag(cam)
        sxr = tde4.getCameraImportSXRRightEyeFlag(cam)
        if sxr == 1:
            sxr2 = " -import_sxr_right_eye "
        else:
            sxr2 = " "
        if exr == 1:
            exr2 = " -import_exr_display_window "
        else:
            exr2 = " "
        proc_err = None

        # makeBCFile exits cleanly even if it errored, so we have to parse
        # its errors manually.
        proc = subprocess.Popen(
            (os.path.join(tde4.get3DEInstallPath(), 'bin',
                          'makeBCFile'), '-source', path, '-start', str(start),
             '-end', str(end), '-out', os.path.dirname(target_path), sxr2,
             exr2, '-black', str(black), '-white', str(white), '-gamma',
             str(gamma), '-softclip', str(softclip)),
            stdout=subprocess.PIPE,
            universal_newlines=True)

        for line in iter(proc.stdout.readline, ''):
            line = line.rstrip()

            if line.startswith('Error'):
                proc_err = line
                continue
            elif line.endswith('image files processed'):
                frame = int(line.split('/', 1)[0])
                msg = 'Exporting: {} ({}/{})'.format(cam_name, frame, frames)
                if ui:
                    tde4.updateProgressRequester(steps_done + frame + 1, msg)
                else:
                    print('{: 3d}% {}'.format(
                        100 * (steps_done + frame + 1) / max_steps, msg))

        if proc_err:
            errors.append(
                "Couldn't create Buffer Compression File for Camera {}.".
                format(cam_name))
            errors.append('Message >>    {}'.format(proc_err))
            steps_done += steps
            continue

        msg = 'Exporting: {} (finishing)'.format(cam_name)
        if ui:
            tde4.updateProgressRequester(steps_done + frames + 2, msg)
        else:
            print('{: 3d}% {}'.format(
                100 * (steps_done + frames + 2) / max_steps, msg))
        bcompress = ('x'.join(target_path.split('#' * path.count('#'))) +
                     '.3de_bcompress')

        if not os.path.isfile(bcompress):
            errors.append(
                "Couldn't find Buffer Compression File for Camera {}.".format(
                    cam_name))
            steps_done += steps
            continue

        if not tde4.importBufferCompressionFile(cam):
            errors.append(
                "Couldn't import Buffer Compression File for Camera {}.".
                format(cam_name))

        # Change permissions of the Buffer Compression File,
        # to be nice to everyone else who might work on the shot eventually!
        try:
            os.chmod(bcompress, 0o666)
        except OSError:
            errors.append(
                "Couldn't set permissions of Buffer CompressionFile for Camera {}."
                .format(cam_name))

        steps_done += steps

    if ui:
        tde4.unpostProgressRequester()

        if errors:
            req = tde4.createCustomRequester()
            for i, line in enumerate(errors):
                name = 'line{}'.format(i)
                tde4.addLabelWidget(req, name, line, 'ALIGN_LABEL_LEFT')
                tde4.setWidgetOffsets(req, name, 0, 0, 0, 0)
            tde4.postCustomRequester(req, TITLE, 0, 0, 'Ok')

    else:
        print('100% Done.')

        if errors:
            raise RuntimeError('\n'.join(errors))
Пример #8
0
            for i, line in enumerate(errors):
                name = 'line{}'.format(i)
                tde4.addLabelWidget(req, name, line, 'ALIGN_LABEL_LEFT')
                tde4.setWidgetOffsets(req, name, 0, 0, 0, 0)
            tde4.postCustomRequester(req, TITLE, 0, 0, 'Ok')

    else:
        print('100% Done.')

        if errors:
            raise RuntimeError('\n'.join(errors))


if __name__ == '__main__':
    req = tde4.createCustomRequester()
    tde4.addOptionMenuWidget(req, 'mode', 'Export:', 'Current Camera',
                             'Selected Cameras', 'All Cameras')
    ret = tde4.postCustomRequester(req, TITLE, 300, 0, 'Export', 'Cancel')

    if ret == 1:
        mode = tde4.getWidgetValue(req, 'mode')

        if mode == 1:
            cams = [tde4.getCurrentCamera()]
        else:
            cams = tde4.getCameraList(mode < 3)

        compress(cams, ui=True)

    tde4.deleteCustomRequester(req)