COM - индексация слоев в группе

  • Автор темы Автор темы Archimedes
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Archimedes

Участник
Топикстартер
Сообщения
43
Реакции
0
Мне нужно получать имя слоя стоящего выше активного. Раньше я делал так

Код:
Function PSTopName:string;
var
  AppRef,M: Variant;
begin
  AppRef := CreateOleObject('Photoshop.Application');
         if not VarIsNull( AppRef ) then
            begin
              M:=AppRef.ActiveDocument.ArtLayers.Index(AppRef.ActiveDocument.ActiveLayer);
              PSTopName:=AppRef.ActiveDocument.ArtLayers(M-1).Name;

            end;
end;
т.е. получал индекс активного слоя
Код:
M:=AppRef.ActiveDocument.ArtLayers.Index(AppRef.ActiveDocument.ActiveLayer);
и получал имя слоя с индексом M-1
Код:
 PSTopName:=AppRef.ActiveDocument.ArtLayers(M-1).Name;
Теперь есть необходимость делать тоже самое, но когда слои находятся в группе - отказывается. Что нужно заменить?
 
Ответ: COM - индексация слоев в группе

Меня тут явно игнорируют :'(
 
Ответ: COM - индексация слоев в группе

просто в основном все балуются скриптами.
(кстати, что это у Вас -- Дельфи?)
 
Ответ: COM - индексация слоев в группе

On the VB6

Код:
' ===== function getActiveLayerIndex written by Zest =======
' returns Active layer index relatively to its container:
' either it is the document or the layer set (layer group)
' when no Active Layer or Layer Set is selected then returns 0
Public Function getActiveLayerIndex(obj As Variant) As Long
Dim i As Long
Dim res As Long

If obj Is Nothing Then
    Dim a As New Photoshop.Application
    Set obj = a.ActiveDocument
End If

' when layer indexes are zero-based then use -1 as default value
getActiveLayerIndex = 0

For i = 1 To obj.ArtLayers.Count
    ' Debug.Print "'" & obj.ArtLayers(i).name & "'" & _
        " has index: " & i & ", in: " & obj.name
    If Photoshop.ActiveDocument.activeLayer Is obj.ArtLayers(i) Then
        getActiveLayerIndex = i
        Exit Function
    End If
Next i

' recursively for each LayerSet
For i = 1 To obj.LayerSets.Count
    res = getActiveLayerIndex(obj.LayerSets(i))
    If res > 0 Then
        getActiveLayerIndex = res
        Exit Function
    End If
Next i

End Function

Usage:

Код:
Debug.Print getActiveLayerIndex(Nothing)
 
Ответ: COM - индексация слоев в группе

But I can't figure out where you could use this Layer Index. If you'll try like that: debug.print ArtLayers(getActiveLayerIndex(Nothing)) you'll get access to some layer in the top hierarchy level (document), or some error if selected layer is LayerSet, or if index is out of bounds. It seems you should to change your workflow at all.
 
Статус
Закрыто для дальнейших ответов.