Доброго времени суток всем! Подскажите, кто в курсе. Существует ли в "природе" список сокращенных кодов систем координат?(скрин). Утомительно, иногда, рыться в этом длинном перечне библиотеки. Спасибо!
Существует, в базе Civil'а, можно вытащить через API А можно сделать свою "Категорию" и запихать туда все нужные _mapcscreate _category
Сложновато для меня будет. Попытался "погуглить", что же это такое API ("для чайника") и получил забавный ответ: Оффтоп (Move your mouse to the spoiler area to reveal the content) "У вас есть собака. Но она не разговаривает на человеческом языке. Однако она способна "понимать" его путём команд, которым её научили в процессе дрессировки. Если сказать пёсику, знающему команду "тапки!" что-то типа "Рексик, принеси мне, пжалста, тапули мои с зайчушками", он разве что на кличку ухом поведёт, но тапки не принесёт. Так вот, API - это набор команд, с помощью которых ваш пёсик вас понимает и делает то, что вам нужно. Это очень сильно упрощённо и для чайника, но суть понятна, думаю".
что то ты совсем не то делаешь - такой dll'ки вообще нет, нужно подключать OSGeo.MapGuide.Geometry.dll C:\Program Files\Autodesk\AutoCAD 2017\Map\OSGeo.MapGuide.Geometry.dll --- Сообщения объединены, 17 июл 2018, Оригинальное время сообщения: 17 июл 2018 --- проект выложи - больше смогу подсказать
Я не из проекта хочу вытащить коды. Мне нужна общая база кодов (список) систем координат. Чтобы проще было назначать нужную СК. По примеру WGS-84. Не залезая в структуру библиотеки, ввожу код: ll-84.
Добрый день! Попробовал попрактиковаться в обращении к библиотеке с помощью OSGeo.MapGuide...dll В частности, получилось выводить списки системных/пользовательских СК в текстовой файл, формировать по ним полную версию библиотеки в формате XML, уточнять WKT код системы координат (дописывать численные параметры датума, которые Сивил по умолчанию не выводит). Но есть интересная проблема- что файл XML с экспортированной библиотекой не содержит имени категории (Category.csd). В самом Сивиле это не критично, но вот из-под того же InfraWorks нереально вызвать систему координат без категории. Что я пытался - сменить имя категории, но там не все так просто. Как я понял все транзакции к изменению (добавлению новых определений) базы данных Библиотеки проходят только после закрытия Сивила (редактирование существующих вроде как не требует закрытия). Есть метод MgCoordinateSystemCategoryDictionary.NewCategory(); Но даже если попробовать создать категорию внутри Сивила - то в нее обязательно нужно добавить хотя бы одно определение СК. А вот как перебирая наименования СК вытаскивать их категории или тем паче менять я вообше не понял - с вытаскиванием имен вроде бы код есть (см. ниже) но он длится бесконечно (я отрубал через пару минут) Имя категорий текущей СК (Наведите курсор, чтобы раскрыть содержимое) Имя категорий текущей СК (раскрыть) Имя категорий текущей СК (свернуть) Код: public static string GetCategoriesOfCS(string CS_value) { var guid = Guid.NewGuid(); MgCoordinateSystemFactory coordSysFactory = new MgCoordinateSystemFactory(); MgCoordinateSystemCatalog csCatalog = coordSysFactory.GetCatalog(); MgCoordinateSystemDictionary csDict = csCatalog.GetCoordinateSystemDictionary(); MgCoordinateSystemEnum csDictEnum = csDict.GetEnum(); int csCount = csDict.GetSize(); MgStringCollection csNames = csDictEnum.NextName(csCount); MgStringCollection csCatNames; string csName = null; string csCatName = null; MgCoordinateSystem cs = null; bool csProtect; //string csCat = null; int i5 = 0; string writePath = $@"C:\Users\GeorgKeneberg\Documents\Temp\LOG\{guid}3.log"; string result = null; //Перебираем словарь СК for (int i2 = 0; i2 < csCount; i2++) { csName = csNames.GetItem(i2); cs = csDict.GetCoordinateSystem(csName); csProtect = cs.IsProtected(); csCatNames = cs.GetCategories(); //Сравниваем с данной строкой if (csName == CS_value && csProtect == false) //csProtect == false && c { do { csCatName = csCatNames.GetItem(i5); using (StreamWriter export_file = new StreamWriter(writePath, true, Encoding.UTF8)) { export_file.WriteLine(csCatName); export_file.Close(); export_file.Dispose(); } i5++; } while (csCatNames.GetItem(i5) != null); result = i5.ToString(); } } result = "Не найдено"; return result; } При том что другие операции с библиотекой категорий проходят успешно - это например вытаскивание списка категорий во внешний файл (код ниже) Извлечение наименований категорий (Наведите курсор, чтобы раскрыть содержимое) Извлечение наименований категорий (раскрыть) Извлечение наименований категорий (свернуть) Код: public static string GetListAndCountOfCategories() //Работает! { var guid = Guid.NewGuid(); MgCoordinateSystemFactory coordSysFactory = new MgCoordinateSystemFactory(); MgCoordinateSystemCatalog csCatalog = coordSysFactory.GetCatalog(); MgCoordinateSystemCategoryDictionary csDictCat = csCatalog.GetCategoryDictionary(); MgCoordinateSystemEnum csDictCatEnum = csDictCat.GetEnum(); int csCatCount = csDictCat.GetSize(); MgStringCollection csCatNames = csDictCatEnum.NextName(csCatCount); string csCategoryName = null; string writePath = $@"C:\Users\GeorgKeneberg\Documents\Temp\LOG\{guid}.log"; for (int i3 = 0; i3<csCatCount; i3++) { csCategoryName = csCatNames.GetItem(i3); using (StreamWriter export_file = new StreamWriter(writePath, true, Encoding.UTF8)) { export_file.WriteLine(csCategoryName); export_file.Close(); export_file.Dispose(); } } return csCatCount.ToString(); } Также успешно получалось переименовывать категории с помощью подобного кода: Переименование категорий (Наведите курсор, чтобы раскрыть содержимое) Переименование категорий (раскрыть) Переименование категорий (свернуть) Код: public static void RenameCurrentCategory(string new_cat_name, string old_cat_name) //Работает! { MgCoordinateSystemFactory coordSysFactory = new MgCoordinateSystemFactory(); MgCoordinateSystemCatalog csCatalog = coordSysFactory.GetCatalog(); MgCoordinateSystemCategoryDictionary csDictCat = csCatalog.GetCategoryDictionary(); csDictCat.Rename(old_cat_name, new_cat_name); } То есть обращаться к библиотеке категорий можно и менять ее - но вот как добавлять новую категорию и сразу изменить ее имя притом что для транзакции надо (?) перезапустить программу после чего естественно неименованная категория удалится, я что-то запутался :(. Ну и плюсом - как назначить СК из словаря новую категорию тоже непонятно ... Да, вопрос во многом экзотичный, но где еще задать его я даже не знаю
Добавлю вариант .. который должен работать но он не работает. Самое интересное что ошибок нет. и счетчик выводит верное число потенциальных правок, но библиотека не меняется. Для простоты я создал категорию в Сивиле, внес в нее 1 СК и после перезапуска программы хочу внести все импортированные СК без категории в него (параметр в коде cs.IsProtected() возвращает false если система не защищена от редактирования (все пользовательские)) Добавление списка СК в категорию (Наведите курсор, чтобы раскрыть содержимое) Добавление списка СК в категорию (раскрыть) Добавление списка СК в категорию (свернуть) Код: public static string CStoCategory() //string Category_name { MgCoordinateSystemFactory coordSysFactory = new MgCoordinateSystemFactory(); MgCoordinateSystemCatalog csCatalog = coordSysFactory.GetCatalog(); MgCoordinateSystemDictionary csDict = csCatalog.GetCoordinateSystemDictionary(); MgCoordinateSystemEnum csDictEnum = csDict.GetEnum(); int csCount = csDict.GetSize(); MgStringCollection csNames = csDictEnum.NextName(csCount); MgCoordinateSystem cs = null; string csName = null; bool csProtect; //Перебираем словарь СК int i1 = 0; for (int i2 = 0; i2 < csCount; i2++) { csName = csNames.GetItem(i2); cs = csDict.GetCoordinateSystem(csName); csProtect = cs.IsProtected(); //Условие - если данная СК пользовательская (импортированная из XML) if (csProtect == false) { //Пусть для примера для созданной категории с одной внесеной ск по имени "NewCategory" new MgCoordinateSystemFactory().GetCatalog().GetCategoryDictionary().GetCategory("NewCategory").AddCoordinateSystem(csName); i1++; } } return i1.ToString(); }
Мммм, я запускаю через Dynamo :((((( - для него просто делаю как для конечной платформы Если такой вариант устроит? Могу вот так - добавил во вложении --- Сообщения объединены, 10 ноя 2020, Оригинальное время сообщения: 10 ноя 2020 --- Сама сборочка для тренировки - на примере чего потестить - вот во вложении - распаковывать в "%LOCALAPPDATA%\Autodesk\User Geospatial Coordinate Systems"