Exemple #1
0
def _query_selection_state():
    """
    Query the current selection state.

    Get the active point group, selected camera and connected lens.

    :returns: A tuple of Point Group ID, Camera ID and Lens ID. Any of
             the tuple members may be None if it could not be found.
    :rtype: (str or None, str or None, str or None)
    """
    cam_id = None
    lens_id = None
    msg = None
    pgroup_id = tde4.getCurrentPGroup()
    if not pgroup_id:
        msg = 'Error: Could not get active Point Group for camera.'
    else:
        with_selection = 1
        cam_ids = tde4.getCameraList(with_selection)
        if len(cam_ids) == 1:
            cam_id = cam_ids[0]
            lens_id = tde4.getCameraLens(cam_id)
            if not lens_id:
                msg = 'Error: Selected camera does not have a connected lens.'
        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
Exemple #2
0
def toMaya(params):
    # print "To Maya - Start"

    # search for camera point group...
    campg = checkCameraGroups()
    if campg is None:
        tde4.postQuestionRequester("Export Maya...",
                                   "Error, there is no camera point group.",
                                   "Ok")
        return

    # getParams
    filepath = params['file_browser'] + '.mel'

    cameras = params['cameras']
    camerasOutSize = params['camerasOutSize']
    camerasFrameStart = params['camerasFirstFrame']

    # openFile
    tools.ensure_dir(filepath)
    f = open(filepath, 'w')

    # write header
    f.write("//\n")
    f.write("// Maya/MEL export data written by %s\n" % tde4.get3DEVersion())
    f.write("//\n")
    f.write("// All lengths are in centimeter, all angles are in degree.\n")
    f.write("//\n\n")

    # write scene group...
    f.write("// create scene group...\n")
    f.write("string $sceneGroupName = `group -em -name \"Scene\"`;\n")

    # wrtie cameras
    exportCameras(f, cameras, camerasFrameStart, params['file_browser'], campg,
                  camerasOutSize, params['date'])

    # write camera points : campg

    exportCameraPoints(f, campg)

    # write moca / Objects
    exportMocaObjects(f, camerasFrameStart[0])

    # write global (scene node) transformation...
    p3d = tde4.getScenePosition3D()
    p3d = convertZup(p3d, yup)
    r3d = tde4.getSceneRotation3D()
    rot = convertToAngles(r3d)
    s = tde4.getSceneScale3D()
    f.write(
        "xform -zeroTransformPivots -rotateOrder zxy -translation %.15f %.15f %.15f -scale %.15f %.15f %.15f -rotation %.15f %.15f %.15f $sceneGroupName;\n\n"
        % (p3d[0], p3d[1], p3d[2], s, s, s, rot[0], rot[1], rot[2]))

    f.write("\n")

    # close file
    f.close()
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
Exemple #4
0
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

    # Generate file contents
    undistort = True
    start_frame = 1
    # Backwards compatibility with 3DE4 Release 2.
    if uvtrack_format.SUPPORT_CAMERA_FRAME_OFFSET is True:
        start_frame = tde4.getCameraFrameOffset(camera)
    data_str = uvtrack_format.generate(
        point_group, camera, points,
        start_frame=start_frame,
        undistort=undistort
    )

    # Write file.
    file_ext = EXT
    f = tempfile.NamedTemporaryFile(
        mode='w+b',
        bufsize=-1,
        suffix=file_ext,
        delete=False
    )
    if f.closed:
        msg = "Error: Couldn't open file.\n%r"
        msg = msg % f.name
        tde4.postQuestionRequester(TITLE, msg, 'Ok')
        return
    f.write(data_str)
    f.close()

    # Override the user's clipboard with the temporary file path.
    if uvtrack_format.SUPPORT_CLIPBOARD is True:
        tde4.setClipboardString(f.name)
    else:
        # Cannot set the clipboard, so we'll print to the Python Console
        # and the user can copy it. Pretty bad workaround.
        print f.name
    return
		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

