From 57ec1e52cb413cadfd061167280021e3708d5d16 Mon Sep 17 00:00:00 2001 From: "Asad M. Zaman" Date: Thu, 20 Jul 2006 00:56:44 +0000 Subject: [PATCH] improved mayacopy that does not require replace prefix and is smart about not loading reference files as they are not needed most times --- pandatool/src/mayaprogs/mayaCopy.cxx | 146 ++++++++++++--------------- pandatool/src/mayaprogs/mayaCopy.h | 4 +- 2 files changed, 69 insertions(+), 81 deletions(-) diff --git a/pandatool/src/mayaprogs/mayaCopy.cxx b/pandatool/src/mayaprogs/mayaCopy.cxx index 248b2ac4a4..2faa160a00 100644 --- a/pandatool/src/mayaprogs/mayaCopy.cxx +++ b/pandatool/src/mayaprogs/mayaCopy.cxx @@ -62,16 +62,18 @@ MayaCopy() { "source filename before it is copied into the tree.", &CVSCopy::dispatch_none, &_keep_ver); + /* add_option ("rp", "replace_prefix", 80, "use these prefixes when replacing reference with the recently copied file from the " "source filename before it is copied into the tree.", &CVSCopy::dispatch_vector_string, NULL, &_replace_prefix); + */ add_option ("omittex", "", 0, - "Character animation files do not need to copy the texures. This option omits the " - "textures of the models to be re-mayacopied", + "Character animation files do not need to copy the texures nor its references. " + "This option omits the textures and references of the models to be re-mayacopied", &CVSCopy::dispatch_none, &_omit_tex); add_path_replace_options(); @@ -188,57 +190,6 @@ copy_maya_file(const Filename &source, const Filename &dest, return false; } - // Finally, copy in any referenced Maya files. - unsigned int num_refs = refs.length(); - - /* - if (num_refs != 0) { - maya_cat.warning() - << "External references are not yet properly supported by mayacopy!\n"; - } - */ - - if (num_refs != 0) { - if (_replace_prefix.empty()) { - // try to put the first word of the file name as the replace prefix - size_t idx = source.get_basename().find("_",0); - if (idx != string::npos) { - string st = source.get_basename().substr(0, idx); - _replace_prefix.push_back(st); - maya_cat.info() << "replace_prefix = " << st << endl; - } - else { - maya_cat.error() - << "External references exist: " - << "please make sure to specify a _replace_prefix with -rp option\n"; - exit(1); - } - } - } - unsigned int ref_index; - maya_cat.info() << "num_refs = " << num_refs << endl; - for (ref_index = 0; ref_index < num_refs; ref_index++) { - // one thing we need to do is rename the path to the base file - // that it is referencing to. This will guarantee that the - // refencing will stay in the copied directory. Only way I could - // make it work properly is through following MEL command. the - // pear character is used as an example. The maya API calls of - // removeReference and reference didn't work for the animations - // file -loadReference "mtpRN" -type "mayaBinary" -options "v=0" - // "m_t_pear_zero.mb"; - string lookup = refs[ref_index].asChar(); - Filename filename = - _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar())); - - CVSSourceTree::FilePath path = - _tree.choose_directory(filename.get_basename(), dir, _force, _interactive); - Filename new_filename = path.get_rel_from(dir); - _exec_string = "file -loadReference \"" + _replace_prefix[_curr_idx++] + "RN\" -type \"mayaBinary\" -options \"v=0\" \"" + new_filename.to_os_generic() + "\";"; - maya_cat.info() << "executing command: " << _exec_string << "\n"; - //MGlobal::executeCommand("file -loadReference \"mtpRN\" -type \"mayaBinary\" -options \"v=0\" \"m_t_pear_zero.mb\";"); - status = MGlobal::executeCommand(MString(_exec_string.c_str())); - } - if (!_omit_tex) { // Get all the shaders so we can determine the set of textures. _shaders.clear(); @@ -257,6 +208,56 @@ copy_maya_file(const Filename &source, const Filename &dest, } } + // Finally, copy in any referenced Maya files. + unsigned int num_refs = refs.length(); + + if (num_refs > 0) { + _omit_tex = true; + } + + unsigned int ref_index; + maya_cat.info() << "num_refs = " << num_refs << endl; + for (ref_index = 0; ref_index < num_refs; ref_index++) { + // one thing we need to do is rename the path to the base file + // that it is referencing to. This will guarantee that the + // refencing will stay in the copied directory. Only way I could + // make it work properly is through following MEL command. the + // pear character is used as an example. The maya API calls of + // removeReference and reference didn't work for the animations + // file -loadReference "mtpRN" -type "mayaBinary" -options "v=0" + // "m_t_pear_zero.mb"; + string lookup = refs[ref_index].asChar(); + + string blah = "file -q -referenceNode \"" + lookup + "\";"; + //maya_cat.info() << blah << endl; + MString result; + status = MGlobal::executeCommand(MString(blah.c_str()), result); + //maya_cat.info() << "result = " << result.asChar() << endl; + + // for multiple reference of the same model. maya throws in a {#} at the end, ignore that + size_t dup = lookup.find('{'); + if (dup != string::npos){ + lookup.erase(dup); + } + + Filename filename = + _path_replace->convert_path(Filename::from_os_specific(lookup)); + + CVSSourceTree::FilePath path = + _tree.choose_directory(filename.get_basename(), dir, _force, _interactive); + Filename new_filename = path.get_rel_from(dir); + + //maya_cat.info() << "curr_idx " << _curr_idx << endl; + _exec_string.push_back("file -loadReference \"" + string(result.asChar()) + "\" -type \"mayaBinary\" -options \"v=0\" \"" + new_filename.to_os_generic() + "\";"); + maya_cat.info() << "executing command: " << _exec_string[_curr_idx] << "\n"; + //MGlobal::executeCommand("file -loadReference \"mtpRN\" -type \"mayaBinary\" -options \"v=0\" \"m_t_pear_zero.mb\";"); + status = MGlobal::executeCommand(MString(_exec_string[ref_index].c_str())); + if (!status) { + status.perror("loadReference failed"); + } + _curr_idx++; + } + // Now write out the Maya file. if (!_maya->write(dest)) { maya_cat.error() @@ -265,48 +266,33 @@ copy_maya_file(const Filename &source, const Filename &dest, } for (ref_index = 0; ref_index < num_refs; ref_index++) { - //maya_cat.info() << "refs filename: " << refs[ref_index].asChar() << "\n"; - //maya_cat.info() << "os_specific filename: " << Filename::from_os_specific(refs[ref_index].asChar()) << "\n"; + if (1) { // we may want an option later to pull in all the referenced files + continue; + } - //maya_cat.info() << "-----------exec_string = " << _exec_string << endl; - string original("loadReference"); - string replace("unloadReference"); - size_t index = _exec_string.find("loadReference"); - _exec_string.replace(index, original.length(), replace, 0, replace.length()); - maya_cat.info() << "executing command: " << _exec_string << "\n"; - status = MGlobal::executeCommand(MString(_exec_string.c_str())); + string lookup = refs[ref_index].asChar(); + // for multiple reference of the same model. maya throws in a {#} at the end, ignore that + size_t dup = lookup.find('{'); + if (dup != string::npos){ + lookup.erase(dup); + } Filename filename = - _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar())); + _path_replace->convert_path(Filename::from_os_specific(lookup)); maya_cat.info() << "External ref: " << filename << "\n"; - + // Now import the file ExtraData ed; ed._type = FT_maya; - + CVSSourceTree::FilePath path = import(filename, &ed, _model_dir); if (!path.is_valid()) { exit(1); } } - /* - for (unsigned int ref_index = 0; ref_index < num_refs; ref_index++) { - Filename filename = - _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar())); - status = MFileIO::reference(MString(filename.get_basename().c_str())); - if (!status) { - status.perror("MFileIO reference"); - } - status = MFileIO::removeReference(refs[ref_index].asChar()); - if (!status) { - status.perror("MFileIO removeReference"); - } - } - */ - return true; } diff --git a/pandatool/src/mayaprogs/mayaCopy.h b/pandatool/src/mayaprogs/mayaCopy.h index 8eb0bcac75..683765043f 100644 --- a/pandatool/src/mayaprogs/mayaCopy.h +++ b/pandatool/src/mayaprogs/mayaCopy.h @@ -74,9 +74,11 @@ private: bool _keep_ver; bool _omit_tex; int _curr_idx; + /* vector_string _replace_prefix; + */ - string _exec_string; + vector_string _exec_string; PT(MayaApi) _maya; MayaShaders _shaders;