Geometry Nodes: Replace String node

This commit adds a node that can be used to find and replace strings
inside of the input string. One initial use case is to have an easier
way to add line breaks to strings to the string to curves node.

Differential Revision: https://developer.blender.org/D12721
This commit is contained in:
Erik Abrahamsson 2021-10-19 15:27:47 -05:00 committed by Hans Goudey
parent 85c8dd6c96
commit a83b405a45
7 changed files with 73 additions and 0 deletions

View File

@ -720,6 +720,7 @@ geometry_node_categories = [
NodeItem("GeometryNodeStringJoin"),
NodeItem("FunctionNodeInputSpecialCharacters"),
NodeItem("GeometryNodeStringToCurves"),
NodeItem("FunctionNodeReplaceString"),
]),
GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
NodeItem("ShaderNodeTexGradient"),

View File

@ -1566,6 +1566,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define FN_NODE_ROTATE_EULER 1215
#define FN_NODE_ALIGN_EULER_TO_VECTOR 1216
#define FN_NODE_INPUT_COLOR 1217
#define FN_NODE_REPLACE_STRING 1218
/** \} */

View File

@ -5879,6 +5879,7 @@ static void registerFunctionNodes()
register_node_type_fn_input_vector();
register_node_type_fn_input_color();
register_node_type_fn_random_value();
register_node_type_fn_replace_string();
register_node_type_fn_rotate_euler();
register_node_type_fn_string_length();
register_node_type_fn_string_substring();

View File

@ -145,6 +145,7 @@ set(SRC
function/nodes/node_fn_input_vector.cc
function/nodes/node_fn_input_color.cc
function/nodes/node_fn_random_value.cc
function/nodes/node_fn_replace_string.cc
function/nodes/node_fn_rotate_euler.cc
function/nodes/node_fn_string_length.cc
function/nodes/node_fn_string_substring.cc

View File

@ -31,6 +31,7 @@ void register_node_type_fn_input_string(void);
void register_node_type_fn_input_vector(void);
void register_node_type_fn_input_color(void);
void register_node_type_fn_random_value(void);
void register_node_type_fn_replace_string(void);
void register_node_type_fn_rotate_euler(void);
void register_node_type_fn_string_length(void);
void register_node_type_fn_string_substring(void);

View File

@ -274,6 +274,7 @@ DefNode(FunctionNode, FN_NODE_INPUT_SPECIAL_CHARACTERS, 0, "INPUT_SPECIAL_CHARAC
DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "")
DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "")
DefNode(FunctionNode, FN_NODE_RANDOM_VALUE, def_fn_random_value, "RANDOM_VALUE", RandomValue, "Random Value", "")
DefNode(FunctionNode, FN_NODE_REPLACE_STRING, 0, "REPLACE_STRING", ReplaceString, "Replace String", "")
DefNode(FunctionNode, FN_NODE_ROTATE_EULER, def_fn_rotate_euler, "ROTATE_EULER", RotateEuler, "Rotate Euler", "")
DefNode(FunctionNode, FN_NODE_STRING_LENGTH, 0, "STRING_LENGTH", StringLength, "String Length", "")
DefNode(FunctionNode, FN_NODE_STRING_SUBSTRING, 0, "STRING_SUBSTRING", StringSubstring, "String Substring", "")

View File

@ -0,0 +1,67 @@
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "BLI_string_utf8.h"
#include "node_function_util.hh"
namespace blender::nodes {
static void fn_node_replace_string_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::String>("String");
b.add_input<decl::String>("Find").description("The string to find in the input string");
b.add_input<decl::String>("Replace").description("The string to replace each match with");
b.add_output<decl::String>("String");
};
} // namespace blender::nodes
static std::string replace_all(std::string str, const std::string &from, const std::string &to)
{
if (from.length() <= 0) {
return str;
}
const size_t step = to.length() > 0 ? to.length() : 1;
size_t offset = 0;
while ((offset = str.find(from, offset)) != std::string::npos) {
str.replace(offset, from.length(), to);
offset += step;
}
return str;
}
static void fn_node_replace_string_build_multi_function(
blender::nodes::NodeMultiFunctionBuilder &builder)
{
static blender::fn::CustomMF_SI_SI_SI_SO<std::string, std::string, std::string, std::string>
substring_fn{"Replace",
[](const std::string &str,
const std::string &find,
const std::string &replace) { return replace_all(str, find, replace); }};
builder.set_matching_fn(&substring_fn);
}
void register_node_type_fn_replace_string()
{
static bNodeType ntype;
fn_node_type_base(&ntype, FN_NODE_REPLACE_STRING, "Replace String", NODE_CLASS_CONVERTER, 0);
ntype.declare = blender::nodes::fn_node_replace_string_declare;
ntype.build_multi_function = fn_node_replace_string_build_multi_function;
nodeRegisterType(&ntype);
}