На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Денис Вицко (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Денис Вицко
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 142 След.
Ошибка при запуске примера скрипта на Python, \GisTool15\Example\python\findobj\findobj.py
 
Да, скрипты Python работают только для x64.
Запускаемый интерпретатор Python должен быть соответствующей разрядности.
x32-разрядный интерпретатор не сможет загрузить x64-разрядные библиотеки ГИС-ядра, даже если пути к ним прописаны правильно.
Ошибка при запуске примера скрипта на Python, \GisTool15\Example\python\findobj\findobj.py
 
Добрый день!

[URL=https://learn.microsoft.com/ru-ru/windows/win32/dlls/dynamic-link-library-search-order]Стандартный порядок поиска динамических библиотек в Windows выглядит так[/URL] (если по-простому):
- Папка, из которой загружено приложение.
- Системная папка.
- Папка Windows.
- Каталоги, перечисленные в переменной PATH среды.

В случае со скриптами Python приложением является сам интерпретатор. Помещать к нему библиотеки я бы не советовал.

В инструкции сказано:
[QUOTE] 1. Сделать доступными для всех приложений Windows библиотеки ГИС-ядра *.dll и
   файлы данных для их функционирования (классификаторы условных знаков,
   настройки, параметры систем координат и другое) из директорий
   \Gistool15\Dll\X32\ и \Gistool15\Dll\X64, для чего:

   Вариант 1. Скопировать содержимое (вместе с поддиректориями)
   - \Gistool15\Dll\X32 в c:\Windows\SysWOW64;
   - \Gistool15\Dll\X64 в c:\Windows\System32.

   Вариант 2. Добавить в переменную PATH окружения Windows вышеуказанные
   директории. Для этого в меню Windows Пуск/Компьютер по правой кнопке мыши
   выбрать Cвойства. В появившемся окне выбрать меню Дополнительные параметры
   системы, далее Переменные среды, далее для параметра Системные переменные
   найти параметр PATH и нажать кнопку изменить (после чего добавить к списку
   общедоступных директорий нужные). Данный вариант является более надежным
   в использовании.
[/QUOTE]

Для работы со скриптами Python оба варианта подходят. Я бы рекомендовал второй вариант - так проще обновлять библиотеки и контролировать, что не расплодилось множество папок с библиотеками ГИС-ядра.
Разместите (например, в корне диска C:) директорию GISLib, скопируйте в нее из директории инсталляции папки \Gistool15\Dll\X32\ и \Gistool15\Dll\X64, допишите к переменной PATH строчку с путями: ";C:\GISLib\X32\;C:\GISLib\X64".

[QUOTE]Андрей Кравцов написал:
Также обнаружено, что файл "preview.png" отсутсвтует в каталоге: \GisTool15\Example\python\findobj\imgwork# путь к рабочему файлу изображдения карты для нашего приложенияabs_imgwork = abs_path_exampwork + 'imgwork\\preview.png'  [/QUOTE]

Спасибо! Проверим. Исправим, если требуется.
Измерение расстояния по карте, Измерение расстояния по карте
 
Добрый день, Сергей Викторович!

Функции вычисления расстояния и дирекционного угла между точками:
Скрытый текст



Функции определения длины участка метрики объекта/подобъекта, вычисления длины, периметра, площади объекта/подобъекта:
Скрытый текст



Соответствующие свойства компонента TMapObj:

[CODE] // Вычисление длины участка объекта (стороны)
   property SideLength[SubObj:integer;Number:integer]:double read GetSideLength;
   // Вычисление дирекционного угла участка объекта (стороны)
   property SideDirection[SubObj:integer;Number:integer]:double;
   // Вычисление уточненной площади объекта на местности
   property Square:double;
   // Вычисление площади объекта в проекции карты
   property SquareInMap :double;
   // Вычисление периметра объекта
   property Perimeter:double;
   // Вычисление уточненной длины объекта на местности
   property Length:double;
   // Вычисление уточненной длины объекта в проекции карты
   property LengthInMap:double;[/CODE]
Не пересчитывается количество объектов на карте, mapGetSiteObjectCount
 
[QUOTE]Сергей Викторович написал:
И очень хорошо, что после сортировки, кстати, ...все порядковые номера объектов НЕ выстраиваются заново...[/QUOTE]

Порядковые номера выстраиваются заново.
Уникальные номера объектов остаются неизменными.

Порядковые номера доступны только программно, из интерфейса пользователю они не видны.
1С8.3 и GIS ToolKit Active: Выделение объектов, Интеграция GIS ToolKit Active в 1С8.3 Выделение объектов
 
Добрый день!

Анатолий Михайлович, посмотрите внимательно примеры кода в [URL=https://gisweb.ru/forum/messages/forum2/topic13632/message100605/13632-1s8.3-i-gis-toolkit-active_-vydelenie-obektov#message100605]моем предыдущем сообщении[/URL].

Там "второй вариант" - это поиск одновременно по всем картам.
В Вашем случае на скорость он особо не повлияет, хотя предпочтительнее использовать именно его, так как он оптимальнее.

Вы же пытаетесь реализовать поиск по отдельно взятой карте (вариант 1). Ваше право.
Код, исключающий все карты и включающий для одной, у Вас сейчас более менее правильный.
За исключением того, что установка условий поиска, как мы уже проходили, должна выполнятся при выключенном поиске.
У Вас он выключается до цикла, а в итерации цикла включается и в следующую итерацию Вы приходите с _axMapFind.Active = Истина и начинаете установку новых параметров.
Добавьте _axMapFind.Active = Ложь; в начало итерации.


От обилия закомментированных строк Ваш код тяжело читать.

В чем сейчас выражается неправильная работа вашего кода?
Вы считаете, что поиск находит объект, который найти не должен был, или не находит объект, который должен был быть найден.

При этом Ваша проверка не равнозначна задаваемым условиям поиска.

Во-первых, значение семантики для поиска указывается так, как пришло в функцию, а сравнивается с обработанным значением функцией СокрЛП().

Во-вторых, семантик с одним и тем же кодом у объекта может быть несколько.
Поиск Вам вернет объект, если хотя бы одна его семантика с кодом КОД_СЕМАНТИКИ_ObjectGUID имеет значение ObjectGUID.
Вы же выполняете проверку всегда только по первой семантике с таким кодом.

Для того, чтобы убедиться, что поиск Вам выдал объект, не отвечающий условиям поиска, выведите на экран диалог информации о найденном объекте:
[QUOTE] Если ПоискИстина = Истина Тогда
           _SiteNumber = _axMapFind.cMapObj.SiteNumber;
           [B]_axMapFind.cMapObj.ShowDialogInfo(0); [/B]
        .... [/QUOTE]

И чтобы видеть, по какой карте Вы выполняете поиск, добавьте:
[QUOTE] Пока НомерКартыНайденный <= ЗагруженоКарт Цикл
         [B]Сообщить("Выбор объектов выполняется для карты " + карта.MapSites.Item_get(НомерКартыНайденный).GetSiteNameUn());[/B]
         ....
[/QUOTE]
Не пересчитывается количество объектов на карте, mapGetSiteObjectCount
 
до сортировки объекты физически остаются в файле карты
функциями MAPAPI к ним можно даже обратиться и запросить из них информацию
при просмотре журнала транзакций можно также встать на удаленный объект и посмотреть его (при необходимости восстановить)
сортировка вычищает все удаленные объекты и все порядковые номера объектов выстраиваются заново, после сортировки восстановление объектов уже не возможно
Не пересчитывается количество объектов на карте, mapGetSiteObjectCount
 
[QUOTE] // Запросить количество объектов в пользовательской карте
 // hMap   - идентификатор открытой основной карты
 // hSite  - идентификатор открытой пользовательской карты
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI [B]mapGetSiteObjectCount[/B](HMAP hMap, HSITE hSite);

 // Запросить количество объектов в пользовательской карте, [B]исключая удаленные[/B]
 // hMap   - идентификатор открытой основной карты
 // hSite  - идентификатор открытой пользовательской карты
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI [B]mapGetSiteRealObjectCount[/B](HMAP hMap, HSITE hSite);

 // Запросить [B]количество удаленных объектов[/B] в листе карты
 // hMap   - идентификатор открытой основной карты
 // hSite  - идентификатор открытой пользовательской карты
 // list   - номер листа (для совместимости с многолистовыми картами)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI [B]mapGetSiteDeleteObjectCount[/B](HMAP hMap, HSITE hSite, long int list);[/QUOTE]
Пропадает созданный объект, При создании первого объекта он пропадает, но при последующем создании объектов все нормально работает
 
[QUOTE]Александр Махин написал:
Все работает и соответствует нормам[/QUOTE]

Это означает, что проблема решена?

Или проверка возможных причин подтвердила корректность работы программы, но проблема остается?
1С8.3 и GIS ToolKit Active: Выделение объектов, Интеграция GIS ToolKit Active в 1С8.3 Выделение объектов
 
[B]Небольшой совет[/B]
Если помимо значения семантики Вы знаете еще какие-то характеристики объектов, которые надо найти, лучше их также задать в условия поиска.
Например, Вас интересуют только площадные и линейные объекты. Тогда стоит сразу исключить из поиска все остальные локализации (точечные, подписи и пр.).
Поиск будет выполнятся быстрее.
1С8.3 и GIS ToolKit Active: Выделение объектов, Интеграция GIS ToolKit Active в 1С8.3 Выделение объектов
 
Добрый день!

Вариантов поиска по нескольким картам два:
1. Поиск по каждой карте по очереди (что Вы, видимо, и пытаетесь сделать) - запусков поиска столько, сколько карт.
2. Поиск сразу по всем картам - запуск поиска один.

В первом случае необходимо исключить из поиска все карты, кроме одной (текущей), и задать условия.

Во втором случае условия поиска задаются для каждой карты [B]индивидуально[/B].

[U]В любом случае работают следующие принципы:[/U]
[B] - если карта не исключена из поиска, она участвует в процессе поиска и ее объекты попадают в результат поиска;
- если для карты, не исключенной из поиска, не заданы условия ограничения выборки объектов, в результат поиска попадают все 100% объектов этой карты.
[/B]
_axMapFind.cMapSelect.ClearAll();  - сбрасывает все условия поиска для всех карт:
 - они снова становятся включенными в процесс поиска;
 - условия, ограничивающие отбор объектов очищаются, то есть все 100% объектов всех карт отвечают этим условиям (будут выведены в результат поиска).

Как исключить/добавить карту в поиск показано в примере, входящем в инсталляцию:
[CODE]
       // Для примера, если карт несколько, выбирать объекты будем только на второй
       // Нумерация карт обстановки начинается с 1, значение 0 определяет контекст поиска/отображения для основной карты
       Если карта.MapSites.SiteCount > 0 Тогда    
           карта_для_поиска = 1;
           ОчиститьСообщения();
           Сообщить("Выбор объектов выполняется для карты " + карта.MapSites.Item_get(карта_для_поиска).GetSiteNameUn());
           карта.ViewSelect.MapSites_set(-1, false);                // выключить для всех карт    
           карта.ViewSelect.MapSites_set(карта_для_поиска, true);   // включить для определенной карты    
       КонецЕсли;    
[/CODE]

[U]Примерно так[/U] должен выглядеть Ваш код по "варианту 1":

[CODE]
_axMapFind.cMapSelect.ClearAll();
_axcMapView.ViewSelect.ClearSampleAll();
_axcMapView.ClearObjectSelected();    

ЗагруженоКарт = _axcMapView.MapSites.SiteCount;  
Ном = 0;                                      
НомерКартыНайденный = 0;

Пока НомерКартыНайденный  <= ЗагруженоКарт Цикл  

_axMapFind.Active = Ложь;          
_axMapFind.FindPoint = Ложь;  

ОчиститьСообщения();
Сообщить("Выбор объектов выполняется для карты " + карта.MapSites.Item_get(НомерКартыНайденный).GetSiteNameUn());
_axMapFind.cMapSelect.MapSites_set(-1, false);                // выключить для всех карт    
_axMapFind.cMapSelect.MapSites_set(НомерКартыНайденный, true);   // включить для определенной карты    

_axMapFind.cMapSelect.SiteNumber = НомерКартыНайденный;    
_axMapFind.cMapSelect.AddSemantic(КОД_СЕМАНТИКИ_ObjectGUID,ObjectGUID,сSC_EQUAL);   // SC_EQUAL = 8;  // значение должно быть равно

_axMapFind.Active = Истина;    
ПоискИстина = _axMapFind.First();  
Если ПоискИстина = Истина Тогда        
_SiteNumber = _axMapFind.cMapObj.SiteNumber;

Пока ПоискИстина = Истина Цикл
  ........ // обработка результатов поиска
ПоискИстина = _axMapFind.Next();
КонецЦикла;  
Иначе      
Сообщить("Объект для выделения не найден на карте ... - " + _SiteNumber);
КонецЕсли;                                  

НомерКартыНайденный = НомерКартыНайденный + 1;
КонецЦикла;        
[/CODE]


[U]Примерно так[/U] должен выглядеть Ваш код по "варианту 2":

[CODE]
_axMapFind.Active = Ложь;          
_axMapFind.FindPoint = Ложь;  

_axMapFind.cMapSelect.ClearAll();
_axcMapView.ViewSelect.ClearSampleAll();
_axcMapView.ClearObjectSelected();    

ЗагруженоКарт = _axcMapView.MapSites.SiteCount;  
Ном = 0;                                      
НомерКартыНайденный = 0;

// Установка условий для карт
Пока НомерКартыНайденный  <= ЗагруженоКарт Цикл  

_axMapFind.cMapSelect.SiteNumber = НомерКартыНайденный;    
_axMapFind.cMapSelect.AddSemantic(КОД_СЕМАНТИКИ_ObjectGUID,ObjectGUID,сSC_EQUAL);   // SC_EQUAL = 8;  // значение должно быть равно

КонецЦикла;

_axMapFind.Active = Истина;    
ПоискИстина = _axMapFind.First();  

Если ПоискИстина = Истина Тогда
       
_SiteNumber = _axMapFind.cMapObj.SiteNumber;

Пока ПоискИстина = Истина Цикл
   ........ // обработка результатов поиска
   ПоискИстина = _axMapFind.Next();
КонецЦикла;
 
Иначе      
Сообщить("Объект для выделения не найден на ни на одной карте");
КонецЕсли;                                  

НомерКартыНайденный = НомерКартыНайденный + 1;
       
[/CODE]
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 142 След.



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности