diff --git a/ps.go b/ps.go index 4db93a1..d46d3a2 100644 --- a/ps.go +++ b/ps.go @@ -23,6 +23,19 @@ var Cmd string var Opts string var pkgpath string +// PSSaveOptions is an enum for options when closing a document. +type PSSaveOptions int + +func (p *PSSaveOptions) String() string { + return fmt.Sprint("", *p) +} + +const ( + PSSaveChanges PSSaveOptions = 1 + PSDoNotSaveChanges PSSaveOptions = 2 + PSPromptToSaveChanges PSSaveOptions = 3 +) + func init() { _, file, _, _ := runtime.Caller(0) pkgpath = filepath.Dir(file) @@ -42,8 +55,8 @@ func Start() error { } // Close closes the active document. -func Close() error { - _, err := run("close") +func Close(save PSSaveOptions) error { + _, err := run("close", save.String()) return err } @@ -54,11 +67,8 @@ func Open(path string) error { } // Quit exits Photoshop. -// -// There are 3 valid values for save: 1 (psSaveChanges), 2 (psDoNotSaveChanges), -// 3 (psPromptToSaveChanges). -func Quit(save int) error { - _, err := run("quit", string(save)) +func Quit(save PSSaveOptions) error { + _, err := run("quit", save.String()) return err } @@ -96,7 +106,6 @@ func DoJs(path string, args ...string) ([]byte, error) { // Useful for when you need to do something by hand in the middle of an // otherwise automated process. func Wait(msg string) { - fmt.Println() fmt.Print(msg) var input string fmt.Scanln(&input) diff --git a/ps_test.go b/ps_test.go index 8bcae3c..3a9a104 100644 --- a/ps_test.go +++ b/ps_test.go @@ -2,10 +2,8 @@ package ps import ( "fmt" - // "log" "os" "path/filepath" - _ "strings" "testing" ) @@ -17,7 +15,10 @@ func TestPkgPath(t *testing.T) { } func TestStart(t *testing.T) { - Start() + err := Start() + if err != nil { + t.Fatal(err) + } } func TestOpen(t *testing.T) { @@ -31,14 +32,23 @@ func TestOpen(t *testing.T) { } func TestClose(t *testing.T) { - Close() + if testing.Short() { + t.Skip("Skipping \"TestClose\"") + } + err := Close(2) + if err != nil { + t.Fatal(err) + } } func TestQuit(t *testing.T) { if testing.Short() { t.Skip("Skipping \"TestQuit\"") } - Quit(2) + err := Quit(2) + if err != nil { + t.Fatal(err) + } } func TestDoJs(t *testing.T) { @@ -109,14 +119,14 @@ func TestLayers(t *testing.T) { } func TestLayer(t *testing.T) { - // lyr, err := Layer("Areas/TitleBackground") - _, err := Layer("Areas/TitleBackground") + lyr, err := Layer("Areas/TitleBackground") + // _, err := Layer("Areas/TitleBackground") if err != nil { t.Fatal(err) } - /* fmt.Println(lyr.Name) - fmt.Println(lyr.Bounds) - */ + fmt.Println(lyr.Name) + fmt.Println(lyr.Bounds) + } func TestApplyDataset(t *testing.T) { @@ -129,4 +139,15 @@ func TestApplyDataset(t *testing.T) { fail := fmt.Sprintf("TestJS failed.\ngot:\t\"%s\"\nwant:\t\"%s\"", ret, out) t.Fatal(fail) } + err = Quit(2) + if err != nil { + t.Fatal(err) + } +} + +func TestDoJs_HideLayer(t *testing.T) { + _, err := DoJs("hideLayers.jsx", "Areas/TitleBackground") + if err != nil { + t.Fatal(err) + } } diff --git a/scripts/close.vbs b/scripts/close.vbs index 1e18426..ac2275f 100644 --- a/scripts/close.vbs +++ b/scripts/close.vbs @@ -1,3 +1,3 @@ set App = CreateObject("Photoshop.Application") set Doc = App.activeDocument -Doc.Close \ No newline at end of file +Doc.Close(CInt(wScript.Arguments(0))) \ No newline at end of file diff --git a/scripts/getLayers.jsx b/scripts/getLayers.jsx index b58a834..fafd93d 100644 --- a/scripts/getLayers.jsx +++ b/scripts/getLayers.jsx @@ -1,32 +1,18 @@ -//arguments = [ 'F:\\TEMP\\js_out.txt\r\narg\r\nargs\r\n', 'Areas/TitleBackground'] -var saveFile = File(arguments[0]) -if(saveFile.exists) - saveFile.remove() -saveFile.encoding = "UTF8" -saveFile.open("e", "TEXT", "????") -try { - var doc = app.activeDocument - var splitPath = arguments[1].split('/') - var bottomLayerSet = doc.layerSets.getByName(splitPath[0]) - for (var i = 1; i < splitPath.length; i++) { - try {bottomLayerSet = bottomLayerSet.layerSets.getByName(splitPath[i])} - catch (e) {bottomLayerSet = { layers: [bottomLayerSet.layers.getByName(splitPath[i])] }} - } - saveFile.writeln('['); - for (var l = 0; l < bottomLayerSet.layers.length; l++) { - var lyr = bottomLayerSet.layers[l] - saveFile.write('{"Name":"' + lyr.name + '", "Bounds": [["' + lyr.bounds[0] + '","' + - lyr.bounds[1] + '","' + lyr.bounds[2] + '"],["' + lyr.bounds[3] + '"]]}'); - if (l != bottomLayerSet.layers.length - 1) - saveFile.write(','); - saveFile.writeln(); +#include lib.js +var stdout = newFile(arguments[0]) +var set = getLayers(arguments[1]) + +stdout.writeln('['); +for (var l = 0; l < set.layers.length; l++) { + var lyr = set.layers[l] + var lyrset = arguments[1].replace(lyr.name, "") + stdout.write(('{"Name":"' + lyr.name + '", "Bounds": [[' + lyr.bounds[0] + ',' + + lyr.bounds[1] + '],[' + lyr.bounds[2] + ',' + + lyr.bounds[3] + ']], "LayerSet": "' + lyrset + '"}').replace(/ px/g, "")); + if (l != set.layers.length - 1) + stdout.write(','); + stdout.writeln(); - } - saveFile.writeln(']'); -} catch (e) { - if (e.message.indexOf('User') == -1) - alert('ERROR: ' + e.message + ' at ' + e.fileName + ':' + e.line); - else - throw new Exception('User cancelled the operation'); } -saveFile.close(); \ No newline at end of file +stdout.writeln(']'); +stdout.close() \ No newline at end of file diff --git a/scripts/lib.js b/scripts/lib.js new file mode 100644 index 0000000..248dda4 --- /dev/null +++ b/scripts/lib.js @@ -0,0 +1,34 @@ +// Opens and returns a file, overwriting new data. +function newFile(path) { + var f = File(path) + if(f.exists) + f.remove() + f.encoding = "UTF8" + f.open("e", "TEXT", "????") + return f +} + +// Returns an array of ArtLayers from a layerSet or an ArtLayer. +function getLayers(path) { + try { + var doc = app.activeDocument + var path = path.split('/') + var lyrs = doc.layerSets.getByName(path[0]) + for (var i = 1; i < path.length; i++) { + try { + lyrs = lyrs.layerSets.getByName(path[i]) + } catch (e) { + lyrs = { layers: [lyrs.layers.getByName(path[i])] } } + } + return lyrs + } catch (e) { + if (e.message.indexOf('User') == -1) + alert(err(e)); + else + throw new Exception('User cancelled the operation'); + } +} + +function err(e) { + return 'ERROR: ' + e.message + ' at ' + e.fileName + ':' + e.line; +} \ No newline at end of file diff --git a/scripts/quit.vbs b/scripts/quit.vbs index b4dbca4..9f77998 100644 --- a/scripts/quit.vbs +++ b/scripts/quit.vbs @@ -2,7 +2,7 @@ Set appRef = CreateObject("Photoshop.Application") Do While appRef.Documents.Count > 0 - appRef.ActiveDocument.Close(wScript.Arguments(0)) + appRef.ActiveDocument.Close(CInt(wScript.Arguments(0))) Loop appRef.Quit() \ No newline at end of file diff --git a/scripts/setLayerVisibility.jsx b/scripts/setLayerVisibility.jsx new file mode 100644 index 0000000..ce52ae4 --- /dev/null +++ b/scripts/setLayerVisibility.jsx @@ -0,0 +1,11 @@ +#include lib.js +var stdout = newFile(arguments[0]) +var lyrs = getLayers(arguments[1]) +var vis = arguments[2] == "true" +try { + for (var i = 0; i < lyrs.layers.length; i++) + lyrs.layers[i].visible = vis +} catch (e) { + stdout.writeln(err(e)) +} +stdout.close() \ No newline at end of file diff --git a/structs.go b/structs.go index 9d38402..141111b 100644 --- a/structs.go +++ b/structs.go @@ -8,7 +8,12 @@ package ps type ArtLayer struct { Name string TextItem string - Bounds [2][2]string + Bounds [2][2]int + LayerSet string +} + +func (a *ArtLayer) SetVisible() { + DoJs("setLayerVisibility.jsx", a.LayerSet+"/"+a.Name, "true") } // func (a *ArtLayer) Name() string {