except Exception, e:
	tde4.postQuestionRequester('Error ', str(e), '  OK  ')

		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

except Exception, e:
	tde4.postQuestionRequester('Error ', str(e), '  OK  ')

Exemple #7
0
def _build_widgets_with_data(req, pgroup_id, cam_id, lens_id, file_data):
    """
    Build the bottom half of the window, using the data from
    the mmcamera file.

    :param req: The 3DEqualizer window requester id.
    :type req: str

    :param pgroup_id: The Point Group ID with the active camera in it.
    :type pgroup_id: str

    :param cam_id: The Camera ID to apply data to.
    :type cam_id: str

    :param lens_id: The Lens ID to apply data to.
    :type lens_id: str

    :param file_data: Valid file data from a .mmcamera file.
    :type file_data: dict
    """
    assert isinstance(file_data, dict)
    assert 'data' in file_data
    data = file_data.get('data')
    assert data is not None

    image_data = data.get('image', dict())
    plate_path = image_data.get('file_path')
    pixel_aspect = image_data.get('pixel_aspect_ratio')

    camera_name = str(data.get('name'))
    start_frame = str(data.get('start_frame'))
    end_frame = str(data.get('end_frame'))

    attrs_data = data.get('attr', dict())
    attr_names = list(attrs_data.keys())

    if not start_frame or not end_frame:
        msg = ('File contains invalid frame range: {file_start}-{file_end}')
        msg = msg.format(
            file_start=start_frame,
            file_end=end_frame,
        )
        tde4.postQuestionRequester(TITLE, msg, 'Ok')
        return
    start_frame = int(start_frame)
    end_frame = int(end_frame)

    # Detect if the parsed file data does not have any frame
    # information in common with the selected camera.
    if not plate_path:
        has_common_frames = False
        cam_start, cam_end, _ = tde4.getCameraSequenceAttr(cam_id)
        if str(start_frame) and str(end_frame) and str(cam_start) and str(
                cam_end):
            cam_start = int(cam_start)
            cam_end = int(cam_end)
            cam_frames = set(range(cam_start, cam_end + 1))
            file_frames = set(range(start_frame, end_frame + 1))
            has_common_frames = not file_frames.isdisjoint(cam_frames)
        if has_common_frames is False:
            msg = ('The file path does not contain animated'
                   ' data in the camera\'s frame range.\n'
                   'File Frame Range: {file_start}-{file_end}\n'
                   'Camera Frame Range: {cam_start}-{cam_end}\n')
            msg = msg.format(file_start=start_frame,
                             file_end=end_frame,
                             cam_start=cam_start,
                             cam_end=cam_end)
            tde4.postQuestionRequester(TITLE, msg, 'Ok')
            return

    tde4.addSeparatorWidget(req, SEP_01_WIDGET)

    if plate_path:
        plate_path = os.path.normpath(plate_path)
        tde4.addToggleWidget(req, PLATE_LOAD_WIDGET, PLATE_LOAD_LABEL, True)
        tde4.addTextFieldWidget(req, PLATE_PATH_WIDGET, PLATE_PATH_LABEL,
                                plate_path)

        plate_range = '{0}-{1}'.format(start_frame, end_frame)
        tde4.addTextFieldWidget(req, PLATE_RANGE_WIDGET, PLATE_RANGE_LABEL,
                                plate_range)

        tde4.addSeparatorWidget(req, SEP_03_WIDGET)

    if camera_name:
        tde4.addToggleWidget(req, CAMERA_NAME_WIDGET, CAMERA_NAME_LABEL, True)

    tde4.addTextFieldWidget(req, START_FRAME_WIDGET, START_FRAME_LABEL,
                            str(start_frame))
    tde4.addTextFieldWidget(req, END_FRAME_WIDGET, END_FRAME_LABEL,
                            str(end_frame))

    has_fbk_w = ATTR_FBK_WIDTH in attr_names
    has_fbk_h = ATTR_FBK_HEIGHT in attr_names
    if has_fbk_w or has_fbk_h:
        tde4.addToggleWidget(req, ATTR_FBK_SIZE_WIDGET, ATTR_FBK_SIZE_LABEL,
                             True)

    has_fbk_x = ATTR_FBK_OFFSET_X in attr_names
    has_fbk_y = ATTR_FBK_OFFSET_Y in attr_names
    if has_fbk_x or has_fbk_y:
        tde4.addToggleWidget(req, ATTR_FBK_OFFSET_WIDGET,
                             ATTR_FBK_OFFSET_LABEL, True)

    if pixel_aspect:
        label = '{0} ({1})'.format(PIXEL_ASPECT_LABEL, str(pixel_aspect))
        tde4.addToggleWidget(req, PIXEL_ASPECT_WIDGET, label, True)

    has_fl = ATTR_FOCAL_LENGTH in attr_names
    if has_fl:
        samples = attrs_data.get(ATTR_FOCAL_LENGTH)
        is_static = mmcamera_format.detect_samples_are_static(samples)
        static_mode = 'static'
        if is_static is not True:
            static_mode = 'animated'
        label = '{0} ({1})'.format(ATTR_FOCAL_LENGTH_LABEL, static_mode)
        tde4.addToggleWidget(req, ATTR_FOCAL_LENGTH_WIDGET, label, True)

    has_tx = ATTR_TRANSLATE_X in attr_names
    has_ty = ATTR_TRANSLATE_Y in attr_names
    has_tz = ATTR_TRANSLATE_Z in attr_names
    if has_tx or has_ty or has_tz:
        label = ATTR_TRANSLATE_LABEL + ' '
        label += 'X' * has_tx
        label += 'Y' * has_ty
        label += 'Z' * has_tz
        tde4.addToggleWidget(req, ATTR_TRANSLATE_WIDGET, label, True)

    has_rx = ATTR_ROTATE_X in attr_names
    has_ry = ATTR_ROTATE_Y in attr_names
    has_rz = ATTR_ROTATE_Z in attr_names
    if has_rx or has_ry or has_rz:
        label = ATTR_ROTATE_LABEL + ' '
        label += 'X' * has_rx
        label += 'Y' * has_ry
        label += 'Z' * has_rz
        tde4.addToggleWidget(req, ATTR_ROTATE_WIDGET, label, True)
    return

