GIS-LAB

Географические информационные системы и дистанционное зондирование

Относительные ссылки в Hotlink с использованием внешнего вьювера документов

Как сделать относительные ссылки на изображения в проектах

При переносе проекта Arcview на диск для дальнейшего распространения, часто встает вопрос,
как сделать так, чтобы он (проект) открывался не зависимо от того, где находится или какой буквой на компьютере пользователя обозначен CD-ROM. Решается эта проблема просто и об этом много написано. С помощью одного из специальных расширений или вручную в любом текстовом редакторе, абсолютные (то есть начинающиеся с буквы дисковода) ссылки в файле проекта (*.apr), например такие,

c:\data\theme1.shp

меняются на относительные, например такие:

theme1.shp

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

Например, если проект запускается из c:\temp\project, путь к данным автоматически расширяется до:

c:\temp\project\theme1.shp

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

Относительные ссылки в hotlink

С хотлинком, который использует встроенные скрипты для открытия, например изображений (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
Автор(ы): Максим Дубинин