| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142 |
- // **************************************************
- // This file created by Brett Bibby (c) 2010-2013
- // You may freely use and modify this file as you see fit
- // You may not sell it
- //**************************************************
- // hidden object game exporter
- //$.writeln("=== Starting Debugging Session ===");
- // enable double clicking from the Macintosh Finder or the Windows Explorer
- #target photoshop
- // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
- // $.level = 0;
- // debugger; // launch debugger on next line
- var sceneData;
- var sourcePsd;
- var duppedPsd;
- var destinationFolder;
- var uuid;
- var sourcePsdName;
- var slicePaddingArr = new Array(0,0,0,0)
- var sliceOriArr = new Array(0,0,0,0)
- main();
- function main(){
- // got a valid document?
- if (app.documents.length <= 0)
- {
- if (app.playbackDisplayDialogs != DialogModes.NO)
- {
- alert("You must have a document open to export!");
- }
- // quit, returning 'cancel' makes the actions palette not record our script
- return 'cancel';
- }
- // ask for where the exported files should go
- destinationFolder = Folder.selectDialog("Choose the destination for export.");
- if (!destinationFolder)
- {
- return;
- }
- // cache useful variables
- uuid = 1;
- sourcePsdName = app.activeDocument.name;
- var layerCount = app.documents[sourcePsdName].layers.length;
- var layerSetsCount = app.documents[sourcePsdName].layerSets.length;
- if ((layerCount <= 1) && (layerSetsCount <= 0))
- {
- if (app.playbackDisplayDialogs != DialogModes.NO)
- {
- alert("You need a document with multiple layers to export!");
- // quit, returning 'cancel' makes the actions palette not record our script
- return 'cancel';
- }
- }
- // setup the units in case it isn't pixels
- var savedRulerUnits = app.preferences.rulerUnits;
- var savedTypeUnits = app.preferences.typeUnits;
- app.preferences.rulerUnits = Units.PIXELS;
- app.preferences.typeUnits = TypeUnits.PIXELS;
- // duplicate document so we can extract everythng we need
- duppedPsd = app.activeDocument.duplicate();
- duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length - 1];
- hideAllLayers(duppedPsd);
- // export layers
- sceneData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
- sceneData += "<PSDUI>";
-
- sceneData += "\n<psdSize>";
- sceneData += "<width>" + duppedPsd.width.value + "</width>";
- sceneData += "<height>" + duppedPsd.height.value+ "</height>";
- sceneData += "</psdSize>";
-
- sceneData += "\n<layers>";
- exportAllLayers(duppedPsd);
- sceneData += "</layers>";
- sceneData += "\n</PSDUI>";
- $.writeln(sceneData);
- duppedPsd.close(SaveOptions.DONOTSAVECHANGES);
- // create export
- var sceneFile = new File(destinationFolder + "/" + destinationFolder.name + ".xml");
- sceneFile.encoding = "utf-8"; //写文件时指定编码,不然中文会出现乱码
- sceneFile.open('w');
- sceneFile.writeln(sceneData);
- sceneFile.close();
- app.preferences.rulerUnits = savedRulerUnits;
- app.preferences.typeUnits = savedTypeUnits;
- }
- function exportAllLayers(obj)
- {
- if (typeof(obj) == "undefined"){
- return;
- }
- if (typeof(obj.layers) != "undefined" && obj.layers.length>0) {
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportLayer(obj.layers[i])
- }
-
- }
- else{
- exportLayer(obj)
- };
- }
- function exportLayer(obj)
- {
- if (typeof(obj) == "undefined"){
- return;
- }
- if (obj.typename == "LayerSet") {
- exportLayerSet(obj);
- }
- else if (obj.typename = "ArtLayer"){
- exportArtLayer(obj);
- }
- }
- function exportLayerSet(_layer)
- {
- if (typeof(_layer.layers) == "undefined" || _layer.layers.length<=0 ){
- return
- }
- if (_layer.name.search("@ScrollView") >= 0)
- {
- exportScrollView(_layer);
- }
- else if (_layer.name.search("@Grid") >= 0)
- {
- exportGrid(_layer);
- }
- else if (_layer.name.search("@Button") >= 0)
- {
- exportButton(_layer);
- }
- else if (_layer.name.search("@Toggle") >= 0)
- {
- exportToggle(_layer);
- }
- else if (_layer.name.search("@Panel") >= 0)
- {
- exportPanel(_layer);
- }
- else if (_layer.name.search("@Slider")>=0) {
- exportSlider(_layer);
- }
- else if (_layer.name.search("@Group")>=0) {
- exportGroup(_layer);
- }
- else if (_layer.name.search("@InputField") >=0) {
- exportInputField(_layer);
- }
- else if (_layer.name.search("@Scrollbar") >=0) {
- exportScrollBar(_layer);
- }else if (_layer.name.search("@LE") >=0) {//增加布局元素导出
- exportLayoutElement(_layer);
- }
- else
- {
- sceneData += "<Layer>";
- sceneData += "<type>Normal</type>";
- sceneData += "<name>" + _layer.name + "</name>";
- sceneData += "<layers>";
- exportAllLayers(_layer)
- sceneData += "</layers>";
- sceneData += "</Layer>";
- }
- }
- function exportLayoutElement(obj)
- {
- sceneData += "<Layer>";
- sceneData += "<type>LayoutElement</type>";
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += "<name>" + itemName + "</name>";
- sceneData += "<layers>";
- exportAllLayers(obj);
- // sceneData += "<images>";
- // for (var j = obj.artLayers.length - 1; 0 <= j; j--)
- // {
- // exportArtLayer(obj.artLayers[j]);
- // }
- // sceneData += "</images>";
- sceneData += "</layers>";
-
- obj.visible = true;
- showAllLayers(obj);
-
- var recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
- hideAllLayers(obj);
-
- sceneData += "</Layer>";
- }
- function exportScrollView(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>ScrollView</type>\n<name>" + itemName + "</name>\n");
- sceneData += ("<layers>\n");
- exportAllLayers(obj);
- sceneData += ("</layers>");
- var params = obj.name.split(":");
- if (params.length > 2)
- {
- alert(obj.name + "-------Layer's name is illegal------------");
- }
- var recSize;
- if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0)
- {
- alert("Bottom layer's name doesn't contain '@Size'");
- }
- else
- {
- obj.layers[obj.layers.length - 1].visible = true;
- recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
- obj.layers[obj.layers.length - 1].visible = false;
- }
-
- //以下计算padding和spacing
- obj.layers[0].visible = true;
- showAllLayers(obj.layers[0]); //子图层组已经在上面导出过,要再次计算size需先将其显示
- var rec0 = getLayerRec(duppedPsd.duplicate());
- hideAllLayers(obj.layers[0]);
- obj.layers[0].visible = false;
-
- obj.layers[1].visible = true;
- showAllLayers(obj.layers[1]);
- var rec1 = getLayerRec(duppedPsd.duplicate());
- hideAllLayers(obj.layers[0]);
- obj.layers[1].visible = false;
-
- var spacing;
- var paddingx;
- var paddingy;
- if(params[1].search("H") >= 0) //水平间距
- {
- spacing = rec1.x - rec0.x - rec0.width;
- paddingx = rec0.x - (recSize.x - recSize.width / 2) - rec0.width / 2; //x方向边距,默认左右相等
- paddingy = (recSize.height - rec0.height) / 2 ; //暂时只考虑上下边距相等
- //paddingy = recSize.height / 2 - rec0.height / 2 - (rec0.y - recSize.y); //上边距
- //paddingy2 = recSize.height - rec0.height - paddingy; //下边距
- }
- else //垂直间距
- {
- spacing = rec0.y - rec1.y - rec0.height;
- paddingx = (recSize.width - rec0.width) / 2 ;
- paddingy = (recSize.y + recSize.height / 2) - rec0.y - rec0.height / 2;
- }
- sceneData += "<arguments>";
- sceneData += "<string>" + params[1] + "</string>"; //滑动方向
- sceneData += "<string>" + spacing + "</string>";
- sceneData += "<string>" + Math.floor (paddingx) + "</string>";
- sceneData += "<string>" + Math.floor (paddingy) + "</string>";
- sceneData += "</arguments>";
- sceneData += "</Layer>";
- }
- function setLayerSizeAndPos(layer)
- {
- layer.visible = true;
- var recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
- layer.visible = false;
- }
- function exportGrid(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Grid</type>\n<name>" + itemName + "</name>\n");
- sceneData += ("<layers>\n");
- exportAllLayers(obj);
- sceneData += ("</layers>");
- var params = obj.name.split(":");
- if (params.length != 3)
- {
- alert("Layer's name is illegal");
- }
- var recSize;
- if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0)
- {
- alert("Bottom layer's name doesn't contain '@Size'");
- }
- else
- {
- setLayerSizeAndPos(obj.layers[obj.layers.length - 1]);
- }
- var totalContentCount = obj.layers.length - 1;
-
- obj.layers[0].visible = true;
- showAllLayers(obj.layers[0]); //子图层组已经在上面导出过,要再次计算size需先将其显示
- var rec0 = getLayerRec(duppedPsd.duplicate());
- hideAllLayers(obj.layers[0]);
- obj.layers[0].visible = false;
-
- var renderHorizontalGap = params[2] > 1 ? (recSize.width - rec0.width * params[2])/(params[2] - 1) : 0;
- var renderVerticalGap = params[1] > 1 ? (recSize.height - rec0.height * params[1])/(params[1] - 1) : 0;
- sceneData += "<arguments>";
- sceneData += "<string>" + params[1] + "</string>"; //行数
- sceneData += "<string>" + params[2] + "</string>"; //列数
- sceneData += "<string>" + rec0.width + "</string>"; //render width
- sceneData += "<string>" + rec0.height + "</string>"; //render height
- sceneData += "<string>" + Math.floor(renderHorizontalGap) + "</string>"; //水平间距
- sceneData += "<string>" + Math.floor(renderVerticalGap) + "</string>"; //垂直间距
- sceneData += "</arguments>";
- sceneData += "</Layer>";
- }
- function exportGroup(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Group</type>\n<name>" + itemName + "</name>\n");
- exportAllLayers(obj);
- var params = obj.name.split(":");
- if (params.length != 3 )
- {
- alert(obj.name + "-------Layer's name not equals 2------------");
- }
- var recSize;
- if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0)
- {
- alert("Bottom layer's name doesn't contain '@Size'");
- }
- else
- {
- obj.layers[obj.layers.length - 1].visible = true;
- recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
- obj.layers[obj.layers.length - 1].visible = false;
- }
- sceneData += "<arguments>";
- sceneData += "<string>" + params[1] + "</string>"; //方向
- sceneData += "<string>" + params[2] + "</string>"; //span
- sceneData += "</arguments>";
- sceneData += "</Layer>";
- }
- function exportInputField(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>InputField</type>\n<name>" + itemName + "</name>\n");
- sceneData += "<layers>";
- // sceneData += "<images>\n";
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportArtLayer(obj.layers[i]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportButton(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Button</type>\n<name>" + itemName + "</name>\n");
- sceneData += "<layers>";
- // sceneData += "<images>\n";
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportArtLayer(obj.layers[i]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportToggle(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Toggle</type>\n<name>" + itemName + "</name>\n");
- sceneData += "<layers>";
- // sceneData += "<images>\n";
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportArtLayer(obj.layers[i]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportSlider(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Slider</type>\n<name>" + itemName + "</name>\n");
- var params = obj.name.split(":");
- if (params.length != 2)
- {
- alert(obj.name + "-------Layer's name is not 1 argument------------");
- }
-
- var recSize;
- if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0)
- {
- alert("Bottom layer's name doesn't contain '@Size'");
- }
- else
- {
- setLayerSizeAndPos(obj.layers[obj.layers.length - 1]);
- }
- sceneData += "<arguments>";
- sceneData += "<string>" + params[1] + "</string>"; //滑动方向
- sceneData += "</arguments>";
-
- // sceneData += "<images>\n";
- sceneData += "<layers>";
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportArtLayer(obj.layers[i]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportScrollBar(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>ScrollBar</type>\n<name>" + itemName + "</name>\n");
- var params = obj.name.split(":");
- if (params.length != 3)
- {
- alert(obj.name + "-------Layer's name is not 1 argument------------");
- }
-
- sceneData += "<arguments>";
- sceneData += "<string>" + params[1] + "</string>"; //滑动方向
- sceneData += "<string>" + params[2] + "</string>"; //比例
- sceneData += "</arguments>";
- // sceneData += "<images>\n";
- sceneData += "<layers>";
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- exportArtLayer(obj.layers[i]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportPanel(obj)
- {
- var itemName = obj.name.substring(0, obj.name.search("@"));
- sceneData += ("<Layer>\n<type>Panel</type>\n<name>" + itemName + "</name>\n");
- exportAllLayers(obj);
- // sceneData += "<images>\n";
- sceneData += "<layers>";
- for (var j = obj.artLayers.length - 1; 0 <= j; j--)
- {
- exportArtLayer(obj.artLayers[j]);
- }
- sceneData += "</layers>";
- // sceneData += "\n</images>\n</Layer>";
- sceneData += "\n</Layer>";
- }
- function exportArtLayer(obj)
- {
- if (typeof(obj) == "undefined") {return};
- if (obj.name.search("@Size") >= 0) {return};
- sceneData += "\n<Layer>";
- sceneData += "<type>Normal</type>";
- //sceneData += "<name>" + makeValidFileName(obj.name) + "</name>";
- var validFileName = makeValidFileName(obj.name);
- sceneData += "<name>" + validFileName + "</name>";
- sceneData += "<image>\n";
- // sceneData += "<PSImage>\n";
- if (LayerKind.TEXT == obj.kind)
- {
- exportLabel(obj,validFileName);
- }
- else if (obj.name.search("Texture") >= 0)
- {
- exportTexture(obj,validFileName);
- }
- else
- {
- exportImage(obj,validFileName);
- }
- sceneData += "</image>";
- // sceneData += "</PSImage>";
- sceneData += "\n</Layer>";
- }
- function exportLabel(obj,validFileName)
- {
- //有些文本如标题,按钮,美术用的是其他字体,可能还加了各种样式,需要当做图片切出来使用
- if(obj.name.search("_ArtStatic") >= 0)
- {
- exportImage(obj,validFileName);
- return;
- }
- //处理静态文本,会对应unity的静态字体
- var StaticText = false;
- if(obj.name.search("_Static") >= 0)
- {
- StaticText = true;
- }
- sceneData += "<imageType>" + "Label" + "</imageType>\n";
- //var validFileName = makeValidFileName(obj.name);
- sceneData += "<name>" + validFileName + "</name>\n";
- obj.visible = true;
- saveScenePng(duppedPsd.duplicate(), validFileName, false);
- obj.visible = false;
-
- sceneData += "<arguments>";
- sceneData += "<string>" + obj.textItem.color.rgb.hexValue + "</string>";
-
- if(StaticText == true)
- {
- sceneData += "<string>" + obj.textItem.font + "_Static" + "</string>";
- }
- else
- {
- sceneData += "<string>" + obj.textItem.font + "</string>";
- }
- //sceneData += "<string>" + obj.textItem.font + "</string>";
- sceneData += "<string>" + obj.textItem.size.value + "</string>";
- sceneData += "<string>" + obj.textItem.contents + "</string>";
-
- //段落文本带文本框,可以取得对齐方式
- if(obj.textItem.kind == TextType.PARAGRAPHTEXT)
- {
- sceneData += "<string>" + obj.textItem.justification + "</string>"; //加对齐方式
- }
- sceneData += "</arguments>";
- }
- function exportTexture(obj,validFileName)
- {
- //var validFileName = makeValidFileName(obj.name);
- sceneData += "<imageType>" + "Texture" + "</imageType>\n";
- sceneData += "<name>" + validFileName + "</name>\n";
- obj.visible = true;
- saveScenePng(duppedPsd.duplicate(), validFileName, true);
- obj.visible = false;
- }
- function exportImage(obj,validFileName)
- {
- //var validFileName = makeValidFileName(obj.name);
- var oriName = obj.name
- sceneData += "<name>" + validFileName + "</name>\n";
- if (obj.name.search("Common") >= 0)
- {
- sceneData += "<imageSource>" + "Common" + "</imageSource>\n";
- }
- else if(obj.name.search("Global") >= 0)
- {
- sceneData += "<imageSource>" + "Global" + "</imageSource>\n";
- }
- else
- {
- sceneData += "<imageSource>" + "Custom" + "</imageSource>\n";
- }
- if (oriName.search("_9S") >= 0)
- {
- sceneData += "<imageType>" + "SliceImage" + "</imageType>\n";
- obj.visible = true;
- var _objName = obj.name
- // var newDoc = app.documents.add(duppedPsd.width, duppedPsd.height,duppedPsd.resolution, _objName+"doc",NewDocumentMode.RGB,DocumentFill.TRANSPARENT)
- // app.activeDocument = duppedPsd
- // obj.copy()
- // app.activeDocument = newDoc
- // newDoc.paste()
- // newDoc.activeLayer.name = _objName
- var recSize = getLayerRec(duppedPsd.duplicate(),true);
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
- // _9sliceCutImg(newDoc,_objName,validFileName);
- _9sliceCutImg(duppedPsd.duplicate(),_objName,validFileName);
- obj.visible = false;
- return;
- }
- else if(oriName.search("LeftHalf") > 0) //左右对称的图片切左边一半
- {
- sceneData += "<imageType>" + "LeftHalfImage" + "</imageType>\n";
-
- obj.visible = true;
-
- var recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
-
- cutLeftHalf(duppedPsd.duplicate(),validFileName);
- obj.visible = false;
- return;
- }
- else if(obj.name.search("BottomHalf") > 0) //上下对称的图片切底部一半
- {
- sceneData += "<imageType>" + "BottomHalfImage" + "</imageType>\n";
-
- obj.visible = true;
-
- //半图要先计算出大小和位置
- var recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
-
- cutBottomHalf(duppedPsd.duplicate(),validFileName);
- obj.visible = false;
- return;
- }
- else if(obj.name.search("Quarter") > 0) //上下左右均对称的图片切左下四分之一
- {
- sceneData += "<imageType>" + "QuarterImage" + "</imageType>\n";
-
- obj.visible = true;
-
- var recSize = getLayerRec(duppedPsd.duplicate());
- sceneData += "<position>";
- sceneData += "<x>" + recSize.x + "</x>";
- sceneData += "<y>" + recSize.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + recSize.width + "</width>";
- sceneData += "<height>" + recSize.height + "</height>";
- sceneData += "</size>";
-
- cutQuarter(duppedPsd.duplicate(),validFileName);
- obj.visible = false;
- return;
- }
- else
- {
- sceneData += "<imageType>" + "Image" + "</imageType>\n";
- }
- obj.visible = true;
- saveScenePng(duppedPsd.duplicate(), validFileName, true);
- obj.visible = false;
-
- }
- function hideAllLayers(obj)
- {
- hideLayerSets(obj);
- }
- function hideLayerSets(obj)
- {
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- if (obj.layers[i].typename == "LayerSet")
- {
- hideLayerSets(obj.layers[i]);
- }
- else
- {
- obj.layers[i].visible = false;
- }
- }
- }
- //显示图层组及组下所有图层
- function showAllLayers(obj)
- {
- showLayerSets(obj);
- }
- function showLayerSets(obj)
- {
- for (var i = obj.layers.length - 1; 0 <= i; i--)
- {
- if (obj.layers[i].typename == "LayerSet")
- {
- showLayerSets(obj.layers[i]);
- }
- else
- {
- obj.layers[i].visible = true;
- }
- }
- }
- function getLayerRec(psd,notMerge)
- {
- // we should now have a single art layer if all went well
- if (!notMerge){
- psd.mergeVisibleLayers();
- }
-
- // figure out where the top-left corner is so it can be exported into the scene file for placement in game
- // capture current size
- var height = psd.height.value;
- var width = psd.width.value;
- var top = psd.height.value;
- var left = psd.width.value;
- // trim off the top and left
- psd.trim(TrimType.TRANSPARENT, true, true, false, false);
- // the difference between original and trimmed is the amount of offset
- top -= psd.height.value;
- left -= psd.width.value;
- // trim the right and bottom
- psd.trim(TrimType.TRANSPARENT);
- // find center
- top += (psd.height.value / 2)
- left += (psd.width.value / 2)
- // unity needs center of image, not top left
- top = -(top - (height / 2));
- left -= (width / 2);
- height = psd.height.value;
- width = psd.width.value;
- psd.close(SaveOptions.DONOTSAVECHANGES);
- return {
- y: top,
- x: left,
- width: width,
- height: height
- };
- }
- function saveScenePng(psd, fileName, writeToDisk,notMerge)
- {
- // we should now have a single art layer if all went well
- if(!notMerge)
- {
- psd.mergeVisibleLayers();
- }
-
- // figure out where the top-left corner is so it can be exported into the scene file for placement in game
- // capture current size
- var height = psd.height.value;
- var width = psd.width.value;
- var top = psd.height.value;
- var left = psd.width.value;
- // trim off the top and left
- psd.trim(TrimType.TRANSPARENT, true, true, false, false);
- // the difference between original and trimmed is the amount of offset
- top -= psd.height.value;
- left -= psd.width.value;
- // trim the right and bottom
- psd.trim(TrimType.TRANSPARENT);
- // find center
- top += (psd.height.value / 2)
- left += (psd.width.value / 2)
- // unity needs center of image, not top left
- top = -(top - (height / 2));
- left -= (width / 2);
- height = psd.height.value;
- width = psd.width.value;
- var rec = {
- y: top,
- x: left,
- width: width,
- height: height
- };
- // save the scene data
- if(!notMerge){
- sceneData += "<position>";
- sceneData += "<x>" + rec.x + "</x>";
- sceneData += "<y>" + rec.y + "</y>";
- sceneData += "</position>";
- sceneData += "<size>";
- sceneData += "<width>" + rec.width + "</width>";
- sceneData += "<height>" + rec.height + "</height>";
- sceneData += "</size>";
- }
-
- if (writeToDisk)
- {
- // save the image
- var pngFile = new File(destinationFolder + "/" + fileName + ".png");
- var pngSaveOptions = new PNGSaveOptions();
- psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
- }
- psd.close(SaveOptions.DONOTSAVECHANGES);
- }
- function makeValidFileName(fileName)
- {
- var validName = fileName.replace(/^\s+|\s+$/gm, ''); // trim spaces
- //删除九宫格关键字符
- validName = validName.replace(/\s*_9S(\:\d+)+/g,"")
- validName = validName.replace(/[\\\*\/\?:"\|<>]/g, ''); // remove characters not allowed in a file name
- validName = validName.replace(/[ ]/g, '_'); // replace spaces with underscores, since some programs still may have troubles with them
- if (validName.match("Common") || validName.match("Global"))
- {
- validName = validName.substring (0,validName.lastIndexOf ("@")); //截取@之后的字符串作为图片的名称。
- }
- else if(!sourcePsdName.match("Common") || !sourcePsdName.match("Global")) // 判断是否为公用的PSD素材文件,如果不是,则自动为图片增加后缀,防止重名。 公用psd文件的图片层不允许重名。
- {
- validName += "_" + uuid++;
- }
-
- $.writeln(validName);
- return validName;
- }
- /***************************************************************************************************************************************************************************************************************/
- //对称的图片处理,切一半
- //2017.01.10
- //by zs
- // 裁切 基于透明像素
- function trim(doc){
- doc.trim(TrimType.TRANSPARENT,true,true,true,true);
- }
- // 裁剪左半部分
- function cutLeftHalf(doc,layerName){
- doc.mergeVisibleLayers();
-
- trim(doc);
- var _obj = doc.activeLayer
- var width = doc.width;
- var height = doc.height;
- var side = width / 2;
- var region = Array(Array(0,height),Array(0,0),Array(side,0),Array(side,height));
-
- var selectRect = doc.selection.select(region);
- doc.selection.copy();
- var newStem = doc.paste();
- newStem.name = layerName;
- var deltaX = 0;
- var deltaY = 0;
- if(region[0][0] != 0){
- deltaX = -(width - side*2);
- }
- newStem.translate(deltaX,deltaY);
- _obj.visible = false;
- trim(doc);
- saveScenePng(doc, layerName, true,true);
- // exportHalfImage(doc,"LeftHalf");
- }
- // 裁剪下半部分
- function cutBottomHalf(doc,layerName){
- doc.mergeVisibleLayers();
-
- trim(doc);
- var _obj = doc.activeLayer
- var width = doc.width;
- var height = doc.height;
- var side = height / 2;
- //var region = Array(Array(0,side),Array(0,0),Array(width,0),Array(width,side));
- var region = Array(Array(0,height),Array(0,side),Array(width,side),Array(width,height));
-
- var selectRect = doc.selection.select(region);
- doc.selection.copy();
- var newStem = doc.paste();
- newStem.name = layerName;
- var deltaX = 0;
- var deltaY = 0;
- if (region[0][1] != side){
- deltaY = -(height - side*2);
- }
- newStem.translate(deltaX,deltaY);
- _obj.visible = false;
- trim(doc);
- saveScenePng(doc, layerName, true,true);
- //exportHalfImage(doc,"UpHalf");
- }
- // 裁剪左下四分之一
- function cutQuarter(doc,layerName){
- doc.mergeVisibleLayers();
-
- trim(doc);
- var _obj = doc.activeLayer
- var width = doc.width;
- var height = doc.height;
- var side = height / 2;
- var region = Array(Array(0,height),Array(0,height / 2),Array(width / 2,height / 2),Array(width / 2,height));
-
- var selectRect = doc.selection.select(region);
- doc.selection.copy();
- var newStem = doc.paste();
- newStem.name = layerName;
- var deltaX = 0;
- var deltaY = 0;
- if (region[0][1] != side){
- deltaY = -(height - side*2);
- }
- newStem.translate(deltaX,deltaY);
- _obj.visible = false;
- trim(doc);
- saveScenePng(doc, layerName, true,true);
- }
- function exportHalfImage(psd,halfType)
- {
- hideAllLayers(psd);
-
- var layerName = "";
- for (var i = psd.layers.length - 1; 0 <= i; i--)
- {
- layerName = psd.layers[i].name;
- if(layerName.match(halfType))
- {
- psd.layers[i].visible = true;
- saveScenePng(psd, layerName, true,true);
- }
- }
- }
- /***************************************************************************************************************************************************************************************************************/
- //九宫格切图
- //2017.01.13
- //by HuangLang
- function _9sliceCutImg(doc,layerName,vaildName){
- // 创建图层组
- var _obj = doc.activeLayer
- var stemGroup = doc.layerSets.add();
- stemGroup.name = layerName
- // _obj.move(stemGroup,ElementPlacement.PLACEATEND)
- doc.mergeVisibleLayers();
- trim(doc);
- var width = doc.width;
- var height = doc.height;
- var re = /\s*_9S(\:\d+)+/g;
- var getStr = ""
- var result = layerName.match(re)
- if (result) {
- getStr = result[0]
- }else{
- alert("图层名为:"+layerName+"的九宫格格式不对!应为_9S:XX或:XX:XX:XX:XX");
- return;
- }
- var nums = getStr.split(":")
- if ( nums.length == 2) {
- for(var j = 0;j<slicePaddingArr.length;j++)
- {
- sliceOriArr[j] = parseInt(nums[1])
- slicePaddingArr[j] = parseInt(nums[1])
- }
- }
- else if ( nums.length == 5)
- {
- for(var j = 0;j<slicePaddingArr.length;j++)
- {
- var num = parseInt(nums[j+1])
- sliceOriArr[j] = num
- if (num == 0 ){
- if ((j+1) %2 == 0) {
- num = parseInt(height/2)
- }else{
-
- num = parseInt(width/2)
- }
- }
- slicePaddingArr[j] = num
- }
- }else{
- alert("图层名为:"+layerName+"的九宫格格式不对!应为_9S:XX或:XX:XX:XX:XX");
- return;
- }
-
- var _obj = doc.activeLayer
- //左下左上,右上右下
- var selRegion = Array(
- Array(Array(0,slicePaddingArr[1]),Array(0, 0),Array(slicePaddingArr[0] , 0),Array(slicePaddingArr[0], slicePaddingArr[1])),
- Array(Array(width-slicePaddingArr[2],slicePaddingArr[1]),Array(width-slicePaddingArr[2], 0),Array(width , 0),Array(width, slicePaddingArr[1])),
- Array(Array(0,height),Array(0, height-slicePaddingArr[3]),Array(slicePaddingArr[0] , height-slicePaddingArr[3]),Array(slicePaddingArr[0], height)),
- Array(Array(width-slicePaddingArr[2],height),Array(width-slicePaddingArr[2], height-slicePaddingArr[3]),Array(width , height-slicePaddingArr[3]),Array(width, height)),
- );
- for (var i = 0;i<selRegion.length;i++)
- {
- doc.activeLayer = _obj;
- doc.selection.select(selRegion[i]);
- doc.selection.copy();
- var newStem = doc.paste();
- newStem.name = vaildName;
- var deltaX = 0;
- var deltaY = 0;
- if(selRegion[i][0][0] != 0){
- deltaX = - (width - slicePaddingArr[0]-slicePaddingArr[2]);
- }
- if(selRegion[i][1][1] != 0){
- deltaY = - (height - slicePaddingArr[1]-slicePaddingArr[3]);
- }
- newStem.translate(deltaX,deltaY);
- }
- _obj.visible = false;
- doc.mergeVisibleLayers();
- sceneData += "<arguments>";
- sceneData += "<string>" + sliceOriArr[0] + "</string>";
- sceneData += "<string>" + sliceOriArr[1] + "</string>";
- sceneData += "<string>" + sliceOriArr[2] + "</string>";
- sceneData += "<string>" + sliceOriArr[3] + "</string>";
- sceneData += "</arguments>";
- trim(doc);
- saveScenePng(doc, vaildName, true,true);
- }
|