citrus.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. 'use strict';
  2. var CopyStr = function (str) {
  3. var input = str;
  4. const el = document.createElement('textarea');
  5. el.value = input;
  6. el.setAttribute('readonly', '');
  7. el.style.contain = 'strict';
  8. el.style.position = 'absolute';
  9. el.style.left = '-9999px';
  10. el.style.fontSize = '12pt'; // Prevent zooming on iOS
  11. const selection = getSelection();
  12. var originalRange = false;
  13. if (selection.rangeCount > 0) {
  14. originalRange = selection.getRangeAt(0);
  15. }
  16. document.body.appendChild(el);
  17. el.select();
  18. el.selectionStart = 0;
  19. el.selectionEnd = input.length;
  20. var success = false;
  21. try {
  22. success = document.execCommand('copy');
  23. } catch (err) { }
  24. document.body.removeChild(el);
  25. if (originalRange) {
  26. selection.removeAllRanges();
  27. selection.addRange(originalRange);
  28. }
  29. return success;
  30. }
  31. //第三个参数是否需要let
  32. var FindNodeParentName = function (CurrNode, ParentNode, HaveLet) {
  33. let temp_node = CurrNode
  34. let NameList = ""
  35. while (1) {
  36. if (temp_node.parent == ParentNode) {
  37. NameList += temp_node.name
  38. // NameList += temp_node.parent.name
  39. let c = NameList.split("-").reverse()
  40. let script_str
  41. if (HaveLet) {
  42. script_str = `let ${CurrNode.name} =this.node`
  43. for (let index = 0; index < c.length; index++) {
  44. const element = c[index];
  45. script_str += `.getChildByName("${element}")`
  46. }
  47. } else {
  48. script_str = []
  49. script_str.push(ParentNode.name)
  50. for (let index = 0; index < c.length; index++) {
  51. const element = c[index];
  52. script_str.push(element)
  53. }
  54. }
  55. return script_str
  56. } else {
  57. NameList += temp_node.name + "-"
  58. temp_node = temp_node.parent
  59. }
  60. }
  61. }
  62. //返回所有后代所有带精灵帧
  63. var SumNode = []//sprite[]
  64. var Return_ALL_Sp_By_Node = function (Curr_Node) {
  65. SumNode = []
  66. Return_ALL_Child(Curr_Node)
  67. return SumNode
  68. }
  69. //返回所有后代节点
  70. var Return_ALL_Child = function (m_node) {
  71. if (m_node.getComponent(cc.Sprite)) {
  72. SumNode.push(m_node)
  73. }
  74. m_node.children.forEach(e => {
  75. if (e.childrenCount > 0) {
  76. Return_ALL_Child(e)
  77. } else {
  78. if (e.getComponent(cc.Sprite)) {
  79. SumNode.push(e)
  80. }
  81. }
  82. })
  83. }
  84. //判断是否是默认图片
  85. var Check_Is_Default_Image = function (data) {
  86. let d = "atom@atom@default_panel@default_sprite@default-particle@default_scrollbar@default_btn_normal@default_editbox_bg@default_btn_pressed@default_progressbar@default_btn_disabled@default_scrollbar_bg@default_sprite_splash@default_toggle_normal@default_progressbar_bg@default_toggle_pressed@default_radio_button_on@default_toggle_disabled@default_radio_button_off@default_toggle_checkmark@default_scrollbar_vertical@default_scrollbar_vertical_bg"
  87. if (d.split("@").indexOf(data) > -1) {
  88. return true
  89. } else {
  90. return false
  91. }
  92. }
  93. //在资源文件夹得到资源文件夹里面的UUid的路径
  94. var In_Assent_By_UUID_Return_DbPath = function (uuid) { return Editor.remote.assetdb.uuidToUrl(uuid) }
  95. //在资源文件夹根据uuid获得名字
  96. var In_Assent_By_UUID_Return_Name = function (uuid) {
  97. let d = Editor.assetdb.assetInfoByUuid(uuid).path.split("/")[c.length - 1]
  98. let c = d
  99. return c
  100. }
  101. //在场景中得到节点上的Sp的UUid
  102. var In_Scene_By_Node_SpriteFrame_Return_UUID = function (m_node) { return m_node.getComponent(cc.Sprite).spriteFrame._uuid }
  103. var Get_One_Prefab_Json = function (Curr_Node) {
  104. var Prefabjson = []
  105. Return_ALL_Sp_By_Node(Curr_Node).forEach(e => {
  106. //如果图片帧存在 并且不是默认图片
  107. if (e.getComponent(cc.Sprite).spriteFrame && !Check_Is_Default_Image(e.getComponent(cc.Sprite).spriteFrame.name)) {
  108. let subJson = {}
  109. let nameList
  110. if (e.uuid == Curr_Node.uuid) {
  111. nameList = Curr_Node.name
  112. } else {
  113. nameList = FindNodeParentName(e, Curr_Node, false)
  114. }
  115. subJson["FindMe"] = nameList
  116. let split_str_arry = In_Assent_By_UUID_Return_DbPath(In_Scene_By_Node_SpriteFrame_Return_UUID(e)).slice(5).split("/")
  117. let temp_ppp = ""
  118. for (let index = 0; index < split_str_arry.length - 1; index++) {
  119. const element = split_str_arry[index];
  120. if (index == split_str_arry.length - 2) {
  121. temp_ppp += element
  122. break
  123. }
  124. temp_ppp += element + "/"
  125. }
  126. subJson["ImagePath"] = temp_ppp
  127. // Alljson[Curr_Node.name + "-" + e.name] = subJson
  128. Prefabjson.push(subJson)
  129. }
  130. })
  131. return Prefabjson
  132. }
  133. var Get_One_Prefab_image = function (Curr_Node) {
  134. let Prefabimage = []
  135. Return_ALL_Sp_By_Node(Curr_Node).forEach(e => {
  136. //如果图片帧存在 并且不是默认图片
  137. if (e.getComponent(cc.Sprite).spriteFrame && !Check_Is_Default_Image(e.getComponent(cc.Sprite).spriteFrame.name)) {
  138. Prefabimage.push(e)
  139. }
  140. })
  141. return Prefabimage
  142. }
  143. var WriteFile = function (data) {
  144. Editor.assetdb.createOrSave('db://assets/citrus.json', data);
  145. }
  146. //获得URL的后缀 db://assets/Texture/HelloWorld.png 得到.png
  147. var GetUrlType = function (url) {
  148. let temp = (url).split('.')
  149. return "." + temp[temp.length - 1]
  150. }
  151. //获得URL的名字 db://assets/Texture/HelloWorld.png 得到HelloWorld
  152. var GetUrlName = function (url) {
  153. let temp = (url).split('/')
  154. return temp[temp.length - 1].replace(GetUrlType(url), "")
  155. }
  156. //获得URL的名字前的路径 db://assets/Texture/HelloWorld.png 得到 db://assets/Texture/
  157. var GetUrlBeforeName = function (url) {
  158. return url.replace(GetUrlName(url) + GetUrlType(url), "")
  159. }
  160. //图片字典
  161. var iamgeData = new Map();
  162. //加载几个图片
  163. var imageCount
  164. let CitrusFuncs =
  165. {
  166. //设置显示与否
  167. 'citrus-active'(event) {
  168. let nodes = Editor.Selection.curSelection('node');
  169. if (nodes && nodes.length != 0) {
  170. let active = cc.engine.getInstanceById(nodes[0]).active;
  171. for (let i = 0; i < nodes.length; i++) {
  172. const id = nodes[i];
  173. let node = cc.engine.getInstanceById(id)
  174. if (node) {
  175. node.active = !active;
  176. }
  177. }
  178. }
  179. },
  180. 'citrus-getThree'(event) {
  181. let CurrNodeThree = Editor.Selection.curSelection('node');
  182. if (CurrNodeThree.length > 1) {
  183. let Curr_Node_Parent = cc.engine.getInstanceById(CurrNodeThree[0])
  184. let citrus_script_str = ""
  185. for (let index = 1; index < CurrNodeThree.length; index++) {
  186. const element = cc.engine.getInstanceById(CurrNodeThree[index])
  187. citrus_script_str += FindNodeParentName(element, Curr_Node_Parent, true) + "\n"
  188. }
  189. CopyStr(citrus_script_str)
  190. Editor.info('Citrus_复制节点树成功!');
  191. return
  192. } else {
  193. Editor.info('Citrus_复制节点树失败!')
  194. return
  195. }
  196. },
  197. //不能有/ - @ 字符
  198. 'citrus-getImageThree'(event) {
  199. // 检测面板焦点在资源管理器还是层级管理器
  200. let activeInfo = Editor.Selection.curGlobalActivate()
  201. let CurrNodeThree
  202. if (activeInfo && activeInfo.type == "node") {
  203. CurrNodeThree = Editor.Selection.curSelection('node');
  204. if (CurrNodeThree.length > 0) {
  205. var AllJson = {}
  206. for (let index = 0; index < CurrNodeThree.length; index++) {
  207. const element = cc.engine.getInstanceById(CurrNodeThree[index]);
  208. AllJson[element.name] = Get_One_Prefab_Json(element)
  209. }
  210. WriteFile(JSON.stringify(AllJson))
  211. Editor.info('Citrus_json树成功!')
  212. }
  213. }
  214. else if (activeInfo && activeInfo.type == "asset") {
  215. CurrNodeThree = Editor.Selection.curSelection('asset');
  216. }
  217. },
  218. 'citrus-LoadingImagee'(event) {
  219. cc.log('Citrus_你等我会儿!')
  220. //先加载图片
  221. Editor.assetdb.queryAssets('db://assets/CitrusImage/**\/*', 'sprite-frame', function (err, results) {
  222. imageCount = results.length
  223. results.forEach(function (result, iindex) {
  224. let temp = (result.url).split('/')
  225. let imageName = temp[temp.length - 1]
  226. cc.loader.load({ uuid: result.uuid }, (err, image) => {
  227. iamgeData.set(imageName, image);
  228. imageCount -= 1
  229. if (imageCount == 0) {
  230. Editor.info('Citrus_资源图片个数' + results.length)
  231. Editor.info('Citrus_资源加载完毕!')
  232. }
  233. });
  234. });
  235. });
  236. },
  237. //替换图片
  238. 'citrus-ReplaceImagee'(event) {
  239. // 检测面板焦点在资源管理器还是层级管理器
  240. let activeInfo = Editor.Selection.curGlobalActivate()
  241. let CurrNodeThree
  242. if (activeInfo && activeInfo.type == "node") {
  243. CurrNodeThree = Editor.Selection.curSelection('node');
  244. if (CurrNodeThree.length > 0) {
  245. //赋值
  246. for (let index = 0; index < CurrNodeThree.length; index++) {
  247. const element = cc.engine.getInstanceById(CurrNodeThree[index]);
  248. let vvvv = Get_One_Prefab_image(element)
  249. for (let iii = 0; iii < vvvv.length; iii++) {
  250. let e = vvvv[iii];
  251. e.getComponent(cc.Sprite).spriteFrame = iamgeData.get(e.getComponent(cc.Sprite).spriteFrame.name)
  252. }
  253. }
  254. Editor.info('Citrus_替换成功!')
  255. }
  256. }
  257. },
  258. //得到nodejson属性
  259. 'citrus-Nodejson'(event) {
  260. // 检测面板焦点在资源管理器还是层级管理器
  261. let activeInfo = Editor.Selection.curGlobalActivate()
  262. let CurrNodeThree
  263. if (activeInfo && activeInfo.type == "node") {
  264. CurrNodeThree = Editor.Selection.curSelection('node');
  265. if (CurrNodeThree.length > 0) {
  266. let setNode = cc.engine.getInstanceById(CurrNodeThree[0]);
  267. let parentJson = {}
  268. for (let index = 1; index < CurrNodeThree.length; index++) {
  269. const element = cc.engine.getInstanceById(CurrNodeThree[index]);
  270. let subJson = {}
  271. if (setNode.position.x != 0) { subJson["PosX"] = element.position.x }
  272. if (setNode.position.y != 0) { subJson["PosY"] = element.position.y }
  273. if (setNode.rotation != 0) { subJson["rotation"] = element.rotation }
  274. if (setNode.scaleX != 0) { subJson["scaleX"] = element.scaleX }
  275. if (setNode.scaleY != 0) { subJson["scaleY"] = element.scaleY }
  276. if (setNode.anchorX != 0) { subJson["anchorX"] = element.anchorX }
  277. if (setNode.anchorY != 0) { subJson["anchorY"] = element.anchorY }
  278. if (setNode.getContentSize().width != 0) { subJson["width"] = element.getContentSize().width }
  279. if (setNode.getContentSize().height != 0) { subJson["height"] = element.getContentSize().height }
  280. if (setNode.opacity != 0) { subJson["opacity"] = element.opacity }
  281. if (setNode.skewX != 0) { subJson["skewX"] = element.skewX }
  282. if (setNode.skewY != 0) { subJson["skewY"] = element.skewY }
  283. parentJson[element.name] = subJson
  284. }
  285. CopyStr(JSON.stringify(parentJson))
  286. Editor.info('Citrus_NodeJson-剪切板成功!')
  287. }
  288. }
  289. },
  290. //批量重命名节点名字
  291. 'citrus-RestSetName'(event) {
  292. // 检测面板焦点在资源管理器还是层级管理器
  293. let activeInfo = Editor.Selection.curGlobalActivate()
  294. let ScenceNode, AssetsNode//场景节点,资源节点
  295. if (activeInfo && activeInfo.type == "node") {
  296. ScenceNode = Editor.Selection.curSelection('node');
  297. let NodeName = cc.engine.getInstanceById(ScenceNode[0]).name;//citrus123
  298. let NameNum = parseInt(NodeName.replace(/[^0-9]/ig, ""));//123
  299. if (!NameNum) {
  300. return Editor.error('节点名称里面没有数字:请设置数字')
  301. }
  302. for (let i = 0; i < ScenceNode.length; i++) {
  303. let temp1, temp2
  304. temp1 = NodeName
  305. temp2 = NodeName
  306. const element = ScenceNode[i];
  307. cc.engine.getInstanceById(element).name = NodeName.replace(NameNum, NameNum + i)
  308. }
  309. Editor.info('Citrus_设置场景名称成功!')
  310. }
  311. if (activeInfo && activeInfo.type == "asset") {
  312. AssetsNode = Editor.Selection.curSelection('asset');
  313. if (AssetsNode.length < 2) {
  314. return Editor.error('选择的太少了最少2个')
  315. }
  316. Editor.assetdb.queryInfoByUuid(AssetsNode[0], function (err, info) { // info.path// info.url // info.type
  317. if (!GetUrlType(info.url).includes("/")) {
  318. let MainName = GetUrlName(info.url)
  319. let NameNum = parseInt(MainName.replace(/[^0-9]/ig, ""));//123
  320. if (!NameNum) {
  321. return Editor.error('节点名称里面没有数字:请设置数字')
  322. }
  323. let ADDnum = 1
  324. for (let i = 1; i < AssetsNode.length; i++) {
  325. const element = AssetsNode[i];
  326. // 打印文件信息
  327. Editor.assetdb.queryInfoByUuid(element, function (err, info) { // info.path// info.url // info.type
  328. if (!GetUrlType(info.url).includes("/")) {
  329. let Type = GetUrlType(info.url)
  330. let BeforeName = GetUrlBeforeName(info.url)
  331. let newName = MainName.replace(NameNum, NameNum + ADDnum++)
  332. Editor.assetdb.move(info.url, BeforeName + newName + Type);
  333. }
  334. });
  335. }
  336. }
  337. });
  338. // Editor.assetdb.move("db://assets/Texture/HelloWorld.png", "db://assets/Texture/HelloWorld222.png");
  339. //移动、重命名文件
  340. // Editor.assetdb.move("db://assets/foo/bar/foobar.js", "db://assets/foo/bar/foobar02.js");
  341. Editor.info('Citrus_设置资源名称成功!')
  342. }
  343. },
  344. };
  345. module.exports = CitrusFuncs;