redream.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #include "plisthpp/redream.h"
  2. #include <QFile>
  3. #include <QDebug>
  4. #include <QDir>
  5. #include "plisthpp/Plist.hpp"
  6. #include <array>
  7. //#include "projectcfg.h"
  8. //#include "Bll/roominfo.h"
  9. //#include "Bll/roominfomgr.h"
  10. static Redream *s_redream = nullptr;
  11. Redream* Redream::getInstance()
  12. {
  13. if (s_redream == nullptr)
  14. {
  15. s_redream = new (std::nothrow) Redream;
  16. }
  17. return s_redream;
  18. }
  19. // 创建房间时创建一个red模版
  20. bool Redream::createRedream(QString filePath)
  21. {
  22. PlistDict dict;
  23. QString templateFilename(":/template.red");
  24. if (!QFile::exists(templateFilename)) {
  25. qDebug() << "无法找到ccb模版文件";
  26. return false;
  27. }
  28. QString generatedTemplate = filePath;
  29. if (!QFile::copy(templateFilename, generatedTemplate)) {
  30. qDebug() << "未正确生成ccb文件";
  31. return false;
  32. }
  33. return true;
  34. }
  35. // 创建物件时导入red文件
  36. void Redream::addObjectToRedream(std::string filePath, std::vector<std::string> object)
  37. {
  38. PlistDict dict;
  39. Plist::readPlist(filePath.c_str(), dict);
  40. QDir().remove(QString(filePath.c_str()));
  41. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  42. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  43. for (int i = 0; i < object.size(); i++) {
  44. PlistDict furnitureDict = _addChildren(object.at(i));
  45. ret.push_back(furnitureDict);
  46. }
  47. dictNodeGraph["children"] = ret;
  48. dict["nodeGraph"] = dictNodeGraph;
  49. Plist::writePlistXML(filePath.c_str(), dict);
  50. }
  51. // 创建家具时导入red文件
  52. void Redream::addFurnitureToRedream(std::string filePath, std::string furnitureId)
  53. {
  54. PlistDict dict;
  55. Plist::readPlist(filePath.c_str(), dict);
  56. QDir().remove(QString(filePath.c_str()));
  57. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  58. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  59. PlistDict furnitureDict = _addChildren(furnitureId);
  60. ret.push_back(furnitureDict);
  61. dictNodeGraph["children"] = ret;
  62. dict["nodeGraph"] = dictNodeGraph;
  63. Plist::writePlistXML(filePath.c_str(), dict);
  64. }
  65. // 从red文件中删除一个物件
  66. void Redream::deleteObjectFromRedream(std::string filePath, std::vector<std::string> object)
  67. {
  68. PlistDict dict;
  69. Plist::readPlist(filePath.c_str(), dict);
  70. QDir().remove(QString(filePath.c_str()));
  71. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  72. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  73. for (auto it = ret.begin(); it != ret.end(); it++) {
  74. for (std::string furnitureId : object) {
  75. PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  76. if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
  77. ret.erase(it);
  78. }
  79. }
  80. }
  81. dictNodeGraph["children"] = ret;
  82. dict["nodeGraph"] = dictNodeGraph;
  83. Plist::writePlistXML(filePath.c_str(), dict);
  84. }
  85. //从red文件中获取时间线列表
  86. QList<QString> Redream::getTimelineFromRedream(std::string filePath)
  87. {
  88. PlistDict dict;
  89. QList<QString> timelineList;
  90. Plist::readPlist(filePath.c_str(), dict);
  91. PlistArray dictSeq = boost::any_cast<PlistArray&>(dict["sequences"]);
  92. for(auto it = dictSeq.begin();it != dictSeq.end();it++){
  93. PlistDict seqDict = boost::any_cast<PlistDict&>(*it);
  94. std::string timeline = boost::any_cast<std::string&>(seqDict["name"]);
  95. timelineList.push_back(QString::fromStdString(timeline));
  96. }
  97. return timelineList;
  98. }
  99. // 从red文件中删除一个家具
  100. void Redream::deleteFurnitureFromRedream(std::string filePath, std::string furnitureId)
  101. {
  102. PlistDict dict;
  103. Plist::readPlist(filePath.c_str(), dict);
  104. QDir().remove(QString(filePath.c_str()));
  105. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  106. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  107. for (auto it = ret.begin(); it != ret.end(); it++) {
  108. PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  109. if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
  110. ret.erase(it);
  111. break;
  112. }
  113. }
  114. dictNodeGraph["children"] = ret;
  115. dict["nodeGraph"] = dictNodeGraph;
  116. Plist::writePlistXML(filePath.c_str(), dict);
  117. }
  118. std::array<qreal, 2> Redream::getFurniturePos(std::string filePath, std::string furnitureId)
  119. {
  120. std::array<qreal, 2> pos = {0.0, 0.0};
  121. PlistDict dict;
  122. Plist::readPlist(filePath.c_str(), dict);
  123. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  124. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  125. for (auto it = ret.begin(); it != ret.end(); it++) {
  126. PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  127. if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
  128. PlistArray properties = boost::any_cast<PlistArray&>(furnitureDict["properties"]);
  129. for (auto it_pro = properties.begin(); it_pro != properties.end(); it_pro++) {
  130. PlistDict dict = boost::any_cast<PlistDict&>(*it_pro);
  131. if (boost::any_cast<std::string&>(dict["name"]) == "position") {
  132. PlistArray posArr = boost::any_cast<PlistArray&>(dict["value"]);
  133. qreal x = boost::any_cast<qreal>(posArr.at(0));
  134. qreal y = boost::any_cast<qreal>(posArr.at(1));
  135. pos = {x, y};
  136. break;
  137. }
  138. }
  139. }
  140. }
  141. return pos;
  142. }
  143. PlistDict Redream::_addChildren(std::string furnitureId)
  144. {
  145. PlistDict furnitureDict;
  146. furnitureDict["animatedProperties"] = PlistDict();
  147. furnitureDict["baseClass"] = std::string("CCSprite");
  148. furnitureDict["children"] = PlistArray();
  149. furnitureDict["customClass"] = std::string("");
  150. furnitureDict["customProperties"] = PlistArray();
  151. furnitureDict["displayName"] = furnitureId;
  152. furnitureDict["expand"] = false;
  153. furnitureDict["hidden"] = false;
  154. furnitureDict["locked"] = false;
  155. furnitureDict["memberVarAssignmentName"] = std::string("");
  156. furnitureDict["memberVarAssignmentType"] = 0;
  157. furnitureDict["properties"] = _addProperties(furnitureId);
  158. furnitureDict["seqExpanded"] = false;
  159. return furnitureDict;
  160. }
  161. PlistArray Redream::_addProperties(std::string furnitureId)
  162. {
  163. PlistArray properties;
  164. PlistDict position;
  165. position["name"] = std::string("position");
  166. position["type"] = std::string("Position");
  167. position["value"] = PlistArray({0.0f, 0.0f, 0, 0, 0});
  168. properties.push_back(position);
  169. PlistDict anchorPoint;
  170. anchorPoint["name"] = std::string("anchorPoint");
  171. anchorPoint["type"] = std::string("Point");
  172. anchorPoint["value"] = PlistArray({0.5f, 0.5f});
  173. properties.push_back(anchorPoint);
  174. PlistDict tag;
  175. tag["name"] = std::string("tag");
  176. tag["type"] = std::string("Integer");
  177. tag["value"] = 0;
  178. properties.push_back(tag);
  179. PlistDict ignoreAnchor;
  180. ignoreAnchor["name"] = std::string("ignoreAnchorPointForPosition");
  181. ignoreAnchor["type"] = std::string("Check");
  182. ignoreAnchor["value"] = false;
  183. properties.push_back(ignoreAnchor);
  184. PlistDict opacity;
  185. opacity["name"] = std::string("opacity");
  186. opacity["type"] = std::string("Byte");
  187. opacity["value"] = 255;
  188. properties.push_back(opacity);
  189. PlistDict color;
  190. color["name"] = std::string("color");
  191. color["type"] = std::string("Color3");
  192. color["value"] = PlistArray({255, 255, 255});
  193. properties.push_back(color);
  194. PlistDict displayFrame;
  195. displayFrame["name"] = std::string("displayFrame");
  196. displayFrame["type"] = std::string("SpriteFrame");
  197. displayFrame["value"] = PlistArray({std::string(""), "full_preview_" + furnitureId + ".png"});
  198. properties.push_back(displayFrame);
  199. return properties;
  200. }
  201. void Redream::checkFurnitureIsLost(std::string filePath, std::string furnitureId)
  202. {
  203. PlistDict dict;
  204. Plist::readPlist(filePath.c_str(), dict);
  205. QDir().remove(QString(filePath.c_str()));
  206. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  207. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  208. for (auto it = ret.begin(); it != ret.end(); it++) {
  209. PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  210. if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
  211. qDebug() << "find node in redream";
  212. return;
  213. }
  214. }
  215. PlistDict furnitureDict = _addChildren(furnitureId);
  216. ret.push_back(furnitureDict);
  217. dictNodeGraph["children"] = ret;
  218. dict["nodeGraph"] = dictNodeGraph;
  219. Plist::writePlistXML(filePath.c_str(), dict);
  220. }
  221. //void Redream::syncAllFurnitureRedreamNodes(QString roomId)
  222. //{
  223. // RoomInfo* room = RoomInfoMgr::getInstance()->getRoomInfoById(roomId);
  224. // QString path = ProjectCfg::getInstance()->getCCBDirPath() + "/" + room->getRoomId() + "/ccb/" + room->getRoomId() + ".red";
  225. // PlistDict dict;
  226. // Plist::readPlist(path.toStdString().c_str(), dict);
  227. //// QDir().remove(QString(path.toStdString().c_str()));
  228. // PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  229. // PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  230. // for(int i = 0; i < room->getObjectInfoList().size(); i++)
  231. // {
  232. // ObjectInfo* object = room->getObjectInfoList().at(i);
  233. // if (object->getObjectStatus() == OBJECT_STATUS_DELETED)
  234. // continue;
  235. // foreach (FurnitureInfo* info, object->getFurnitureInfoList()) {
  236. // bool found = false;
  237. // for (auto it = ret.begin(); it != ret.end(); it++) {
  238. // PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  239. // if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == info->getFurnitureId().toStdString()) {
  240. // found = true;
  241. // break;
  242. // }
  243. // }
  244. // if (!found)
  245. // {
  246. // PlistDict furnitureDict = _addChildren(info->getFurnitureId().toStdString());
  247. // ret.push_back(furnitureDict);
  248. // }
  249. // foreach (FurnitureInfo* adInfo, info->getAdjunctFurnitureList()) {
  250. // bool found = false;
  251. // for (auto it = ret.begin(); it != ret.end(); it++) {
  252. // PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  253. // if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == adInfo->getFurnitureId().toStdString()) {
  254. // found = true;
  255. // break;
  256. // }
  257. // }
  258. // if (!found)
  259. // {
  260. // PlistDict adfurnitureDict = _addChildren(adInfo->getFurnitureId().toStdString());
  261. // ret.push_back(adfurnitureDict);
  262. // }
  263. // }
  264. // }
  265. // }
  266. // dictNodeGraph["children"] = ret;
  267. // dict["nodeGraph"] = dictNodeGraph;
  268. // Plist::writePlistXML(path.toStdString().c_str(), dict);
  269. //}
  270. int Redream::getFurnitureLocalZOrder(std::string filePath, std::string furnitureId)
  271. {
  272. PlistDict dict;
  273. Plist::readPlist(filePath.c_str(), dict);
  274. PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
  275. PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
  276. for (auto it = ret.begin(); it != ret.end(); it++) {
  277. PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
  278. if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
  279. int index = it - ret.begin();
  280. return index;
  281. }
  282. }
  283. }