[См 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. Если вы хотите сохранить ключи нетронутыми, вы должны:
- не принуждать к списку (Дух)
- имеет последовательные ключи в ключевом паре для каждого объекта или
- использовать 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
Я надеюсь, что это имеет смысл и имеет Помогите.
Не могли бы вы объяснить, что вы подразумеваете под «значением списка элементов данных в парах ключей»? – CRGreen
В моей графике задано значение ключевой пары Data Key и Data Value, я хочу получить значение Value. –
Если ваш код не работает, значит, у вас неправильное имя ключа. Вы уверены, что это «значение пользовательских данных»? Попробуйте найти что-то вроде этого для устранения неполадок: скажите приложению «OmniGraffle» вернуть свойства элемента 1 графики холста переднего окна – jweaks