Так прибрали ж $I=$I+1 у тілі циклу (той що перший). Цикл натикається на кадномер якого немає серед значень параметра ID106 і йде на мітку %Messege, звідти - на %Start, безкінечний цикл. Перший тра повернути, а викинути другий. Однак, щоб читати ще й перший рядок списку:
Вибачте, будь-ласка. З вашого дозволу. Я тут трохи повправлявся - не маю натхнення свою роботу робити $Demo=@DemoMode
@If $Demo=1 then @Break Неможливо зберегти in4.|Програма в демо-режимі
$FileExist=@Dialog.OpenFile *.txt *.txt
@If $FileExist= then @Break Не вказано текстового файлу зі списком кадномерів
$CountI=@Text.Load $FileExist
@Map.BeginUpdate
@Map.DeselectAll
$I=0
%Start
$I=$I+1
@IF $I>$CountI then @Goto %EndText
;працюєм з рядком списку
$CN=@Text.Line[$I]
$S=@Map.FindFirstByParameters 1|ID106=$CN
@If $S=0 then @Text[1].Add $CN
@If $S=0 then @Goto %Start
;;використовуємо внутрішнє ім'я функції, яка російською звучить Файл | Извлечь участок в In4
;;раптом хтось ще працює українською
@ExecuteMenu FileExtracttoIn4
@Map.SaveToFile
@FileClose
@Goto %Start
%EndText
$CountErr=@Text[1].Count
@If $CountErr<>0 then $Text1=@Text[1].Text
@If $CountErr=0 then $Text=Всі ділянки in4 збережені зі списку $FileExist else $Text=Вказані ділянки зі списку $FileExist не збережені, їх немає в карті:|$Text1
@Map.EndUpdate RefreshAlways
@Dialog.Message $TextТут легше розібратись, тому що в тексті скрипта із циклу немає виходу по-за самого циклу: тільки за умови, що лічильник більший як кількість рядків.
Чи працює в когось виклик функції Transfer з бібліотеки GeoGed? Поділіться досвідом, будь-ласка. Можливо слід повністю встановлювати Proj4? Інакше:
біліотеки несамодостатні, і треба cc3290mt.dll;
за наявності cc3290mt.dll виклик функції Transfer вибиває Digitals повністю.
Підозрюю, що функція в dll може бути: Function _pj_transform(src,dst:PProjPJ;point_count:TLong;point_offset:Integer; x,y,z:PDoubleArray):Integer;cdecl;external ‘PROJ.DLL’
тобто, не PAnsiChar
Якщо так, то це не вихід, а виклик функції - мертвий?
Працює, і це добре. Однак функція Transfer крім того що повертає перераховані координати, ще й “трансферує” позначені в карті об’єкти на перераховані координати. Тобто: виконує те, що й штатна в Digitals фунція MapReferenceSystem (Карта | Система координат…). Якби додати функцію, яка просто повертала би перераховані координати - була би “скриптова бомба” Щоб можна було працювати, як на відео з хмари, але без трансферування самих об’єктів карти.
Функцiя Transfer i повертає перерахованi координати, що i видно в скриптi $Str=@DLLExec GeoGed\GeoGed.Transfer ‘$source’ ‘$target’ ‘$PntList’ $Res=@StringPart 1,$str - к-сть оброблених точок (якщо невiдємне значення, iнакше IД помилки i сама помилка) $PntCnt=$Res $PntList=@Calc Replace(Delete(“$Str”,1,Pos(“,”,“$Str”)),“,”,“;”) Список точок, роздiлених “;” $Pnt=@StringPart $PntCnt;$PntList - координати точки масиву $PntList
… або (щойно побачив, що є зайвi перетворення) $PntList=@Calc Delete(“$Str”,1,Pos(“,”,“$Str”)) Список точок, роздiлених “,” $Pnt=@StringPart $PntCnt,$PntList - координати точки масиву $PntList (X Y Z)
тобто закоментувавши стрiчуку @Map.Object[$Obj].Point[$PntCnt] $Pnt не буде трансформування об’єктiв, а дальше - Ваша фантазiя
Всім доброго дня.
Є в мене така задача - розділити збірний полігональний об’єкт на не збірні. Немає проблем: функція @Map.SplitMultiPolygon N “Разбивает составной полигон на отдельные полигоны, сохраняя внутренние”.
Та ж сама задача - розділити збірний полігональний об’єкт на не збірні, однак об’єкт збірно-складний (комплексний полігон - бублик з частиною полігона в дірці від бублика). Функція не справляється з таким комплексом, відокремлюючи лише полігон№1 від складного №2&№3. Очевидно функція сприймає полігон №2&№3 як складний.[attachment=0]KomplexPolig.JPG[/attachment]
Вирішення можливе двома шляхами:
зробити самому на тимчасовій карті
після розділення функцією @Map.SplitMultiPolygon N перебрати всі полігони, утворені функцією spbSplit (Операції з об’єктами.Розділити), застосованої до об’єктів, що мають розрив у коодинатах;
зібрати полігони заново, перебравши їх в порядку зростання їхньої площі з оцінкою кількості перетинів горизонтального правого променя від центроїда, координати якого визначені функцією @Map.Object[N].Centroid (якщо кількість перетинів не парна - полігон, якщо парна - дірка в полігоні);
просити розробників допрацювати функцію @Map.SplitMultiPolygon N, на предмет розділення збірно-складних полігонів на прості та/або складні.
Бачте як: якщо самому (методом трасування променів), то перетини порахувати можна й без тимчасової карти, а от отримати площі чи координати центроїда - ніяк. Щоб без тимчасової карти, треба мати ще й функціональні скрипти:
обчислення площі полігону за координатами поворотних точок межі;
визначення координат центроїда за координатами точок межі полігона.
Складно
[attachment=0]KomplexPolig.JPG[/attachment]Прошу розробників допрацювати функцію @Map.SplitMultiPolygon N, на предмет розділення збірно-складних полігонів на прості та/або складні.
Я описав, як можна зробити в скрипті самому, але тільки через тимчасову карту. Однак може статися як раніше - з функцією @Calc Replace.