Все про скрипти

Заберiть один з $I=$I+1

Дякую!

Вибирає всі кадастрові номера по списку! Дякую!

Чомусь вибирає 30 ділянок і зависає :frowning:

Попробуйте забрати @FileClose, а потiм закриєте самостiйно вiдкритi карти

Так прибрали ж $I=$I+1 у тілі циклу (той що перший). Цикл натикається на кадномер якого немає серед значень параметра ID106 і йде на мітку %Messege, звідти - на %Start, безкінечний цикл. Перший тра повернути, а викинути другий. Однак, щоб читати ще й перший рядок списку:

;Список з кад номерами
$I=0

Скрипт не мiй, але iндекс повинен збiльшуватися правильно, якщо забрати другий I=I+1

Вибачте, будь-ласка. З вашого дозволу. Я тут трохи повправлявся - не маю натхнення свою роботу робити :smiley: $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Тут легше розібратись, тому що в тексті скрипта із циклу немає виходу по-за самого циклу: тільки за умови, що лічильник більший як кількість рядків.

Дякую, скрипт працює :slight_smile:

Попередній скрипт працює викинувши другий $I=$I+1 та замінивши
;Список з кад номерами
$I=0

Дякую)

[url]Экспорт SHP, импорт DGN]

Дякую дуже, саме те що треба для перерахунку координат у скрипті :smiley: Добре що дали самі dll-ки, а то не хочуть качатись з прямого наведення.

Чи працює в когось виклик функції 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
    Якщо так, то це не вихід, а виклик функції - мертвий?

.Перепрошую, забув перевiрити. Тепер має працювати (завантажте новi файли).

Працює, і це добре. Однак функція Transfer крім того що повертає перераховані координати, ще й “трансферує” позначені в карті об’єкти на перераховані координати. Тобто: виконує те, що й штатна в Digitals фунція MapReferenceSystem (Карта | Система координат…). Якби додати функцію, яка просто повертала би перераховані координати - була би “скриптова бомба” :blush: Щоб можна було працювати, як на відео з хмари, але без трансферування самих об’єктів карти.

Функц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я :slight_smile:

Вибачте, я прошльопав - у скрипті. Хороша робота. Дякую.

Всім доброго дня.
Є в мене така задача - розділити збірний полігональний об’єкт на не збірні. Немає проблем: функція @Map.SplitMultiPolygon N “Разбивает составной полигон на отдельные полигоны, сохраняя внутренние”.

Та ж сама задача - розділити збірний полігональний об’єкт на не збірні, однак об’єкт збірно-складний (комплексний полігон - бублик з частиною полігона в дірці від бублика). Функція не справляється з таким комплексом, відокремлюючи лише полігон№1 від складного №2&№3. Очевидно функція сприймає полігон №2&№3 як складний.[attachment=0]KomplexPolig.JPG[/attachment]
Вирішення можливе двома шляхами:

  1. зробити самому на тимчасовій карті
  • після розділення функцією @Map.SplitMultiPolygon N перебрати всі полігони, утворені функцією spbSplit (Операції з об’єктами.Розділити), застосованої до об’єктів, що мають розрив у коодинатах;
  • зібрати полігони заново, перебравши їх в порядку зростання їхньої площі з оцінкою кількості перетинів горизонтального правого променя від центроїда, координати якого визначені функцією @Map.Object[N].Centroid (якщо кількість перетинів не парна - полігон, якщо парна - дірка в полігоні);
  1. просити розробників допрацювати функцію @Map.SplitMultiPolygon N, на предмет розділення збірно-складних полігонів на прості та/або складні.

Бачте як: якщо самому (методом трасування променів), то перетини порахувати можна й без тимчасової карти, а от отримати площі чи координати центроїда - ніяк. Щоб без тимчасової карти, треба мати ще й функціональні скрипти:

  • обчислення площі полігону за координатами поворотних точок межі;
  • визначення координат центроїда за координатами точок межі полігона.
    Складно :blush:

Може так? (не зрозумiв, що потрiбно отримати в кiнцевому результатi)
[url]Библиотека полезных скриптов - #123 від user24]

[attachment=0]KomplexPolig.JPG[/attachment]Прошу розробників допрацювати функцію @Map.SplitMultiPolygon N, на предмет розділення збірно-складних полігонів на прості та/або складні.

Я описав, як можна зробити в скрипті самому, але тільки через тимчасову карту. Однак може статися як раніше - з функцією @Calc Replace.