• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Photoshop 2014.2 bug with duplicating layers in different doc

Enthusiast ,
Oct 12, 2014 Oct 12, 2014

Copy link to clipboard

Copied

Encountered an issue with Photoshop 2014.2 that occurs when I try to use some_basic_bitmap_layer.duplicate(some_layer_in_different_doc, ElementPlacement.PLACEAFTER). So this is code that has been pretty much unchanged for a year and works in CS6 and CC2012 and used to worked in CC2014.1. I use .duplicate() with docs and with layers inside same doc, but this is the one giving exception:

General Photoshop error occured. This functionality may not be available in this version of Photoshop.

- The object " <unknown> of layer 2" is not currently available

Another strange thing is is that in ESTK debugging the exception surfaced in a bit different places depending on factoring. I.e. before I added more detailed exception catching, it occured later in code. But this place is the only spot there is a layer named "layer 2". But gives me the feeling it's an internal state corruption

I'm guessing it might so specific no-one else will hit it, but I'd like to ask

- Any workarounds you can think of?

- Any ways to directly escalate it to Adobe given it's a new release. The general feedback site seems a waste of effort.

- Any way to downgrade (in a way that normal users could do it also) to 2014.1?

TOPICS
Actions and scripting

Views

1.4K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe
Community Expert ,
Oct 12, 2014 Oct 12, 2014

Copy link to clipboard

Copied

Matias Kiviniemi,

please show us a screenshot of your picture including the layers palette and also the real Javascriptcode.

Otherwise: Sorry, my crystal ball is on repairs...

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Oct 12, 2014 Oct 12, 2014

Copy link to clipboard

Copied

It's quite complex.. Before the offending line several hundreds of lines code has been run. But I managed to squeeze it to a small replicable format. I.e. below code runs in CC2012 but fires an exception in CC2014.2. Code is funny, but it's basically the steps of doc manipulation that happens in minimal case. Should work on any PSD, but you can get an example from here: Dropbox - bug_report.psd

try {

    var original_doc = app.activeDocument

    var  copy_doc = original_doc.duplicate("copy_doc", false) // duplicate original

    var export_doc = app.documents.add(original_doc.width, original_doc.height, original_doc.resolution, "export_doc", NewDocumentMode.RGB, DocumentFill.TRANSPARENT) // create empty export doc

    app.activeDocument = copy_doc   // select copy and first layer of it

    var layer = copy_doc.artLayers[0]

    // create dummy layer to merge to to flatten all vector & style data

    var tmp_layer =  copy_doc.artLayers.add()

    tmp_layer.move(layer, ElementPlacement.PLACEAFTER)

    layer = layer.merge()

    // copy layer to export doc

    layer.duplicate (export_doc.artLayers[0] , ElementPlacement.PLACEAFTER)

} catch (e) {

    alert(e.message)

} finally {

    copy_doc.close(SaveOptions.DONOTSAVECHANGES)

    export_doc.close(SaveOptions.DONOTSAVECHANGES)  

}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Oct 12, 2014 Oct 12, 2014

Copy link to clipboard

Copied

Okay, thx.

I do not work with CC – but did you check this?

var original_doc = app.activeDocument;

var  copy_doc = original_doc.duplicate("copy_doc", false); // duplicate original

var export_doc = app.documents.add(original_doc.width, original_doc.height, original_doc.resolution, "export_doc", NewDocumentMode.RGB, DocumentFill.TRANSPARENT); // create empty export doc

app.activeDocument = copy_doc;   // select copy and first layer of it

var layer = copy_doc.artLayers[0];

if (!layer.isBackgroundLayer) {

    //alert ("is not background")

if (layer.visible == true) {

    //alert ("visible")

if (!layer.allLocked) {

    //alert ("not locked")

    alert("Did you check this all?")

    }

}

}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Oct 12, 2014 Oct 12, 2014

Copy link to clipboard

Copied

Thanks. They are checked for being locked and can't be background since in the real case it'll always be a layer in group. Invisible it might be, but has not mattered so far.

And in the example PSD (and any that I've tried) that causes an exception these are all OK.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 09, 2014 Nov 09, 2014

Copy link to clipboard

Copied

Thanks for the feedback!

The sample code is meant for the sample psd, so it's playing on assumption that there is only one layer that is not background, is visible and not locked. In the production code it's always inside a group so it's not a background and we check for locked. Visibility we don't check but it has not been the case in the PSDs we've replicated this in.

However playing with this I did manage to find a workaround: it's possible to duplicate the layer to beginning of doc and then move it like below.

try {

    var original_doc = app.activeDocument

    var  copy_doc = original_doc.duplicate("copy_doc", false) // duplicate original

    var export_doc = app.documents.add(original_doc.width, original_doc.height, original_doc.resolution, "export_doc", NewDocumentMode.RGB, DocumentFill.TRANSPARENT) // create empty export doc

    app.activeDocument = copy_doc   // select copy and first layer of it

    var layer = copy_doc.artLayers[0]

    // create dummy layer to merge to to flatten all vector & style data

    var tmp_layer =  copy_doc.artLayers.add()

    tmp_layer.move(layer, ElementPlacement.PLACEAFTER)

    layer = layer.merge()

    var duplicate = layer.duplicate (export_doc , ElementPlacement.PLACEATBEGINNING)

    app.activeDocument = export_doc

    var dummy = export_doc.artLayers.add()

    var target = export_doc.artLayers.add()

    duplicate.move(target, ElementPlacement.PLACEAFTER)

} catch (e) {

    alert(e.message)

} finally {

    copy_doc.close(SaveOptions.DONOTSAVECHANGES)

    export_doc.close(SaveOptions.DONOTSAVECHANGES)   

}

Also if I try to move duplicated layer without setting the active document Photoshop raises the same exception "The object " <unknown> of layer 2" is not currently available". I.e. it's hitting some internal issue instead of giving the right error of "not allowed to move layers in non-selected document". It kind of makes sense, i.e. duplicating to different doc after certain layer is a combo operation that duplicates to different doc and moves and they different requirements (what is the active doc).

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 09, 2014 Nov 09, 2014

Copy link to clipboard

Copied

Yes, you have to have the doc from which you're moving the layer from as the front document. So far, I haven't had any issues with duplicating a layer using PLACEAFTER, as long as I'm not trying to place it after a background layer. I wrote a extension panel that moves and duplicates multiple layers within the current document and to different documents. So far I haven't had any issues with it, as long as I have the error checking for that background layer.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 09, 2014 Nov 09, 2014

Copy link to clipboard

Copied

Well, I never had issues before CC 2014.2 (still works fine in CC 2012 and CS6), have you tested that? It might also be dependant on the layer internal state, i.e. that merge might matter.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Nov 07, 2014 Nov 07, 2014

Copy link to clipboard

Copied

We are working on a fix for this. The work around would be to use Action* instead of the DOM. Use ScriptListener to generate the code for you.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 08, 2014 Nov 08, 2014

Copy link to clipboard

Copied

Tom, there is a flaw in trying to use ScriptListener code to duplicate one or more layers from one document to another, which is what the OP seems to be saying. If you generate the code, there is no way to specify which layer is to be duplicated, and it will throw an error. See bug 3783024.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Nov 10, 2014 Nov 10, 2014

Copy link to clipboard

Copied

@csuebele, In the bug you have this step: "Drag one of more layers from one document to another." If you turn on actions recording you will note that the "duplicate the layer" action never occurred but you only got a "select document" event. This is the bug that should be reported, the fact that the duplicate event was never reported. Remember that everything does not get recorded via user actions and you might need to think of alternatives. "Insert Menu item" is one that comes to mind.

To get ScriptListener and the actions panel to capture this event, 1) select the layers you want copied, 2) use the flyout menu on the layers panel to "Duplicate Layer..." and then use the dialog to get the layers into your other document. You might need to move the layer after it arrives in the other document.

I believe you can use all the other steps using the DOM code and only replace the duplicate command in this example.

NOTE: Our layer indexing and id capturing is the bug. If you are dealing with multiple documents with different layer structures you are going to hit that bug. I would recommend using ScriptListener code or always using the activeDocument and activeLayer to work around this problem. The merge() in the example above is what causes the indexing and id's to go out of sync. Ps is trying to get the index of the active document and not the layer from the other document.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 10, 2014 Nov 10, 2014

Copy link to clipboard

Copied

LATEST

Thanks, for that insight, Tom. I didn't think about using the layer's panel to record the duplicate.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 08, 2014 Nov 08, 2014

Copy link to clipboard

Copied

One thing I'm seeing in your code is that you're not checking to see if you are trying to move the layer after a background layer. Either make sure layer[0] is not a background layer, if it is convert it to a normal layer, or use PLACEBEFORE.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines