VS Code

Настройка рабочей среды для написания скриптов на IronPython под Autodesk Revit

Предисловие
У всех людей разный уровень знаний в разных сферах человеческой деятельности. Передо мной стояла цель: подробно разъяснить тему из заголовка каждому читающему вне зависимости от его уровня знаний.
Зачем нужна эта статья?
"Паш, может тебе написать статью про vscode с его степбайстеп настройкой под ревит?" (цитаты из чата)
В целом, этой цитатой можно было бы закончить, но нет.
В уютных чатах #втомсамоммесенджере всё больше и больше людей пишут о проблемах в python-нодах, связанных с синтаксисом. Да, отчасти это проблема тех, кто плохо знает Python, но статья пишется в конце 2019-ого года. Современные среды программирования должны иметь минимальный набор функций, которые будут помогать программисту, а не усложнять ему жизнь. Это же касается и платформы Revit Python Shell.
Перечислю некоторые проблемы:
1. Не для всех объектов работает Intellisense (умное автодополнение кода);
2. Нет подстветки синтаксических ошибок;
3. Подсветку кода нельзя кастомизировать, а очень хочется, потому что во встроенных редакторах она меньше минимальной;
4. При зависании или вылете Revit, весь код теряется.
Также есть большое количество вопросов по использованию и настройке внешних текстовых редакторов для написания кода на IronPython под Revit. В интернете не очень много информации на эту тему, а в русскоязычном сегменте интернета её ещё меньше.
Поэтому поехали!
Текстовые редакторы
"
- забей и юзай vs code
- это не то же самое ,что VS?
- нет
- а, так это текстовый редактор
" (цитаты из чата)
Чтобы написать код, прежде всего нужно иметь программу, в которой его можно было бы составить. Так как код - это текст, то нам нужен текстовый редактор (далее ТР). По умолчанию в Windows таким ТР является "Блокнот". В Linux аналогом блокнота является "Gedit". Данных ТР хватит, чтобы написать свою первую программу на каком-либо языке, будь-то Python или же C#. В современном мире всё больше и больше растут требования к скорости и качеству работы, поэтому обычных текстовых редакторов уже перестаёт хватать. Для большего удобства ТР обзавелись некоторыми возможностями, которые помогут разработчикам быстрей и эффективней писать код.
Список данных возможностей:
•  Определение языка программирования;
•  Подсветка синтаксиса;
•  Автодополнения;
•  Быстрая навигация по коду;
•  Сниппеты;
•  Функции проверки синтаксиса;
•  Мультикурсор;
•  Горячие клавиши;
•  И многое другое в зависимости от ТР.
IDE
И вроде бы всё хорошо - программисты получили возможность эффективнее писать код, но очень часто возникает потребность проверять работу программы "построчно", работать с версиями своего кода, а если для создания приложения необходимо компилировать исходный код, то это приходилось делать через командную строку. ТР не имели этих возможностей, и разработчикам приходилось переключаться на другие приложения, что уменьшало производительность. Вследствие чего появились интегрированные средства разработки (Integrated Development Environment - IDE).
По умолчанию современные IDE, например Microsoft Visual Studio, включают в себя:
•  Текстовый редактор;
•  Компилятор и/или интерпретатор;
•  Средства автоматизации сборки;
•  Отладчик;
•  Браузер классов;
•  Систему контроля версий;
•  Инструменты для создания графических интерфейсов;
•  Диаграмму иерархии классов.
ТР vs IDE
"
-...и зачем делать в с# и не делать в студии, останется это для меня загадкой
-если по-быстрому надо посмотреть как работает кусок кода, без развёртывания авианосца
" (цитаты из чата)
Для написания скриптов нам не потребуется большая часть из того, что нам готовы предоставить современные IDE, а именно:
•  Без доступа к объектам Revit нам незачем запускать интерпретатор IronPython;
•  Создавать сборку проекта, написанного на IronPython, в dll файл нет смысла, так как Revit не примет её;
•  Отладчиком также нельзя воспользоваться, так как запуск скрипта происходит вне IDE, а налог "addin Manager" для IronPython ещё не завезли.
VS Code хоть и является текстовым редактором, но имеет многие функции IDE и не обладает теми, которые нам не пригодятся.
Следовательно, наш выбор - текстовый редактор VS Code!
Ещё раз, зачем нам всё это нужно
"Вообще уже который раз убеждаюсь в том, что динамовский редактор - шляпа" (цитаты из чата)
При написании кода мы можем совершить множество ошибок:
•  Совершить ошибку в написании ранее объявленной переменной;
•  Не поставить " : " после аргументов функции;
•  Вызвать метод или свойство, которого нет у объекта;
•  Поставить неправильное количество пробелов для отступа текста;
•  Использовать классы из библиотек, которые не были импортированы;
•  И многие другие ошибки.
Было бы здорово, если бы текстовый редактор указывал нам на эти ошибки или даже сам их исправлял.
Также мы хотим кастомизировать подсветку кода и всю рабочую среду.
VS Code
"неплохая штуковина этот VS Code" (цитаты из чата)
Основная информация
Скачивать VS Code нужно с официально сайта, не стоит искать никаких левых торрентов, программа абсолютно бесплатная. И не путайте с Visual Studio (такое на моей практике было).
Помимо скачивания программы, на сайте можно найти важную и интересную информацию.
В ходе данной статьи нас будут интересовать вкладки Docs, Updates, Extensions.
Приступим к установке. Проблем с этим возникнуть не должно, подробно об этом написано во вкладке Docs, в разделе Setup на сайте.
По умолчанию VS Code будет устанавливаться для текущего пользователя.
C:\users\{username}\AppData\Local\Programs\Microsoft VS Code
Советую выбрать вот эти чекбоксы.
Первый запуск
При первом запуске вы увидите окно приветствия, разбирать его я не буду так как это не цель данной статьи. Главное для нас - в меню выбрать File → Open Folder.
Это важно и об этом чуть позже. Во время открытия можно создать нужную вам папку для проекта, если вы не сделали это заранее.
Открытую папку VS Code воспринимает как рабочее пространство, корнем которого является данная папка, имя рабочего пространства также соответствует имени созданной папки, в моём случае это TESTVSCODE. В меню во вкладке File можно заметить такие пункты как "Open Workspace...", "Add Folder to Workspace...", "Save Workspace As...". Это более "продвинутый" функционал работы с рабочими пространствами, о котором мы поговорим чуть позже.
Ещё одна важная вещь, которую нам надо освоить в самом начале - это командная строка (Command Palette).
Она вызывается нажатием клавиши F1, либо комбинацией клавиш Ctrl + Shift + P (иногда я буду напоминать эту комбинацию).
Вот так она выглядит. Поддерживает поиск команд, а так же показывает сочетания клавиш для данной команды.
Давайте же создадим наш первый файл. Это можно сделать либо через Explorer, либо через Welcome Page, либо через комбинацию клавиш Ctrl + N. Сохраняем его с расширением .py.
VS Code сразу подсказывает нам о том, что для файла с расширением .py необходимо поставить расширение для Python файлов. Соглашаемся и нажимаем Install
VS Code поставит расширение от Microsoft, которое содержит или даёт возможности для:
1. IntelliSense - автозаполнение, навигации по коду, проверки синтаксиса;
2. Linting - дополнительный анализ кода с помощью библиотеки Pylint и ей подобных (ставятся отдельно);
3. Code Formatting - форматирование кода с помощью различных библиотек (ставятся отдельно);
4. Refactoring - реструктурирование кода Python с помощью библиотеки Rope (ставится отдельно).
Я отметил только интересующий нас функционал, полный список можно посмотреть на странице данного расширения.
Также данное расширение подключит к рабочему пространству имеющийся на компьютере интерпретатор Python. Если на компьютере имеется несколько интерпретаторов, то расширение выберет любой на своё усмотрение. Так как c ревитом мы взаимодействием через IronPython, нужно подключить именно его. Он идёт "в коробке" с Dynamo, путь по умолчанию:
C:\Program Files (x86)\IronPython 2.7\ipy.exe
Если вместо этого интерпретатора подключился какой либо другой (если он есть у вас на компьютере), то нужно использовать сочетание клавишь Ctrl + Shift + P и в открывшейся с верху командной строке набрать:
>Preferences: Open Settings (JSON)
Появится окно свойств VS Code (подробней о свойствах далее). Добавим сюда строчку, содержащую путь к интерпретатору IronPython.
В левом нижнем углу догжна появится такая надпись.
Не обращайте внимание на то, что написано Python, а не IronPython, тут всё правильно.
Интерпретатор подключили, пора уже что-нибудь написать. Возьмём типичный код из Python-нода, но сделаем пару ошибок:
1. Ошибемся в имени FilteredElementCollector;
2. Не будем инициировать переменную doc;
3. Не будем импортировать класс Wall, но будем его использовать.
Во время написания кода VS Code не давал подсказок связанных с библиотеками Revit API, а так же не указывает на наши ошибки. Надо это исправить.
Покопавшись в недрах интернета можно найти решение, а именно репозиторий на github ironpython-stubs.
Что это такое? "Если вы пишете код на Python, предназначенный для IronPython, и используете модули, загруженные через Common Language Runtime (clr), механизм автозаполнения вашего редактора (который работает на обычном Python) не сможет получить доступ к этим не родным модулям. Другими словами, модули / или пакеты, загруженные с помощью clr.AddReference (), недоступны в вашем модуле автозаполнения. Обходной путь здесь прост: используйте IronPython для обхода этих библиотек и создания «заглушек» или «фиктивных объектов». Эти «заглушки» могут быть использованы механизмом автозаполнения CPython. Заглушки включают строки документа, а также сигнатуры конструктора / функции / метода. Этот репозиторий содержит код для создания этих заглушек, а также хранит их версию, которая может использоваться autocomplete-python."
Звучит отлично! Подключим же эти заглушки!
Первое, что надо сделать - это скачать весь репозиторий (есть ещё пути, но этот самый простой)
В этой папке нас интересует папка .\ironpython-stubs-master\release\stubs.min. Копируем её (stubs.min) в любую папку на вашем компьютере. Можно разместить на облаке, чтобы всегда иметь доступ к stubs. Теперь подключаем данную папку к VS Code. Делается это через Settings (добавим ещё несколько строк).
"python.autoComplete.extraPaths": [
        "D:\\CLOUDS\\Dropbox\\Visual Studio Code\\ironpython-stubs\\stubs.min"
],
Проверим работает это или нет, заново напишем код.
Работает! Продолжим проверку.
Ошибки до сих пор не подсвечиваются, нужно поставить Linter. Для этого в командной строке напишем
>Python: Select Linter и выберем pylint.
В зависимости от интерпретатора IronPython либо ничего не произойдёт, либо VS Code вызовет окно с требованием установки.
Нажимая Install, VS Code вызовет Windows PowerShell и попытается установить линтер.
Но мы обречены на провал. В IronPython, который идёт вместе с Dynamo, нет pip. Попытки установить pip, либо установить другой интерпретатор IronPython вместе с pip, так же не увенчаются успехом. Может стоит воспользоваться Python 3? Но это тоже не сработает, потому что в Python3 нет модуля "clr" (Common Language Runtime) (не путать с библиотекой "clr" стилей терминальных строк).
Решение нашёл Алексей Бабинов. Он стал использовать Python 2.7.16. Этот интерпретатор может подхватывать заглушки, которые мы недавно установили, а так же имеет все необходимые нам сторонние библиотеки.
Python 2.7.X
Заходим на сайт Python во вкладку Downloads и выбираем "All releases".
Из предоставленных на данный момент скачиваем последнюю версию. В моём случае это Python 2.7.17
(думаю она будет последней).
Во время установки лучше выбрать:
•  Install for all users;
•  ВАЖНО! В окне Customize Python включить установку "Add python.exe to Path".
После установки нужно изменить путь к интерпретатору и на всякий случай посмотреть Workspace-settings, возможно при смене пути в User-settings туда автоматически запишется старый путь.
После записи пути и сохранения настроек перезапустим VS Code. Это можно сделать через командную строку
>Developer: Reload Window
Окно VS Code перезагрузится и в нижнем левом углу снова появится окно установки линтера. Поробуем установить эту библиотеку.
VS Code откроет PowerShell в директорию с выбранным интерпретатором Python установится библиотека pylint.
После этого все ошибки кода будут подчёркнуты красной волнистой линией, при наведении на которую мы сможем увидеть текст ошибки. Данная ошибка говорит нам о том, что имя "FilteredElementCOllector" не определено в нашем модуле. К сожалению, быстрое исправление проблем в VS Code для Python ещё не завезли, поэтому мы видим надпись "No quick fixes available", но мы будем с нетерпением ждать этого функционала.
При нажатии на "Peek Problem" появится окно с более подробным описанием ошибки, в нашем случае описание будет таким же.
Исправим ошибку в коллекторе и попробуем вызвать какой либо метод.
В целом это минимальный набор расширений и библиотек для того, чтобы можно было писать скрипты на Python, но мы тут для того, чтобы познать VS Code на "все 100%".
Extensions
"Вы каким расширением пользуетесь? от Майков или от Don Jayamanne ?" (цитаты из чата)
"Расширения" - одна из самых крутых возможностей в VS Code, которая превращает текстовый редактор в практически полноценную среду разработки.
Мы уже установили одно расширение, но установка была сделана самой VS Code, теперь сделаем это вручную.
В этой вкладке находится 3 списка расширений:
1. Включенные;
2. Рекомендованные;
3. Выключенные.
Также тут есть строка поиска, которой мы и воспользуемся, чтобы находить и устанавливать расширения.
1. Python Extension Pack.
ДАННОЕ РАСШИРЕНИЕ УСТАНАВЛИВАТЬ НЕ НУЖНО! В начале этой главы я процитировал свой вопрос в чате (как же сильно я ошибался). Дело в том, что расширение от "Don Jayamanne" включает в себя расширение от Microsoft, которое мы уже установили и некоторые другие, которые нам никак не пригодятся.
2. Visual Studio IntelliCode.
IntelliSense от Microsoft работает хорошо, но его можно прокачать, добавив AI (Artificial Intelligence). Данное расширение от Microsoft немного перестраивает автодополнение кода и подключает ваш код к Microsoft Python Language Server для лучшего анализа.
3. indent-rainbow.
Очень полезное расширение для тех, кто будет писать не только в VS Code, но и в Dynamo, и в Revit Python Shell. Оно позволяет не только выделять отступы разными цветами, но и отображать символы пробела и Tab. Позже расскажу, почему это расширение просто must have.
4. Material Icon Theme.
Необязательное расширение, просто решил вам его посоветовать. Очень красивые и понятные иконки.
5. Twilight Theme.
Тоже необязательное расширение, но мы будем на нём тренироваться кастомизировать подсветку кода.
6. Memory Color Theme.
Цветовая тема от Григория Петрова - одного из российских Python евангелистов. Попробуйте, вдруг понравится (мне понравилось).
Есть очень полезное меню, которое мало кто замечает.
Дополнительные библиотеки
"Вон сидят двое, пишут код в командной строке и молодежь этому учат!" (цитаты из чата)
Линтеры
Мы уже установили pylint, но могу порекомендовать установку линтера flake8, потому что:
У него есть дополнительная подсветка "проблем" с кодом;
Все ошибки пронумерованы, и есть сайт, на котором можно найти описание ошибки по номеру и посмотреть, как правильно, а как неправильно.
Чтобы выбрать другой линтер, нужно воспользоваться командной строкой (Ctrl + Shift + P).
>Python: Select Linter
После чего вам будет показан выбор линтеров, выберем flake8. Скорей всего эта библиотека у вас не установлена, поэтому появится уже привычное нам окно с установкой.
После установки линтеры встраиваются в VS Code, а раньше отчёты можно было посмотреть только в командной строке, например вот так
Как видим в cmd, линтер показал отчёт о синтаксических нарушениях в нашем коде.
Есть случаи, когда просто нельзя не вызвать некоторые ошибки. Одна из них - "Undefined variable". Если код запускать через Revit Python Shell, то чаще всего нам необходимо использовать имена, которые содержатся там, но интерпретатор и линтер их не видят.
Чтобы убрать эту ошибку, необходимо после строки написать
  # noqa
Но советую не увлекаться этим.
Лайфхак как запомнить данную запись:
1. QA - это должность в IT (тестировщик);
2. Дословный перевод "Гарантия качества";
3. Но мы не хотим чтобы выбранную строку проверяли, следовательно ставим отрицательное слово "no".
Внимательно посмотрите на то, как ставятся пробелы на скриншоте.
Подробней про линтеры можно почитать тут.
Форматтеры
Бок о бок с линтерами идут форматтеры. Для примера возьмём какой-либо код, в котором больше строк, чем есть сейчас у нас.
Код можно скачать тут.
Чтобы вызвать форматтер кликнем ПКМ по любой строке в коде и выберем Format Document
И мы снова увидим то самое окно установки сторонних библиотек или расширений.
После этого придётся снова нажать ПКМ, выбрать Format Document, и мы увидим, как преобразился наш код.
Форматировать можно не только весь код, но и отдельные его части, только нужно выбрать участок кода.
Существует ещё несколько библиотек, которые помогают в форматировании кода:
1. Yapf;
2. Black.
Переключение между ними должно осуществляться через командную строку >Format Selection , но библиотеки форматирования очень "крепко" сидят в VS Code, поэтому это не всегда удаётся сделать.
Рефакторинг
Форматирование просто "причесывает" код в соответствии с принятыми стандартами, но есть ещё одна функция "Рефакторинг".
Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы.
Давайте удалим объявление функции "example1", создадим переменную some_var, добавим её в some_tuple, вызовем в print(some_variable, some_tuple), а выбранные строки переведём обратно в функцию.
Как бы мы это сделали:
1. Hаписали def example1(some_variable);
2. Выбранные строки табнули;
3. Написали return some_variable, some_tuple.
Но мы можем на выбранном коде нажать ПКМ и выбрать пункт Extract Method.
И снова появится окно об установке сторонней библиотеки.
Опять на выбранном коде клацнем ПКМ и выберем пункт Extract Method. После чего VS Code создаст нам функцию, вызовет её в новой строке, предложит написать имя и в return положит нужные локальные переменные. Одна печаль, в объявлении функции не создался аргумент some_var. Работать это будет, но не очень хорошо, ведь нам придётся использовать глобальную переменную. Так что всегда перепроверяйте результаты автоматического рефакторинга.
Все рассмотренные выше библиотеки можно установить в ручную, без помощи VS Code, воспользовавшись cmd.
python -m pip install flake8
python -m pip install autopep8
python -m pip install rope
Settings
"
-кстати, обязательно добавьте вот это "workbench.settings.useSplitJSON": true,
-да вы, батенька, олдфаг)
" (цитаты из чата)
Настройки VS Code делятся на две группы, это настройки пользователя (глобальные настройки) и настройки рабочей области.
Все настройки хранятся в файлах формата JSON, а это значит, что вы можете без проблем переносить их между компьютерами и пользователями.
User-settings
Настройки пользователя находятся по адресу ниже, эти настройки подхватываются всеми открытыми окнами VS Code.
%APPDATA%\Code\User\settings.json
Workspace-settings
Настройки рабочей области содержатся в корневой папке рабочей области в папке .vscode. Они имеют больший приоритет над User-settings.
Поэтому, если одни и те же параметры установлены и в User, и в Workspace-settings, то VS Code будет работать по настройкам Workspace.
Если вы собираетесь писать скрипты только для Revit, то пользуйтесь только User-settings.
Ближе к д̶е̶л̶у̶  JSON
В VS Code есть два вида отображения настроек:
1. Через графический интерфейс (GUI);
2. Через отображение JSON-файла.
Мне удобней работать с JSON-отображением, поэтому в статье работать с настройками будем именно в этом режиме.
Подобраться к настройкам можно несколькими способами:
1. Через меню File → Preferences → Settings;
2. Сочетанием клавиш Ctrl + , ;
3. Через палитру команд, введя в неё.
>Preferences: Open Settings
>Preferences: Open Settings (UI)
>Preferences: Open Settings (JSON)
Воспользуемся последним способом >Preferences: Open Settings (JSON). Мы увидим такой файл.
"Почему именно эти свойства?" - спросите вы меня, тут представлены только те свойства, значения которых отличаются от значений по умолчанию.
Вкратце, JSON-файл состоит из набора ключей и значений, разделенных двоеточиями и запятыми, как в словаре Python. Ключами тут являются свойства VS Code или свойства установленных расширений. Следовательно, если в файле JSON содержатся настройки для какого-либо расширения, они вступят в силу после установки данного расширения. Вернуть свойство к значению по умолчанию можно тремя способами:
1. Удалить строку с переопределением свойства;
2. Закомментировать строку (// "property_name": "value");
3. Вписать значение по умолчанию.
Нужно разобраться, какие настройки у нас сейчас есть.
Если навести мышь на свойство и чуть-чуть подождать, то VS Code покажет нам информацию о данном свойстве.
Но как-то неинформативно. Добавим пару строк в этот файл, причём будем вводить имена свойств без кавычек.
"workbench.settings.useSplitJSON": true
"workbench.settings.editor": "json"
Строки добавили, но ничего не произошло. Нужно закрыть файл настроек. Теперь их можно открыть любым перечисленным выше способом, после чего мы увидим вот это.
Теперь в строке поиска настроек можно ввести любое свойство и посмотреть примечания, а у некоторых свойств - список возможных значений.
Чтобы узнать какие значения можно применить к свойству, нужно удалить существующее, нажать сочетание клавиш
Ctrl + Space и выбрать одно из списка.
Заметьте, все эти настройки относятся к USER-Settings, к WORKSPACE-Settings мы придём чуть позже.
Все свойства, которые находятся в левом окне, доступны для редактирования и там вы можете увидеть значение по умолчанию. Вы можете настроить VS Code настолько гибко, насколько вам нужно. Можно копаться в этих настройках недели, но я бы хотел заострить внимание на некоторых:
1. "editor.renderWhitespace": "boundary"
Данное свойство меняет отображение пробельных символов на кружки. Это очень удобно показывает смешанные отступы у строк, которые состоят из символов Tab и пробелов, из-за чего код может не работать. Ни один из встроенных редакторов (Dynamo, RPS) не может отображать разницу между этими символами, из-за чего становится тяжело найти ошибку.
2. "editor.rulers": [120]
    "editor.wordWrapColumn": 120
Можно писать код в одну строку, и она будет ну очень длинной. Можно, но не нужно. Давайте же установим "границу", за которую мы не будем заходить своим кодом. Для современных мониторов это число 120 - 140. Будем придерживаться современных тенденций.
3. "editor.wordWrap": "wordWrapColumn"
Это свойство добавляет автоматический перевод символом на следующую строку, если они заходят за обозначенную "границу".
4. "indentRainbow.ignoreErrorLanguages": ["*"]
Если вы будете пользоваться расширением "indentRainbow", то вам пригодится данная настройка. На предыдущих скриншотах отступы были окрашены в красный цвет. Это означает, что символы начинаются с позиции, не кратной текущему отступу (4 пробела). Python разрешает это на уровне PEP8. Когда необходимо переводить аргументы на следующую строку, они должны располагаться ровно под аргументами верхней строки.
5. "editor.insertSpaces": true/false
Все мы знаем, что Python любит пробелы, так давайте же их ставить автоматически, нажимая на клавишу "Tab".
Тут стоит сделать одно лирическое отсупление.
Текстовый редактор в Python-ноде и текстовый редактор RPS по нажатию "Tab" ставят символ Tab (удивительно), тобишь не конвертируют его в четыре пробела. С одной стороны, а что в этом такого, пусть будет Tab, но
eсли вы будете писать аргументы как на примере выше, то вы неизбежно сталкнётесь с проблемой смешения пробелов и табов;
eсли у вас будут только пробелы, то вы не сможете полноценно править код в Dynamo или копировать от туда код в текстовый файл .py.
Оставлю этот момент на выбор читателя.
6. "indentRainbow.colors": ["rgba(100,100,100,0.05)", "rgba(100,100,100,0.2)"]
Мне не нравится "радуга" которая идёт по умолчанию, поэтому я оставляю два цвета для данного расширения.
7. "python.linting.flake8Enabled": true
Мы с вами выбрали в качестве линтера flake8. Следовательно, Enabled должно быть true.
8. "python.linting.flake8Args": ["--max-line-length=120"]
Весь список аргументов можно найти на сайте, но озвучим основные.
Исторически повелось, что по умолчанию минимальное количество символов в строке == 72 . И flake8 так же по умолчанию проверяет максимальное количество символов в строке. Ранее мы провели границу на 120 символов, проверку тоже переведём на это число.
9. "python.linting.flake8Args": ["--ignore=E401,402,..."]
flake8 помечает ошибки номером, по этому номеру можно найти не только подробную информацию об ошибке, но и проигнорировать её, добавив в аргументы. Не советую этим увлекаться, ибо зачем мы ставили Linter.
10. "python.pythonPath": "C:\\Python27\\python.exe"
Путь до интерпретатора Python (У вас путь может отличаться)
11. "python.linting.enabled": true
Мы же хотим, чтобы линтеры работали и проверяли код.
12. "python.autoComplete.addBrackets": true
       "python.jediEnabled": false
Автоматически добавляет скобки при вызове функций и перемещает каретку внутрь. НО это работает только при включенном Jedi. НО это отключает Python Language Server, так что выбор за вами.
Настройка подсветки кода через Settings.
Я какое-то время писал в PyCharm и мне очень нравилась цветовая схема "Twilight". Выше мы уже поставили его через Extensions, но что-то было не так. Сравним, как выглядит код в PyCharm и VS Code.
Есть несколько различий.
1. Методы не подсвечиваются отдельно от объекта;
2. В классе self не выделяется другим цветом;
3. Локальные переменные в методе или функции, которые зависят от аргумента, не подсвечены;
4. В целом использованы немного другие цвета.
Вроде не существенные отличия, но у нас есть возможность настроить это.
VS Code воспринимает код, разбивая его на области (Scope). И настройки каждой области можно посмотреть, вызвав из палитры команд
>Developer: Inspect TM Scopes
После активации этой команды в том месте, где у вас была "каретка", появится окно
Можно выделить имя или кусок кода и увидеть его свойства
То, что нам нужно, находится в самом низу маркированного списка. Это и есть области, в которые входят выбранные символы. С верху вниз идут области от локальной до глобальной, а именно "source.python" - это глобальная область Python кода. Где бы вы ни поставили каретку и какой бы символ вы ни выбрали, всё будет принадлежать этой области.
Как мы теперь сможем этим воспользоваться?
В настройках есть свойство "editor.tokenColorCustomizations", посмотрим на него.
Как мы можем увидеть, это свойство переопределяет цвета редактора и стиль шрифта из выбранной в данный момент цветовой темы. Значением этого свойства должен быть JSON-объект со своими свойствами и значениями для них. За правилами заполнения нужно идти на GitHub. Самые любознательные могут это сделать и ещё глубже разобраться в областях VS Code. Для остальных же я напишу правило заполнения здесь.
"editor.tokenColorCustomizations":
{
    "textMateRules":
    [
        {
            "scope"
            [
                "scope_name_1",
                "scope_name_2",
                "scope_name_N"
            ],
            "settings":
            {
                "foreground": "color_number",
                "fontStyle": "font_name",
            }
        },
            {
            "scope": ...
        },
    ]
}

Вот небольшой пример из моих настроек.
Теперь мы можем попробовать повторить всё, что есть в PyCharm.
Получилось неплохо, но вот локальные переменные в методе или функции, которые зависят от аргумента, до сих пор не подсвечены, потому что для этого нет отдельной области, а данные имена находятся только в глобальной области "source.python".
Немного про WorkSpace
Допустим мы пишем не только под Revit, но и для себя на Python3. Сейчас в настройках путь до интерпретатора Python 2.7.17, неужели нам придётся каждый раз при переключении проекта изменять эту строку? Нет, VS Code сделает это за нас автоматически и записывать он будет в Workspace-settings (но мы можем это сделать сами в ручную). Для этого нужно открыть командную строку и ввести >Python: Select Interpreter и выбрать интерпретатор из появившегося списка. Есть ещё одни способ, в левом нижнем углу нажать на имя интерпретатора и в командной строке так же появится список.
Если какого-то интерпретатора нет в списке это значит, что путь к нему не прописан в системной переменной "Path".
В начале статьи я упоминал, что можно воспользоваться "Save Workspace As...", но зачем нам это делать?
Если мы это выберем, будет предложение создать текстовый файл с расширением *.code-workspace. Создание данного файла может быть очень полезно, когда вы работаете над несколькими смежными проектами одновременно. Сохраним наше новое мульти-проектное рабочее пространство как test.code-workspace.
В каком либо месте на компьютере создаим ещё одну папку TestWorkspace (я поленюсь и создам её рядом) и создадим в ней файл test.py.
Добавим папку к рабочему пространству через "Add Folder to Workspace...".
Обозреватель проекта преобразовался. Он начал показывать все папки подключеные к данной рабочей области вне зависимости от их места расположения.
Чем это удобно:
1. Быстрый доступ к файлам из разных проектов;
2. Можно перемещать файлы из проекта в проект, перемещая их в Explorer VS Code (вне зависимости от расположения корневых папок);
3. Можно хранить общие настройки для всех проектов.
Подробней про многокорневые рабочие пространства читайте тут.
Snippets
"Питон и не знает о таких зверях" (цитаты из чата)
Данный функционал присутствует во всех современных текстовых редакторах и IDE. В чём же его задача?
Я очень редко пишу код для использования его в нодах Dynamo, но когда это случается, я либо долго вспоминаю, либо ищу в интернете подгрузку библиотек ревита. Выход есть - это сниппеты.
Начнём вводить имя addserv и увидем, что это имя существует где-то в VS Code и в описании уже что-то есть про библиотеку RevitServices. Если вы знаете, что сниппет есть, но он не появляется, нужно его вызвать через сочетание клавишь Ctrl + Space.
Нажав на "Tab" мы получим такой код
Наверное сейчас вы принялись вводить это волшебное слово, но ваш VS Code ничего о нём не знает. Нужно его как-то записать.
Для этого откроем командную строку и наберём >Preferences: Configure User Snippets
Большой выбор, но нас пока интересует python.json. Не обращайте внимание на название моего файла, я его создал через "New Global Snippets file...", наша задача научиться писать сниппеты.
"AddRevitServicesDocumentAndTransactionManager": {
        "prefix": "addserv",
        "body": ["clr.AddReference(\"RevitServices\")",
                         "from RevitServices.Persistence import DocumentManager",
                         "from RevitServices.Transactions import TransactionManager"
        ]
}

Этот код управляет вставкой сниппета в нашем рабочем коде. В этом JSON файле может содержаться несколько сниппетов, нужно просто придерживаться синтаксиса JSON.
Подробно рассказывать о них не буду, моя цель - рассказать вам, что такой функционал существует и как его можно использовать, но разберу код данного снипета.
1. Имя сниппета, в моём случае это "AddRevitServicesDocumentAndTransactionManager";
2. prefix - свойство сниппета через который его вызывают в коде;
3. body - тело сниппета которое переходит в код.
Я специально рассмотрел случай с многострочным body, интуитивно это не сразу понятно.
Вот ещё один полезный сниппет.
"FirstRowInIronPythonProject":{
        "prefix": "!",
        "body": "# -*- coding: utf-8 -*-"
}
Как уже сказал выше, углубляться в эту тему не буду, вот документация.
Zen Mode
Не буду ничего выдумывать своего, просто скопирую, что написано в документации, ибо моя цель познакомить вас с этим функционалом.
"По запросу одного из пользователей мы добавили Zen Mode в VS Code. Режим Zen позволяет вам сосредоточиться на своем коде, скрывая весь пользовательский интерфейс, кроме редактора. Режим Zen можно переключать с помощью меню « Вид» , палитры команд или сочетания клавиш Ctrl + K, Z . Если вы предпочитаете не переходить в полноэкранный режим, это можно отключить с помощью window.fullScreenZenMode. Двойное нажатие на Escape выходит из режима дзен".
Бонус
Если вы хотите запомнить горячие клавиши VS Code, но не хотите хранить записки, распечатки или постоянно вызывать в настройках команду KeyBoard Shortcuts, есть хорошее решение!
Поставьте себе на рабочий стол изображение горячих клавиш, когда нужно - сворачивайте все открытые приложения сочетанием клавиш Win + D, вспоминайте нужное сочетание клавиш для VS Code и так же обратно разворачивайте приложения и продолжайте работать.
Вернёмся к нашим "баранам"
Код, который мы написали, нужно ещё как-то использовать, мы можем запускать его из наших любимых платформ.
Dynamo
"Откуда такая агрессия к динаме?" (цитаты из чата)
Пришло время запуска Python кода в Dynamo.
Для этого надо будет:
1. Получить путь к этому файлу;
2. Получить сам файл;
3. Прочитать файл (получить все строки);
4. Передать их в нод "Python Script From String".
Если модули вашего проекта располагаются в репозитории на GitHub, то Алексей Бабинов расскажет, как их можно подключить.
Revit Python Shell
"Добрый день, помогите разобратся с пайтон шелом" (цитаты из чата)
Файл для запуска в RPS выглядит иначе
Один из способов запуска:
1. В запущенном окне консоли жмём по желтой папке (open python script);
2. Выбираем файл .py, который хотим запустить;
3. Весь его код переместится в консоль, после этого нажимаем на знак "Play" (белая стрелка в синем круге).
Второй способ - создать кнопку на панели RPS.
При внесении изменении в подключеный файл .py у вас будет меняться функционал кнопки, но об этом подробней узнаете тут.
Возможные проблемы
"кто-нибудь сталкивался с подобной проблемой?" (цитаты из чата)
1. Если у вашей учётной записи имеются кириллические символы, то вы не сможете устанавливать некоторые библиотеки через pip.
Решение:
1. Создать на своём компьютере ещё одного пользователя, в имени которого будут только латинские символы;
2. Переименовать текущего пользователя, ТОЛЬКО ЕСЛИ ЭТО НЕ АДМИНИСТРАТОР.
2. Изменение пути установки Python 2.7.X может привести к тому, что pip не установится.
Решение: удалить интерпретатор и при следующей установке не менять путь, оставить C:\Python27\
3. Подсветка синтаксиса иногда работает некорректно.
Это может быть связано с большим количеством установленных расширений для Python, скорей всего они конфликтуют между собой.
Решение: оставить только расширение для Python от Microsoft.
4. Если в Dynamo вы увидите ошибку "IronPythonEvaluator.EvaluateIronPythonScript operation failed. expected an indented block"
Это значит, что в отступе строки содержаться как пробелы, так и символы "Tab".
Решение: привести все отступы строк к одному "стилю" (либо только пробелы, либо только табы, но помни что в Динамо табы по умолчанию).
P.S.
Эта статья будет развиваться по мере накопления новых знаний о VS Code, и вы, сообщество программистов на IronPython, можете поспособствовать этому развитию, оставив комментарий через форму обратной связи или же напрямую написав автору в одном из тематических телеграм чатов (Stepik_BIMbimsapr) c хештегом #vscode.
Автор: Павел Алтынников
Рецензия: Алексей Бабинов
Редакторы: Владислав Харизин, Максим Степанников
Понравилась данная статья? Хотите еще больше углубить свои знания в этой области? Поступайте на наш новый онлайн курс "BIM Planet No2. Погружение в IronPython и Revit API", старт которого намечен на 20 июня 2020 года.
Back to Top