Как сделать относительные ссылки на изображения в проектах
При переносе проекта Arcview на диск для дальнейшего
распространения, часто встает вопрос,
как сделать так, чтобы он (проект) открывался не зависимо от того,
где находится или какой буквой на компьютере пользователя обозначен
CD-ROM. Решается эта проблема просто и об этом много написано. С
помощью одного из специальных расширений или вручную в любом текстовом
редакторе, абсолютные (то есть начинающиеся с буквы дисковода) ссылки в файле проекта (*.apr),
например такие,
c:\data\theme1.shp
меняются на относительные, например такие:
theme1.shp
В этих ссылка первая часть опускается, остается только имя файла и (необязательно) каталога. Если у вас все файлы использующиеся в проекте лежат в одной папке с проектом то достаточно имени файла. При открытии проекта пути к файлам автоматически дополняются именем того каталога из которого был запущен проект.
Например, если проект запускается из c:\temp\project, путь к данным автоматически расширяется до:
c:\temp\project\theme1.shp
При использовании таких ссылок проект становится переносимым и может быть скопирован (вместе с данными конечно, которые нужно будет скопировать отдельно) в любую директорию с возможностью открытия его без всяких проблем. При перезаписи такого проекта все относительные ссылки будут заменены на абсолютные, так что вам придется заново делать из проекта переносимый путем их редактирования в текстовом редакторе.
С хотлинком, который использует встроенные скрипты для открытия, например изображений (Link.ImageFile), все работает корректно, если в атрибутивной таблице пути относительные, например:
images\photo1.tif
В этом случае при подключения хотлинка и указания в поле Predefined Action - Link to Image File все будет работать.
Однако есть более сложная проблема, а что делать с хотлинком на сторонний скрипт (например для использования внешнего просмотровщика для картинок)? По умолчанию для правильной его работы в таблице должен быть прописан абсолютный путь.
Проблема решается очень просто. Ссылки в таблице остаются относительными как приведено выше.
Создаем в проекте, который собираемся записывать на CD новый скрипт следующего содержания (загрузить) и переименовываем его в проекте (Project\Rename 'Script1') в View.Hotlink:
theView = av.GetActiveDoc found = false p = theView.GetDisplay.ReturnUserPoint for each t in theView.GetActiveThemes if ((t.HasAttributes) and (t.GetHotField <> nil)) then recs = t.FindByPoint(p) for each rec in recs theField = t.GetHotField found = true theVal = t.ReturnValueString(theField.GetName, rec) 'все изменения системного скрипта в этой строке av.Run(t.GetHotScriptName, FileName.GetCWD.asstring+"\"+theVal) end end end if (not found) then System.Beep end
Для подключения внешнего просмотровщика скрипт остается прежним (загрузить).
theVal = SELF atoolpath = "c:\Tools\iview\i_view32.exe" if (not (theVal.IsNull)) then if (File.Exists(theVal.AsFileName)) then System.Execute(atoolpath++theVal) else MsgBox.Warning("File "+theVal+" not found.","Hot Link") end end
Не забудьте изменить в нем путь к просмотровщику (переменная atoolpath в самом начале скрипта). Сам вьювер также можно положить на диск с проектом, тогда вместо строки
System.Execute("c:\Tools\iview\i_view32.exe"++theVal)
нужна будет строка
System.Execute(FileName.GetCWD.asstring + "\" +"i_view32.exe"++theVal)
и вьювер (в нашем случае IrfanView) должен будет лежать на одном уровне с проектом. Если он находится в любой другой папке, например она специально для него создана, просто замените "\" на название этой папки, например "\viewers\".
Результирующий скрипт должен называться Link.ImageFile (таким образом он заменит стандартный) и подключается через свойства темы.
Совет №1: чтобы изображение автоматически не масштабировалось (Set scale был всегда выключен), используйте этот скрипт.
Если нужно открывать несколько изображений сразу, то можно записывать их пути и имена в соответствующее поле через точку с запятой ";" и использовать следующую модификацию скрипта: Link.ImageFile:
theVal = SELF
theProject = av.GetProject
aDir = theProject.GetWorkDir.GetFullName
atoolpath = "C:\tools\IrfanView\i_view32.exe"
if (not (theVal.IsNull)) then
for each aval in theVal.AsTokens(";")
aFullName = aDir.asstring+"\"+aVal
if (File.Exists(aFullName.AsFileName)) then
acommand = atoolpath+" " + aFullName
System.Execute(acommand)
else
MsgBox.Warning("File "+aFullName+" not found.","Hot Link")
end
end
end
Каталог с фотографиями должен быть указан как рабочий каталог Arcview (View\File\Set Working Directory). Модифицировать View.Hotlink не нужно.
Обсудить в форуме Комментариев 2
Последнее обновление: September 09 2021
Дата создания: 25.11.2002
Автор(ы): Максим Дубинин
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).