#
# main script...
projectPath = tde4.getProjectPath()
projectName = os.path.basename(projectPath)
ShotName = projectName.split('_')[1]
#
# search for camera point group...

campg = None
pgl = tde4.getPGroupList()
for pg in pgl:
    if tde4.getPGroupType(pg) == "CAMERA": campg = pg
if campg == None:
    tde4.postQuestionRequester("Export Maya...",
                               "Error, there is no camera point group.", "Ok")

#
# open requester...

try:
    req = _export_requester_maya
except (ValueError, NameError, TypeError):
    _export_requester_maya = tde4.createCustomRequester()
    req = _export_requester_maya
    tde4.addFileWidget(req, "file_browser", "Exportfile...", "*.mel")
    tde4.addTextFieldWidget(req, "startframe_field", "Startframe", "1")
    # tde4.addOptionMenuWidget(req,"mode_menu","Orientation","Y-Up", "Z-Up")
    tde4.addToggleWidget(req, "hide_ref_frames", "Hide Reference Frames", 0)

cam = tde4.getCurrentCamera()
Exemple #9
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)
Exemple #10
0
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

    start, end, step = tde4.getCameraSequenceAttr(camera)
    start_frame = start
    # Backwards compatibility with 3DE4 Release 2.
    if SUPPORT_CAMERA_FRAME_OFFSET is True:
        start_frame = tde4.getCameraFrameOffset(camera)

    rs_enabled = False
    rs_distance = None
    # Backwards compatibility with 3DE4 Release 1.
    if SUPPORT_RS_ENABLED is True:
        rs_enabled = bool(tde4.getCameraRollingShutterEnabledFlag(camera))
    if rs_enabled is True:
        rs_distance = get_rs_distance(camera)
        if (SUPPORT_PROJECT_NOTES is True
                and SUPPORT_RS_DISTANCE is False):
            set_rs_distance_into_project_notes(rs_distance)

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

    # Write file.
    file_ext = EXT
    # Prefix with the current time 'YYYY-MM-DD_HH_MM', for example
    # '2020-12-04_14_26'.
    now_str = time.strftime('%Y-%m-%d_%H_%M')
    prefix = 'tmp_{0}_'.format(now_str)
    f = tempfile.NamedTemporaryFile(
        mode='w',
        prefix=prefix,
        suffix=file_ext,
        delete=False
    )
    if f.closed:
        msg = "Error: Couldn't open file.\n%r"
        msg = msg % f.name
        tde4.postQuestionRequester(TITLE, msg, 'Ok')
        return
    f.write(data_str)
    f.close()

    # Override the user's clipboard with the temporary file path.
    if SUPPORT_CLIPBOARD is True:
        tde4.setClipboardString(f.name)
    else:
        # Cannot set the clipboard, so we'll print to the Python Console
        # and the user can copy it. Pretty bad workaround.
        print(f.name)
    return
Exemple #11
0
def main():
    campg = None
    pgl = tde4.getPGroupList()
    for pg in pgl:
        if tde4.getPGroupType(pg) == "CAMERA": campg = pg
    if campg == None:
        tde4.postQuestionRequester("Export Maya...",
                                   "Error, there is no camera point group.",
                                   "Ok")

    #
    # open requester...

    try:
        req = _export_requester_maya
    except (ValueError, NameError, TypeError):
        _export_requester_maya = tde4.createCustomRequester()
        req = _export_requester_maya
        tde4.addFileWidget(req, "file_browser", "Exportfile...", "*.mel")
        tde4.addTextFieldWidget(req, "startframe_field", "Startframe", "1")
        # tde4.addOptionMenuWidget(req,"mode_menu","Orientation","Y-Up", "Z-Up")
        tde4.addToggleWidget(req, "hide_ref_frames", "Hide Reference Frames",
                             0)

    cam = tde4.getCurrentCamera()
    offset = tde4.getCameraFrameOffset(cam)
    tde4.setWidgetValue(req, "startframe_field", str(offset))

    # ret	= tde4.postCustomRequester(req,"Export Maya (MEL-Script)...",600,0,"Ok","Cancel")
    ret = 1

    if ret == 1:
        # yup	= tde4.getWidgetValue(req,"mode_menu")
        # if yup==2: yup = 0
        yup = 1
        # path	= tde4.getWidgetValue(req,"file_browser")
        path = get_mel_filename()['path']
        # frame0	= float(tde4.getWidgetValue(req,"startframe_field"))
        # frame0	-= 1
        framerange = get_frame_range()
        playbackoptions = 'playbackOptions -min {0} -max {1};'
        playbackoptions = playbackoptions.format(framerange['first'],
                                                 framerange['last'])
        frame0 = framerange['first'] - 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...

                f.write("//\n")
                f.write("// Maya/MEL export data written by %s\n" %
                        tde4.get3DEVersion())
                f.write("//\n")
                f.write(
                    "// All lengths are in centimeter, all angles are in degree.\n"
                )
                f.write("//\n\n")

                #
                # write scene group...
                groupname = """// create scene group...
string $sceneGroupName = `group -em -name "mm_{name}"`;
"""

                # f.write("// create scene group...\n")
                # f.write("string $sceneGroupName = `group -em -name \"Scene\"`;\n")
                groupname = groupname.format(
                    name=get_mel_filename()['filename'][:-4])
                f.write(groupname)

                #
                # write cameras...

                cl = tde4.getCameraList()
                index = 1
                for cam in cl:
                    camType = tde4.getCameraType(cam)
                    noframes = tde4.getCameraNoFrames(cam)
                    lens = tde4.getCameraLens(cam)
                    if lens != None:
                        name = validName(tde4.getCameraName(cam))
                        cam_name = 'cam_mm_' + name
                        # name		= "%s_%s_1"%(name,index)
                        # name		= "%s_%s"%(name,index)
                        name = cam_name
                        index += 1
                        fback_w = tde4.getLensFBackWidth(lens)
                        fback_h = tde4.getLensFBackHeight(lens)
                        p_aspect = tde4.getLensPixelAspect(lens)
                        focal = tde4.getCameraFocalLength(cam, 1)
                        lco_x = tde4.getLensLensCenterX(lens)
                        lco_y = tde4.getLensLensCenterY(lens)

                        # convert filmback to inch...
                        fback_w = fback_w / 2.54
                        fback_h = fback_h / 2.54
                        lco_x = -lco_x / 2.54
                        lco_y = -lco_y / 2.54

                        # convert focal length to mm...
                        focal = focal * 10.0

                        # create camera...
                        f.write("\n")
                        f.write("// create camera %s...\n" % name)
                        f.write(
                            "string $cameraNodes[] = `camera -name \"%s\" -hfa %.15f  -vfa %.15f -fl %.15f -ncp 0.01 -fcp 10000 -shutterAngle 180 -ff \"overscan\"`;\n"
                            % (name, fback_w, fback_h, focal))
                        f.write("string $cameraTransform = $cameraNodes[0];\n")
                        f.write("string $cameraShape = $cameraNodes[1];\n")
                        f.write(
                            "xform -zeroTransformPivots -rotateOrder zxy $cameraTransform;\n"
                        )
                        f.write(
                            "setAttr ($cameraShape+\".horizontalFilmOffset\") %.15f;\n"
                            % lco_x)
                        f.write(
                            "setAttr ($cameraShape+\".verticalFilmOffset\") %.15f;\n"
                            % lco_y)
                        f.write("setAttr ($cameraShape+\".renderable\") 1;\n")
                        p3d = tde4.getPGroupPosition3D(campg, cam, 1)
                        p3d = convertZup(p3d, yup)
                        f.write(
                            "xform -translation %.15f %.15f %.15f $cameraTransform;\n"
                            % (p3d[0], p3d[1], p3d[2]))
                        r3d = tde4.getPGroupRotation3D(campg, cam, 1)
                        rot = convertToAngles(r3d)
                        f.write(
                            "xform -rotation %.15f %.15f %.15f $cameraTransform;\n"
                            % rot)
                        f.write("xform -scale 1 1 1 $cameraTransform;\n")
                        """add pipeline attributes to camerashape"""
                        # attribs = add_pipeline_attribs() ### OBSOLETE WAY
                        attribs = add_pipeline_parms()
                        f.write(attribs)

                        # image plane...
                        f.write("\n\n\n\n// create image plane...\n")
                        f.write(
                            "string $imagePlane = `createNode imagePlane`;\n")
                        f.write(
                            "cameraImagePlaneUpdate ($cameraShape, $imagePlane);\n"
                        )
                        f.write(
                            "setAttr ($imagePlane + \".offsetX\") %.15f;\n" %
                            lco_x)
                        f.write(
                            "setAttr ($imagePlane + \".offsetY\") %.15f;\n" %
                            lco_y)

                        if camType == "SEQUENCE":
                            f.write(
                                "setAttr ($imagePlane+\".useFrameExtension\") 1;\n"
                            )
                        else:
                            f.write(
                                "setAttr ($imagePlane+\".useFrameExtension\") 0;\n"
                            )

                        f.write(
                            "expression -n \"frame_ext_expression\" -s ($imagePlane+\".frameExtension=frame\");\n"
                        )
                        path = tde4.getCameraPath(cam)
                        sattr = tde4.getCameraSequenceAttr(cam)
                        path = prepareImagePath(path, sattr[0])
                        f.write(
                            "setAttr ($imagePlane + \".imageName\") -type \"string\" \"%s\";\n"
                            % (path))
                        f.write("setAttr ($imagePlane + \".fit\") 4;\n")
                        f.write(
                            "setAttr ($imagePlane + \".displayOnlyIfCurrent\") 1;\n"
                        )
                        f.write(
                            "setAttr ($imagePlane  + \".depth\") (9000/2);\n")

                        # parent camera to scene group...
                        f.write("\n")
                        f.write("// parent camera to scene group...\n")
                        f.write("parent $cameraTransform $sceneGroupName;\n")

                        if camType == "REF_FRAME" and hide_ref:
                            f.write(
                                "setAttr ($cameraTransform +\".visibility\") 0;\n"
                            )

                        # animate camera...
                        if camType != "REF_FRAME":
                            f.write("\n")
                            f.write("// animating camera %s...\n" % name)
                            f.write(playbackoptions)
                            # f.write("playbackOptions -min %d -max %d;\n"%(1+frame0,noframes+frame0))
                            f.write("\n\n")

                        frame = 1
                        while frame <= noframes:
                            # rot/pos...
                            p3d = tde4.getPGroupPosition3D(campg, cam, frame)
                            p3d = convertZup(p3d, yup)
                            r3d = tde4.getPGroupRotation3D(campg, cam, frame)
                            rot = convertToAngles(r3d)
                            if frame > 1:
                                rot = [
                                    angleMod360(rot0[0], rot[0]),
                                    angleMod360(rot0[1], rot[1]),
                                    angleMod360(rot0[2], rot[2])
                                ]
                            rot0 = rot
                            f.write(
                                "setKeyframe -at translateX -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, p3d[0]))
                            f.write(
                                "setKeyframe -at translateY -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, p3d[1]))
                            f.write(
                                "setKeyframe -at translateZ -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, p3d[2]))
                            f.write(
                                "setKeyframe -at rotateX -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, rot[0]))
                            f.write(
                                "setKeyframe -at rotateY -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, rot[1]))
                            f.write(
                                "setKeyframe -at rotateZ -t %d -v %.15f $cameraTransform; "
                                % (frame + frame0, rot[2]))

                            # focal length...
                            focal = tde4.getCameraFocalLength(cam, frame)
                            focal = focal * 10.0
                            f.write(
                                "setKeyframe -at focalLength -t %d -v %.15f $cameraShape;\n"
                                % (frame + frame0, focal))

                            frame += 1

                #
                # write camera point group...

                f.write("\n")
                f.write("// create camera point group...\n")
                name = "cameraPGroup_%s_1" % validName(
                    tde4.getPGroupName(campg))
                f.write(
                    "string $pointGroupName = `group -em -name  \"%s\" -parent $sceneGroupName`;\n"
                    % name)
                # f.write("$pointGroupName = ($sceneGroupName + \"|\" + $pointGroupName);\n")
                f.write("\n")

                # write points...
                l = tde4.getPointList(campg)
                for p in l:
                    if tde4.isPointCalculated3D(campg, p):
                        name = tde4.getPointName(campg, p)
                        name = "p%s" % validName(name)
                        p3d = tde4.getPointCalcPosition3D(campg, p)
                        p3d = convertZup(p3d, yup)
                        f.write("\n")
                        f.write("// create point %s...\n" % name)
                        f.write(
                            "string $locator = stringArrayToString(`spaceLocator -name %s`, \"\");\n"
                            % name)
                        f.write("$locator = (\"|\" + $locator);\n")
                        f.write("xform -t %.15f %.15f %.15f $locator;\n" %
                                (p3d[0], p3d[1], p3d[2]))
                        f.write("parent $locator $pointGroupName;\n")

                f.write("\n")
                f.write(
                    "xform -zeroTransformPivots -rotateOrder zxy -scale 1.000000 1.000000 1.000000 $pointGroupName;\n"
                )
                f.write("\n")

                #
                # write object/mocap point groups...

                camera = tde4.getCurrentCamera()
                noframes = tde4.getCameraNoFrames(camera)
                pgl = tde4.getPGroupList()
                index = 1
                for pg in pgl:
                    if tde4.getPGroupType(pg) == "OBJECT" and camera != None:
                        f.write("\n")
                        f.write("// create object point group...\n")
                        pgname = "objectPGroup_%s_%d_1" % (validName(
                            tde4.getPGroupName(pg)), index)
                        index += 1
                        f.write(
                            "string $pointGroupName = `group -em -name  \"%s\" -parent $sceneGroupName`;\n"
                            % pgname)
                        f.write(
                            "$pointGroupName = ($sceneGroupName + \"|\" + $pointGroupName);\n"
                        )

                        # write points...
                        l = tde4.getPointList(pg)
                        for p in l:
                            if tde4.isPointCalculated3D(pg, p):
                                name = tde4.getPointName(pg, p)
                                name = "p%s" % validName(name)
                                p3d = tde4.getPointCalcPosition3D(pg, p)
                                p3d = convertZup(p3d, yup)
                                f.write("\n")
                                f.write("// create point %s...\n" % name)
                                f.write(
                                    "string $locator = stringArrayToString(`spaceLocator -name %s`, \"\");\n"
                                    % name)
                                f.write("$locator = (\"|\" + $locator);\n")
                                f.write(
                                    "xform -t %.15f %.15f %.15f $locator;\n" %
                                    (p3d[0], p3d[1], p3d[2]))
                                f.write("parent $locator $pointGroupName;\n")

                        f.write("\n")
                        scale = tde4.getPGroupScale3D(pg)
                        f.write(
                            "xform -zeroTransformPivots -rotateOrder zxy -scale %.15f %.15f %.15f $pointGroupName;\n"
                            % (scale, scale, scale))

                        # animate object point group...
                        f.write("\n")
                        f.write("// animating point group %s...\n" % pgname)
                        frame = 1
                        while frame <= noframes:
                            # rot/pos...
                            p3d = tde4.getPGroupPosition3D(pg, camera, frame)
                            p3d = convertZup(p3d, yup)
                            r3d = tde4.getPGroupRotation3D(pg, camera, frame)
                            rot = convertToAngles(r3d)
                            if frame > 1:
                                rot = [
                                    angleMod360(rot0[0], rot[0]),
                                    angleMod360(rot0[1], rot[1]),
                                    angleMod360(rot0[2], rot[2])
                                ]
                            rot0 = rot
                            f.write(
                                "setKeyframe -at translateX -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[0]))
                            f.write(
                                "setKeyframe -at translateY -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[1]))
                            f.write(
                                "setKeyframe -at translateZ -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[2]))
                            f.write(
                                "setKeyframe -at rotateX -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, rot[0]))
                            f.write(
                                "setKeyframe -at rotateY -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, rot[1]))
                            f.write(
                                "setKeyframe -at rotateZ -t %d -v %.15f $pointGroupName;\n"
                                % (frame + frame0, rot[2]))

                            frame += 1

                    # mocap point groups...
                    if tde4.getPGroupType(pg) == "MOCAP" and camera != None:
                        f.write("\n")
                        f.write("// create mocap point group...\n")
                        pgname = "objectPGroup_%s_%d_1" % (validName(
                            tde4.getPGroupName(pg)), index)
                        index += 1
                        f.write(
                            "string $pointGroupName = `group -em -name  \"%s\" -parent $sceneGroupName`;\n"
                            % pgname)
                        f.write(
                            "$pointGroupName = ($sceneGroupName + \"|\" + $pointGroupName);\n"
                        )

                        # write points...
                        l = tde4.getPointList(pg)
                        for p in l:
                            if tde4.isPointCalculated3D(pg, p):
                                name = tde4.getPointName(pg, p)
                                name = "p%s" % validName(name)
                                p3d = tde4.getPointMoCapCalcPosition3D(
                                    pg, p, camera, 1)
                                p3d = convertZup(p3d, yup)
                                f.write("\n")
                                f.write("// create point %s...\n" % name)
                                f.write(
                                    "string $locator = stringArrayToString(`spaceLocator -name %s`, \"\");\n"
                                    % name)
                                f.write("$locator = (\"|\" + $locator);\n")
                                f.write(
                                    "xform -t %.15f %.15f %.15f $locator;\n" %
                                    (p3d[0], p3d[1], p3d[2]))
                                for frame in range(1, noframes + 1):
                                    p3d = tde4.getPointMoCapCalcPosition3D(
                                        pg, p, camera, frame)
                                    p3d = convertZup(p3d, yup)
                                    f.write(
                                        "setKeyframe -at translateX -t %d -v %.15f $locator; "
                                        % (frame + frame0, p3d[0]))
                                    f.write(
                                        "setKeyframe -at translateY -t %d -v %.15f $locator; "
                                        % (frame + frame0, p3d[1]))
                                    f.write(
                                        "setKeyframe -at translateZ -t %d -v %.15f $locator; "
                                        % (frame + frame0, p3d[2]))
                                f.write("parent $locator $pointGroupName;\n")

                        f.write("\n")
                        scale = tde4.getPGroupScale3D(pg)
                        f.write(
                            "xform -zeroTransformPivots -rotateOrder zxy -scale %.15f %.15f %.15f $pointGroupName;\n"
                            % (scale, scale, scale))

                        # animate mocap point group...
                        f.write("\n")
                        f.write("// animating point group %s...\n" % pgname)
                        frame = 1
                        while frame <= noframes:
                            # rot/pos...
                            p3d = tde4.getPGroupPosition3D(pg, camera, frame)
                            p3d = convertZup(p3d, yup)
                            r3d = tde4.getPGroupRotation3D(pg, camera, frame)
                            rot = convertToAngles(r3d)
                            if frame > 1:
                                rot = [
                                    angleMod360(rot0[0], rot[0]),
                                    angleMod360(rot0[1], rot[1]),
                                    angleMod360(rot0[2], rot[2])
                                ]
                            rot0 = rot
                            f.write(
                                "setKeyframe -at translateX -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[0]))
                            f.write(
                                "setKeyframe -at translateY -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[1]))
                            f.write(
                                "setKeyframe -at translateZ -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, p3d[2]))
                            f.write(
                                "setKeyframe -at rotateX -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, rot[0]))
                            f.write(
                                "setKeyframe -at rotateY -t %d -v %.15f $pointGroupName; "
                                % (frame + frame0, rot[1]))
                            f.write(
                                "setKeyframe -at rotateZ -t %d -v %.15f $pointGroupName;\n"
                                % (frame + frame0, rot[2]))

                            frame += 1

                #
                # global (scene node) transformation...

                p3d = tde4.getScenePosition3D()
                p3d = convertZup(p3d, yup)
                r3d = tde4.getSceneRotation3D()
                rot = convertToAngles(r3d)
                s = tde4.getSceneScale3D()
                f.write(
                    "xform -zeroTransformPivots -rotateOrder zxy -translation %.15f %.15f %.15f -scale %.15f %.15f %.15f -rotation %.15f %.15f %.15f $sceneGroupName;\n\n"
                    %
                    (p3d[0], p3d[1], p3d[2], s, s, s, rot[0], rot[1], rot[2]))

                f.write("\n")
                f.close()
                # tde4.postQuestionRequester("Export Maya...","Project successfully exported.","Ok")
                print '--> successfully exported Maya Mel'
            else:
                tde4.postQuestionRequester("Export Maya...",
                                           "Error, couldn't open file.", "Ok")

    return get_mel_filename()['path']