Библиотека полезных скриптов

Изменение указанного параметра для всех объектов заданного слоя во всех XML файлах в выбранной папке

Скрипт позволяет произвести массовую замену значения параметра на заданное значение во всех файлах в заданой папке. Список слоев и параметров загружается с указанного шаблона (в примере XMLNormal.dmf).

Если задан файл шаблона заполнения (csv), тогда значение параметра по умолчанию (оно высвечивается в диалоговом окне ввода значения) берется оттуда.

;шаблон для получения списка параметров
$UseTemplate=Templates\XMLNormal.dmf
;шаблон заполнения для получения значения параметра по умолчанию
$UseCSV=Templates\XML.csv
;искать файлы заданного типа
$Ext=.xml
$SourceDir=@Dialog.Ask Каталог исходных XML файлов Default=d:\Temp\Src
$DestDir=@Dialog.Ask Каталог результирующих XML файлов Default=d:\Temp\Dst
;открываем шаблон
@FileOpen $UseTemplate
;формируем список параметров шаблона
$Params=@Map.Parameters.List
$Layers=@Map.Layers.List
;закрываем шаблон
@FileClose
;выбираем слой в котором находятся интересующие объекты
$Layer=@Dialog.ListSelect Выберите слой|$Layers
$LayerId=@StringPart 1 $Layer
;выбираем параметр из списка параметров шаблона
$Param=@Dialog.ListSelect Выберите параметр|$Params
$ParamId=@StringPart 1 $Param
;
$ParamValue=
;из csv вытягиваем значение предлагаемое по умолчанию
$CSVFound=@FileExists $UseCSV
;csv шаблон не найден
@if $CSVFound=0 then @Goto %AskParamValue
@Text.Load $UseCSV
$N=@Text.Count
$I=1
$BlockFound=0
;в csv разделение колонок при помощи Tab
$Tab=@Calc Char(9)
$Tab=@DequoteText $Tab
;ищем строку вида -7 70005
;где -7 это номер параметра ID слоя
;70005 это значение параметра, то есть ID слоя
%CSVLoop
$S=@Text.Line[$I]
$P1=@StringPart 1$Tab$S
$P2=@StringPart 2$Tab$S
@if $P1= then @Goto %SkipRow
;убираем минус из -7 иначе Digitals сравнение рассматривает как арифм. выражение
$TempP1=@Calc Delete($P1,1,1)
;найден слой, соответствующий выбору пользователя
@if ($TempP1=7) and ($P2=$LayerId) then $BlockFound=1
@if ($BlockFound=0) or ($P1<>$ParamId) then @Goto %SkipRow
;найден параметр, соответствующий выбору пользователя
$N=@Calc Length($P1)
;удаляем первую часть строки - код параметра
$ParamValue=@Calc Delete(“$S”,1,$N+1)
;получаем значение параметра по умолчанию, считанное из csv
$ParamValue=@DequoteText $ParamValue
@Goto %AskParamValue
%SkipRow
$I=$I+1
@if $I<=$N then @Goto %CSVLoop
%AskParamValue
;
;значение параметра для заполнения в файлах
$Prompt=Введите значение параметра
@if $ParamValue= then @Goto %EnterParamValue
$Prompt=$Prompt|Значение по умолчанию взято из $UseCSV
%EnterParamValue
$ParamValue=@Dialog.Ask $Prompt Default=$ParamValue Size=450
;находим все файлы заданного типа в указанном каталоге
@Text.FolderList *$Ext $SourceDir
;проверяем или список пустой
$FileCount=@Text.Count
@If $FileCount=0 then @Break В папке “$SourceDir” отсутствуют файлы $Ext
;открываем файлы из списка по одному
$I=0
%MapLoop
$I=$I+1
@If $I>$FileCount then @Break
$F=@Text.Line[$I]
@FileOpen $F
;перебираем все объекты карты по одному
$ObjCount=@Map.Count
$J=0
%ObjLoop
$J=$J+1
@If $J>$ObjCount then @Goto %SaveMap
;пропускаем все объекты кроме нужного слоя
$ObjLayerId=@Map.Object[$J].LayerID
@if $ObjLayerId<>$LayerId then @Goto %ObjLoop
;меняем значение параметра объекта
@Map.Object[$J].Parameter[ID$ParamId]=$ParamValue
@Goto %ObjLoop
;сохраняем измененную карту
%SaveMap
$F=@Map.ClearShortFilename
@Map.SaveToFile $DestDir$F$Ext
@FileClose
;переходим к следующей карте
@Goto %MapLoop