17 Replies Latest reply on May 8, 2017 6:33 AM by jacqw4878115

    CC 14.2 Smart Objects, Relative Path?

    Stapledon Level 1



      The Linked SO's are very welcome, however as far as I can tell we're still stuck with absolute file paths. Is this right; there's no way to map to document relative paths?

        • 2. Re: CC 14.2 Smart Objects, Relative Path?
          JJMack Most Valuable Participant

          There are not two Place items in the menu File.  Place Embedded and Place Linked this had me worried because I use  the old menu FIle>Place in many of my scripts.  The good news for was my scripts still worked.   I use ScriptListener code for Place in my scripts so I went about capturing "Place Embedded" and "Place Link" compare them to the old "Place" All three do record full Path so I'm quite sure it would have to be and most likely you can not move file and expect things to work.  To me a relative path would not work for smart object layer has pixels rendered for the image file be it layers  have ACR setting if its RAW. It has to be a particular file.  The Path can not change neither Windows  and OSX have an object oriented file system.



          // ========= Place Embedded Photoshop CC 14.2 =======    // ========Place Linked Photoshop CC 14.2============  // ========Place prior Photoshop CC 14.2============================

          var idPlc = charIDToTypeID( "Plc " );                                          var idPlc = charIDToTypeID( "Plc " );                                          var idPlc = charIDToTypeID( "Plc " );

              var desc34 = new ActionDescriptor();                                           var desc37 = new ActionDescriptor();                                           var desc5 = new ActionDescriptor();

              var idnull = charIDToTypeID( "null" );                                         var idnull = charIDToTypeID( "null" );                                         var idnull = charIDToTypeID( "null" );

              desc34.putPath( idnull, new File( "Path\\Name" ) );                            desc37.putPath( idnull, new File( "Path\\Name" ) );                            desc5.putPath( idnull, new File( "Path\\Name" ) );



              var idOpAs = charIDToTypeID( "OpAs" );

                  var desc35 = new ActionDescriptor();

                  var idCMod = charIDToTypeID( "CMod" );

                  desc35.putString( idCMod, """Canon EOS-1D Mark II""" );

                  var idSett = charIDToTypeID( "Sett" );

                  var idSett = charIDToTypeID( "Sett" );

                  var idCst = charIDToTypeID( "Cst " );

                  desc35.putEnumerated( idSett, idSett, idCst );

                  var idWBal = charIDToTypeID( "WBal" );

                  var idWBal = charIDToTypeID( "WBal" );

                  var idAsSh = charIDToTypeID( "AsSh" );

                  desc35.putEnumerated( idWBal, idWBal, idAsSh );

                  var idTemp = charIDToTypeID( "Temp" );

                  desc35.putInteger( idTemp, 5500 );

                  var idTint = charIDToTypeID( "Tint" );

                  desc35.putInteger( idTint, 6 );

                  var idAWBV = charIDToTypeID( "AWBV" );

                  desc35.putInteger( idAWBV, 134348800 );

                  var idCtoG = charIDToTypeID( "CtoG" );

                  desc35.putBoolean( idCtoG, false );

                  var idStrt = charIDToTypeID( "Strt" );

                  desc35.putInteger( idStrt, 0 );

                  var idShrp = charIDToTypeID( "Shrp" );

                  desc35.putInteger( idShrp, 25 );

                  var idLNR = charIDToTypeID( "LNR " );

                  desc35.putInteger( idLNR, 0 );

                  var idCNR = charIDToTypeID( "CNR " );

                  desc35.putInteger( idCNR, 25 );

                  var idVigA = charIDToTypeID( "VigA" );

                  desc35.putInteger( idVigA, 0 );

                  var idBlkB = charIDToTypeID( "BlkB" );

                  desc35.putInteger( idBlkB, 0 );

                  var idRHue = charIDToTypeID( "RHue" );

                  desc35.putInteger( idRHue, 0 );

                  var idRSat = charIDToTypeID( "RSat" );

                  desc35.putInteger( idRSat, 0 );

                  var idGHue = charIDToTypeID( "GHue" );

                  desc35.putInteger( idGHue, 0 );

                  var idGSat = charIDToTypeID( "GSat" );

                  desc35.putInteger( idGSat, 0 );

                  var idBHue = charIDToTypeID( "BHue" );

                  desc35.putInteger( idBHue, 0 );

                  var idBSat = charIDToTypeID( "BSat" );

                  desc35.putInteger( idBSat, 0 );

                  var idVibr = charIDToTypeID( "Vibr" );

                  desc35.putInteger( idVibr, 23 );

                  var idHA_R = charIDToTypeID( "HA_R" );

                  desc35.putInteger( idHA_R, 0 );

                  var idHA_O = charIDToTypeID( "HA_O" );

                  desc35.putInteger( idHA_O, 0 );

                  var idHA_Y = charIDToTypeID( "HA_Y" );

                  desc35.putInteger( idHA_Y, 0 );

                  var idHA_G = charIDToTypeID( "HA_G" );

                  desc35.putInteger( idHA_G, 0 );

                  var idHA_A = charIDToTypeID( "HA_A" );

                  desc35.putInteger( idHA_A, 0 );

                  var idHA_B = charIDToTypeID( "HA_B" );

                  desc35.putInteger( idHA_B, 0 );

                  var idHA_P = charIDToTypeID( "HA_P" );

                  desc35.putInteger( idHA_P, 0 );

                  var idHA_M = charIDToTypeID( "HA_M" );

                  desc35.putInteger( idHA_M, 0 );

                  var idSA_R = charIDToTypeID( "SA_R" );

                  desc35.putInteger( idSA_R, 0 );

                  var idSA_O = charIDToTypeID( "SA_O" );

                  desc35.putInteger( idSA_O, 0 );

                  var idSA_Y = charIDToTypeID( "SA_Y" );

                  desc35.putInteger( idSA_Y, 0 );

                  var idSA_G = charIDToTypeID( "SA_G" );

                  desc35.putInteger( idSA_G, 0 );

                  var idSA_A = charIDToTypeID( "SA_A" );

                  desc35.putInteger( idSA_A, 0 );

                  var idSA_B = charIDToTypeID( "SA_B" );

                  desc35.putInteger( idSA_B, 0 );

                  var idSA_P = charIDToTypeID( "SA_P" );

                  desc35.putInteger( idSA_P, 0 );

                  var idSA_M = charIDToTypeID( "SA_M" );

                  desc35.putInteger( idSA_M, 0 );

                  var idLA_R = charIDToTypeID( "LA_R" );

                  desc35.putInteger( idLA_R, 0 );

                  var idLA_O = charIDToTypeID( "LA_O" );

                  desc35.putInteger( idLA_O, 0 );

                  var idLA_Y = charIDToTypeID( "LA_Y" );

                  desc35.putInteger( idLA_Y, 0 );

                  var idLA_G = charIDToTypeID( "LA_G" );

                  desc35.putInteger( idLA_G, 0 );

                  var idLA_A = charIDToTypeID( "LA_A" );

                  desc35.putInteger( idLA_A, 0 );

                  var idLA_B = charIDToTypeID( "LA_B" );

                  desc35.putInteger( idLA_B, 0 );

                  var idLA_P = charIDToTypeID( "LA_P" );

                  desc35.putInteger( idLA_P, 0 );

                  var idLA_M = charIDToTypeID( "LA_M" );

                  desc35.putInteger( idLA_M, 0 );

                  var idSTSH = charIDToTypeID( "STSH" );

                  desc35.putInteger( idSTSH, 0 );

                  var idSTSS = charIDToTypeID( "STSS" );

                  desc35.putInteger( idSTSS, 0 );

                  var idSTHH = charIDToTypeID( "STHH" );

                  desc35.putInteger( idSTHH, 0 );

                  var idSTHS = charIDToTypeID( "STHS" );

                  desc35.putInteger( idSTHS, 0 );

                  var idSTB = charIDToTypeID( "STB " );

                  desc35.putInteger( idSTB, 0 );

                  var idPC_S = charIDToTypeID( "PC_S" );

                  desc35.putInteger( idPC_S, 0 );

                  var idPC_D = charIDToTypeID( "PC_D" );

                  desc35.putInteger( idPC_D, 0 );

                  var idPC_L = charIDToTypeID( "PC_L" );

                  desc35.putInteger( idPC_L, 0 );

                  var idPC_H = charIDToTypeID( "PC_H" );

                  desc35.putInteger( idPC_H, 0 );

                  var idPC_one = charIDToTypeID( "PC_1" );

                  desc35.putInteger( idPC_one, 25 );

                  var idPC_two = charIDToTypeID( "PC_2" );

                  desc35.putInteger( idPC_two, 50 );

                  var idPC_three = charIDToTypeID( "PC_3" );

                  desc35.putInteger( idPC_three, 75 );

                  var idShpR = charIDToTypeID( "ShpR" );

                  desc35.putDouble( idShpR, 1.000000 );

                  var idShpD = charIDToTypeID( "ShpD" );

                  desc35.putInteger( idShpD, 25 );

                  var idShpM = charIDToTypeID( "ShpM" );

                  desc35.putInteger( idShpM, 0 );

                  var idPCVA = charIDToTypeID( "PCVA" );

                  desc35.putInteger( idPCVA, 0 );

                  var idGRNA = charIDToTypeID( "GRNA" );

                  desc35.putInteger( idGRNA, 0 );

                  var idCNRD = charIDToTypeID( "CNRD" );

                  desc35.putInteger( idCNRD, 50 );

                  var idCNRS = charIDToTypeID( "CNRS" );

                  desc35.putInteger( idCNRS, 50 );

                  var idLPEn = charIDToTypeID( "LPEn" );

                  desc35.putInteger( idLPEn, 0 );

                  var idMDis = charIDToTypeID( "MDis" );

                  desc35.putInteger( idMDis, 0 );

                  var idPerV = charIDToTypeID( "PerV" );

                  desc35.putInteger( idPerV, 0 );

                  var idPerH = charIDToTypeID( "PerH" );

                  desc35.putInteger( idPerH, 0 );

                  var idPerR = charIDToTypeID( "PerR" );

                  desc35.putDouble( idPerR, 0.000000 );

                  var idPerS = charIDToTypeID( "PerS" );

                  desc35.putInteger( idPerS, 100 );

                  var idPerA = charIDToTypeID( "PerA" );

                  desc35.putInteger( idPerA, 0 );

                  var idPerU = charIDToTypeID( "PerU" );

                  desc35.putInteger( idPerU, 0 );

                  var idAuCA = charIDToTypeID( "AuCA" );

                  desc35.putInteger( idAuCA, 0 );

                  var idExonetwo = charIDToTypeID( "Ex12" );

                  desc35.putDouble( idExonetwo, 0.600000 );

                  var idCronetwo = charIDToTypeID( "Cr12" );

                  desc35.putInteger( idCronetwo, -10 );

                  var idHionetwo = charIDToTypeID( "Hi12" );

                  desc35.putInteger( idHionetwo, -19 );

                  var idShonetwo = charIDToTypeID( "Sh12" );

                  desc35.putInteger( idShonetwo, 19 );

                  var idWhonetwo = charIDToTypeID( "Wh12" );

                  desc35.putInteger( idWhonetwo, -3 );

                  var idBkonetwo = charIDToTypeID( "Bk12" );

                  desc35.putInteger( idBkonetwo, 28 );

                  var idClonetwo = charIDToTypeID( "Cl12" );

                  desc35.putInteger( idClonetwo, 19 );

                  var idDfPA = charIDToTypeID( "DfPA" );

                  desc35.putInteger( idDfPA, 0 );

                  var idDPHL = charIDToTypeID( "DPHL" );

                  desc35.putInteger( idDPHL, 30 );

                  var idDPHH = charIDToTypeID( "DPHH" );

                  desc35.putInteger( idDPHH, 70 );

                  var idDfGA = charIDToTypeID( "DfGA" );

                  desc35.putInteger( idDfGA, 0 );

                  var idDPGL = charIDToTypeID( "DPGL" );

                  desc35.putInteger( idDPGL, 40 );

                  var idDPGH = charIDToTypeID( "DPGH" );

                  desc35.putInteger( idDPGH, 60 );

                  var idCrv = charIDToTypeID( "Crv " );

                      var list9 = new ActionList();

                      list9.putInteger( 0 );

                      list9.putInteger( 0 );

                      list9.putInteger( 255 );

                      list9.putInteger( 255 );

                  desc35.putList( idCrv, list9 );

                  var idCrvR = charIDToTypeID( "CrvR" );

                      var list10 = new ActionList();

                      list10.putInteger( 0 );

                      list10.putInteger( 0 );

                      list10.putInteger( 255 );

                      list10.putInteger( 255 );

                  desc35.putList( idCrvR, list10 );

                  var idCrvG = charIDToTypeID( "CrvG" );

                      var list11 = new ActionList();

                      list11.putInteger( 0 );

                      list11.putInteger( 0 );

                      list11.putInteger( 255 );

                      list11.putInteger( 255 );

                  desc35.putList( idCrvG, list11 );

                  var idCrvB = charIDToTypeID( "CrvB" );

                      var list12 = new ActionList();

                      list12.putInteger( 0 );

                      list12.putInteger( 0 );

                      list12.putInteger( 255 );

                      list12.putInteger( 255 );

                  desc35.putList( idCrvB, list12 );

                  var idCamP = charIDToTypeID( "CamP" );

                  desc35.putString( idCamP, """Adobe Standard""" );

                  var idCP_D = charIDToTypeID( "CP_D" );

                  desc35.putString( idCP_D, """B0393704628CAFDD09F0DE7684972186""" );

                  var idPrVe = charIDToTypeID( "PrVe" );

                  desc35.putInteger( idPrVe, 101122048 );

                  var idRtch = charIDToTypeID( "Rtch" );

                  desc35.putString( idRtch, """""" );

                  var idREye = charIDToTypeID( "REye" );

                  desc35.putString( idREye, """""" );

                  var idLCs = charIDToTypeID( "LCs " );

                  desc35.putString( idLCs, """""" );

                  var idUpri = charIDToTypeID( "Upri" );

                  desc35.putString( idUpri, """""" );

                  var idCrpT = charIDToTypeID( "CrpT" );

                  desc35.putDouble( idCrpT, 0.000000 );

                  var idCrpL = charIDToTypeID( "CrpL" );

                  desc35.putDouble( idCrpL, 0.000000 );

                  var idCrpB = charIDToTypeID( "CrpB" );

                  desc35.putDouble( idCrpB, 0.000000 );

                  var idCrpR = charIDToTypeID( "CrpR" );

                  desc35.putDouble( idCrpR, 0.000000 );

                  var idCrpA = charIDToTypeID( "CrpA" );

                  desc35.putDouble( idCrpA, 0.000000 );

                  var idClrS = charIDToTypeID( "ClrS" );

                  var idClrS = charIDToTypeID( "ClrS" );

                  var idProP = charIDToTypeID( "ProP" );

                  desc35.putEnumerated( idClrS, idClrS, idProP );

                  var idBtDp = charIDToTypeID( "BtDp" );

                  var idBtDp = charIDToTypeID( "BtDp" );

                  var idBDonesix = charIDToTypeID( "BD16" );

                  desc35.putEnumerated( idBtDp, idBtDp, idBDonesix );

                  var idRStF = charIDToTypeID( "RStF" );

                  var idRStF = charIDToTypeID( "RStF" );

                  var idRFNo = charIDToTypeID( "RFNo" );

                  desc35.putEnumerated( idRStF, idRStF, idRFNo );

                  var idRslt = charIDToTypeID( "Rslt" );

                  desc35.putDouble( idRslt, 300.000000 );

                  var idReUn = charIDToTypeID( "ReUn" );

                  var idReUn = charIDToTypeID( "ReUn" );

                  var idPpIn = charIDToTypeID( "PpIn" );

                  desc35.putEnumerated( idReUn, idReUn, idPpIn );

                  var idOSM = charIDToTypeID( "OSM " );

                  var idOSM = charIDToTypeID( "OSM " );

                  var idOSMN = charIDToTypeID( "OSMN" );

                  desc35.putEnumerated( idOSM, idOSM, idOSMN );

                  var idOrnt = charIDToTypeID( "Ornt" );

                  desc35.putInteger( idOrnt, 3 );

                  var idSnap = charIDToTypeID( "Snap" );

                  desc35.putString( idSnap, """""" );

              var idAdobeCameraRaw = stringIDToTypeID( "Adobe Camera Raw" );

              desc34.putObject( idOpAs, idAdobeCameraRaw, desc35 );



                                                                                             var idLnkd = charIDToTypeID( "Lnkd" );

                                                                                             desc37.putBoolean( idLnkd, true );

                                                                                             var idOpAs = charIDToTypeID( "OpAs" );

                                                                                                 var desc38 = new ActionDescriptor();

                                                                                             var idnull = charIDToTypeID( "null" );

                                                                                             desc37.putObject( idOpAs, idnull, desc38 );



              var idFTcs = charIDToTypeID( "FTcs" );                                         var idFTcs = charIDToTypeID( "FTcs" );                                         var idFTcs = charIDToTypeID( "FTcs" );

              var idQCSt = charIDToTypeID( "QCSt" );                                         var idQCSt = charIDToTypeID( "QCSt" );                                         var idQCSt = charIDToTypeID( "QCSt" );

              var idQcsa = charIDToTypeID( "Qcsa" );                                         var idQcsa = charIDToTypeID( "Qcsa" );                                         var idQcsa = charIDToTypeID( "Qcsa" );

              desc34.putEnumerated( idFTcs, idQCSt, idQcsa );                                desc37.putEnumerated( idFTcs, idQCSt, idQcsa );                                desc5.putEnumerated( idFTcs, idQCSt, idQcsa );

              var idOfst = charIDToTypeID( "Ofst" );                                         var idOfst = charIDToTypeID( "Ofst" );                                         var idOfst = charIDToTypeID( "Ofst" );

                  var desc36 = new ActionDescriptor();                                           var desc39 = new ActionDescriptor();                                           var desc6 = new ActionDescriptor();

                  var idHrzn = charIDToTypeID( "Hrzn" );                                         var idHrzn = charIDToTypeID( "Hrzn" );                                         var idHrzn = charIDToTypeID( "Hrzn" );

                  var idRlt = charIDToTypeID( "#Rlt" );                                          var idRlt = charIDToTypeID( "#Rlt" );                                          var idPxl = charIDToTypeID( "#Pxl" );

                  desc36.putUnitDouble( idHrzn, idRlt, 0.000000 );                               desc39.putUnitDouble( idHrzn, idRlt, 0.000000 );                               desc6.putUnitDouble( idHrzn, idPxl, 0.000000 );

                  var idVrtc = charIDToTypeID( "Vrtc" );                                         var idVrtc = charIDToTypeID( "Vrtc" );                                         var idVrtc = charIDToTypeID( "Vrtc" );

                  var idRlt = charIDToTypeID( "#Rlt" );                                          var idRlt = charIDToTypeID( "#Rlt" );                                          var idPxl = charIDToTypeID( "#Pxl" );

                  desc36.putUnitDouble( idVrtc, idRlt, 0.000000 );                               desc39.putUnitDouble( idVrtc, idRlt, 0.000000 );                               desc6.putUnitDouble( idVrtc, idPxl, 0.000000 );

              var idOfst = charIDToTypeID( "Ofst" );                                         var idOfst = charIDToTypeID( "Ofst" );                                         var idOfst = charIDToTypeID( "Ofst" );

              desc34.putObject( idOfst, idOfst, desc36 );                                    desc37.putObject( idOfst, idOfst, desc39 );                                    desc5.putObject( idOfst, idOfst, desc6 );

          executeAction( idPlc, desc34, DialogModes.NO );                                executeAction( idPlc, desc37, DialogModes.NO );                                executeAction( idPlc, desc5, DialogModes.NO );

































































































          • 3. Re: CC 14.2 Smart Objects, Relative Path?
            Stapledon Level 1

            Thanks guys, I'm already doing this through script but I was hoping for a more simple (and easier for other people to read & alter) approach -- the fact that there's no SO handles at all in the DOM doesn't help.


            JJMac, you may have a different perception of what I mean by relative paths, I'm talking specifically of document-relative.

















            It's not about object oriented anything - it's a system that the vast majority of professional DCC software has been using for years. Photoshop isn't just about retouching pictures anymore, it has a place in complex pipelines that extend deep into high-end content creation territory. It needs to grow and learn to fit in with our needs, and we have proven workflows that can benefit everyone.

            • 4. Re: CC 14.2 Smart Objects, Relative Path?
              JJMack Most Valuable Participant

              No that the same perception. A current Path and filename.ext. where the running procedures is aware of part of the full path. When that is used somewhere in the process the full Path needs to be materialized to get to the correct file (Device Local or Remote share):\Path\File". 


              SO can be any supported Photoshop thing it not limited to files.  SO are self contained. For example if you were to convert a group of layers into a SO. After you do those layer no longer exists. What is left of then exist in the SO layers embedded object.  I you open the SO embedded object Photoshop creates a temp PSB file in your user id temp space for you to work on. Should you commit changes Photoshop updates the SO layers embedded object and renders a new set of pixels for the layer.  


              In the past embedded object that contained file were create several ways.  Open as smart Object through ACR, File>Pave and Layer>Smart Objects>New Smart Object via Copy.  While all may contain the original File's Full Path it was never need for that file was copied into the smart object.  The original file could be moved or deleted it made not difference. For the embeded file copy is copied into your user ID temp space when you open the smart object layer's object.


              Now with 14.2 I see no difference in ACR Interface it still offered an Open Object.  I do not know it the object is considered linked or just embedded.  I would expect embedded.  In the File menu with an open document I now see a "Place Embedded..." and a "Place Linked..." instead of just "Place..."  In the menu Layers>Smart Objects> I still see New Smart Object via Copy.  However I seem many new options have been added for Linked Smart Objects.  Therefore the fully resolved file device path and name would be needed for the original current path may not be the same as when the smart object layer was created. Also if the original File has been deleted or moved I would guess the current embedded object would be used and the layer not deleted.



              • 5. Re: CC 14.2 Smart Objects, Relative Path?
                c.pfaffenbichler Level 9

                A Scripting solution for relinking the linked SOs to files in local folders seems feasible.

                When you have the list of the linked SOs’ paths identifying the instances should be no problem (though it can probably run into time deoending on the number of layers) with the "fileReference" of the Layers.

                • 6. Re: CC 14.2 Smart Objects, Relative Path?
                  JJMack Most Valuable Participant

                  I would agree and think it is what Layers>Smart Objects>Resolve Broken Link... would be doing.

                  • 7. Re: CC 14.2 Smart Objects, Relative Path?
                    Stapledon Level 1

                    JJMac: Yep my query's specifically about the new Placed Linked SO's in 14.2 - they have a literal path, and although they may be (don't know!) embedded at load time for performance, editing them opens the linked file, not a .psb.


                    Deleted/Moved Linked SO files are reported when you open the document, with a panel for locating them. Unfortunately the panel only allows you to locate a single file at a time -- I'd not like to use that with a doc containing hundreds of Linked SO's



                    c.p. Yeah, at the moment I'm setting all the links through script to be project-path relative. They're still absolute paths, and the script has to be run every time we create a new project, but it's functional and that's good enough for my purposes - albeit a little slow to put together and extend as I'm still getting to grips with working with AM code.


                    But what I'd really like to see (and the reason I posted here instead of the Scripting discussion) is a way for artists in general to include relative paths in their own work (without me having to give them scripts, or run scripts on the files we get from them) - the ideal solution being a little checkbox in the file dialog and Properties panel, "Relative Path", and perhaps a more elegant path remapping panel for missing assets.

                    • 8. Re: CC 14.2 Smart Objects, Relative Path?
                      Stapledon Level 1

                      Addendum:  It seems Linked files are embedded in the saved PSD in a fashion - missing files still accept filters, but can't be transformed without being rasterized first; a fair fallback over broken and possibly permanently lost external linked files.

                      • 9. Re: CC 14.2 Smart Objects, Relative Path?
                        JJMack Most Valuable Participant

                        With a little testing my guess that ACR open Object are embedded objects not linked SO is correct. While I see Update All Modified Content enabled not grayed out. Menu "Layers>Smart Objects>Update All Modified Content" does nothing when I had used the bridge to update the RAW conversion setting for the original raw file after using ACR Open Object. The Bridge undated setting were not applied from the bridge into the open document or from "Layers>Smart Objects>Update All Modified Content".  Using menu "Layers>Smart Objects>Replace Content..." and pointing to the original RAW file worked

                        • 10. Re: CC 14.2 Smart Objects, Relative Path?
                          JJMack Most Valuable Participant

                          Stapledon wrote:


                          Addendum:  It seems Linked files are embedded in the saved PSD in a fashion - missing files still accept filters, but can't be transformed without being rasterized first; a fair fallback over broken and possibly permanently lost external linked files.

                          All Smart Object layers have a set of rendered pixels for the layer and act like a layer that has pixels that can not be modified. Adjustment layer and smart filters can be added the these none modifiable pixels. The only way to modify the smart object layers pixels is to open the layers embedded object to update. Now with 14.2 embedded Objects that are linked files can be updated with options in the Layer>Smart Objects and I also read updating is automatic if a document with a linked file object is open when the link file is updated by a save in some other open document.  SO layers act like a raster layer embedded thing like vector graphics are not used except when the layers object is opened and updated.

                          • 11. Re: CC 14.2 Smart Objects, Relative Path?
                            Stapledon Level 1

                            Yep. The automatic updating (side-by-side open documents) only works down one level. If, like me, you have SO's inside SO's etc, then you need to traverse down the chain and Update All in each SO (a yellow warning triangle on the layer icon indicates an SO's file has changed but hasn't been updated) to enable the changes to recurse to the top most document with the final produce SO's in it, if you see what I mean.


                            For those interested, here's a working re-link script. It's only cobbled together for my own immediate quick & dirty needs, with layer names that match SO filenames, all in PSD format, that *aren't* in LayerSets (layer folders); but easy to build upon.


                            Put all your SO files in subDirectory (LinkedLayers in the example) below your target doc, and run the script with the doc open.


                            ( Warning: this will also re-link embedded SOs - I've not figured out how to distinuish between them yet ).


                            // Specific purpse Linked SO remapping.

                            // Works only with .PSD SO files

                            // Ignores LayerSets



                            var doc = app.activeDocument;

                            var myLayer = doc.activeLayer;

                            var rootPath = decodeURI (doc.path.fsName); //activeDocument.path;

                            var targetLayers = new Array;

                            var subDirectory = "\\LinkedLayers\\";

                            targetLayers = doc.layers;




                            $.writeln("Root: " + rootPath);






                            function main()


                                for (var i = 0; i < targetLayers.length -1 ; i++) {



                                    $.writeln( targetLayers[i].name + "  ( " + targetLayers[i].kind  + " )");

                                    doc.activeLayer = targetLayers[i];


                                      if (targetLayers[i].kind== LayerKind.SMARTOBJECT )


                                            $.writeln("Re-linking "+targetLayers[i].name+ " to:");


                                            var filepath = rootPath + subDirectory + targetLayers[i].name + ".psd";


                                           // =======================================================

                                           var idplacedLayerReplaceContents = stringIDToTypeID( "placedLayerReplaceContents" );

                                           var desc2 = new ActionDescriptor();

                                           var idnull = charIDToTypeID( "null" );

                                           desc2.putPath( idnull, new File( filepath ) );

                                           executeAction( idplacedLayerReplaceContents, desc2, DialogModes.NO );




                                           $.writeln( targetLayers[i].name + " is not a Smart Object.");




                            • 12. Re: CC 14.2 Smart Objects, Relative Path?



                              I had the same problem and did some testing. Strangely i noticed a difference in placing a Linked psb file using Alt in finder instead of using the menu in photoshop (place Linked). That seems to create a relative path instead of keeping an absolute path when you copy the folder with the psd and the linked psb's. Not sure whether this works for smartobject-linking, but perhaps this is useful.


                              For example:

                              • I create a Photoshop document masterFile.psd and a folder next to it named LinkFiles with 3 .psb files (see Folder Structure below).
                              • Inside the folder LinkedFiles i hold ALT and drag the psb files inside the Photoshop document (masterFile.psd) and press Enter, this automatically creates the LinkedFiles.
                              • Now save the Photoshop document.
                              • Next when i copy the entire folder (Workfolder) and place it somewhere else and open the new psd file, the LinkedFiles are linked to the new relative path instead of the old folder location.

                              (Folder structure)








                              For me this worked, perhaps someone can also test it to see if this is a solid solution?


                              Kind regards,

                              • 13. Re: CC 14.2 Smart Objects, Relative Path?
                                SG... Adobe Employee



                                Stapledon wrote:


                                Addendum:  It seems Linked files are embedded in the saved PSD in a fashion - missing files still accept filters, but can't be transformed without being rasterized first; a fair fallback over broken and possibly permanently lost external linked files.


                                The files aren't embedded, but we keep the composite layer data in the parent file for operations that can use it.




                                • 14. Re: CC 14.2 Smart Objects, Relative Path?
                                  Tai Luxon Adobe Employee

                                  @Stapledon, We always look for the linked-to file in the same relative location first. Only when we do not find it there do we fall back to looking in other places, such as the last known absolution location and next to the parent file.



                                  • 15. Re: CC 14.2 Smart Objects, Relative Path?
                                    jacquilynw Level 2

                                    Ok I know this is a Photoshop form, but indesign does the exact opposite. So no you don't.

                                    • 16. Re: CC 14.2 Smart Objects, Relative Path?

                                      Thanks for your post! This is how it seemed to be working but I wanted to make sure. Using relative paths makes a big difference when version-controlling projects.

                                      • 17. Re: CC 14.2 Smart Objects, Relative Path?

                                        Has this changed? I can't get photoshop to accept files from a relative location (without going in and manually re-linking every file every time I start new project). I even tried deleting the folder containing the linked assets in the master location, then when I opened the psd in a new project location, the master asset folder came back (I don't understand how).


                                        To be totally clear this what I have setup:

                                        master template folder/






                                        new project folder/






                                        another new project folder/








                                        I used to be able to just copy/duplicate the master template folder as a new project folder, and the new project would just re-link to all the assets for that project. All the sudden that isn't working at all. Whenever I copy the folder, the mynewproject.psd is using assets in master template folder/assets/ (the exact opposite of what I need and have been doing for months now).


                                        Did PS get an update that changed this functionality? Should I re-install/repair my PS install? I'm a on mac el capitan with PS 2017.1.0 / 20170309.r.207 x64 if that makes any difference.

                                        • 18. Re: CC 14.2 Smart Objects, Relative Path?
                                          M Shaw Adobe Employee

                                          I am trying without success to reproduce your issue. I have tried PS 18.0.1, 18.1, and 18.1.1 on Mac OX 10.11 with folders located on my desktop. Each copy of the file I open from copied folders looks for the assets in the corresponding copy folder. Is there something about the file location or other variable that I am missing that would help to reproduce this?

                                          • 19. Re: CC 14.2 Smart Objects, Relative Path?
                                            jacqw4878115 Level 1

                                            I'm not sure. The master psd was made in a previous version of photoshop (though one that had artboards, so not too many version back). The master and projects are are the same internal hdd, though they are a few folders apart; like users/me/templates for the master and user/me/docs/projectName for the projects (though I've tried copying the master where it lives and the copy still links to the master assets, not to the copy assets).


                                            I tried making a brand new psd on my desktop, and it's re-linking just fine. If you have any suggestions, I'd love to hear them. The work-around I've been using is just embedding linked assets that need to change with each project. Some assets don't usually need any changes, so those all link to this shared asset folder outside the project and master folders.