Клуб Народной карты

Скрипт-букмарклет для создания объектов-привязок в Народной карте (пост обновлён 03.08.18)

Никита Юшков
1 августа, 12:07

Скрипт добавляет в панель «Недавно созданные» объекты-привязки, откуда их можно нетрудным образом создать.

Из панели можно будет создать Улицу и задать при создании привязку к конкретной единице АТД (например, это очень помогает в случае расположения улицы в СНТ в границах города, из-за чего при создании улицы стандартными методами она не была ни к чему привязана). Можно будет также создавать Реки и Линии ж/д (естественно, с присутствием названия по желанию).

Стандартным функционалом Народной карты это сделать напрямую невозможно! Но скрипт расширяет наши возможности.

Код изменён благодаря советам a-zakh. За что ему большое спасибо!)

javascript:
var j = JSON.parse(localStorage.getItem('nk:app-settings'));
j.lastUsedGeoObjectTemplates=[{"templateId":"bld","template":{"categoryId":"rd","attrs":{"sys:blocked":false}}},{"templateId":"hydro","template":{"categoryId":"hydro_ln","attrs":{"sys:blocked":false}}},{"templateId":"rd_el","template":{"categoryId":"transport_railway","attrs":{"sys:blocked":false}}}];
if(confirm("Страница будет перезагружена. Несохранённые данные будут потеряны. Продолжить?")){
    localStorage.setItem('nk:app-settings', JSON.stringify(j));
    location.reload();
}

Установка стандартно через диспетчер закладок браузера (в Яндекс.Браузере и Google Chrome можно открыть комбинацией клавиш Ctrl + Shift + O).

12 комментариев
Почему бы для выделения подстроки не использовать, например, String.prototype.substr() ?
Никита Юшков
1 августа, 13:08
a-zakh,
я JS начал изучать только на днях. Пока только основные функции узнал. Спасибо за совет) Почитаю, что это за функция.
Никита Юшков,
тогда ещё дам пару советов.


Для поиска подстроки в строке есть функции, например String.prototype.indexOf().
Просто если ты пишешь сумму из 25 слагаемых, то должно закрасться подозрение, что ты что-то делаешь не так, и нужно спросить интернет "javascript поиск подстроки в строке", что наведёт тебя на нужную функцию.


Но, по-моему, тебе тут нужна не работа со строками. Настройка nk:app-settings представляет собой сериализованный в json javascript-объект. Для работы с форматом json есть встроенный объект JSON с функциями parse/stringify. Т.е. если у тебя есть переменная
var data = [
    {
          templateId:"bld",
          template : {
                    categoryId:"rd",
                    attrs: {"sys:blocked":false}
          }
    },
    ...
];
то её (при некоторых условиях) можно преобразовать в json-строку вызовом 
var json_str = JSON.stringify(data);


Обратное преобразование:
var data = JSON.parse(json_str);


Скорее всего, работа с настройками у тебя должна выглядеть так: нужно достать нужное значение из localStorage, десериализовать (parse), поработать с ним как с объектом (найти нужный ключ/значение, добавить элементы и т. д.), потом сериализовать (stringify) и сохранить.
Насколько я понял твой ход мыслей, ты закладываешься на определённый порядок ключей в сериализованном объекте, а никакиой порядок не гарантируется.
Никита Юшков
1 августа, 14:39
a-zakh,
ха, клёво. А я до этого только на паскале да на сях кодил, там в таких функциях необходимости особо нет. Но ведь по сути они работают наверняка также, как и описал я, только это будет происходить дольше из-за обращения к сторонней функции и проверке с её стороны вообще всех элементов.
Олег Чечулин
1 августа, 14:53
Никита Юшков,
Скорость работы и понятность кода - взаимно конфликтующие сущности. Если написать очень быстро работающее приложение, то в нём практически невозможно будет исправить ошибку либо расширить функционал. 
Никита Юшков,
потеря производительности из-за вызова функции - однобокое и часто неверное представление о функциях. Ты учти, что твою сумму на 3 строки интерпретатору нужно обработать (валидировать и скомпилировать), а каждая операция конкатенации порождает новый объект строки, что намного превысит затраты на вызов функции. Ну и понятность и красота кода сильно страдает, зато повышается подверженность ошибкам и трудность в сопровождении. Ты не ошибся, когда отсчитывал 25 символов? А может их 26? А если ключ переименуют и длина станет 32, каковы будут трудозатраты на изменения и отладку твоего кода вместо записи str.substr(j, 25) ?


Всё-таки больше обрати внимание на мой второй совет. Не надо работать с настройками как со строкой.
Никита Юшков
1 августа, 15:10
a-zakh,
я всё учту, не волнуйтесь) Вечерком попробую переписать код. Но пока , если не будут менять названия и последовательность двух задействованных атрибутов (а их менять незачем), код точно будет выполняет свои функции :) Но через Ваш совет ему будет уже неважен второй атрибут, что сильно повышает устойчивость к изменениям значения параметра nk:app-settings. Я Вам очень благодарен за советы.
Никита Юшков,
Да я не волнуюсь, просто борюсь с заблуждениями ) Отсутствие гарантии порядка ключей в объекте означает, что этот порядок случаен (в реальности, псевдослучаен, т.е. зависит от разных нам неподвластных факторов). Этот порядок никто не выбирает и не меняет, его выдаёт движок javascript по алгоритмам, понятным только его разработчикам. Это значит, что только что всё работало, а при следующем заходе уже может не работать, хотя никто ничего не менял.
Семён Федотов
1 августа, 13:01
В своё время хотел в фичи написать по поводу "шаблонов" для всяких с/т, трансформаторов и т.п., чтобы вручную не вводить каждый раз названия. Сохранил один раз себе вот такой "шаблон" и создавай из него новые объекты.
Теперь в фичи по поводу подобных хотелок писать не буду, а буду напрямую Никите =)
Обновлено 1 августа, 13:01
Никита Юшков
1 августа, 13:09
Семён Федотов,
я такими шаблонами весной орудовал, когда к нам в город заехала новая сеть супермаркетов. Если надо будет - пишите)
Никита Юшков,
шаблоны часто бывают полезны, поэтому можете опубликовать скрипт.