diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp index 7afd3fa91..453fddaa3 100644 --- a/src/libslic3r/GCode/PostProcessor.cpp +++ b/src/libslic3r/GCode/PostProcessor.cpp @@ -247,7 +247,7 @@ bool run_post_process_scripts(std::string &src_path, bool make_copy, const std:: boost::nowide::setenv("SLIC3R_PP_OUTPUT_NAME", output_name.c_str(), 1); // Path to an optional file that the post-processing script may create and populate it with a single line containing the output_name replacement. - std::string path_output_name = src_path + ".output_name"; + std::string path_output_name = path + ".output_name"; auto remove_output_name_file = [&path_output_name, &src_path]() { try { if (boost::filesystem::exists(path_output_name)) @@ -288,10 +288,29 @@ bool run_post_process_scripts(std::string &src_path, bool make_copy, const std:: std::string new_output_name; std::getline(f, new_output_name); f.close(); + + if (host == "File") { + boost::filesystem::path op(new_output_name); + if (op.is_relative() && op.has_filename() && op.parent_path().empty()) { + // Is this just a filename? Make it an absolute path. + auto outpath = boost::filesystem::path(output_name).parent_path(); + outpath /= op.string(); + new_output_name = outpath.string(); + } + else { + if (! op.is_absolute() || ! op.has_filename()) + throw Slic3r::RuntimeError("Unable to parse desired new path from output name file"); + } + if (! boost::filesystem::exists(op.parent_path())) + throw Slic3r::RuntimeError(Slic3r::format("Output directory does not exist: %1%", op.parent_path().string())); + } + BOOST_LOG_TRIVIAL(trace) << "Post-processing script changed the file name from " << output_name << " to " << new_output_name; output_name = new_output_name; } catch (const std::exception &err) { - BOOST_LOG_TRIVIAL(error) << Slic3r::format("Failed reading a file %1% carrying the final name / path of a G-code file: %2%", path_output_name, err.what()); + throw Slic3r::RuntimeError(Slic3r::format("run_post_process_scripts: Failed reading a file %1% " + "carrying the final name / path of a G-code file: %2%", + path_output_name, err.what())); } remove_output_name_file(); }