Чемно дякую.
Однак мені траплялися складні полігони, в координатах яких спочатку йшов блок координат внутрішнього елемента, а потім - через розрив, блок координат зовнішнього елемента. Біс його знає, як такі неправильно складені складні полігони збирались. Зібрати своїми руками мені їх не вдається. Якраз мається на меті перезібрати усі складні полігони, щоб “неправильних” не було.
Як в такому випадку, після розділення функцією spbSplit, номери об’єктів: спочатку зовнішній, потім внутрішній, чи в порядку розміщення блоків координат?
Список номерів об’єктів після @Map.SplitMultiPolygon N - всі номери, більші за @Map.Count, застосованої до розділення.
… це вже iнше питання, приклад для аналiзу i що хочете отримати. На малюнку “неправильний” полiгон, контури 5,6 мають бути в 2, чи 1 полiгонi, чи 5 в 1-ому а 6 в 2-ому, чи ….
Створюються новi, вiдповiдно i к-сть збiльшується (був один “складний” - стало декiлька “простих”).
Список номерів новостворених об’єктів (після @Map.SplitMultiPolygon N) - всі номери, більші за @Map.Count, застосованої до розділення.
Вроді як, вирішено вже тут, крім того є @Map.Layers.Polygon Number [0/1], @Map.Object[N].Closed, хоча повністю підтримую прохання.
Ще раз дякую пану Руслану за варіант в “розборі польотів”. Насправді, накладка полігонів, от де інше питання, а моє - самий раз:
Ви впевнені, що перебираючи створені функцією розділення на прості полігони в порядку зростання номерів цих об’єктів, ви перебираєте спочатку зовнішній, потім внутрішній Ніхто не підтверджував, що функція spbSplit саме в такому порядку присвоює номера новоствореним об’єктам.
Як на мене, відкрито два питання:
якщо для складного полігона у властивостях (в списку точок) першими йдуть координати внутрішнього полігона, а після розриву - координати зовнішнього полігона, номер внутрішнього полігона, після розбивки складного на прості функцією spbSplit, буде менший ніж зовнішнього?
якщо при розділенні полігона прості полігони створюються в тому ж порядку, в якому їх координати описані в списку точок (у властивостях об’єкта), то запропонований спосіб розділення збірно-складних не годиться, тоді треба читати Алгоритм установления принадлежности точечного объекта внутренней области линейного замкнутого объекта.
Складно це, тому прошу розробників допрацювати функцію @Map.SplitMultiPolygon N, на предмет розділення збірно-складних полігонів на прості та/або складні, або хоча б дати відповідь на перше питання.
… чи не легше працювати зразу з готовим списком, а не створювати декiлька змiнних, щоб його отримати?
… для цiєї задачi достатньо метод сортування (вищенаведений алгоритм трiшки для iншого, хiба що є бажання написати свою для формування i роботи з складними полiгонами), а щодо того, як створюється складний контур, думаю теж по такому принципу (сортування по площi), хоча можна i перепитати у розробникiв, чи ми “йдемо у правильному напрямку”.
P.S. з сортуванням слiд використати функцiю @Map.SortByParameter 0 (для сортування площ).
Продовжу, щодо розділення складно-збірних полігонів на прості та/або складні.
Функція @Map.SortByParameter 0 відсортує всі об’єкти в карті по площі, при цьому змінить плановість об’єктів залежно від номерів об’єктів. Це в карті буде “каша”.
Сортувати треба список, де перше поле (через пробіл) - площа, а друге поле - номер об’єкта. Потім у циклі читати номера об’єктів із сортованого по першому полю списку. А це вже двомірний масив (з двома індексами). Немає, поки що в мові скриптів кілька-мірних масивів. Шкода.
Приходиться так:
для кожного з розділених полігонів
запис номера N об’єкта в список-1;
запис площі об’єкта в список-2;
запис площі об’єкта в список-3.
для створених списків
сортування за зростанням списку-3;
для кожного і-го рядка списку-3
пошук n-го номера рядка списку-2 зі значенням і-го рядка списку-3
отримання номера N полігону з n-го рядка списку-1;
видалення n-го рядка зі списку-2 (раптом декілька полігонів мають однакову площу);
запис номера N у список-4.
Во чого треба зробити, щоб виконати сортування списку номерів полігонів за зростанням площі полігонів
P.S. Я саме за сортування текстового списку, маю на увазі.
Продовжу, щодо розділення складно-збірних полігонів на прості та/або складні. Спитаєте - для чого?[attachment=0]Demo.JPG[/attachment]Якщо батьківський - складно-збірний, то для внутрішнього збірного лінійного (коричневим кольором) і для внутрішнього полігонального (суцільно залитого фіолетовим кольором) не знайдено батьківського полігона функцією @Map.ParentObject Number [ParentLayer].
Зате, якщо батьківський збірно-складний, він легко визначається як батьківський для внутрішнього збірного лінійного чи внутрішнього полігонального.
Воно получається як: для перевірки вкладеності об’єктів у батьківський полігон, треба спочатку розбити складно збірний полігон на прості та/або складні полігони.
Щодо функції @Calc Replace(s,t,v,[1/0=ReplaceAll,[1/0=IgnoreCase]] )
Задача: треба було видалити лапки з рядка s. Непосильна задача для вказаної функції, оскільки в скрипті команда мала б виглядати як @Calc Replace(“s”,“”“,”").
Довелось писати в Delphi: функція ReplaceCharInStr Str,Whot,Replace з бібліотеки Functions.dll - замінить фразу Whot рядка Str на фразу Replace. Для прикладу:;Приклад роботи функції dll (ReplaceCharInStr Str,Whot,Replace - заміни фрази Whot рядка Str на фразу Replace
$StrLineText1=@DLLExec Functions.ReplaceCharInStr 2901 Філія_Крижопільський_"Райагроліс",",
$StrLineText1=@DLLExec Functions.ReplaceCharInStr $StrLineText1,_,
@Dialog.Message Замінено:|2901 Філія_Крижопільський_"Райагроліс"||на|$StrLineText1Може комусь згодиться - файл з хмари в теку Digitals:
Функція ExistFormForClassAndCaption FormClass/FormCaption, яка повертає: 0 - якщо вікно з класом форми FormClass і заголовком FormCaption не відображається на екрані; 1 - якщо вказане вікно відображається.
Приклад виклику функції зі скрипта:
$Res=@DLLExec Functions.ExistFormForClassAndCaption TFormTB/До лісових карт(c)
, де: TFormTB - клас форми вікна користувацької панелі інструментів Digitals; До лісових карт(c) - заголовок вікна (назва користувацької панелі інструментів).
Функція ChangeValueIniFile IniFile/Section/Key/Value встановлює значення Value ключа Key в секції Section файла ініціалізації з повним ім’ям (включаючи шлях та розширення) IniFile
Прошу розробників виправити скриптову функцію @Dialog.Ask Text [Default=Value Size=WidthInPixels] - “Вызывает окно с полем для ввода текста и возвращает введенный пользователем текст. Ключ Default= позволяет задать начальное значение текста, а ключ Size - ширину окна в пикселах”.
Наразі функція працює так: “Вызывает окно с полем для ввода текста и возвращает введенный пользователем текст…” або припиняє роботу скрипта, якщо у вікні натиснуто кнопку <Скасувати> чи кнопку <Закрити> системного меню вікна.
Не правильно це “Скасувати уведення даних” ніяк не може означати “Скасувати виконання скрипта”
У вікні @Dialog.Ask можна вказати будь-яку (у т.ч. й порожню) строку та натиснути Ок. Навіщо продовжувати виконання скрипта після закриття вікна чи натискання Cancel?
Вся логіка роботи з діалоговим вікном уведення даних (для операційної системи Windows загалом) така:
або уводимо дані та підтверджуємо уведені дані натисканням на кнопку (застосувати, продовжити, прийняти, готово, погоджено і т.д.);
або не вводимо дані (користувач знає, що даних і не потрібно вводити, коли даних немає - і скрипт передбачає, що даних може й не бути), і тоді відмовляємось від уведення даних кнопкою (скасувати, відмінити, вийти, припинити і т.д.).
Таким чином, якщо скасувати, відмінити, вийти, припинити і т.д. на кнопці діалогового вікна для введення даних - то всі наведені синоніми кнопки мали б припинити уведення даних, а не роботу скрипта
Якщо прийняти так як є, то кнопка має бути одна - , інакше - скласти алгоритм роботи скрипта, не знаючи коли він (алгоритм) перерветься це марна справа. Так є ж функція @Break.
Все просто: користувач вводить дані у вікні, далі скрипт перевіряє уведені дані аналізуючи їх та - продовжує роботу, або припиняє роботу командою @Break. Для чого кнопка - щоб не можна було скласти алгоритм