test_ece_crawl

download sketchfab models

  1. // ==UserScript==
  2. // @name test_ece_crawl
  3. // @version 2.12
  4. // @description download sketchfab models
  5. // @author qqingzheng
  6. // @match *://*.sketchfab.com/*
  7. // @require https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jszip/3.1.5/jszip.min.js
  8. // @require https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jszip-utils/0.1.0/jszip-utils.min.js
  9. // @require https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/FileSaver.js/1.3.8/FileSaver.min.js
  10. // @require https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js
  11. // @require https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.min.js
  12. // @run-at document-start
  13. // @grant unsafeWindow
  14. // @grant GM_download
  15. // @namespace https://greasyfork.org/users/1330796
  16. // ==/UserScript==
  17.  
  18. var _DivideType = 0;
  19. var _OpenDownload = 1;
  20. var _OpenFav = 1;
  21. var _ExtJpeg = 0;
  22.  
  23. var zip = new JSZip();
  24. let folder = zip.folder('collection');
  25.  
  26. var button_dw = false;
  27. var func_drawGeometry = /(this\._stateCache\.drawGeometry\(this\._graphicContext,t\))/g;
  28. var fund_drawArrays = /t\.drawArrays\(t\.TRIANGLES,0,6\)/g;
  29. var func_renderInto1 = /x\.renderInto\(n,S,y/g;
  30. var func_renderInto2 = /g\.renderInto=function\(e,i,r/g;
  31. var func_getResourceImage = /getResourceImage:function\(e,t\){/g;
  32.  
  33.  
  34. var _FreeMemory = 0;
  35. var addbtnfunc;
  36. var createPreview, createLinkFile, getUri;
  37. var gr_id, gr_url, gr_imgUrl, gr_imgName, gr_texNums, gr_info, dl_btn, dl_title, dl_status, timeID, objNums, objNamePext={}, mtl="", previewName="预览图.jpeg", linkFileName="快捷方式.url", imgNamePextList={};
  38.  
  39. var _disPlayMod = 1;
  40. var mid, url, freedl, list, favList={}, favType={}, webUrl=location.href, webSite, colNums, colTop, searchPage=1;
  41. let resourceReady = false;
  42. let resourceTimer = null;
  43.  
  44. if (webUrl.indexOf('/models/') > -1) {
  45. webSite = 'page_models';
  46. } else if (webUrl.indexOf('/3d-models/popular') > -1) {
  47. webSite = 'page_popular';
  48. }
  49.  
  50. if (webSite == 'page_models' && window.top.document.body.clientWidth > 1500) window.top.document.body.style.width = '1500px';
  51.  
  52.  
  53. function getByteLength(str) {
  54. let byteLength = 0;
  55. for (let i = 0; i < str.length; i++) {
  56. const charCode = str.charCodeAt(i);
  57. if (charCode <= 0x7F) {
  58. byteLength += 1;
  59. } else if (charCode <= 0x7FF) {
  60. byteLength += 2;
  61. } else if (charCode <= 0xFFFF) {
  62. byteLength += 3;
  63. } else {
  64. byteLength += 4;
  65. }
  66. }
  67. return byteLength;
  68. }
  69.  
  70. (function() {
  71. 'use strict';
  72. if(webSite != 'page_models' && !_OpenDownload) return;
  73.  
  74. var window = unsafeWindow;
  75.  
  76. window.allmodel = [];
  77. var saveimagecache1 = {};
  78. var saveimagecache2 = {};
  79. var objects = {};
  80.  
  81. var gr_iframe;
  82.  
  83. let gr_canvas = document.createElement('canvas');
  84. gr_canvas.width = 100;
  85. gr_canvas.height = 100;
  86. let gr_context = gr_canvas.getContext('2d');
  87. let gr_temp,gr_data,gr_imageData;
  88.  
  89.  
  90. window.addEventListener('message',function(e){
  91. if (e.data.status == 6) {
  92. var res = e.data.modelInfo;
  93. gr_imgName = previewName;
  94. gr_imgUrl = res.imgUrl;
  95. gr_url = res.viewerUrl;
  96. gr_texNums = res.textureCount;
  97. createPreview(gr_imgUrl, gr_imgName, "jpeg", 1);
  98. createLinkFile(gr_url, linkFileName);
  99. if(dl_status) dl_status.innerHTML = "Please wait... /tex: " + gr_texNums;
  100. }
  101. });
  102.  
  103. getUri = function() {
  104. gr_id = location.href.replace(/\?.+/g,'');
  105. if (gr_id.indexOf("sketchfab.com/models") > -1) {
  106. gr_id = gr_id.replace(/.+\/models\/([^\/]+?)\/.+/g,'$1');
  107. } else {
  108. gr_id="";
  109. return;
  110. }
  111. var data = {"postType": "getModelInfo", "postData": {"member": _ACCOUNT, "mid":gr_id}};
  112. gr_iframe.contentWindow.postMessage(data,'*');
  113. }
  114.  
  115. createPreview = function(url, fileName, mimeType, type) {
  116. if (mimeType == "jpg") mimeType = "jpeg";
  117. var image = new Image();
  118. image.src = url;
  119. image.setAttribute("crossOrigin", "Anonymous");
  120. image.onload = function() {
  121. var canvas = document.createElement("canvas");
  122. var setW = type == 1 ? image.width : 300;
  123. var setH = type == 1 ? image.height : 300;
  124. canvas.width = setW;
  125. canvas.height = setH;
  126. var context = canvas.getContext("2d");
  127. context.drawImage(image, 0, 0, setW, setH);
  128. canvas.toBlob(function(blob){objects[fileName] = blob;},"image/" + mimeType);
  129. };
  130. }
  131.  
  132. createLinkFile = function(linkURL, fileName) {
  133. var content = `[{000214A0-0000-0000-C000-000000000046}]
  134. Prop3=19,11
  135. [InternetShortcut]
  136. IDList=
  137. URL=${linkURL}
  138. IconFile=
  139. IconIndex=1`;
  140. var blob = new Blob([content]);
  141. objects[fileName] = blob;
  142. }
  143.  
  144. var showStatus = function() {
  145. dl_title.innerHTML = "Packing... ";
  146. setTimeout(()=>{dl_title.innerHTML = "";}, 250);
  147. }
  148.  
  149. var reImgName = function(oldName, uid) {
  150. var namePext = oldName.replace(/\.[^\.]+?$/g,"");
  151. var namePextL = namePext.toLowerCase();
  152. if (!imgNamePextList[namePextL]) {
  153. imgNamePextList[namePextL] = namePextL;
  154. return oldName;
  155. } else {
  156. namePext = namePext + "_" + uid;
  157. var ext = oldName.split(".").pop();
  158. var newName = namePext + "." + ext;
  159. return newName;
  160. }
  161. }
  162.  
  163. var saveimage_to_list = function(url,file_name)
  164. {
  165. if (!saveimagecache2[url])
  166. {
  167. var mdl = {
  168. name: file_name
  169. }
  170.  
  171. saveimagecache2[url] = mdl;
  172. }
  173. }
  174. addbtnfunc = function() {
  175. var p = document.evaluate("//div[@class='titlebar']", document, null, 9, null).singleNodeValue;
  176. if(p && !button_dw) {
  177. var btn = document.createElement("a");
  178. btn.setAttribute("id", "dl_btn");
  179. btn.innerHTML = "<pre style='color:#ff3e3e; text-shadow: 0 0 3px #454545; font-family: Arial; font-weight: bold;'>DOWNLOAD</pre>";
  180. btn.addEventListener("click", dodownload , false);
  181. p.appendChild(btn);
  182. // add status info
  183. var info = document.createElement("div");
  184. info.setAttribute("class", "dl_info");
  185. info.style.cssText = "color: #00d500; text-shadow: 0 0 3px #000000; z-index: 99; line-height: 1.5em; margin-top: 30px; font-size: 12px; font-weight: bold; letter-spacing: 1px; position: relative; text-align: right; padding-right: 10px; padding-left:10px;";
  186. info.innerHTML = "<span id='dl_title'></span><span id='dl_status'></span>";
  187. p.parentNode.insertBefore(info,p.nextSibling);
  188. gr_info = info;
  189. dl_btn = document.getElementById("dl_btn");
  190. dl_title = document.getElementById("dl_title");
  191. dl_status = document.getElementById("dl_status");
  192. dl_status.style.cssText = "background:#1fb10d; border-radius: 50px; padding: 0 10px; color:#fff;";
  193. button_dw = true;
  194. // add iframe
  195. gr_iframe = document.createElement("iframe");
  196. gr_iframe.setAttribute("id", "gr_iframe");
  197. gr_iframe.setAttribute("height", "10");
  198. gr_iframe.setAttribute("border", "0");
  199. gr_iframe.setAttribute("frameborder", "0");
  200. gr_iframe.setAttribute("src", "https://www.gieex.com/skf/iframe.html");
  201. document.body.appendChild(gr_iframe);
  202. waitdownload();
  203. } else {
  204. setTimeout(addbtnfunc, 3000);
  205. }
  206. }
  207. var waitdownload = function(){
  208. if(!resourceReady){
  209. setTimeout(waitdownload, 500);
  210. }else{
  211. setTimeout(dodownload, 200);
  212. }
  213. }
  214. var dodownload = function() {
  215. dl_btn.removeEventListener('click', dodownload, false);
  216. dl_btn.innerHTML = "";
  217. if (Object.keys(saveimagecache2).length > 0 && Object.keys(saveimagecache1).length != Object.keys(saveimagecache2).length && _DivideType != 1) {
  218. Object.keys(saveimagecache2).forEach(function(url) {
  219. if (!saveimagecache1[url]) {
  220. var ext;
  221. if (_ExtJpeg == 1) {
  222. ext = "jpeg";
  223. } else {
  224. ext = url.split(".").pop();
  225. }
  226. var ret = saveimagecache2[url].name.split(".").pop();
  227. saveimagecache2[url].name = saveimagecache2[url].name.replace('.'+ret,'');
  228. var name = saveimagecache2[url].name + "." + ext;
  229. saveimagecache2[url].name = name;
  230. createPreview(url, name, ext, 1);
  231. }
  232. });
  233. }
  234. objNums = window.allmodel.length;
  235. dl_title.innerHTML = "Packing...";
  236. timeID = setInterval(showStatus, 500);
  237. if (_DivideType == 2) {
  238. if(dl_status) dl_status.innerHTML = "tex: " + Object.keys(saveimagecache2).length + " / obj: "+ objNums;
  239. setTimeout(PackAll, 1000);
  240. return;
  241. }
  242. var idx = 1;
  243. window.allmodel.forEach(function(obj)
  244. {
  245. var objName;
  246. if (obj._name) {
  247. objName = obj._name.split('_');
  248. objName = objName.length > 1 ? objName[objName.length-2] : objName[0];
  249. if (objName == "") objName = "0";
  250. var objNameL = objName.toLowerCase();
  251. if (!objNamePext[objNameL]) {
  252. objNamePext[objNameL] = 1;
  253. } else {
  254. objNamePext[objNameL] += 1;
  255. objName = objName + "_" + objNamePext[objNameL];
  256. }
  257. } else {
  258. objName = "model_"+idx;
  259. }
  260. objName = String(objName);
  261. var mdl = {
  262. name: objName,
  263. obj: parseobj(obj),
  264. tex: parsetex(obj,idx)
  265. }
  266. dosavefile(mdl,idx);
  267. idx++;
  268. });
  269.  
  270. setTimeout(PackAll, 3000);
  271. }
  272.  
  273. var PackAll = function ()
  274. {
  275. for (var obj in objects) {
  276. var ext = obj.split(".").pop();
  277. if((ext != "png" && ext != "jpg" && ext != "jpeg" && ext != "bmp" && ext != "gif" && ext != "tga" && ext != "tif") || obj == previewName) {
  278. folder.file(obj, objects[obj], {binary:true});
  279. } else {
  280. folder.file("tex\\" + obj, objects[obj], {binary:true});
  281. }
  282. }
  283.  
  284. var file_name = document.getElementsByClassName('model-name__label')[0].textContent + " -" + gr_id;
  285. if (objects[gr_imgName]) {
  286. saveAs(objects[gr_imgName], file_name+".jpeg");
  287. }
  288. folder.generateAsync({ type: "blob" }).then(content => {saveAs(content, file_name + ".zip"); gr_info.innerHTML = '<span style="color: #08f508; text-shadow: 0 0 3px #000000;">文件大小:'+(content.size/1024/1024).toFixed(1)+' MB</span>';});
  289. clearInterval(timeID);
  290. gr_info.innerHTML = '<span style="color: #08f508; text-shadow: 0 0 3px #000000;">Successful!</span>';
  291. var mid = window.top.location.href.split("-").pop();
  292. window.top.document.getElementById('gr_iframe').contentWindow.postMessage({"postType": "setDownLoad", "postData":{"member": _ACCOUNT, "mid": mid}},'*');
  293. window.top.close();
  294. }
  295.  
  296. var parseobj = function(obj)
  297. {
  298. var list = [];
  299. obj._primitives.forEach(function(p) {
  300. if(p && p.indices) {
  301. list.push({
  302. 'mode' : p.mode,
  303. 'indices' : p.indices._elements
  304. });
  305. }
  306. })
  307.  
  308. var attr = obj._attributes;
  309. return {
  310. vertex: attr.Vertex._elements,
  311. normal: attr.Normal ? attr.Normal._elements : [],
  312. uv: attr.TexCoord0 ? attr.TexCoord0._elements :
  313. attr.TexCoord1 ? attr.TexCoord1._elements :
  314. attr.TexCoord2 ? attr.TexCoord2._elements :
  315. attr.TexCoord3 ? attr.TexCoord3._elements :
  316. attr.TexCoord4 ? attr.TexCoord4._elements :
  317. attr.TexCoord5 ? attr.TexCoord5._elements :
  318. attr.TexCoord6 ? attr.TexCoord6._elements :
  319. attr.TexCoord7 ? attr.TexCoord7._elements :
  320. attr.TexCoord8 ? attr.TexCoord8._elements : [],
  321. primitives: list,
  322. };
  323. }
  324.  
  325. var textype = {
  326. DiffusePBR: "map_Kd",
  327. DiffuseColor: "map_Kd",
  328. SpecularPBR: "map_Ks",
  329. SpecularColor: "map_Ks",
  330. GlossinessPBR: "map_Pm",
  331. NormalMap: "map_Bump",
  332. EmitColor: "map_Ke",
  333. AlphaMask: "map_d",
  334. Opacity: "map_o",
  335. AlbedoPBR: "map_Kd",
  336. RoughnessPBR: "map_Ns",
  337. MetalnessPBR: "map_Ks",
  338. AOPBR: "map_Ka",
  339. BumpMap: "map_Bump",
  340. DiffuseIntensity: "map_Ka"
  341. };
  342. var fixTextype = function(texStr) {
  343. if (texStr.indexOf('Specular') > -1) {
  344. return 'SpecularColor';
  345. }
  346. return texStr;
  347. }
  348.  
  349. var parsetex = function(obj,idx) {
  350. var texlist = [];
  351. var stateset = obj._parents[0].stateset ? obj._parents[0].stateset : obj.stateset;
  352. if (stateset && stateset._textureAttributeArrayList) {
  353. stateset._textureAttributeArrayList.forEach(function(arr,k) {
  354. if (arr && arr[0]&& arr[0]._object) {
  355. var object = arr[0]._object;
  356. var channelNums = object._channels.length || 0;
  357. if (channelNums == 1) {
  358. var image = object._texture && object._texture._imageModel;
  359. if (image) {
  360. var fName;
  361. if (object._texture._image._url) {
  362. fName = saveimagecache2[object._texture._image._url].name;
  363. } else {
  364. image.attributes.images.forEach(function(img) {
  365. if (saveimagecache2[img.url]) {
  366. fName = saveimagecache2[img.url].name;
  367. }
  368. });
  369. }
  370. var texStr = fixTextype(object._channels[0]);
  371. var type = textype[texStr] || object._channelName || "map_Kd";
  372. texlist.push({
  373. url: "none",
  374. type: type,
  375. filename: fName
  376. });
  377. }
  378. } else if (channelNums > 1) {
  379. var packed = object._packedTextures;
  380. if (packed) {
  381. object._channels.forEach(function(channel) {
  382. var image = packed[channel] && packed[channel].texture && packed[channel].texture._imageModel;
  383. if (image) {
  384. var fName;
  385. if (packed[channel].texture._image._url) {
  386. fName = saveimagecache2[packed[channel].texture._image._url].name;
  387. } else {
  388. image.attributes.images.forEach(function(img) {
  389. if (saveimagecache2[img.url]) {
  390. fName = saveimagecache2[img.url].name;
  391. }
  392. });
  393. }
  394. var texStr = fixTextype(channel);
  395. var type = textype[texStr] || "map_Kd";
  396. texlist.push({
  397. url: "none",
  398. type: type,
  399. filename: fName
  400. });
  401. }
  402. });
  403. }
  404. }
  405. }
  406. });
  407. }
  408. return texlist;
  409. }
  410.  
  411. var dosavefile = function(mdl,idx)
  412. {
  413. var obj = mdl.obj;
  414. var vtNums = obj.uv.length ? obj.uv.length : 0;
  415.  
  416. var str = '';
  417. str += 'mtllib Texture.mtl\n';
  418. str += 'o ' + mdl.name + '\n';
  419. for (var i = 0; i < obj.vertex.length; i += 3) {
  420. str += 'v ';
  421. for (var j = 0; j < 3; ++j) {
  422. str += obj.vertex[i + j].toFixed(6) + ' ';
  423. }
  424. str += '\n';
  425. }
  426. for (i = 0; i < obj.normal.length; i += 3) {
  427. str += 'vn ';
  428. for (j = 0; j < 3; ++j) {
  429. str += obj.normal[i + j].toFixed(6) + ' ';
  430. }
  431. str += '\n';
  432. }
  433.  
  434. for (i = 0; i < obj.uv.length; i += 2) {
  435. str += 'vt ';
  436. for (j = 0; j < 2; ++j) {
  437. str += obj.uv[i + j].toFixed(6) + ' ';
  438. }
  439. str += '\n';
  440. }
  441. if (vtNums > 0) str += 'usemtl ' + mdl.name + '\n';
  442. str += 's on \n';
  443.  
  444. var vn = obj.normal.length != 0;
  445. var vt = obj.uv.length != 0;
  446.  
  447. for (i = 0; i < obj.primitives.length; ++i) {
  448. var primitive = obj.primitives[i];
  449. if (primitive.mode == 4 || primitive.mode == 5) {
  450. var strip = (primitive.mode == 5);
  451. for (j = 0; j + 2 < primitive.indices.length; !strip ? j += 3 : j++) {
  452. str += 'f ';
  453. var order = [ 0, 1, 2];
  454. if (strip && (j % 2 == 1)) {
  455. order = [ 0, 2, 1];
  456. }
  457. for (var k = 0; k < 3; ++k)
  458. {
  459. var faceNum = primitive.indices[j + order[k]] + 1;
  460. str += faceNum;
  461. if (vn || vt) {
  462. str += '/';
  463. if (vt) {
  464. str += faceNum;
  465. }
  466. if (vn) {
  467. str += '/' + faceNum;
  468. }
  469. }
  470. str += ' ';
  471. }
  472. str += '\n';
  473. }
  474. }
  475. else {
  476. }
  477. }
  478. str += '\n';
  479. var objblob = new Blob([str], {type:'text/plain'});
  480. objects[mdl.name+".obj"] = objblob;
  481.  
  482. if (vtNums > 0) {
  483. var tex = mdl.tex;
  484. mtl += 'newmtl ' + mdl.name + '\n';
  485. tex.forEach(function(texture) {
  486. mtl += texture.type + ' tex\\\\' + texture.filename + '\n';
  487. });
  488. mtl += '\n';
  489. }
  490. if (idx == objNums) {
  491. var mtlblob = new Blob([mtl], {type:'text/plain'});
  492. objects["Texture.mtl"] = mtlblob;
  493. }
  494. if(dl_status) dl_status.innerHTML = "tex: " + Object.keys(saveimagecache2).length + " / obj: "+ objNums;
  495.  
  496. }
  497.  
  498.  
  499. window.attachbody = function(obj)
  500. {
  501. if(obj._faked != true && ((obj.stateset && obj.stateset._name) || obj._name || (obj._parents && obj._parents[0]._name)) ) {
  502. obj._faked = true;
  503. if(obj._name == "composer layer" || obj._name == "Ground - Geometry") return;
  504. // 用计时器判断资源是否准备好。
  505. if (resourceTimer) {
  506. clearTimeout(resourceTimer);
  507. console.log("Resource not ready.");
  508. }
  509. resourceTimer = setTimeout(() => {
  510. resourceReady = true;
  511. console.log("Resource is ready.");
  512. }, 2000);
  513. // 根据_instanceID去重复,不然会下载很多次,导致每次下载大小不一样。
  514. let isDuplicate = window.allmodel.some(existingObj => existingObj._instanceID === obj._instanceID);
  515. if (!isDuplicate) {
  516. window.allmodel.push(obj);
  517. }
  518. }
  519. }
  520.  
  521.  
  522. window.drawhookcanvas = function(e, imagemodel)
  523. {
  524. var flag = (new Error()).stack.split("\n")[3].trim().split(" ")[1];
  525. if(flag == "getImageSmallest")
  526. {
  527. return e;
  528. }
  529. if(imagemodel)
  530. {
  531. let alpha = e.options && e.options.format ? e.options.format : 'R';
  532. let filename_image = imagemodel.attributes.name;
  533. if (filename_image == "internal_ground_ao_texture.jpeg") {
  534. return e;
  535. }
  536. let uid = imagemodel.attributes.uid;
  537. let url_image = e.url;
  538. let max_size = 0;
  539. let obr = e;
  540. imagemodel.attributes.images.forEach(function(img)
  541. {
  542. let alpha_is_check;
  543. if (img.options && img.options.format) {
  544. alpha_is_check = alpha == "A" ? img.options.format == alpha : true;
  545. } else {
  546. alpha_is_check = true;
  547. }
  548.  
  549. let d = img.width;
  550. if (d % 2 != 0 && d > 1) {
  551. d = d - 1;
  552. }
  553. while ( d % 2 == 0 )
  554. {
  555. d = d / 2;
  556. }
  557. let target = 0;
  558. if (img.options && img.options.format) {
  559. if(img.size > max_size && alpha_is_check && d == 1 && img.options.format) {
  560. target = 1;
  561. }
  562. } else if (img.size == e.size && img.url == e.url) {
  563. target = 1;
  564. }
  565. if (target == 1) {
  566. max_size = img.size;
  567. url_image = img.url;
  568. uid = img.uid;
  569. obr = img;
  570. }
  571. });
  572.  
  573. var ext;
  574. if (_ExtJpeg == 1) {
  575. ext = "jpeg";
  576. } else {
  577. ext = url_image.split(".").pop();
  578. if(ext != "png" && ext != "jpg" && ext != "jpeg" && ext != "bmp" && ext != "gif" && ext != "tga" && ext != "tif") {
  579. ext = "png";
  580. }
  581. }
  582. filename_image = filename_image.replace(/\.[^\.]+?$/g,"."+ext);
  583.  
  584. if(!saveimagecache2[url_image])
  585. {
  586. let newName = reImgName(filename_image, uid);
  587. saveimage_to_list(url_image, newName);
  588. }
  589.  
  590. return obr;
  591. }
  592. return e;
  593. }
  594.  
  595. window.drawhookimg = function(gl,t)
  596. {
  597. var url = t[5].currentSrc;
  598. var width = t[5].width;
  599. var height = t[5].height;
  600.  
  601. if(!saveimagecache2[url])
  602. {
  603. return;
  604. }
  605.  
  606. saveimagecache1[url] = saveimagecache2[url];
  607.  
  608. gr_data = new Uint8Array(width * height * 4);
  609. gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, gr_data);
  610.  
  611. var halfHeight = height / 2 | 0;
  612. var bytesPerRow = width * 4;
  613.  
  614. gr_temp = new Uint8Array(width * 4);
  615. for (let y = 0; y < halfHeight; ++y)
  616. {
  617. let topOffset = y * bytesPerRow;
  618. let bottomOffset = (height - y - 1) * bytesPerRow;
  619.  
  620. gr_temp.set(gr_data.subarray(topOffset, topOffset + bytesPerRow));
  621.  
  622. gr_data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);
  623.  
  624. gr_data.set(gr_temp, bottomOffset);
  625. }
  626.  
  627. gr_canvas.width = width;
  628. gr_canvas.height = height;
  629. gr_context.clearRect(0, 0, width, height);
  630.  
  631. gr_imageData = gr_context.createImageData(width, height);
  632. gr_imageData.data.set(gr_data);
  633. gr_context.putImageData(gr_imageData, 0, 0);
  634.  
  635. var name = saveimagecache2[url].name;
  636. var ext = name.split(".").pop();
  637.  
  638. gr_canvas.toBlob(function(blob){
  639. objects[name] = blob;
  640. if (Object.keys(saveimagecache1).length == Object.keys(saveimagecache2).length && _FreeMemory == 1) {
  641. var canvas2 = document.getElementsByClassName('canvas')[0];
  642. var gl2 = canvas2.getContext('webgl');
  643. gl2.getExtension('WEBGL_lose_context').loseContext();
  644. }
  645. },"image/"+ext);
  646.  
  647. gr_imageData = null;
  648. gr_data = null;
  649. gr_temp = null;
  650. if(dl_status) dl_status.innerHTML = String("tex: " + Object.keys(saveimagecache1).length + "/" + Object.keys(saveimagecache2).length);
  651.  
  652. }
  653. })();
  654.  
  655. (() => {
  656. "use strict";
  657. if(webSite != 'page_models' && !_OpenDownload) return;
  658.  
  659. const Event = class {
  660. constructor(script, target) {
  661. this.script = script;
  662. this.target = target;
  663.  
  664. this._cancel = false;
  665. this._replace = null;
  666. this._stop = false;
  667. }
  668.  
  669. preventDefault() {
  670. this._cancel = true;
  671. }
  672. stopPropagation() {
  673. this._stop = true;
  674. }
  675. replacePayload(payload) {
  676. this._replace = payload;
  677. }
  678. };
  679.  
  680. let callbacks = [];
  681. window.addBeforeScriptExecuteListener = (f) => {
  682. if (typeof f !== "function") {
  683. throw new Error("Event handler must be a function.");
  684. }
  685. callbacks.push(f);
  686. };
  687. window.removeBeforeScriptExecuteListener = (f) => {
  688. let i = callbacks.length;
  689. while (i--) {
  690. if (callbacks[i] === f) {
  691. callbacks.splice(i, 1);
  692. }
  693. }
  694. };
  695.  
  696. const dispatch = (script, target) => {
  697. if (script.tagName !== "SCRIPT") {
  698. return;
  699. }
  700.  
  701. const e = new Event(script, target);
  702.  
  703. if (typeof window.onbeforescriptexecute === "function") {
  704. try {
  705. window.onbeforescriptexecute(e);
  706. } catch (err) {
  707. console.error(err);
  708. }
  709. }
  710.  
  711. for (const func of callbacks) {
  712. if (e._stop) {
  713. break;
  714. }
  715. try {
  716. func(e);
  717. } catch (err) {
  718. console.error(err);
  719. }
  720. }
  721.  
  722. if (e._cancel) {
  723. script.textContent = "";
  724. script.remove();
  725. } else if (typeof e._replace === "string") {
  726. script.textContent = e._replace;
  727. }
  728. };
  729. const observer = new MutationObserver((mutations) => {
  730. for (const m of mutations) {
  731. for (const n of m.addedNodes) {
  732. dispatch(n, m.target);
  733. }
  734. }
  735. });
  736. observer.observe(document, {
  737. childList: true,
  738. subtree: true,
  739. });
  740. })();
  741.  
  742. (() => {
  743. "use strict";
  744. if(webSite != 'page_models' && !_OpenDownload) return;
  745.  
  746. window.onbeforescriptexecute = (e) => {
  747. var links_as_arr = Array.from(e.target.childNodes);
  748.  
  749. links_as_arr.forEach(function(srimgc)
  750. {
  751. if(srimgc instanceof HTMLScriptElement)
  752. {
  753. if (srimgc.src.indexOf("web/dist/") >= 0 || srimgc.src.indexOf("standaloneViewer") >= 0)
  754. {
  755. e.preventDefault();
  756. e.stopPropagation();
  757. var req = new XMLHttpRequest();
  758. req.open('GET', srimgc.src, false);
  759. req.send('');
  760. var jstext = req.responseText;
  761. var ret = func_renderInto1.exec(jstext);
  762.  
  763. if (ret && 0)
  764. {
  765. var index = ret.index + ret[0].length;
  766. var head = jstext.slice(0, index);
  767. var tail = jstext.slice(index);
  768. jstext = head + ",i" + tail;
  769. }
  770.  
  771. ret = func_renderInto2.exec(jstext);
  772.  
  773. if (ret && 0)
  774. {
  775. var index = ret.index + ret[0].length;
  776. var head = jstext.slice(0, index);
  777. var tail = jstext.slice(index);
  778. jstext = head + ",image_data" + tail;
  779. }
  780.  
  781. ret = fund_drawArrays.exec(jstext);
  782.  
  783. if (ret && 0)
  784. {
  785. var index = ret.index + ret[0].length;
  786. var head = jstext.slice(0, index);
  787. var tail = jstext.slice(index);
  788. jstext = head + ",window.drawhookimg(t,image_data)" + tail;
  789. }
  790.  
  791. ret = func_getResourceImage.exec(jstext);
  792.  
  793. if (ret)
  794. {
  795. var index = ret.index + ret[0].length;
  796. var head = jstext.slice(0, index);
  797. var tail = jstext.slice(index);
  798. jstext = head + "e = window.drawhookcanvas(e,this._imageModel);" + tail;
  799. }
  800.  
  801. ret = func_drawGeometry.exec(jstext);
  802. if (ret) {
  803. setTimeout(addbtnfunc, 3000);
  804. setTimeout(getUri, 4000);
  805. }
  806.  
  807. if (ret && _DivideType != 2)
  808. {
  809. var index1 = ret.index + ret[1].length;
  810. var head1 = jstext.slice(0, index1);
  811. var tail1 = jstext.slice(index1);
  812. jstext = head1 + ";window.attachbody(t);" + tail1;
  813. }
  814.  
  815. var idx = 0;
  816. var obj = document.createElement('script');
  817. obj.type = "text/javascript";
  818. obj.text = jstext;
  819. document.getElementsByTagName('head')[0].appendChild(obj);
  820. }
  821. }
  822. });
  823. };
  824. })();
  825.  
  826.  
  827. (function($) {
  828. 'use strict';
  829. if(webSite == 'page_models' && !_OpenFav) return;
  830.  
  831. $(function(){
  832. var gr_css = '<style type="text/css" index="gr_css">\
  833. .gr_cicle {display: block; width:30px; height:30px; border: 5px solid #ff5722; position: absolute; margin-top: -40px; margin-left: 10px; border-radius: 50%;}\
  834. .gr_fav {color:#9e9e9e; padding: 10px; margin-left: -10px; margin-top: -10px; cursor: pointer;}\
  835. .gr_fav:hover {color:#ff5722; }\
  836. .gr_fav::before {content: "\\f05d" " "; font-family: Font Awesome\\ 6 Pro; font-size: 20px;}\
  837. .gr_nums {position: absolute; right:10px; margin-top: -22px; color:#fff; font-size: 12px; font-style: italic; text-shadow: 0 0 5px #000; display: none;}\
  838. .gr_delPre {cursor: pointer; margin-right: 10px; color:#999; font-size: 13px;}\
  839. .gr_delPre:hover {color:#ff5722; font-weight: bold;}\
  840. #gr_tag {z-index:999; background: #ffffff; padding: 20px; border-radius: 20px; border: 2px solid #1abc9c;position: absolute; margin-left:-1000px; opacity: 0; width:500px; box-shadow: 0px 1px 4px #959595; transition: .25s linear;}\
  841. #gr_tagbg {z-index:888; background: rgba(0,0,0,0.5);; position: fixed; top:0; left:0; width:100%; height:100%; transition: .25s linear;}\
  842. #gr_edit {float: right; cursor: pointer;}\
  843. #gr_setdl {cursor: pointer; font-size:13px; color:#999; margin-left:10px;}\
  844. #gr_edit:hover, #gr_setdl:hover {color: #FF6651;}\
  845. #gr_menu {background: #e50707;display: inline-block;padding: 0 7px;font-weight: bold; color: #fff;border-radius: 4px;cursor: pointer; margin-left: 10px;}\
  846. #gr_menu:hover {background: #ff3f3f;}\
  847. #gr_main_1 {width: 600px; height: 100%; background: #2b3340; padding: 20px; color: #999; position: fixed; top: 0; right:0; display: none;z-index:998; box-shadow: 3px 0 9px #005fab;}\
  848. #gr_main_2 {width: 570px; height: 100%; background: #303948; padding: 20px 10px; color: #999; position: fixed; top: 0; right:0; display: none;z-index:990; box-shadow: 3px 0 9px #005fab; overflow-y: auto;}\
  849. #gr_main_2 .model-smallcard__thumbnail {width: 230px; display: inline-block; margin: 10px;}\
  850. .grdl_tab_2::-webkit-scrollbar, .grdl_finished::-webkit-scrollbar, #grdl_tab_1 textarea::-webkit-scrollbar, #grdl_fav::-webkit-scrollbar, #gr_main_2::-webkit-scrollbar {width: 10px; height: 1px;}\
  851. .grdl_tab_2::-webkit-scrollbar-thumb, .grdl_finished::-webkit-scrollbar-thumb, #grdl_tab_1 textarea::-webkit-scrollbar-thumb, #grdl_fav::-webkit-scrollbar-thumb, #gr_main_2::-webkit-scrollbar-thumb {background: #1c3254; border:1px solid rgba(35,74,137,0.66); border-right:none;}\
  852. .grdl_tab_2::-webkit-scrollbar-track, .grdl_finished::-webkit-scrollbar-track, #grdl_tab_1 textarea::-webkit-scrollbar-track, #grdl_fav::-webkit-scrollbar-track, #gr_main_2::-webkit-scrollbar-track {background: #242d3c;}\
  853. #grdl_tab_1 textarea::-webkit-resizer {background: #242d3c;}\
  854. #gr_title {color: #03a9f4; font-size: 19px; font-weight: bold; margin-bottom: 10px;}\
  855. #gr_main ul {list-style-type: none; padding-left:45px;}\
  856. #gr_main li {position: relative;}\
  857. #gr_main a {text-decoration: none; display: block; padding: 5px; color: #999;}\
  858. #gr_main a:hover {text-decoration: underline;}\
  859. #gr_nav {margin-bottom: 10px;}\
  860. .nav_tab {display: inline-block; cursor: pointer; padding: 0 20px; color: #03a9f4; border: 1px solid #185a8f; border-right: 0;}\
  861. .nav_tab.selected, .nav_tab:hover {background: #0b4c81;}\
  862. .nav_tab:last-of-type {border-right: 1px solid #185a8f;}\
  863. .grdl_tab {display:none;}\
  864. .grdl_btn_fav {display: block; padding: 10px; margin: 0 auto; margin-top:50%; cursor: pointer; width: 180px; height: 60px; background: #005fab; color: #fff; border: 1px solid #2e86cd;}\
  865. .grdl_btn_fav:hover {background: #1e84d5;}\
  866. #grdl_fav {width: 100%; overflow-y: auto;}\
  867. .grdl_fav_tab {display: inline-block; padding:5px 10px; margin: 0 10px 10px 0; font-size:13px; cursor: pointer;}\
  868. .grdl_fav_tab:hover {text-decoration: underline; color: #03a9f4;}\
  869. .grdl_fav_i {color: #607d8b;}\
  870. .grdl_fav_color {color: #03a9f4;}\
  871. .grdl_fav_n {font-size: 15px;}\
  872. .grdl_fav_a {}\
  873. #grdl_tab_1 {width: 450px; height:60px; vertical-align: top; display: inline-block; position: relative;}\
  874. #grdl_tab_1 textarea {width: 440px; height: 60px; color: #999; padding: 5px; background: none; border: 1px solid #455062; z-index: 920; position: absolute; top: 0; font-size:12px;}\
  875. #grdl_tips_1 {position: absolute; top: 0; padding: 5px; z-index: 910; font-size: 14px;}\
  876. .grdl_tab_2 {width: 550px; height: 420px; overflow-y: auto; border: 1px solid #455062; color: #999; margin-top: 10px;}\
  877. #grdl_tab_btn {vertical-align: top; margin-left: 6px; display: inline-block;}\
  878. .grdl_btn_list {padding: 10px; cursor: pointer;width: 90px; height: 60px; background: #005fab; color: #fff; border: 1px solid #2e86cd;}\
  879. .grdl_btn_list:hover {background: #2196f3;}\
  880. .grdl_tab_2 li:first-child {border-bottom: 1px solid #03a9f4; margin-bottom:40px; margin-top: 20px;}\
  881. .grdl_tab_2 li:first-child a {padding: 15px 0; color: #03a9f4;}\
  882. .grdl_finished {width: 550px; height: 120px; color: #999; font-size: 13px; border: 1px solid #455062; overflow-y: auto; margin-top: 20px;}\
  883. .grdl_finished p {padding-left: 10px;}\
  884. .grli_num {display: inline-block; position: absolute; left: -35px; top: 8px; font-size: 13px;}\
  885. .gr_color {color: #ff5722 !important;}\
  886. .gr_colorG {color: #00d500 !important; font-weight: bold;}\
  887. .gr_colorbg {background: #ff5722 !important;}\
  888. .freedl_color {color: #8bc34a !important;}\
  889. .gr_tagborder {border:2px solid #fd9270;}\
  890. .gr_display {display: inline-block !important;}\
  891. .selected {display: inline-block !important;}\
  892. .selected_bd {border: 1px solid #03a9f4; border-radius: 30px;}\
  893. \
  894. .bootstrap-tagsinput { background-color: #fff; border: 1px solid #ccc; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); display: inline-block; padding: 4px 6px; color: #555; vertical-align: middle; border-radius: 4px; max-width: 100%; line-height: 22px; cursor: text; }\
  895. .bootstrap-tagsinput input { border: none; box-shadow: none; outline: none; background-color: transparent; padding: 0 6px; margin: 0; width: auto; max-width: inherit; }\
  896. .bootstrap-tagsinput.form-control input::-moz-placeholder { color: #777; opacity: 1; }\
  897. .bootstrap-tagsinput.form-control input:-ms-input-placeholder { color: #777; }\
  898. .bootstrap-tagsinput.form-control input::-webkit-input-placeholder { color: #777; }\
  899. .bootstrap-tagsinput input:focus { border: none; box-shadow: none; }\
  900. .bootstrap-tagsinput .tag { margin-right: 2px; color: white; }\
  901. .bootstrap-tagsinput .tag [data-role="remove"] { margin-left: 8px; cursor: pointer; }\
  902. .bootstrap-tagsinput .tag [data-role="remove"]:after { content: "x"; padding: 0px 2px; }\
  903. .bootstrap-tagsinput .tag [data-role="remove"]:hover { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); }\
  904. .bootstrap-tagsinput .tag [data-role="remove"]:hover:active { box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\
  905. \
  906. .bootstrap-tagsinput {width: 100%; border: none; padding: 10px; box-shadow:none;}\
  907. .bootstrap-tagsinput .tag [data-role="remove"] {display: none;}\
  908. .bootstrap-tagsinput .tag [data-role="remove"]:hover {line-height: 15px; font-size: 20px; color:#000000; margin-left: 5px;}\
  909. .bootstrap-tagsinput .tag {background-color: #1abc9c; border-radius: 4px; font-size: 13px; overflow: hidden; display: inline-block; padding: 3px 8px; white-space: nowrap; cursor: pointer; transition: all 0.2s linear;}\
  910. .bootstrap-tagsinput .tag:hover {background-color: #FF6651;}\
  911. .bootstrap-tagsinput input {vertical-align: top; height: 28px; font-size: 14px; color: #34495e; min-width: 130px;}\
  912. </style>';
  913.  
  914. $('head').append(gr_css);
  915. $('body').append('<iframe id="gr_iframe" name="gr_iframe" src="https://www.gieex.com/skf/iframe.html" width="200" height="10" border="0" frameborder="0" align="center"></iframe>');
  916. $('body').append('<div id="gr_tag"><h2 style="display: inline-block;">添加到收藏夹</h2><a id="gr_setdl">(设为已下载)</a><span id="gr_edit" data-edit="0">编辑</span><input data-role="tagsinput" id="tagsinputval" name="tagsinput" placeholder="输入新分类后回车" value=""/><div id="gr_tagList"><ul></ul></div></div>');
  917.  
  918. if ($('body').hasClass('model-page')) {
  919. $('body').append('<a id="gr_close" style="position: fixed; right: 30px; top: 70px;background: #e50707;display: inline-block;padding: 12px 7px;font-weight: bold;font-size: 21px;color: #fff;border-radius: 4px;cursor: pointer;" onclick="window.close();">Close</a>');
  920. }
  921. });
  922.  
  923. window.onload = function () {
  924.  
  925. var gr_iframe = document.getElementById('gr_iframe');
  926.  
  927. $('#tagsinputval').tagsinput({
  928. trimValue: true
  929. });
  930. $('#tagsinputval').on('itemAdded', function(event) {
  931. if ($('#gr_edit').data('edit') == '1') {
  932. $('.bootstrap-tagsinput .tag [data-role="remove"]').last().addClass('gr_display');
  933. }
  934. });
  935. $('#tagsinputval').on('beforeItemRemove', function(event) {
  936. if(!confirm('确定要删除该分类吗?删除后该分类下的数据将自动清空')) {
  937. event.cancel = true;
  938. return;
  939. }
  940. var data = {"postType": "delType", "postData": {"member": _ACCOUNT, "type": event.item}};
  941. gr_iframe.contentWindow.postMessage(data,'*');
  942. });
  943. $('#tagsinputval').on('itemRemoved', function(e) {
  944. e.stopPropagation();
  945. });
  946. $('body').on('click', '.bootstrap-tagsinput .tag [data-role="remove"]', function(e) {
  947. e.stopPropagation();
  948. });
  949. $('body').on('click', '#gr_tagbg', function(e) {
  950. $('#gr_tag').removeAttr('style');
  951. $('#gr_main_1').slideUp('fast');
  952. $('#gr_main_2').animate({right:'0'},'fast').hide('fast');
  953. $(this).remove();
  954. $('html').removeAttr('style');
  955. e.stopPropagation();
  956. });
  957. $('body').on('click', '#gr_main_1, #gr_main_2', function(e) {
  958. $('#gr_tag').removeAttr('style');
  959. e.stopPropagation();
  960. });
  961. $('body').on('click', '#gr_edit', function() {
  962. if($(this).data('edit') == '0'){
  963. $(this).data('edit','1');
  964. $(this).text('[ 编辑 ]');
  965. } else {
  966. $(this).data('edit','0');
  967. $(this).text('编辑');
  968. }
  969. $('.bootstrap-tagsinput .tag [data-role="remove"]').toggleClass('gr_display');
  970. $(this).toggleClass('gr_color');
  971. });
  972. $('body').on('click', '#gr_tag', function(e) {
  973. e.stopPropagation();
  974. });
  975. $('body').on('click', '#gr_setdl', function() {
  976. gr_iframe.contentWindow.postMessage({"postType": "setDownLoad", "postData":{"member": _ACCOUNT, "mid": mid}},'*');
  977. });
  978.  
  979. $('body').on('click', function() {
  980. if (!list) return;
  981. $('body').find('.c-grid__item').each(function(){
  982. if ($('.gr_fav',this).length > 0) return;
  983. $('.card__main__corner.--top-left',this).append('<span class="gr_fav"> </span>');
  984. var cardNums_last = $(this).prev().find('.gr_nums').text() || 0;
  985. var cardNums = Number(cardNums_last)+1;
  986. if (location.href.indexOf('/search?') > -1 && searchPage) getcol(1);
  987. var show = cardNums % colNums == 0 ? ' selected' : '';
  988. $('.card__main__corner.--top-right',this).after('<span class="gr_nums'+show+'">'+cardNums+'</span>');
  989. $('.card__footer__right',this).prepend('<span class="gr_delPre">&lt;&lt;&lt;&lt;&lt;</span>');
  990. var mid = $('.card-model',this).length==1 ? $('.card-model',this).data('uid') : $('.model-smallcard',this).data('uid');
  991. if (list[mid]) {
  992. if (_disPlayMod == 1) {
  993. var color = list[mid].downloaded == 0 ? 'gr_color' : 'gr_colorG';
  994. $('.gr_fav',this).addClass(color).data('favid',list[mid].fav_type_id);
  995. } else {
  996. $(this).remove();
  997. }
  998. }
  999. });
  1000. });
  1001. var getcol = function (runOnce) {
  1002. if (runOnce == 1) searchPage = 0;
  1003. $('body').find('.c-grid__items .c-grid__item').each(function(k,v){
  1004. if (k == 0) {
  1005. colTop = $(this).offset().top;
  1006. colNums = 1;
  1007. } else {
  1008. if (colTop == $(this).offset().top) {
  1009. colNums += 1;
  1010. } else {
  1011. return false;
  1012. }
  1013. }
  1014. });
  1015. }
  1016. getcol();
  1017. $('body').find('.c-grid__item').each(function(){
  1018. $('.card__main__corner.--top-left',this).append('<span class="gr_fav"> </span>');
  1019. if ($('.card-model',this).length==1) {
  1020. var cardNums = $(this).index()+1;
  1021. var show = cardNums % colNums == 0 ? ' selected' : '';
  1022. $('.card__main__corner.--top-right',this).after('<span class="gr_nums'+show+'">'+cardNums+'</span>');
  1023. }
  1024. $('.card__footer__right',this).prepend('<span class="gr_delPre">&lt;&lt;&lt;&lt;&lt;</span>');
  1025. });
  1026.  
  1027. $('body').on('click','.gr_delPre',function(e){
  1028. $(this).closest('.c-grid__item').prevAll().remove();
  1029. e.stopPropagation();
  1030. });
  1031.  
  1032. $('body').on('click','.gr_fav',function(e){
  1033. mid = $(this).closest('.card-model').length==1 ? $(this).closest('.card-model').data('uid') : $(this).closest('.model-smallcard').data('uid');
  1034. url = $(this).closest('.card-model').length==1 ? $(this).closest('.card-model').find('.card-model__thumbnail-link').attr('href') : $(this).closest('.model-smallcard').find('.card-model__thumbnail-link').attr('href');
  1035. freedl = $(this).closest('.card-model').length==1 ? $(this).closest('.card-model').find('.--downloads').length : $(this).closest('.model-smallcard').find('.--downloads').length;
  1036. var favid = $(this).data('favid');
  1037. $('body').find('.bootstrap-tagsinput .tag').removeClass('gr_colorbg');
  1038. $('body').find('.bootstrap-tagsinput .tag').each(function(){
  1039. var name = $(this).text();
  1040. if(favType[name] == favid) {
  1041. $(this).addClass('gr_colorbg');
  1042. }
  1043. });
  1044. $('#gr_tag').css({
  1045. 'opacity': 1,
  1046. 'position': 'fixed',
  1047. 'margin-left': 'auto',
  1048. 'left': ($(window).width()-$('#gr_tag').width())/2,
  1049. 'top': ($(window).height()-$('#gr_tag').height())/2-80
  1050. });
  1051. if ($('body #gr_tagbg').length == 0) $('body').prepend('<div id="gr_tagbg"> </div>');
  1052. e.stopPropagation();
  1053. });
  1054.  
  1055. $('body').on('click', '.bootstrap-tagsinput .tag', function() {
  1056. var type = $(this).text();
  1057. $('body').find('.bootstrap-tagsinput .tag').removeClass('gr_tagborder gr_colorbg');
  1058. $(this).addClass('gr_tagborder');
  1059. if (mid) {
  1060. var data = {"postType": "setData", "postData": {"member": _ACCOUNT, "mid": mid, "url": url, "freedl": freedl, "type": type}};
  1061. gr_iframe.contentWindow.postMessage(data,'*');
  1062. } else {
  1063. alert('DOM change!');
  1064. }
  1065. });
  1066.  
  1067. var getData = function() {
  1068. var data = {"postType": "getData", "postData": {"member": _ACCOUNT}};
  1069. gr_iframe.contentWindow.postMessage(data,'*');
  1070. }
  1071. getData();
  1072.  
  1073. window.addEventListener('message',function(e){
  1074. if (e.data.status == 1) {
  1075. list = e.data.list;
  1076. if (e.data.fav_type) {
  1077. favType = JSON.parse(e.data.fav_type);
  1078. $.each(favType, function(k,v){
  1079. $('#tagsinputval').tagsinput('add', k);
  1080. favList[k] = {'favid': v};
  1081. });
  1082. }
  1083. if (webSite == 'page_popular') {
  1084. var temp = [];
  1085. $.each(list, function(mid,v) {
  1086. var j = [mid, v.downloaded];
  1087. if (!temp[parseInt(v.fav_type_id)]) {
  1088. temp[parseInt(v.fav_type_id)] = [];
  1089. temp[parseInt(v.fav_type_id)][0] = [];
  1090. temp[parseInt(v.fav_type_id)][1] = [];
  1091. }
  1092. if (v.downloaded == 0) {
  1093. temp[parseInt(v.fav_type_id)][0].push(j);
  1094. } else {
  1095. temp[parseInt(v.fav_type_id)][1].push(j);
  1096. }
  1097. });
  1098. $.each(favList, function(k,v) {
  1099. favList[k].list = temp[v.favid];
  1100. });
  1101. }
  1102. if (!list) return;
  1103. if (_disPlayMod == 1) {
  1104. $('.c-grid__item').each(function(){
  1105. var mid = $('.card-model',this).length==1 ? $('.card-model',this).data('uid') : $('.model-smallcard',this).data('uid');
  1106. if (list[mid]) {
  1107. var color = list[mid].downloaded == 0 ? 'gr_color' : 'gr_colorG';
  1108. $('.gr_fav',this).addClass(color).data('favid',list[mid].fav_type_id);
  1109. }
  1110. });
  1111. } else {
  1112. $('.c-grid__item').each(function(){
  1113. var mid = $('.card-model',this).length==1 ? $('.card-model',this).data('uid') : $('.model-smallcard',this).data('uid');
  1114. if (list[mid]) {
  1115. $(this).remove();
  1116. }
  1117. });
  1118. }
  1119. } else if (e.data.status == 2) {
  1120. $('body').find('#gr_tagbg').click();
  1121. if ($('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').length == 1) {
  1122. $('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').addClass('gr_color').data('favid',e.data.fav_type_id);
  1123. } else {
  1124. $('body').find('.model-smallcard[data-uid="'+e.data.mid+'"] .gr_fav').addClass('gr_color').data('favid',e.data.fav_type_id);
  1125. }
  1126. } else if (e.data.status == 3) {
  1127. $('body').find('#gr_tagbg').click();
  1128. if ($('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').length == 1) {
  1129. $('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').removeClass('gr_color gr_colorG').data('favid','');
  1130. } else {
  1131. $('body').find('.model-smallcard[data-uid="'+e.data.mid+'"] .gr_fav').removeClass('gr_color gr_colorG').data('favid','');
  1132. }
  1133. } else if (e.data.status == 5) {
  1134. $('body').find('#gr_tagbg').click();
  1135. if ($('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').length == 1) {
  1136. $('body').find('.card-model[data-uid="'+e.data.mid+'"] .gr_fav').removeClass('gr_color').addClass('gr_colorG');
  1137. } else {
  1138. $('body').find('.model-smallcard[data-uid="'+e.data.mid+'"] .gr_fav').removeClass('gr_color').addClass('gr_colorG');
  1139. }
  1140. }
  1141.  
  1142. });
  1143.  
  1144. if (webSite == 'page_popular') {
  1145. var gr_menu = '<div id="gr_menu">E Menu</div>';
  1146. var gr_main = '<div id="gr_main">\
  1147. <div id="gr_main_1">\
  1148. <div id="gr_title">-- 3D模型下载列表 --</div>\
  1149. <div id="gr_container" >\
  1150. <div id="gr_nav"><div class="gr_menu_fav nav_tab selected">我的收藏夹</div><div class="gr_menu_list nav_tab">导入文本列表</div></div>\
  1151. <div id="grdl_fav" class="grdl_tab selected">\
  1152. <input class="grdl_btn_fav" type="button" value="打开收藏夹">\
  1153. </div>\
  1154. <div id="grdl_list" class="grdl_tab">\
  1155. <div id="grdl_tab_1">\
  1156. <textarea name="grdl_tab_1" onfocus="document.getElementById(\'grdl_tips_1\').style.display=\'none\'" onblur="if(value==\'\')document.getElementById(\'grdl_tips_1\').style.display=\'block\'"></textarea>\
  1157. <div id="grdl_tips_1" class="grdl_tips">在这里粘贴网址列表,每行一条</div>\
  1158. </div>\
  1159. <div id="grdl_tab_btn">\
  1160. <input class="grdl_btn_list" type="button" value="导入列表">\
  1161. </div>\
  1162. <div class="grdl_tab_2">\
  1163. <ul></ul>\
  1164. </div>\
  1165. <div class="grdl_finished"><p>已下载历史记录:</p><ul></ul></div>\
  1166. </div>\
  1167. </div>\
  1168. </div>\
  1169. <div id="gr_main_2"></div>\
  1170. </div>';
  1171. $('body h1.jS_AtdxX').append(gr_menu);
  1172. $('body').append(gr_main);
  1173. $('body').on('click', '#gr_menu', function() {
  1174. $('#gr_main_1').slideDown('fast');
  1175. $('body').prepend('<div id="gr_tagbg"> </div>');
  1176. $('html').css('overflow-y','hidden');
  1177. getData();
  1178. });
  1179.  
  1180. $('body').on('click', '#gr_nav .nav_tab', function() {
  1181. $('.nav_tab, .grdl_tab').removeClass('selected');
  1182. $(this).addClass('selected');
  1183. if ($(this).hasClass('gr_menu_fav')) {
  1184. $('#grdl_fav').addClass('selected');
  1185. addFavList();
  1186. } else if ($(this).hasClass('gr_menu_list')) {
  1187. $('#grdl_list').addClass('selected');
  1188. }
  1189. });
  1190. $('body').on('click', '.grdl_btn_fav', function() {
  1191. $(this).hide();
  1192. addFavList();
  1193. });
  1194.  
  1195. var addFavList = function() {
  1196. var h = window.innerHeight - 150;
  1197. $('#grdl_fav').css({'height': h+'px'});
  1198. $('#grdl_fav').empty();
  1199. $.each(favList, function(k,v) {
  1200. var favNums;
  1201. if (favList[k].list) {
  1202. var color = favList[k].list[0].length > 0 ? ' grdl_fav_color' : '';
  1203. favNums = '<span class="grdl_fav_n'+color+'">'+favList[k].list[0].length+'</span>/<span class="grdl_fav_a">'+(favList[k].list[0].length+favList[k].list[1].length)+'</span>';
  1204. } else {
  1205. favNums = '<span class="grdl_fav_a">0</span>';
  1206. }
  1207. $('#grdl_fav').append('<div class="grdl_fav_tab" data-favid="'+v.favid+'"><span class="grdl_fav_tx">'+k+'</span><span class="grdl_fav_i"> '+favNums+'</span></div>');
  1208. });
  1209. }
  1210. var mp1 = $('.grdl_tab_2').clone();
  1211. var mp2 = $('.grdl_finished').clone();
  1212. $('#gr_main_2').append(mp1);
  1213. $('#gr_main_2').append(mp2);
  1214.  
  1215. $('body').on('click', '.grdl_fav_tab', function() {
  1216. var favid = $(this).data('favid');
  1217. var text = $(this).find('.grdl_fav_tx').text();
  1218. $('.grdl_fav_tab').removeClass('selected_bd');
  1219. $(this).addClass('selected_bd');
  1220. if (!favList[text].list) return;
  1221. $('#gr_main_2').show().animate({right:'600px'},'fast',function() {
  1222. $('#gr_main_2 .grdl_tab_2 ul').empty();
  1223. if (favList[text].list[0].length > 0) {
  1224. var listNums = favList[text].list[0].length;
  1225. $.each(favList[text].list[0], function(k,v) {
  1226. var url = 'https://sketchfab.com/3d-models/'+list[v[0]].url;
  1227. var name = list[v[0]].url;
  1228. var num = listNums - k;
  1229. var freedlClass = list[v[0]].freedl == 1 ? 'class="freedl_color"' : '';
  1230. $('#gr_main_2 .grdl_tab_2 ul').append('<li><span class="grli_num">'+num+'.</span><a '+freedlClass+' href="'+url+'" target="_blank">'+name+'</a></li>');
  1231. });
  1232. }
  1233. });
  1234. });
  1235.  
  1236. var grdl_list, grdl_listArr;
  1237. $('body').on('click','input.grdl_btn_list',function () {
  1238. grdl_list = $('body #grdl_tab_1 textarea').val();
  1239. if (grdl_list == '') {
  1240. $('#gr_main_1 .grdl_tab_2 ul').empty();
  1241. return;
  1242. }
  1243. grdl_listArr = grdl_list.split("\n");
  1244. grdl_listArr = grdl_listArr.filter(element => element);
  1245. var listNums = grdl_listArr.length;
  1246. $.each(grdl_listArr, function (k,v) {
  1247. if (v != "") {
  1248. var nameArr = v.split('/');
  1249. var name = nameArr.pop();
  1250. var num = listNums - k;
  1251. $('#gr_main_1 .grdl_tab_2 ul').append('<li><span class="grli_num">'+num+'.</span><a href="'+v+'" target="_blank">'+name+'</a></li>');
  1252. }
  1253. });
  1254. });
  1255.  
  1256. $('body').on('click', '.grdl_tab_2 a',function () {
  1257. $('body .grdl_finished p').remove();
  1258. var $li = $(this).parent('li');
  1259. if ($(this).closest('#gr_main_1').length == 1) {
  1260. $('#gr_main_1 .grdl_finished ul').prepend($li.clone());
  1261. } else {
  1262. $('#gr_main_2 .grdl_finished ul').prepend($li.clone());
  1263. }
  1264. $li.remove();
  1265. });
  1266.  
  1267. }
  1268.  
  1269. };
  1270.  
  1271.  
  1272. })(jQuery);