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

Доброго вечера. Можно ли с помощью функции @Thread распараллелить добавление объектов в текущую карту? Например есть N количество txt файлов с координатами и нужно соответственно их обработать и добавить объекты в карту.

Доброї пори доби.

Підкажіть, будь-ласка. Чому функція @Map.CreateLayout XCenter YCenter Width Height Scale DPI BitPerPixel BMPFileName створює растр з розрізненістю 96 dpi - не залежно від того, яке значення DPI вказано?

Підозрюю, що справа може бути в налаштуваннях/константах - усе перерив, жодної зачіпки.
Буду вдячний за відповідь.

Доброї пори!
Дивно, чому у Вас може працювати не так як треба.
Перевірьте на цьому скрипті, він створює два растри з різною роздільною здатністю на певну область (100мм*100мм навколо центру поміченого об’єкта активної карти в поточному масштабі).

$MinMax=@Map.Selected.GetMinMax
$MinMax=%Library.ReplaceComma $MinMax
$XMin=@StringPart 1 $MinMax
$XMax=@StringPart 4 $MinMax
$YMin=@StringPart 2 $MinMax
$YMax=@StringPart 5 $MinMax
$XCenter=($XMin+$XMax)/2
$YCenter=($YMin+$YMax)/2
$Width=100
$Height=100
$Scale=0
$BitPerPixel=24
$BMPFileName=D:\test300.bmp
@Map.CreateLayout $XCenter $YCenter $Width $Height $Scale 300 $BitPerPixel $BMPFileName
$BMPFileName=D:\test100.bmp
@Map.CreateLayout $XCenter $YCenter $Width $Height $Scale 100 $BitPerPixel $BMPFileName

На жаль, результат той самий[attachment=0]CreateLayout.png[/attachment]Можливо грає роль драйвер принтера на замовчування (PDF-XChange Virtual Printer)? Однак пробував XPS на замовчування - те саме. Чи грає роль калібрування принтера?

Почуваюся дещо обділеним, трохи мені не зручно :confused: . Прийдеться, мабуть, через встановлення рамки та відповідного масштабу карти… Якщо не вдається встановити причину такої роботи функції.

Для блага справи, готовий надати доступ в режимі віддаленого керування (TeamViewer, AnyDesk).

P.S. Ну все. Пробував на чистій установці Digitals, на іншому компі. Отже - справа тільки в функції.

Все вірно, BMP-файл створюється такий, що у його заголовку є лише розміри у пікселях по ширині та висоті та формат(кількість біт) пікселя. Test300 має одні розміриу пікселях, Test100 - інші, а вже програма переглядач визначає розміри в сантиметрах використовуючи роздільну здатність екрану (96 dpi)

Отже. Щоб отримати фрагмент карти для вставки в документ Word розміром 10х10 см при масштабі відображення 100%, необхідно давати функції 96 dpi.

Для результату по аналогії з функцією FileSaveAsJPEG (Експорт у | JPG), треба мати ще й розмір пікселя. Останній визначається з масштабу? Чи варто чекати розробки такої функції?

Дякую за оперативну відповідь.

Знайшли можливість писати в заголовок BMP роздільну здатність, оновіть програму та спробуйте ще раз @CreateLayout
P.S. Word/Excel раніше некоректно відображав розміри вставлених зображень, оріентуйтесь краще на щось інше, IrfanView наприклад

Так. У мене VBA процедура застосовує специфічне “калібрування принтера”.

Чемно дякую за оперативну підтримку. Тепер з BMP - те що треба. Однак варто перевірити решту форматів. JPG - спричиняє помилку звертання до пам’яті.

Доброго дня!
Слава Україні!!!
Можливо не на часі, але працювати за можливості потрібно.
Тому можливо хтось із Гуру Digitals мені допоможе.
Суть проблеми: при використанні функції @Map.IntersectionWithLayer не коректно опрацьовуються об’єкти-складні полігони, у підсумку площа об’єкта пересічення вираховується невірно.
У моєму випадку площа об’єкта пересічення становить 56,3550, а має бути 54,5962.

Фрагмент скрипта яким я користуюсь.

$N90008N=@Map.Layers.FindByID ID90008 @if $N90008N>0 then @Goto %Yes90008 @if $N90008N=0 then @Map.Layers.Add 90008 1 Залишок по обробітку @Map.Layers.SetAttributes ID90008 0 0 255 20 1 16777215 0 Arial 80 0 -16777208 @Map.Layers.Polygon ID90008 1 %Yes90008 ;---------------------------------------------------------- ;---------------------------------------------------------- $RestrictLayerID=ID90005 @Map.DeselectAll @Dialog.WaitBox Виберiть контури для аналiзу $ObjectList=@Map.Selected.List @Map.DeselectAll @Text[1].Text=$ObjectList @Text[2].Clear $Count=@Text[1].Count @While $Count>0 %LoopObjectList ;--------------------------------------------------------------------- $ObjectID=@Text[1].Line[$Count] $ObjArea=@Map.Object[$ObjectID].Parameter[0] ;--------------------------------------------------------------------- $RestrictObj=@Map.IntersectionWithLayer $ObjectID $RestrictLayerID @If $RestrictObj=0 Then @Goto %SkipObjectList ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ;Додано мною для виправлення помилки, але всеодно не коректно працює ;функція IntersectionWithLayer при обробітку великої кількості обєктів ;@Map.DeselectAll ;@Map.Object[$RestrictObj].LayerID ID90008 ;Операции с объектами.Разделить ;@ExecuteMenu spbSplit ;@Map.DeselectAll ;@Map.SelectLayer ID90008 ;Операции с объектами.Сложный полигон ;@ExecuteMenu spbCombine ;$RestrictObj=@Map.SelectedObject ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- $ObjRestArea=@Map.Object[$RestrictObj].Parameter[0] @Map.DeleteObject $RestrictObj @Text[2].Add Об'єкт $ObjectID, площа $ObjArea (пересiчення з шаром $RestrictLayerID складає $ObjRestArea) %SkipObjectList $Count=$Count-1 %LoopObjectList $Count=@Text[2].Count @If $Count=0 Then @Break Спiвпадань з шаром $RestrictLayerID не знайдено $Buffer=@Text[2].Text @Dialog.Message $Buffer

Частково вихід знайшов, якщо застосувати в цьому коді таку маніпуляцію

;Додано мною для виправлення помилки, але всеодно не коректно працює функція IntersectionWithLayer при обробітку великої кількості об'єктів ;@Map.DeselectAll ;@Map.Object[$RestrictObj].LayerID ID90008 ;Операции с объектами.Разделить ;@ExecuteMenu spbSplit ;@Map.DeselectAll ;@Map.SelectLayer ID90008 ;Операции с объектами.Сложный полигон ;@ExecuteMenu spbCombine ;$RestrictObj=@Map.SelectedObject ;---------------------------------------------------------------------
Але якщо опрацьовувати велику кількість об’єктів складнішим скриптом, з певним набором циклів. То трапляються випадки, що функція @Map.IntersectionWithLayer у результаті своєї роботи повертає результат $RestrictObj=0, хоча там 100% є пересічення.
Допоможіть будь-ласка розібратись з цією проблемою. Файл приклад додаю.

Якщо об’єкт-перетин не потрібен потім, то використайте функцію PAR
Нижче скрипт, який оновлює у прикладі вміст параметрів 259 і 260, для карт з невеликою кількістю об’єктів можна функцію PAR вписати в параметр, тоді й скрипт не потрібен. В прикладі додано ще й допоміжний 258-й параметр.

$TempPar=ID7006411 $FieldLayerID=70005 $FieldPar1=ID7006412 $FieldPar2=ID7006413 $ParcelLayerID=90005 $FL=@Map.Layers.FindByID $FieldLayerID @if $FL<1 then @Break Не знайдено шар "Ділянка" $PL=@Map.Layers.FindByID $ParcelLayerID @if $PL<1 then @Break Не знайдено шар "Масив" $I=0 $MC=@Map.Count %LoopObject1 $I=$I+1 $L=@Map.Object[$I].Layer @if $L<>$FL then @Goto %Continue1 $Val=@Map.Object[$I].CalculateFormula PAR($PL,$TempPar) $Val=%Library.ReplaceComma $Val $Val=@Calc trunc($Val*10000+0.5)/10000 $Area=@Map.Object[$I].Parameter[0] $Area=%Library.ReplaceComma $Area $V2=$Area-$Val @Map.Object[$I].Parameter[$FieldPar1] $Val @Map.Object[$I].Parameter[$FieldPar2] $V2 @Map.RefreshObject $I %Continue1 @if $I<$MC then @Goto %LoopObject1 @Dialog.Message All done!!!

Велике дякую! :smiley: Буду пробувати вмонтувати в мій скрипт! :wink:

Всім доброго дня!
Підкажіть будь ласка чи є можливість створення параметра для точкових об’єктів який би вказував кількість дотичних лінійних об’єктів до них (наприклад опора і лінії які її належать).

;шар лінійних об'єктів $LineLayer=1 ;шар точкових об'єктів $PointLayer=2 ;номер параметру кількості дотичних об'єктів $CountParam=1 $MC=@Map.Count $I=0 %LoopObject1 $I=$I+1 $L=@Map.Object[$I].Layer @if $L<>$PointLayer then @Goto %Continue1 $XYZ=@Map.Object[$I].Point[1] $C=0 $J=0 %LoopObject2 $J=$J+1 $L=@Map.Object[$J].Layer @if $L<>$LineLayer then @Goto %Continue2 $IP=@Map.Object[$J].IndexOfPoint $XYZ @if $IP>0 then $C=$C+1 %Continue2 @if $J<$MC then @Goto %LoopObject2 @Map.Object[$I].Parameter[$CountParam] $C @Map.RefreshObject $I %Continue1 @if $I<$MC then @Goto %LoopObject1

ВЕЛИКЕ дякую!

Підкажіть будь ласка що не так із таким скриптом, не можу зрозуміти чому він не виконується для деякої частини об’єктів

$CountSel=@Map.SelCount
@If $CountSel=0 then @Break Позначте лінійні об’єкти.
$SelObj=0
@Progress.Start $CountSel Виконання
%StartSelObj
$SelObj=@Map.NextSelected $SelObj
@If $SelObj=0 then @Goto %EndProc
@Progress.StepBy
$CntP=@Map.Object[$SelObj].Count
@If $CntP<>2 then @Goto %StartSelObj
$P1=@Map.Object[$SelObj].Point[1]
$P2=@Map.Object[$SelObj].Point[2]
$ObjP1=@Map.PointObject 0 $P1
@If $ObjP1=0 then @Goto %FindObjP2
$P7038=@Map.Object[$ObjP1].Parameter[ID7024]
@Map.Object[$SelObj].Parameter[ID7038]=$P7038
%FindObjP2
$ObjP2=@Map.PointObject 0 $P2
@If $ObjP2=0 then @Goto %StartSelObj
$P7038=@Map.Object[$ObjP2].Parameter[ID7024]
@Map.Object[$SelObj].Parameter[ID7038]=$P7038
@Goto %StartSelObj
%EndProc
@Progress.Stop
@Dialog.Message Виконано

Зі скриптом все норм. Здається причина - в карті. Додайте запис лог-файла у скрипт: @OpenLog першим рядком скрипта і (наприклад) @CloseLog D:\Log.txt останнім рядком. Далі продивіться лог-файл у текстовому редакторі: знайдіть фрагмент SelObj=N, в якому N - номер лінійного об’єкта, по якому скрипт не спрацював.

Добрий день!

Роблю інвентаризацію нових скриптових функцій (з грудня 2020 року ви додали аж 110 штук). Серед них є дуже цікаві.
Чи можна трохи роз’яснити по деяких з них? Бо не зрозуміло.

  1. @Dialog.EditFields Var1=Value:Name,… - виводить діалогове вікно для заповнення/редагування іменованих значень
    Написав ось так - Dialog.EditFields Налаштування|Var1=Value1:Позиція 1|Var1=Value2:Позиція 2|Var1=Value3:Позиція 3
    Але результатом функція завжди дає 1. Як отримувати введені дані? І чи можна там зробити можливість вибирати із файлу варіанти для введення так, як це реалізовано в масці параметрів?

  2. @SingleClickDialogs [1/0] - без опису

  3. @Dialog.Information Text - виводить повідомлення з інформацією
    Чим відрізняється від @Dialog.Message Text?

  4. @DocumentFromTemplate TemplateName|DocName|Options|Key1=Value1|… - створює документ за шаблоном та замінює змінні в ньому на потрібні значення
    Що означають Options та Key1?

  5. @Map.Object[N].AlignToLayer LayerIndex - без опису
    (в перекладі - “вирівнює по шару”, але як і що вирівнює?)

  6. @Map.ArrangeFixedValues - без опису
    (в перекладі - “упорядковує фіксовані значення”, але про які фіксовані значення йде мова?)

  7. @StringCalc Text function - виконує текстову функцію, наприклад, Copy
    Можна детальніше? Куди копіюється текст? І як його вказувати?

  8. @Float Formula - повертає числовий результат виразу
    Чим відрізняється від @CalculateFormula Formula та @Calc?

  9. @Map.StartRoute Name - без опису
    Виводить повідомлення: Не знайдено файл C:\Digital\Route\Name. Створюю файл txt - нічого не дає. Яке розширення файлу має бути і якщо можна - призначення функції?

  10. @Map.ZB.UpdateParsels LayerIndex та @Map.ZB.UpdateServi LayerIndex - без опису і не зрозуміло взагалі, що це таке може бути

  11. @NextPeriodicDate PrevDate NumberOfMonths - вираховує наступну дату періодичного платежу.
    Замість PrevDate вводжу дату у форматі 28.02.2022, замість NumberOfMonths - цифру (номер місяця?), а в результаті та сама дата. Дату якого платежу має рахувати функція?

  12. @CropImageByPolygon ImageFileName - без опису
    Обрізає зображення по полігону? По якому? Вказую шлях до зоображення (як растр і як звичайне), виділяю полігон - ніякого результату.

  13. @UkrCadServer - без опису

  14. @Map.FromArchitectural 0/1 - без опису

Всім доброго дня!
Підкажіть будь ласка, як за допомогою скрипту ефективно видаляти із отриманого текстового списку значення які дублюються, наприклад якщо в списку повторюється “1” то вона має зникнути із нього.

Доброго дня!
Якщо питання ще актуальне, то уточніть - вам потрібно шукати рядки, які дублюються у списку, окремі символи, чи цілі слова? Якщо рядки - то треба написати скрипт, який перебирає кожний рядок і співставляє з кожним рядком того ж списку, шукаючи ідентичні. Такий скрипт можу написати. Готового не маю. Якщо вам тільки для одного разу і є ексель - то там є функція Видалення дублікатів.

Є відповідна функція @Text[].Unique, вона сортує!!! список та лишає у ньому тільки унікальні значення
Приклад:

@Text[1].Add 1 @Text[1].Add 2 @Text[1].Add 1 @Text[1].Add 3 @Text[1].Add 1 @Text[1].Add 6 @Text[1].Add 1 @Text[1].Add 8 @Text[1].Add 12 @Text[1].Unique $S=@Text[1].Text @Dialog.Message $S

Нажаль це не зовсім те що потрібно, ця “одиниця” має зникнути взагалі із списку.