python - 使用 python win32com.client 在 Photoshop 中移动图层
问题描述
我一直在使用移动层功能,在 python 中编写一个 Photoshop 脚本。图层最终位于其他图层集内,而不是在它们之后,等等。
在 Photoshop 的 Javascript 中执行此操作的本机命令是:
layer.move(relativeObject, insertionLocation)
其中 insertLocation 可以是:
ElementPlacement.INSIDE、ElementPlacement.PLACEATBEGINNING、ElementPlacement.PLACEATEND、ElementPlacement.PLACEBEFORE 或 ElementPlacement.PLACEAFTER
我当前的代码如下所示:
@staticmethod
def moveLayer(layer, relativeLayer = None, placement = 3):
if placement == PHAPS.ElementPlacementPLACEATEND:
layers = PHAPS.app().ActiveDocument.layers
relativeLayer = layers[len(layers) - 1]
placement = PHAPS.ElementPlacementPLACEAFTER
elif placement == PHAPS.ElementPlacementPLACEATBEGINNING:
relativeLayer = PHAPS.app().ActiveDocument.layers[0]
placement = PHAPS.ElementPlacementPLACEBEFORE
layer.Move(relativeLayer, placement)
这是我对常数值的猜测,显然是错误的:
ElementPlacementPLACEATBEGINNING = 1
ElementPlacementINSIDE = 2
ElementPlacementPLACEBEFORE = 3
ElementPlacementPLACEAFTER = 4
ElementPlacementPLACEATEND = 5
我尝试过跟踪这些常量的原生值,但 Photoshop 很好地隐藏了这些常量。我也尝试过 Action Manager 代码,但我发现它有点难以理解。
有谁知道用python在photoshop中移动图层的可靠方法?首选操作管理器代码,但不是必需的。
解决方案
嗨,您可以使用这些方法代替 .Move()
def MoveAfter(self, RelativeObject=defaultNamedNotOptArg):
'Move the PageItem in behind object'
return self._oleobj_.InvokeTypes(1299596641, LCID, 1, (24, 0), ((9, 1),),RelativeObject
)
def MoveBefore(self, RelativeObject=defaultNamedNotOptArg):
'Move the PageItem in front of object'
return self._oleobj_.InvokeTypes(1299596642, LCID, 1, (24, 0), ((9, 1),),RelativeObject
)
def MoveToBeginning(self, Container=defaultNamedNotOptArg):
'Move the PageItem to beginning of container'
return self._oleobj_.InvokeTypes(1299596646, LCID, 1, (24, 0), ((9, 1),),Container
)
def MoveToEnd(self, Container=defaultNamedNotOptArg):
'Move the PageItem to end of container'
return self._oleobj_.InvokeTypes(1299596645, LCID, 1, (24, 0), ((9, 1),),Container
在哪里:
- RelativeObject = 是相对图层参考
- Container = 是图层所在的文档
例子
from win32com.client import Dispatch
app = Dispatch("Photoshop.Application")
doc = app.Open(r"hereTheProjectPath.psd")
layerRefA = doc.ArtLayers.Add()
layerRefA.MoveToEnd(doc)
layerRefB = doc.ArtLayers.Add()
layerRefB.MoveAfter(layerRefA)
推荐阅读
- javascript - 计算价格包括和不包括增值税两种方式保持相同的结果
- html - 如何在 TestCafé 的输入标签内上传文件
- python - Django ModelForm - 有没有办法动态定义字段,但不是最后一个字段?
- corda - Corda - 显式合约升级
- reactjs - 不刷新页面删除数据
- angular - 如何将验证器和 CSS 样式传播到自定义 Angular 表单组件中的输入控件?
- objective-c - NSOutlineView 将多个项目拖放到单个 xml 文件 Finder
- c - 快速排序实现不在 C 中排序
- c# - Bit twiddling:从 ulong 中获取表示哪些字节非零的位掩码
- r - theme_minimal() 中的中心标题和副标题