2015-03-04 2 views
0

У меня есть код AppleScript;Доступ к значениям свойств в applescript

tell application "OmniGraffle" 
activate 
tell canvas of front window 
repeat with obj in graphics 
set ObjName to id of obj 
display dialog "This is the dialog " & ObjName 
end repeat 
end tell 
end tell 

Это возвращает идентификатор каждого из моего графика, но то, что я действительно хочу вернуть это значение элемента списка данных в пары ключей. Я пробовал множество способов, но безуспешно. Ниже приведен пример того, чего я хочу достичь (но не работает).

tell application "OmniGraffle" 
activate 
tell canvas of front window 
repeat with obj in graphics 
set ObjName to user data value of obj 
display dialog "This is the dialog " & ObjName 
end repeat 
end tell 
end tell 

Любая помощь приветствуется. Заранее спасибо.

У меня теперь другая ошибка;

tell application "OmniGraffle" 
    activate 
    tell canvas of front window 
     repeat with obj in graphics 
      set test to user data in graphics 
      repeat with value in (properties of test) as list 
       display dialog value 
      end repeat 
     end repeat 
    end tell 
end tell 

Ошибка, которую я получаю;

Не удается получить свойства {{типа: "ДА"}, {типа: "testg"}, {типа: "MySQL"}, {типа: "Linux"}}

Я чувствую находится на правильном пути, но я не могу получить доступ к значениям пары ключей :-(

+0

Не могли бы вы объяснить, что вы подразумеваете под «значением списка элементов данных в парах ключей»? – CRGreen

+0

В моей графике задано значение ключевой пары Data Key и Data Value, я хочу получить значение Value. –

+0

Если ваш код не работает, значит, у вас неправильное имя ключа. Вы уверены, что это «значение пользовательских данных»? Попробуйте найти что-то вроде этого для устранения неполадок: скажите приложению «OmniGraffle» вернуть свойства элемента 1 графики холста переднего окна – jweaks

ответ

0

[См EDIT, ниже]

В OmniGraffle, есть свойство называется user data, но если это имеет отсутствующее значение, вы не сможете его получить (так как вы сможете получить другие свойства), выполнив

tell application "OmniGraffle" 
    user data of item 1 of graphics 
end tell 

следующие должны работать для получения class любого объекта:

tell application "OmniGraffle" 
    class of item 1 of graphics 
end tell 

Если объект имеет значение в user data, вы должны быть в состоянии получить это. Проблема заключается в том, что если вы запускаете первый пример (user data of ...) и нет (отсутствующих) данных, ничего, даже не возвращается missing data, что означает, что ваш скрипт будет ломаться, если он попытается установить доступ к переменной для этого свойства; вы получите ошибку «переменная не определенная». Одна работа вокруг должна сначала получить все свойства объекта, например, так:

tell canvas of front window 
    set itemOneProps to properties of item 1 of graphics 
    set uData to user data of itemOneProps 
end tell 

В этом примере вы можете впоследствии проверить missing value (if uData = missing data) и игнорировать (или изменить) его. Вы также можете установить пользовательские данные, как это:

set user data of item 2 of graphics to {Status:"green", foobar:"pickle"} 

EDIT это объясняет то, что вы имеете дело с тем, когда доступ к пользователю данные:

tell application "OmniGraffle" 
    --activate 
    tell canvas of front window 
     repeat with obj in graphics 
      set test to user data in graphics 
      --as I mentioned, you don't want to be getting the "properties" of the list; it's just a list (actually, a record, which is a list of properties as key pairs) 
      repeat with thisDatum in test --I'm calling it thisDatum; see below 
       --you should coerce thisDatum to a list, 
       --then you can repeat loop through this list of values (you lose the keys) and do something with each item 
       set thisDatumList to (thisDatum as list) --parentheses a MUST! 
       --or you can use "items of thisDatum" to return list of values and also lose keys 
       --now I'm using "thisValue" because of {key:value} structure, but NOT using "value" because 
       -- that is a keyword and may conflict with code at some point 
       repeat with thisValue in thisDatumList 
        thisValue 
       end repeat 
      end repeat 
     end repeat 
    end tell 
end tell 
thisValue 

Обратите внимание, что вы теряете ключи в парах ключей пользовательских данных ({ключ: значение}), используя этот метод coerce-to-list. Если вы хотите сохранить ключи нетронутыми, вы должны:

  1. не принуждать к списку (Дух)
  2. имеет последовательные ключи в ключевом паре для каждого объекта или
  3. использовать TRY блок, чтобы поймать когда ключ/пара, к которому вы пытаетесь использовать get, не имеет этого конкретного ключа.

Другими словами, если вы set x to myColor of thisKeyPair (в цикле с каждым thisDatum), там должны быть в пользовательских данных myColor:"redOrSomeValue". Если некоторые объекты имеют myColor:"redOrSomeValue" и некоторые нет, вам нужно (я знаю, что это боль), чтобы поймать ошибку в Ьге блоке, как:

try 
    set x to myColor of thisKeyPair 
on error 
    --ignore or do something else 
end try 

Я надеюсь, что это имеет смысл и имеет Помогите.

+0

Поблагодарите CRGreen, у моей модели есть ценности. Я с тех пор прогрессировал, и теперь я получаю «Не могу получить свойства» {{type: «YES»}, {type: "testg"}, {type: "mysql"}, {type: "linux"}} его почти так, как если бы я не мог напрямую получить значение типа (я бы тогда написал цикл вокруг этого, если бы мог). –

+0

Привет @CarlBruiners - вы не получаете свойства данных пользователя; вы должны воспроизводить код неправильно. Если объект (некоторый элемент графика) имеет значение пользовательских данных, вы должны иметь возможность использовать «пользовательские данные» этого объекта. Но если в цикле вы столкнетесь с объектом без пользовательских данных, он убьет ваш скрипт, а значит, метод получения «свойств» этого объекта, а затем получение «пользовательских данных» любой переменной, в которую вы помещаете свойства , Если вам нужно, отправьте больше примеров кода. – CRGreen

+0

Извините, это было непонятно. Когда я писал: «Вы не получаете свойства пользовательских данных», я имел в виду, что вы не должны получать свойства пользовательских данных, вы должны получать свойства каждого графического объекта, например Rectangle , строка, что угодно, а затем значение пользовательских данных в этом большом списке свойств. – CRGreen

Смежные вопросы