Доброго вечера. Можно ли с помощью функции @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 на замовчування - те саме. Чи грає роль калібрування принтера?
Почуваюся дещо обділеним, трохи мені не зручно
. Прийдеться, мабуть, через встановлення рамки та відповідного масштабу карти… Якщо не вдається встановити причину такої роботи функції.
Для блага справи, готовий надати доступ в режимі віддаленого керування (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!!!
Велике дякую!
Буду пробувати вмонтувати в мій скрипт! ![]()
Всім доброго дня!
Підкажіть будь ласка чи є можливість створення параметра для точкових об’єктів який би вказував кількість дотичних лінійних об’єктів до них (наприклад опора і лінії які її належать).
;шар лінійних об'єктів
$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 штук). Серед них є дуже цікаві.
Чи можна трохи роз’яснити по деяких з них? Бо не зрозуміло.
-
@Dialog.EditFields Var1=Value:Name,… - виводить діалогове вікно для заповнення/редагування іменованих значень
Написав ось так - Dialog.EditFields Налаштування|Var1=Value1:Позиція 1|Var1=Value2:Позиція 2|Var1=Value3:Позиція 3
Але результатом функція завжди дає 1. Як отримувати введені дані? І чи можна там зробити можливість вибирати із файлу варіанти для введення так, як це реалізовано в масці параметрів? -
@SingleClickDialogs [1/0] - без опису
-
@Dialog.Information Text - виводить повідомлення з інформацією
Чим відрізняється від @Dialog.Message Text? -
@DocumentFromTemplate TemplateName|DocName|Options|Key1=Value1|… - створює документ за шаблоном та замінює змінні в ньому на потрібні значення
Що означають Options та Key1? -
@Map.Object[N].AlignToLayer LayerIndex - без опису
(в перекладі - “вирівнює по шару”, але як і що вирівнює?) -
@Map.ArrangeFixedValues - без опису
(в перекладі - “упорядковує фіксовані значення”, але про які фіксовані значення йде мова?) -
@StringCalc Text function - виконує текстову функцію, наприклад, Copy
Можна детальніше? Куди копіюється текст? І як його вказувати? -
@Float Formula - повертає числовий результат виразу
Чим відрізняється від @CalculateFormula Formula та @Calc? -
@Map.StartRoute Name - без опису
Виводить повідомлення: Не знайдено файл C:\Digital\Route\Name. Створюю файл txt - нічого не дає. Яке розширення файлу має бути і якщо можна - призначення функції? -
@Map.ZB.UpdateParsels LayerIndex та @Map.ZB.UpdateServi LayerIndex - без опису і не зрозуміло взагалі, що це таке може бути
-
@NextPeriodicDate PrevDate NumberOfMonths - вираховує наступну дату періодичного платежу.
Замість PrevDate вводжу дату у форматі 28.02.2022, замість NumberOfMonths - цифру (номер місяця?), а в результаті та сама дата. Дату якого платежу має рахувати функція? -
@CropImageByPolygon ImageFileName - без опису
Обрізає зображення по полігону? По якому? Вказую шлях до зоображення (як растр і як звичайне), виділяю полігон - ніякого результату. -
@UkrCadServer - без опису
-
@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
Нажаль це не зовсім те що потрібно, ця “одиниця” має зникнути взагалі із списку.