1

Тема: AHK: Алгоритм работы с XML

Имеется XML (привожу фрагмент с середины)

<VideoTrackGroup ObjectID="8" ClassID="9e9abf7a-0918-49c2-91ae-991b5dde77bb" Version="8">
<EnablePT>185</EnablePT>
<FieldType>2</FieldType>
<TrackGroup Version="1">
<NextTrackID>4</NextTrackID>
<Tracks Version="1">
<Track Index="0" ObjectRef="9"/>
<Track Index="1" ObjectRef="10"/>
<Track Index="2" ObjectRef="11"/>
</Tracks>
<Node Version="1">
</Node>
<FrameRate>10160640000</FrameRate>
</TrackGroup>
<PixelAspectRatio>768,702</PixelAspectRatio>
<FrameRect>0,0,720,576</FrameRect>
</VideoTrackGroup>

И мне необходимо:
1) Удостовериться, что есть такой таг <PixelAspectRatio>
2) Если он есть, то удостовериться, что есть такой <EnablePT>
3) Если он есть удостовериться, что есть <Tracks Version="1">
4) Если он есть, то прыгаем в самое начало XML

Я это решил таким способом


n = 1
Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <PixelAspectRatio>, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <EnablePT>, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      MarkersObjectRef := "<Markers ObjectID=""" NewVar """"
      n = 3
   }

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Tracks Version="1">
      {
         IfNotInString, A_LoopReadLine, </VideoTrackGroup>, continue
         n = 1
      }
      Else
      {
         n = 0
         break
      }
   }    
}


Loop, read, %ProjectFile%
{
   if n = 0
   {
      IfNotInString, A_LoopReadLine, %MarkersObjectRef%, continue
      n = 1
   }
                 ; и т.д.

Может есть другие более удобные варианты?
Спасибо!

2

Re: AHK: Алгоритм работы с XML

А зачем куда-то прыгать? Просто считать весь файл в строку и проверять на наличие любого нужного тега в любой последовательности.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Алгоритм работы с XML

Просто в xml эти все теги повторяются, смешиваются и путаются.
Поэтому необходимо идти снизу вверх, как в этом примере.
При том если это все считать в одну строку, то потом получать данные из этой строки будет куда сложнее через RegExReplace.
Разве не так?
А по скорости твой вариант будет быстрее обрабатываться?

4

Re: AHK: Алгоритм работы с XML

В RegExMatch() можно указать StartingPosition. По скорости, думаю, будет быстрее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Алгоритм работы с XML

Что-то не представляю, как такой поиск с помощью  RegExMatch() осуществить.
Вот мой скрипт целиком.
Там еще такая загвоздка, что в некоторых местах надо проверять наличие одного тага и чтобы не было другого.
14 мб xml обрабатывает секунд за 5.
Это нормально?
И возможно его как-то ускорить?
Про алгоритм работы с xml нигде так и не нашел.

ProjectFile = C:\fin33.prproj
SequenceName = sequence 01
MarkerListFile = E:\1.txt          ; will be deleted and recreated after script starts

SetBatchLines, -1
k = 1
n = 1

FileRead, Contents, %ProjectFile%
StringGetPos, out, Contents, <Name>%SequenceName%</Name>
if out = -1
{
   msgbox, Sequence with this name does not exist!
   ExitApp
}



Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <Sequence ObjectUID, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Second ObjectRef, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      FrameRateObjectRef := "<VideoTrackGroup ObjectID=""" NewVar """"
      n = 3
   }

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Name>%SequenceName%</Name>
      {
         IfNotInString, A_LoopReadLine, </Sequence>, continue
         n = 1
      }
      Else
      {
         n = 1
         break
      }
   }    
}



Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, %FrameRateObjectRef%, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <FrameRate>, continue
      FrameRate := trim(RegExReplace(A_LoopReadLine, "<FrameRate>(.+)</FrameRate>", "$1"))
      n = 1
      break
   }
}



If FrameRate = 10160640000      ;  25fps
{ 
   delimeter= :
   i = 0
   fps = 25
   FramesInOneHour = 90000
   FramesInOneMinute = 1500
}

If FrameRate = 10594584000          ;  24fps
{ 
   delimeter= :
   i = 0
   fps = 24
   FramesInOneHour = 86400
   FramesInOneMinute = 1440
}

If FrameRate = 5080320000          ;  50fps
{ 
   delimeter= :
   i = 0
   fps = 50
   FramesInOneHour = 180000
   FramesInOneMinute = 3000
}

If FrameRate = 8475667200         ;  29.97fps
{
   delimeter=;
   i = 2
   fps = 30
   FramesInOneHour = 108000
   FramesInOneMinute = 1800
}

If FrameRate = 4237833600         ;  59.94fps
{
   delimeter=;
   i = 4
   fps = 60
   FramesInOneHour = 216000
   FramesInOneMinute = 3600
}



Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <Sequence ObjectUID, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Markers ObjectRef, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      MarkersObjectRef := "<Markers ObjectID=""" NewVar """"
      n = 3
   }

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Name>%SequenceName%</Name>
      {
         IfNotInString, A_LoopReadLine, </Sequence>, continue
         n = 1
      }
      Else
      {
         n = 0
         break
      }
   }    
}



Loop, read, %ProjectFile%
{
   if n = 0
   {
      IfNotInString, A_LoopReadLine, %MarkersObjectRef%, continue
      n = 1
   }

   if n = 1
   {
      IfNotInString, A_LoopReadLine, "a45508e0-3ff7-4d04-90a7-2e0dfff4c910"
      {
         IfNotInString, A_LoopReadLine, </DVDMarkers>, continue
         break
      }
      Else
      {
         a1 := "Marker " k "`n"
         n = 2
      }
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Comments>, continue
      Comments := trim(RegExReplace(A_LoopReadLine, "<Comments>(.+)</Comments>", "$1"))
      a2 := "Comment: " Comments "`n"
      If Comments  = <Comments></Comments>
         a2 =
      n = 3
   }

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Duration>, continue
      Duration := trim(RegExReplace(A_LoopReadLine, "<Duration>(.+)</Duration>", "$1"))
      framecount := Floor(Duration / FrameRate)
      framecount := framecount + floor(framecount / FramesInOneMinute)*i - floor(framecount / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount/FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a3 := "Duration: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 4
   }

   if n = 4
   {
      IfNotInString, A_LoopReadLine, <Time>, continue
      Time := trim(RegExReplace(A_LoopReadLine, "<Time>(.+)</Time>", "$1"))
      framecount := Floor(Time / FrameRate)
      framecount := framecount + floor(framecount / FramesInOneMinute)*i - floor(framecount / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount/FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a4 := "Timecode: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 5
   } 

   if n = 5
   {
      IfNotInString, A_LoopReadLine, <ML.Marker.TextName>
      {
         IfNotInString, A_LoopReadLine, <Name>, continue
         Number := trim(RegExReplace(A_LoopReadLine, "<Name>(.+)</Name>", "$1"))
         a6 := "Number: " Number "`n"
         If Number  = <Name></Name>
            a6 =
         n = 1
      }
      Else
      {
         TextName := trim(RegExReplace(A_LoopReadLine, "<ML.Marker.TextName>(.+)</ML.Marker.TextName>", "$1"))
         a5 := "TextName: " TextName "`n"
         n = 6
      }
   } 

   if n = 6
   {
      IfNotInString, A_LoopReadLine, <Name>, continue
      Number := trim(RegExReplace(A_LoopReadLine, "<Name>(.+)</Name>", "$1"))
      a6 := "Number: " Number "`n"
      If Number  = <Name></Name>
         a6 =
      n = 1
   } 
   k := k + 1
   MarkerList .=  a1 a2 a3 a4 a5 a6 "`n"
}
FileDelete, %MarkerListFile%
FileAppend, % MarkerList, %MarkerListFile%, UTF-8
Msgbox, Done
ExitApp

6

Re: AHK: Алгоритм работы с XML

ahk пишет:

Это нормально?
И возможно его как-то ускорить?

Чтобы ответить на эти вопросы, нужно видеть файл и знать точно, что нужно сделать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Алгоритм работы с XML

Вот xml
http://pastebin.com/KNirGtar
Задача.
Извлечь из секвенции проекта таймкоды маркеров.
Для этого
1) Проверяем, есть ли такая секвенция в проекте

FileRead, Contents, %ProjectFile%
StringGetPos, out, Contents, <Name>%SequenceName%</Name>
if out = -1
{
   msgbox, Sequence with this name does not exist!
   ExitApp
}

2) Находим референс на ее framerate

Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <Sequence ObjectUID, continue
      n = 2
   }
 
   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Second ObjectRef, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      FrameRateObjectRef := "<VideoTrackGroup ObjectID=""" NewVar """"
      n = 3
   }
 
   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Name>%SequenceName%</Name>
      {
         IfNotInString, A_LoopReadLine, </Sequence>, continue
         n = 1
      }
      Else
      {
         n = 1
         break
      }
   }    
}

3) Получаем ее framerate

Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, %FrameRateObjectRef%, continue
      n = 2
   }
 
   if n = 2
   {
      IfNotInString, A_LoopReadLine, <FrameRate>, continue
      FrameRate := trim(RegExReplace(A_LoopReadLine, "<FrameRate>(.+)</FrameRate>", "$1"))
      n = 1
      break
   }
}

4) Ищем  референс на маркеры

Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <Sequence ObjectUID, continue
      n = 2
   }
 
   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Markers ObjectRef, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      MarkersObjectRef := "<Markers ObjectID=""" NewVar """"
      n = 3
   }
 
   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Name>%SequenceName%</Name>
      {
         IfNotInString, A_LoopReadLine, </Sequence>, continue
         n = 1
      }
      Else
      {
         n = 0
         break
      }
   }    
}

5) Считываем маркеры

Loop, read, %ProjectFile%
{
   if n = 0
   {
      IfNotInString, A_LoopReadLine, %MarkersObjectRef%, continue
      n = 1
   }
 
   if n = 1
   {
      IfNotInString, A_LoopReadLine, "a45508e0-3ff7-4d04-90a7-2e0dfff4c910"
      {
         IfNotInString, A_LoopReadLine, </DVDMarkers>, continue
         break
      }
      Else
      {
         a1 := "Marker " k "`n"
         n = 2
      }
   }
 
   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Comments>, continue
      Comments := trim(RegExReplace(A_LoopReadLine, "<Comments>(.+)</Comments>", "$1"))
      a2 := "Comment: " Comments "`n"
      If Comments  = <Comments></Comments>
         a2 =
      n = 3
   }
 
   if n = 3
   {
      IfNotInString, A_LoopReadLine, <Duration>, continue
      Duration := trim(RegExReplace(A_LoopReadLine, "<Duration>(.+)</Duration>", "$1"))
      framecount := Floor(Duration / FrameRate)
      framecount := framecount + floor(framecount / FramesInOneMinute)*i - floor(framecount / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount/FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a3 := "Duration: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 4
   }
 
   if n = 4
   {
      IfNotInString, A_LoopReadLine, <Time>, continue
      Time := trim(RegExReplace(A_LoopReadLine, "<Time>(.+)</Time>", "$1"))
      framecount := Floor(Time / FrameRate)
      framecount := framecount + floor(framecount / FramesInOneMinute)*i - floor(framecount / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount/FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a4 := "Timecode: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 5
   } 
 
   if n = 5
   {
      IfNotInString, A_LoopReadLine, <ML.Marker.TextName>
      {
         IfNotInString, A_LoopReadLine, <Name>, continue
         Number := trim(RegExReplace(A_LoopReadLine, "<Name>(.+)</Name>", "$1"))
         a6 := "Number: " Number "`n"
         If Number  = <Name></Name>
            a6 =
         n = 1
      }
      Else
      {
         TextName := trim(RegExReplace(A_LoopReadLine, "<ML.Marker.TextName>(.+)</ML.Marker.TextName>", "$1"))
         a5 := "TextName: " TextName "`n"
         n = 6
      }
   } 
 
   if n = 6
   {
      IfNotInString, A_LoopReadLine, <Name>, continue
      Number := trim(RegExReplace(A_LoopReadLine, "<Name>(.+)</Name>", "$1"))
      a6 := "Number: " Number "`n"
      If Number  = <Name></Name>
         a6 =
      n = 1
   } 
   k := k + 1
   MarkerList .=  a1 a2 a3 a4 a5 a6 "`n"
}

8

Re: AHK: Алгоритм работы с XML

Ой, не, за это только платно возьмусь!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: Someone, 2012-11-19 12:40:34)

Re: AHK: Алгоритм работы с XML

Можно использовать что-то типа этого:


xmlParser := ComObjCreate("MSXML2.DOMdocument.6.0")

xmlParser.async := False

xmlParser.load("data.xml")

If (xmlParser.parseError.errorCode != 0)
{
  ShowError(xmlParser.parseError)
  ExitApp
}

colNodes := xmlParser.selectNodes("/PremiereData/Sequence")

For node In colNodes
{
  MsgBox % "UID: " node.getAttribute("ObjectUID") ", Name: " node.selectSingleNode("Name").text
}

colNodes := xmlParser.getElementsByTagName("VideoTrackGroup")

For node In colNodes
{
  if (node.getElementsByTagName("PixelAspectRatio").length != 0)
  {
    if (node.getElementsByTagName("EnablePT").length != 0)
    {
      if (node.getElementsByTagName("Tracks").length != 0)
      {
        MsgBox % node.getAttribute("ObjectID") " - " node.getAttribute("ClassID") " matches criteria!"
      }
    }
  }
}

ShowError(XMLDOMParseError)
{
  msg := "parseError.errorCode: " XMLDOMParseError.errorCode "`n"
  . "parseError.filepos: " XMLDOMParseError.filepos "`n"
  . "parseError.line: " XMLDOMParseError.line "`n"
  . "parseError.linepos: " XMLDOMParseError.linepos "`n"
  . "parseError.reason: " XMLDOMParseError.reason "`n"
  . "parseError.srcText: " XMLDOMParseError.srcText "`n"
  . "parseError.url: " XMLDOMParseError.url
  MsgBox % msg
}

10

Re: AHK: Алгоритм работы с XML

Ой, не, за это только платно возьмусь!

Да не надо ни за что браться, у меня все работает.
Просто хочу узнать правильный алгоритм работы с xml.

Можно использовать что-то типа этого:

А где об этом можно почитать?
А то я вообще ничего не понял и если я в него вписываю свое название проекта (xml), то он показывает ошибку.

11 (изменено: alexii, 2012-11-19 05:16:44)

Re: AHK: Алгоритм работы с XML

IXMLDOMDocument/DOMDocument Members
Сценарии объектной модели документа DOM XML средствами OLE-Automation

12

Re: AHK: Алгоритм работы с XML

Someone, используйте тэг «url» для оформления ссылок на форуме. Я поправил Ваш пост.

13

Re: AHK: Алгоритм работы с XML

А также здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: Someone, 2012-11-19 13:36:33)

Re: AHK: Алгоритм работы с XML

Malcev пишет:

А то я вообще ничего не понял и если я в него вписываю свое название проекта (xml), то он показывает ошибку.

А что за ошибка? Я поправил тот пост, попробуйте еще раз.

Вот еще пример, просто выводит все ноды, атрибуты и их значения в MsgBox:


xmlParser := ComObjCreate("Msxml2.DOMDocument.6.0")
xmlParser.async := False
xmlParser.load("data.xml")

ParseNode(xmlParser.documentElement, 0)

ParseNode(nodeNode, numLevel)
{
  If (nodeNode.nodeValue)
    MsgBox % "Node: " Space(numLevel*4) . nodeNode.nodeName . " = " nodeNode.nodeValue
  Else
    MsgBox % "Node: " Space(numLevel*4) . nodeNode.nodeName

  For nodeAttr In nodeNode.attributes
  {
    MsgBox % "Attribute: " Space((numLevel+1)*4) . nodeAttr.nodeName . " = " . nodeAttr.nodeValue
  }

  For nodeChild In nodeNode.childNodes
  {
    ParseNode(nodeChild, numLevel+1)
  }
}

Space(x)
{
  Loop, % x
    result.=A_Space
  Return, result
}

15

Re: AHK: Алгоритм работы с XML

А вот сейчас и тот пример и этот работает.
Спасибо. Буду разбираться.

16 (изменено: Malcev, 2012-11-22 07:34:59)

Re: AHK: Алгоритм работы с XML

Все-таки слишком тяжело для моего понимания.
Проблема в том, что в xml надо проверять очередность colNodes.
Например, если после

<SubClip ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</SubClip>

идет

<video ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</video>

То мы начинаем искать новую colNode.

<clip ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</clip>

А если после

<SubClip ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</SubClip>

идет

<photo ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</photo>

то мы ищем опять

<SubClip ObjectID="3234" ClassID="e0c58dc9-dbdd-4166-aef7-5db7e3f22e84" Version="3">
<Node Version="1">
</Node>
<Name>title008</Name>
<Clip ObjectRef="3235"/>
<MasterClip ObjectURef="02145512-bddc-4f7f-b8b5-7b952bad8f40"/>
</SubClip>

17

Re: AHK: Алгоритм работы с XML

Тэгов с такими названиями в файле-примере что Вы выкладывали вообще нету.

18 (изменено: Malcev, 2012-11-22 15:34:33)

Re: AHK: Алгоритм работы с XML

Так это я для примера сказал.
Сейчас у меня код выглядит так

ProjectFile = C:\test.prproj
SequenceName = Sequence 01
EffectName = PR.ADBE Extract
EffectListFile = E:\test.txt          ; будет стерт и заново создастся после запуска скрипта

SetBatchLines, -1
k = 1
n = 1


; Проверяем есть ли такая секвенция и название эффекта

FileRead, Contents, %ProjectFile%
StringGetPos, out, Contents, <Name>%SequenceName%</Name>
if out = -1
{
   msgbox, Sequence with this name does not exist!
   ExitApp
}

FileRead, Contents, %ProjectFile%
StringGetPos, out, Contents, <MatchName>%EffectName%</MatchName>
if out = -1
{
   msgbox, Effect with this name does not exist!
   ExitApp
}



; Находим айди секвенции и референс на её фреймрейт

Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <Sequence ObjectUID, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <Second ObjectRef, continue
      Variable := trim(A_LoopReadLine)
      NewVar := RegExReplace(Variable, "\D")
      FrameRateObjectRef := "<VideoTrackGroup ObjectID=""" NewVar """"
      n = 3
   }

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <ID>, continue
      ID := trim(RegExReplace(A_LoopReadLine, "<ID>(.+)</ID>", "$1"))
      n = 4
   }

   if n = 4
   {
      IfNotInString, A_LoopReadLine, <Name>%SequenceName%</Name>
      {
         IfNotInString, A_LoopReadLine, </Sequence>, continue
         n = 1
      }
      Else
      {
         n = 1
         break
      }
   }    
}



; Определяем framerate секвенции

Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, %FrameRateObjectRef%, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <FrameRate>, continue
      FrameRate := trim(RegExReplace(A_LoopReadLine, "<FrameRate>(.+)</FrameRate>", "$1"))
      n = 1
      break
   }
}



If FrameRate = 10160640000      ;  25fps
{ 
   delimeter= :
   i = 0
   fps = 25
   FramesInOneHour = 90000
   FramesInOneMinute = 1500
}

If FrameRate = 10594584000          ;  24fps
{ 
   delimeter= :
   i = 0
   fps = 24
   FramesInOneHour = 86400
   FramesInOneMinute = 1440
}

If FrameRate = 5080320000          ;  50fps
{ 
   delimeter= :
   i = 0
   fps = 50
   FramesInOneHour = 180000
   FramesInOneMinute = 3000
}

If FrameRate = 8475667200         ;  29.97fps
{
   delimeter=;
   i = 2
   fps = 30
   FramesInOneHour = 108000
   FramesInOneMinute = 1800
}

If FrameRate = 4237833600         ;  59.94fps
{
   delimeter=;
   i = 4
   fps = 60
   FramesInOneHour = 216000
   FramesInOneMinute = 3600
}



; Находим клипы с эффектом

EffectList := "В секвенции """ SequenceName """ эффект """ EffectName """ присутствует:"
Loop, read, %ProjectFile%
{
   if n = 1
   {
      IfNotInString, A_LoopReadLine, <VideoClipTrackItem ObjectID, continue
      n = 2
   }

   if n = 2
   {
      IfNotInString, A_LoopReadLine, <TrackIndex>, continue
      TrackIndex := trim(RegExReplace(A_LoopReadLine, "<TrackIndex>(.+)</TrackIndex>", "$1"))
      a1 := "Track: " TrackIndex + 1
      n = 3
   } 

   if n = 3
   {
      IfNotInString, A_LoopReadLine, <End>, continue
      End := trim(RegExReplace(A_LoopReadLine, "<End>(.+)</End>", "$1"))
      framecountEnd := Floor(End / FrameRate)
      framecount := framecountEnd + floor(framecountEnd / FramesInOneMinute)*i - floor(framecountEnd / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount / FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a2 := "Sequence Out: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 4
   }

   if n = 4
   {
      IfNotInString, A_LoopReadLine, <Start>, continue
      Start := trim(RegExReplace(A_LoopReadLine, "<Start>(.+)</Start>", "$1"))
      framecountStart := Floor(Start / FrameRate)
      framecount := framecountStart + floor(framecountStart / FramesInOneMinute)*i - floor(framecountStart / FramesInOneMinute / 10)*i
      TC1 = % floor(framecount / FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a3 := "Sequence In: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 5
   }

   if n = 5
   {
      framecount := framecountEnd - framecountStart
      TC1 = % floor(framecount/FramesInOneHour)
      TC2 = % floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
      TC3 = % floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
      TC4 = % floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps )
      SetFormat, Float, 02.0
      Loop, 4
         TC%A_Index% += 0.0
      a4 := "Duration: " TC1 delimeter TC2 delimeter TC3 delimeter TC4 "`n"
      n = 6
   } 

   if n = 6
   {
      IfNotInString, A_LoopReadLine, <SubClip ObjectID, continue
      n = 7
   }

   if n = 7
   {
      IfNotInString, A_LoopReadLine, <Name>, continue
      Name := trim(RegExReplace(A_LoopReadLine, "<Name>(.+)</Name>", "$1"))
      a5 := "Clip Name: " Name "`n"
      n = 8
   } 

   if n = 8
   {
      IfNotInString, A_LoopReadLine, <VideoComponentChain ObjectID, continue
      n = 9
   }

   if n = 9
   {
      IfNotInString, A_LoopReadLine, <SeqID>, continue
      SeqID := trim(RegExReplace(A_LoopReadLine, "<SeqID>(.+)</SeqID>", "$1"))
      If SeqID != %ID%
          n = 1
      Else
          n = 10
   }

   if n = 10
   {
      IfNotInString, A_LoopReadLine, </VideoComponentChain>, continue
      n = 11
   }

   if n = 11
   {
      IfInString, A_LoopReadLine, </VideoComponentChain>, continue
      n = 12
   }

   if n = 12
   {  
      n = 13
      IfInString, A_LoopReadLine, <VideoClipTrackItem ObjectID
      n = 2
   }

   if n = 13
   {
      IfNotInString, A_LoopReadLine, <VideoFilterComponent ObjectID
         n = 1
      Else
         n = 14
   }

   if n = 14
   {
      IfNotInString, A_LoopReadLine, <MatchName>, continue
      MatchName := trim(RegExReplace(A_LoopReadLine, "<MatchName>(.+)</MatchName>", "$1"))
      If MatchName != %EffectName%
         n = 15
      Else
         n = 16
   }

   if n = 15
   {
      IfNotInString, A_LoopReadLine, <VideoFilterComponent ObjectID
      {
         IfNotInString, A_LoopReadLine, <VideoClipTrackItem ObjectID, continue   
         n = 2
      }
      Else
      n = 14
   }

   if n = 16
   {
      IfNotInString, A_LoopReadLine, <Bypass>, continue
      Bypass := trim(RegExReplace(A_LoopReadLine, "<Bypass>(.+)</Bypass>", "$1"))
      n = 17
      If Bypass = false
         a6 := "Enabled`n"
      Else
         a6 := "Disabled`n"
   }

   if n = 17
   {
      n = 15
      List .= framecountStart "a" k "`n"
      EffectList%k% := a6 a3 a2 a4 a5 a1
      k := k + 1
    }
}

Sort, List, N D`n
List:=RegExReplace(list,"\s*$","")
n = 1
loop, parse, List, `n, `r
{
   var := (RegExReplace(A_LoopField, "(.+)a", "$2"))
   k := var
   EffectList .= "`n`n" n ") " EffectList%k%
   n++
}

FileDelete, %EffectListFile%
FileAppend, % EffectList, %EffectListFile%, UTF-8
Msgbox, Done
ExitApp

То есть, как вы видите приходится перебирать кучу тегов.
Возможно ли такое сделать через ноды?
Вот сам проект
http://pastebin.com/WbxxfzBj

19

Re: AHK: Алгоритм работы с XML

Malcev пишет:

Возможно ли такое сделать через ноды?

Ну а почему нет? Только

Sequence with this name does not exist!

20

Re: AHK: Алгоритм работы с XML

Я исправил. В этом проекте находится Sequence 01
Pastebin не дает пейстить более чем 500 кб текста, поэтому пришлось запейстить другой проект.

21 (изменено: Someone, 2012-11-22 15:52:51)

Re: AHK: Алгоритм работы с XML

Malcev пишет:

Я исправил. В этом проекте находится Sequence 01
Pastebin не дает пейстить более чем 500 кб текста, поэтому пришлось запейстить другой проект.

Некорректный xml файл, тэг <WorkspaceSettings> открывается, но нигде не закрывается. Так же есть незакрытый тэг Properties, возможно еще другие ошибки в этом файле...

---------------------------
test3.ahk
---------------------------
parseError.errorCode: -1072896659
parseError.filepos: 218595
parseError.line: 5388
parseError.linepos: 3
parseError.reason: End tag 'PremiereData' does not match the start tag 'WorkspaceSettings'.


parseError.srcText: </PremiereData> <First>228cda18-3625-4d2d-951e-348879e4ed93</First>
parseError.url: file:///C:/data2.xml
---------------------------
OK   
---------------------------

22

Re: AHK: Алгоритм работы с XML

Это я срезал, чтобы в 500 кб уместиться.
Вот  настоящий файл
http://ru.files.fm/u/awxmoah

23

Re: AHK: Алгоритм работы с XML

а нет ли скрипта, который позволял бы пользоваться XPath правилами для работы с XML?

24 (изменено: Someone, 2012-11-22 21:08:52)

Re: AHK: Алгоритм работы с XML

Полный скрипт: http://paste2.org/p/2506429

25

Re: AHK: Алгоритм работы с XML

Спасибо большое.
Сейчас буду переваривать.
Но скрипт стал однозначно красивее.

26

Re: AHK: Алгоритм работы с XML

Но красивее-то он красивее, а по скорости вычислений уступает моему аж в 4 раза
5-ти мегабайтный проект ваш считает 1594 милисекунды, а мой 390.
Получается, мой алгоритм оптимальней?

27

Re: AHK: Алгоритм работы с XML

А Вы определите какая часть скрипта медленно работает, если это вызов xmlParser.load(ProjectFile), то тут уже ничего не поделаешь, а если что-то другое, то возможно можно как-то оптимизировать код что-бы работало быстрее.

28 (изменено: Malcev, 2012-11-23 17:09:54)

Re: AHK: Алгоритм работы с XML

320 милисекунд загружается сам xml, и целую секунду длится цикл.
Ну, как я понимаю, никто не рассматривает xml с помощью IfNotInString.

29 (изменено: Someone, 2012-11-23 18:02:58)

Re: AHK: Алгоритм работы с XML

На файле который Вы выкладывали мой скрипт отрабатывает за 31 мс, а Ваш скрипт за 63 мс.

30

Re: AHK: Алгоритм работы с XML

У меня на файле, который я выкладывал, время примерно одинаковое.
Я замерял так.
В начало скрипта прописывал

StartTime := A_TickCount

И в конец

ElapsedTime := A_TickCount - StartTime
MsgBox,  %ElapsedTime% milliseconds have elapsed.

Но если взять побольше проект - мегабайтов 20,
то тут разница выполнения вычислений вашим и моим скриптом увеличивается в геометрической прогрессии.
Мой выполняет за 1900 милисекунд, а ваш 43400.
Если вам интересно, то можете взглянуть
http://ru.files.fm/u/efbyhng
Название секвенции в которой ищем - "test"

31 (изменено: Someone, 2012-11-24 03:19:13)

Re: AHK: Алгоритм работы с XML

В таком виде вроде скорость увеличилась: http://paste2.org/p/2512820, возможно еще что-то можно ускорить...

ЗЫ Выходные файлы вашего и моего скриптов различаются

32

Re: AHK: Алгоритм работы с XML

Да, в вашем варианте, почему-то он некоторые пропускает.
Единственное, что я заметил, что вот эта проверка не нужна

bypass := vfNode.selectSingleNode("Component/Bypass").text

    if (bypass != "false")
        continue

Так как, в итоговом файле, даже если фильтр disabled, то все-равно должен показываться, только с надписью disabled.
Но на данный проект, это не должно влиять, так как задисейбленных фильтров в нем нету.

33 (изменено: Someone, 2012-11-24 14:29:28)

Re: AHK: Алгоритм работы с XML

Вот так разультат получается идентичным: http://paste2.org/p/2514914.
Мой скрипт парсит большой проэкт за ~2900 мс, а Ваш за ~4000 мс.

34

Re: AHK: Алгоритм работы с XML

Someone, а какой смысл выкладывать код на другой ресурс?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: Алгоритм работы с XML

teadrinker пишет:

Someone, а какой смысл выкладывать код на другой ресурс?

http://paste2.org специально для этого и предназначен. Не вижу причин им не пользоваться.

36

Re: AHK: Алгоритм работы с XML

А какова логика не пользоваться данным? Он тоже для этого предназначен. Зачем заставлять людей ходить лишний раз по ссылкам?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

37

Re: AHK: Алгоритм работы с XML

teadrinker пишет:

А какова логика не пользоваться данным? Он тоже для этого предназначен. Зачем заставлять людей ходить лишний раз по ссылкам?

Учитывая то, что с этого форума даже текст нормально не копируется без всяких левых вайтспэйсов, использование сторонних ресурсов для выкладывания фрагментов кода имеет ряд преимуществ.

38

Re: AHK: Алгоритм работы с XML

Someone пишет:

Учитывая то, что с этого форума даже текст нормально не копируется без всяких левых вайтспэйсов, использование сторонних ресурсов для выкладывания фрагментов кода имеет ряд преимуществ.

Да нормально отсюда всё копируется. А по ссылкам действительно ходить менее удобно.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

39

Re: AHK: Алгоритм работы с XML

The gray Cardinal пишет:
Someone пишет:

Учитывая то, что с этого форума даже текст нормально не копируется без всяких левых вайтспэйсов, использование сторонних ресурсов для выкладывания фрагментов кода имеет ряд преимуществ.

Да нормально отсюда всё копируется. А по ссылкам действительно ходить менее удобно.

Не нормально: http://i.imgur.com/7kO9Q.png. Вон сколько лишних пробелов в начале пустых строк...

40

Re: AHK: Алгоритм работы с XML

То же самое но в моём Word. Видно, что пробел и переход на следующую строку - не одно и то же.
http://i.imgur.com/Gsrwa.jpg

41

Re: AHK: Алгоритм работы с XML

ypppu пишет:

То же самое но в моём Word. Видно, что пробел и переход на следующую строку - не одно и то же.
http://i.imgur.com/Gsrwa.jpg

Отчетливо видно что там есть пробел: http://i.imgur.com/YyWw2.png.

42

Re: AHK: Алгоритм работы с XML

Обратил внимание, что пробелы появляются при указании языка:

text

text

А вот так их нет:

text

text

А как наличие пробелов в начале пустых строк может повлиять на выполнение кода?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

43

Re: AHK: Алгоритм работы с XML

Да, теперь вижу, что есть пробелы. В чём выражается их негативное влияние?

44

Re: AHK: Алгоритм работы с XML

ypppu пишет:

Да, теперь вижу, что есть пробелы. В чём выражается их негативное влияние?

Просто меня раздражают эти лишние символы.

45

Re: AHK: Алгоритм работы с XML

Someone, код, который постишь ты, ведь предназначен для других участников форума? Поэтому логичнее было бы спросить, что раздражает их. Может, как раз ходить лишний раз по ссылкам? Меня вот слегка раздражает. С другой стороны, от того, что ты будешь постить код на другом ресурсе, лишние символы на форуме не пропадут, и тебе всё равно придётся копировать код вместе с ними.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

46

Re: AHK: Алгоритм работы с XML

teadrinker пишет:

Someone, код, который постишь ты, ведь предназначен для других участников форума? Поэтому логичнее было бы спросить, что раздражает их. Может, как раз ходить лишний раз по ссылкам? Меня вот слегка раздражает. С другой стороны, от того, что ты будешь постить код на другом ресурсе, лишние символы на форуме не пропадут, и тебе всё равно придётся копировать код вместе с ними.

Может тогда проще вообще ничего не постить? Мне это не нужно, а кому нужен код и по ссылке перейдет чтобы его посмотреть.

47

Re: AHK: Алгоритм работы с XML

Мой скрипт парсит большой проэкт за ~2900 мс, а Ваш за ~4000 мс.

Странно. У меня в точности наоборот.
Ваш ~9000.
Мой ~1900.
Ничего не понимаю.
Может работа вашего скрипта увеличивается в разы от мощности процессора?

48

Re: AHK: Алгоритм работы с XML

Someone пишет:

Может тогда проще вообще ничего не постить? Мне это не нужно, а кому нужен код и по ссылке перейдет чтобы его посмотреть.

Можно ничего не постить, но если уж постишь, желательно придерживаться традиций форума. Кроме того, код, который выложен на другой ресурс, нельзя найти поиском по этому, что неудобно для участников, которых интересует та же тема.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

49 (изменено: Someone, 2012-11-24 17:45:37)

Re: AHK: Алгоритм работы с XML

Malcev пишет:

Мой скрипт парсит большой проэкт за ~2900 мс, а Ваш за ~4000 мс.

Странно. У меня в точности наоборот.
Ваш ~9000.
Мой ~1900.
Ничего не понимаю.
Может работа вашего скрипта увеличивается в разы от мощности процессора?

Может быть, но у меня всего лишь Intel Core i5 760, выпущенный в 3 квартале 2010 года, новым его уже не назовешь и по производительности тоже уже есть гораздо более мощные процессоры.

teadrinker пишет:

Кроме того, код, который выложен на другой ресурс, нельзя найти поиском по этому, что неудобно для участников, которых интересует та же тема.

Зато тему найти можно (если конечно она названа соответственно), а в теме ссылку на код. Не вижу тут проблемы. И вообще если бы мне нужно было что-то найти, я бы воспользовался поиском в Google, а не по какому-то там форуму.

50

Re: AHK: Алгоритм работы с XML

Someone пишет:

Зато тему найти можно (если конечно она названа соответственно)

Это, к сожалению, бывает нечасто. Потом, нельзя найти по специфическим словам, используемым в коде.

Someone пишет:

И вообще если бы мне нужно было что-то найти, я бы воспользовался поиском в Google, а не по какому-то там форуму.

Форум, где обсуждается AHK, единственный в рунете, а не какой-то, и информацию по этому языку большинство ищет именно здесь. Посему, либо ты придерживаешься правил форума, либо ищешь другой.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

51

Re: AHK: Алгоритм работы с XML

teadrinker пишет:

Посему, либо ты придерживаешься правил форума, либо ищешь другой.

И где же там сказано что нельзя размещать код на специализированных для этого ресурсах?
Я смотрю у вас ко мне прямо предвзятость какая-то, влезаете в тему, которая вас никак не касается, устраиваете флуд.
Какой Вы после этого модератор? Вы не заслуживаете этого звания. Модератор должен быть примером для пользователей, не то что вы, умник.

52

Re: AHK: Алгоритм работы с XML

Someone забанен на 3 дня за пререкания с модератором с использованием неуважительных выражений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

53

Re: AHK: Алгоритм работы с XML

Someone пишет:

Я смотрю у вас ко мне прямо предвзятость какая-то, влезаете в тему, которая вас никак не касается, устраиваете флуд.

Это не предвзятость, а прямая обязанность модератора.

Someone пишет:

Какой Вы после этого модератор? Вы не заслуживаете этого звания. Модератор должен быть примером для пользователей, не то что вы, умник.

Заведите себе форум и служите там хоть примером, хоть образцом для подражания. А здесь соизвольте, наконец, прочесть Правила форума и впредь не нести ерунды по поводу того, кто чем должен заниматься.

54 (изменено: Malcev, 2015-02-08 10:29:48)

Re: AHK: Алгоритм работы с XML

Не понимаю как парсить XML парсером.
Может кто-нибудь может на пальцах объяснить.
Вот файл:
http://ru.files.fm/down.php?i=zvixjoo&n=test.prproj
Вот результат, который мне нужен с помощью регекс:
Нужно найти все VideoClipTrackItem у которых в VideoFilterComponent ID PR.ADBE Levels больше, чем остальные VideoFilterComponent ID.

SetBatchLines -1
FileRead, test, C:\test\test.prproj
FilterList := match1 := "", Poss := 1
While Poss := regexmatch(test, "<VideoClipTrackItem ObjectID(.*?)(?:<VideoClipTrackItem ObjectID|</PremiereData>)", match, poss+StrLen(match1))
{
   If Instr(match1, "<MatchName>PR.ADBE Levels</MatchName>")
   {
      FilterMatch := "", Posss := 1, minid := 999999999999999, maxid := ""
      While Posss := regexmatch(match1, "<VideoFilterComponent ObjectID.*?</VideoFilterComponent>", FilterMatch, posss+StrLen(FilterMatch))
      {
         regexmatch(FilterMatch, "<MatchName>(.*?)</MatchName>", filterName)
         regexmatch(FilterMatch, "<VideoFilterComponent ObjectID=""(.*?)""", id)
         regexmatch(FilterMatch, "<Bypass>(.*?)</Bypass>", bypass)
         if (filterName1 = "PR.ADBE Levels") and (bypass1 = "false")
         {
            if (id1 > maxid)
               maxid := id1
         }
         else if (filterName1 != "AE.ADBE Opacity") and (filterName1 != "AE.ADBE Motion") and (filterName1 != "AE.ADBE AECrop") and (filterName1 != "AE.ADBE Gaussian Blur 2") and (bypass1 = "false")
         {
            if (id1 < minid)
               minid := id1
         }
      }
      if (maxid > minid)
      {
         regexmatch(match1, "<Name>(.*?)</Name>", name)
         regexmatch(match1, "<Start>(.*?)</Start>", start)
         startTimeline := 9142035840000000      ;     <MZ.ZeroPoint>
         start1 += startTimeline
         delimeter := ":", fps := 25, FramesInOneHour := 90000, FramesInOneMinute := 1500, FrameRate := 10160640000
         framecount := Start1 / FrameRate
         TC1 := floor(framecount / FramesInOneHour)
         TC2 := floor((framecount - TC1*FramesInOneHour) / FramesInOneMinute)
         TC3 := floor((framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute) /fps)
         TC4 := floor(framecount - TC1*FramesInOneHour - TC2*FramesInOneMinute - TC3*fps)
         SetFormat, Float, 02.0
         Loop, 4
            TC%A_Index% += 0.0
         FilterList .= TC1 delimeter TC2 delimeter TC3 delimeter TC4 name1 "`n"
      }
   }
}
if (FilterList != "")
{
   FilterListNew := ""
   Sort, FilterList
   loop, parse, FilterList, `n, `r 
   {
      StringLeft, TcNew, A_LoopField, 11
      StringTrimLeft, NameNew, A_LoopField, 11
      FilterListNew .= NameNew "  -  " TcNew  "`n"
   }
   StringTrimRight, FilterListNew, FilterListNew, 7
   Gui,+AlwaysOnTop -MinimizeBox
   Gui, Font, s10
   Gui, Add, Button, , OK
   Gui, Add, Edit,,  %FilterListNew%
   Gui,Show,, Levels Vishe!!!
   return

   GuiClose:
   ButtonOK:
   Gui, Destroy
   return
}

А вот код от SomeOne, который не могу модернизировать.

startTime := A_TickCount
ProjectFile := "fin30.prproj"
SequenceName := "test"
EffectName := "PR.ADBE Extract"
EffectListFile := "out.txt" ; будет стерт и заново создастся после запуска скрипта
xmlParser := ComObjCreate("Msxml2.DOMDocument.6.0")
xmlParser.async := False
xmlParser.load(ProjectFile)
If (xmlParser.parseError.errorCode != 0)
{
   ShowError(xmlParser.parseError)
   ExitApp
}
ShowError(XMLDOMParseError)
{
msg := "parseError.errorCode: " XMLDOMParseError.errorCode "`n"
. "parseError.filepos: " XMLDOMParseError.filepos "`n"
. "parseError.line: " XMLDOMParseError.line "`n"
. "parseError.linepos: " XMLDOMParseError.linepos "`n"
. "parseError.reason: " XMLDOMParseError.reason "`n"
. "parseError.srcText: " XMLDOMParseError.srcText "`n"
. "parseError.url: " XMLDOMParseError.url
MsgBox % msg
}
; Проверяем есть ли такая секвенция и название эффекта
seqNode := xmlParser.selectNodes("/PremiereData/Sequence[Name = '" SequenceName "']")
if (seqNode.length == 0)
{
   MsgBox Sequence with this name does not exist!
   ExitApp
}
effNode := xmlParser.selectNodes("/PremiereData/VideoFilterComponent[MatchName = '" EffectName "']")
if (effNode.length == 0)
{
   MsgBox Effect with this name does not exist!
   ExitApp
}
; Находим айди секвенции и референс на её фреймрейт
frameRateObjId := seqNode.item(0).selectSingleNode("TrackGroups/TrackGroup[@Index='0']/Second").getAttribute("ObjectRef")
sequenceId := seqNode.item(0).selectSingleNode("ID").text
;MsgBox % frameRateObjId " - " sequenceId
; Определяем framerate секвенции
FrameRate := xmlParser.selectSingleNode("/PremiereData/VideoTrackGroup[@ObjectID='" frameRateObjId "']/TrackGroup/FrameRate").text
;MsgBox % FrameRate
fps := 254016000000/FrameRate
FramesInOneHour := fps * 60 * 60
FramesInOneMinute := fps * 60
;MsgBox % fps
If (FrameRate == 10160640000) ; 25fps
{
   delimeter := ":", i := 0
}
Else If (FrameRate == 10594584000) ; 24fps
{
   delimeter := ":", i := 0
}
Else If (FrameRate == 5080320000) ; 50fps
{
   delimeter := ":", i := 0
}
Else If (FrameRate == 8475667200) ; 29.97fps
{
   delimeter := ";", i := 2
}
Else If (FrameRate == 4237833600) ; 59.94fps
{
   delimeter := ";", i := 4
}
; Находим клипы с эффектом
trackNodes := xmlParser.selectNodes("/PremiereData/VideoClipTrackItem")
k := 1
;Msgbox, % "Loop in " A_TickCount - startTime
for node in trackNodes
{
   videoComponentChainObjectID := node.selectSingleNode("ClipTrackItem/ComponentOwner/Components").getAttribute("ObjectRef")
   vccNode := xmlParser.selectSingleNode("/PremiereData/VideoComponentChain[@ObjectID='" videoComponentChainObjectID "']")
   ccc := vccNode.SelectNodes("ComponentChain/Components/Component")
   for comp in ccc
   {
      VideoFilterComponentObjectID := comp.getAttribute("ObjectRef")
      vfNode := xmlParser.selectSingleNode("/PremiereData/VideoFilterComponent[@ObjectID='" VideoFilterComponentObjectID "']")
      seqId := vfNode.SelectSingleNode("SequenceID").text
      if (seqId != sequenceId)
         continue
      matchName := vfNode.selectSingleNode("MatchName").text
      if (matchName != EffectName)
         continue
      bypass := vfNode.selectSingleNode("Component/Bypass").text
      start := node.selectSingleNode("ClipTrackItem/TrackItem/Start").text
      end := node.selectSingleNode("ClipTrackItem/TrackItem/End").text
      subClipObjectID := node.selectSingleNode("ClipTrackItem/SubClip").getAttribute("ObjectRef")
      trackIndex := node.selectSingleNode("ClipTrackItem/TrackItem/TrackIndex").text
      name := xmlParser.selectSingleNode("/PremiereData/SubClip[@ObjectID='" subClipObjectID "']/Name").text
      a1 := "Track: " trackIndex + 1
      framecountEnd := Floor(End / FrameRate)
      framecount := framecountEnd + floor(framecountEnd / FramesInOneMinute) * i - floor(framecountEnd / FramesInOneMinute / 10) * i
      a2 := "Sequence Out: " FormatTime(framecount) "`n"
      framecountStart := Floor(Start / FrameRate)
      framecount := framecountStart + floor(framecountStart / FramesInOneMinute) * i - floor(framecountStart / FramesInOneMinute / 10) * i
      a3 := "Sequence In: " FormatTime(framecount) "`n"
      a4 := "Duration: " FormatTime(framecountEnd - framecountStart) "`n"
      a5 := "Clip Name: " Name "`n"
      If (bypass == "false")
         a6 := "Enabled`n"
      Else
         a6 := "Disabled`n"
      List .= framecountStart "a" k "`n"
      EffectList%k% := a6 a3 a2 a4 a5 a1
      k++
      ;MsgBox % start " - " end " - " subClipObjectID " - " trackIndex " - " name " - " bypass
   }
}
FormatTime(framecount)
{
   global FramesInOneHour, FramesInOneMinute, fps, delimeter
   TC1 := % floor(framecount / FramesInOneHour)
   TC2 := % floor((framecount - TC1 * FramesInOneHour) / FramesInOneMinute)
   TC3 := % floor((framecount - TC1 * FramesInOneHour - TC2 * FramesInOneMinute) / fps)
   TC4 := % floor(framecount - TC1 * FramesInOneHour - TC2 * FramesInOneMinute - TC3 * fps )
   SetFormat, Float, 02.0
   Loop, 4
      TC%A_Index% += 0.0
   return TC1 delimeter TC2 delimeter TC3 delimeter TC4
}
EffectList := "В секвенции """ SequenceName """ эффект """ EffectName """ присутствует:"
Sort, List, N D`n
List := RegExReplace(list,"\s*$","")
n := 1
loop, parse, List, `n, `r
{
   var := (RegExReplace(A_LoopField, "(.+)a", "$2"))
   k := var
   EffectList .= "`n`n" n ") " EffectList%k%
   n++
}
FileDelete, %EffectListFile%
FileAppend, % EffectList, %EffectListFile%, UTF-8
Msgbox, % "Done in " A_TickCount - startTime
ExitApp