How-To: Use BuildMasterAssemblyModel function

SC::Store::AssemblyTree::BuildMasterAssemblyModel will gather part modes and create the master assembly model.

Sample Code

  1. There are two models, microengine1.scz and microengine2.scz, in C:\HOOPS_Communicator\quick_start\converted_models\authoring_samples_data
  2. Combine two models and create a assembly model “combine_microengine_sample”.
int
CombineSample(const std::string& model_path)
{
	std::string cache_path = "C:\\HOOPS_Communicator_2021\\quick_start\\converted_models\\authoring_samples_data";
	std::string model_name = "combine_microengine_sample";

	ApplicationLogger logger;
	try {
		// Open the cache
		SC::Store::Database::SetLicense(HOOPS_LICENSE);
		SC::Store::Cache cache = SC::Store::Database::Open(logger);

		SC::Store::AssemblyTree assembly_tree(logger);
		uint32_t root_id = 0;
		assembly_tree.CreateAssemblyTreeRoot(root_id);
		assembly_tree.SetNodeName(root_id, "assemblytree_sample");
		uint32_t child_node = 0;
		assembly_tree.CreateChild(root_id, child_node);
		assembly_tree.SetNodeName(child_node, "first");
		bool res = assembly_tree.SetExternalModel(child_node, "microengine1");

		float matrix_data[] = {
			1.0f, 0.0f, 0.0f,
			0.0f, 1.0f, 0.0f,
			0.0f, 0.0f, 1.0f,
			0.0f, 100.0f, 0.0f,
		};
		SC::Store::Matrix3d * matrix = (SC::Store::Matrix3d *)matrix_data;

		assembly_tree.CreateChild(root_id, child_node);
		assembly_tree.SetNodeName(child_node, "second");
		res = assembly_tree.SetExternalModel(child_node, "microengine2");
		assembly_tree.SetNodeLocalTransform(child_node, *matrix);

		std::string modelPath = cache_path + "\\" + model_name;
		if (cache.Exists((cache_path + "\\" + model_name).c_str())) {
			printf("Model already exists.\n");
			return 1;
		}
		res = assembly_tree.BuildMasterAssemblyModel(cache_path.c_str(), modelPath.c_str(), cache_path.c_str(), false);
	}
	catch (std::exception const & e)
	{
		std::string message("Exception: ");
		message.append(e.what());
		message.append("\n");
		logger.Message(message.c_str());
		return 1;
	}

	return 0;
}