Аналитика http://geosystema.net/forum/ |
|
Все про скрипти http://geosystema.net/forum/viewtopic.php?f=1&t=2809 |
Страница 81 из 83 |
Автор: | Denidz [ 14 янв 2022 18:43 ] |
Заголовок сообщения: | Re: Все про скрипти |
Доброго вечера. Можно ли с помощью функции @Thread распараллелить добавление объектов в текущую карту? Например есть N количество txt файлов с координатами и нужно соответственно их обработать и добавить объекты в карту. |
Автор: | voha [ 01 фев 2022 01:08 ] |
Заголовок сообщения: | Re: Все про скрипти |
Доброї пори доби. Підкажіть, будь-ласка. Чому функція @Map.CreateLayout XCenter YCenter Width Height Scale DPI BitPerPixel BMPFileName створює растр з розрізненістю 96 dpi - не залежно від того, яке значення DPI вказано? Підозрюю, що справа може бути в налаштуваннях/константах - усе перерив, жодної зачіпки. Буду вдячний за відповідь. |
Автор: | Dmitry_Zolotar [ 01 фев 2022 12:33 ] |
Заголовок сообщения: | Re: Все про скрипти |
Доброї пори! Дивно, чому у Вас може працювати не так як треба. Перевірьте на цьому скрипті, він створює два растри з різною роздільною здатністю на певну область (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 |
Автор: | voha [ 01 фев 2022 14:32 ] |
Заголовок сообщения: | Re: Все про скрипти |
Dmitry_Zolotar писал(а): ...Перевірьте на цьому скрипті, він створює два растри з різною роздільною здатністю на певну область (100мм*100мм навколо центру поміченого об'єкта активної карти в поточному масштабі)... На жаль, результат той самийВложение: CreateLayout.png [ 38.12 Кб | Просмотров: 13573 ] Почуваюся дещо обділеним, трохи мені не зручно . Прийдеться, мабуть, через встановлення рамки та відповідного масштабу карти... Якщо не вдається встановити причину такої роботи функції. Для блага справи, готовий надати доступ в режимі віддаленого керування (TeamViewer, AnyDesk). P.S. Ну все. Пробував на чистій установці Digitals, на іншому компі. Отже - справа тільки в функції. |
Автор: | Dmitry_Zolotar [ 01 фев 2022 15:31 ] |
Заголовок сообщения: | Re: Все про скрипти |
Все вірно, BMP-файл створюється такий, що у його заголовку є лише розміри у пікселях по ширині та висоті та формат(кількість біт) пікселя. Test300 має одні розміриу пікселях, Test100 - інші, а вже програма переглядач визначає розміри в сантиметрах використовуючи роздільну здатність екрану (96 dpi) |
Автор: | voha [ 01 фев 2022 16:28 ] |
Заголовок сообщения: | Re: Все про скрипти |
Dmitry_Zolotar писал(а): Все вірно, BMP-файл створюється такий, що у його заголовку є лише розміри у пікселях по ширині та висоті та формат(кількість біт) пікселя. Test300 має одні розміриу пікселях, Test100 - інші, а вже програма переглядач визначає розміри в сантиметрах використовуючи роздільну здатність екрану (96 dpi) Отже. Щоб отримати фрагмент карти для вставки в документ Word розміром 10х10 см при масштабі відображення 100%, необхідно давати функції 96 dpi.Для результату по аналогії з функцією FileSaveAsJPEG (Експорт у | JPG), треба мати ще й розмір пікселя. Останній визначається з масштабу? Чи варто чекати розробки такої функції? Дякую за оперативну відповідь. |
Автор: | Dmitry_Zolotar [ 01 фев 2022 16:41 ] |
Заголовок сообщения: | Re: Все про скрипти |
Знайшли можливість писати в заголовок BMP роздільну здатність, оновіть програму та спробуйте ще раз @CreateLayout P.S. Word/Excel раніше некоректно відображав розміри вставлених зображень, оріентуйтесь краще на щось інше, IrfanView наприклад |
Автор: | voha [ 01 фев 2022 17:04 ] |
Заголовок сообщения: | Re: Все про скрипти |
Dmitry_Zolotar писал(а): Знайшли можливість писати в заголовок BMP роздільну здатність, оновіть програму та спробуйте ще раз @CreateLayout Так. У мене VBA процедура застосовує специфічне "калібрування принтера".P.S. Word/Excel раніше некоректно відображав розміри вставлених зображень, оріентуйтесь краще на щось інше, IrfanView наприклад Чемно дякую за оперативну підтримку. Тепер з BMP - те що треба. Однак варто перевірити решту форматів. JPG - спричиняє помилку звертання до пам'яті. |
Автор: | petrogeo [ 31 мар 2022 07:43 ] | ||
Заголовок сообщения: | Re: Все про скрипти | ||
Доброго дня! Слава Україні!!! Можливо не на часі, але працювати за можливості потрібно. Тому можливо хтось із Гуру 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% є пересічення. Допоможіть будь-ласка розібратись з цією проблемою. Файл приклад додаю.
|
Автор: | Dmitry_Zolotar [ 31 мар 2022 12:30 ] | ||
Заголовок сообщения: | Re: Все про скрипти | ||
Якщо об'єкт-перетин не потрібен потім, то використайте функцію 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!!!
|
Автор: | petrogeo [ 31 мар 2022 13:27 ] |
Заголовок сообщения: | Re: Все про скрипти |
Dmitry_Zolotar писал(а): Якщо об'єкт-перетин не потрібен потім, то використайте функцію 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!!! Велике дякую! Буду пробувати вмонтувати в мій скрипт! |
Автор: | Denys Sanitskyi [ 13 апр 2022 11:00 ] |
Заголовок сообщения: | Re: Все про скрипти |
Всім доброго дня! Підкажіть будь ласка чи є можливість створення параметра для точкових об'єктів який би вказував кількість дотичних лінійних об'єктів до них (наприклад опора і лінії які її належать). |
Автор: | Dmitry_Zolotar [ 14 апр 2022 14:17 ] | ||
Заголовок сообщения: | Re: Все про скрипти | ||
Denys Sanitskyi писал(а): Всім доброго дня! Підкажіть будь ласка чи є можливість створення параметра для точкових об'єктів який би вказував кількість дотичних лінійних об'єктів до них (наприклад опора і лінії які її належать). Код: ;шар лінійних об'єктів
$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
|
Автор: | Denys Sanitskyi [ 15 апр 2022 08:18 ] |
Заголовок сообщения: | Re: Все про скрипти |
ВЕЛИКЕ дякую! Підкажіть будь ласка що не так із таким скриптом, не можу зрозуміти чому він не виконується для деякої частини об'єктів $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 Виконано |
Автор: | voha [ 16 апр 2022 09:50 ] |
Заголовок сообщения: | Re: Все про скрипти |
Denys Sanitskyi писал(а): Підкажіть будь ласка що не так із таким скриптом, не можу зрозуміти чому він не виконується для деякої частини об'єктів... Зі скриптом все норм. Здається причина - в карті. Додайте запис лог-файла у скрипт: @OpenLog першим рядком скрипта і (наприклад) @CloseLog D:\Log.txt останнім рядком. Далі продивіться лог-файл у текстовому редакторі: знайдіть фрагмент SelObj=N, в якому N - номер лінійного об'єкта, по якому скрипт не спрацював.
|
Страница 81 из 83 | Часовой пояс: UTC + 2 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |