§2 · Установка и первый запуск

AnimaGeo — обычный Python-пакет. Поставить можно из pypi (pip install animageo) или из репозитория, если нужны последние фиксы. Вместе с ней идут manim и pycairo как транзитивные зависимости; для TeX-подписей отдельно нужен системный LaTeX.

Системные требования

КомпонентВерсияЗачем
python≥ 3.11 (тестируется на 3.13 и 3.14)язык и окружение
manim≥ 0.20.1графическое ядро (Mobject, Scene)
numpy≥ 1.26геометрия, адаптивный sampling
pycairo≥ 1.0экспорт в SVG (минуя manim-рендерер)
lark≥ 1.1парсер GGB-выражений
LaTeXлюбая (basictex, texlive-latex-base, MikTeX)TeX-подписи: $\alpha$, \triangle ABC

sympy и scipy нужны только если вы используете Function/ImplicitCurve и хотите аналитические пересечения кривых — обычно идут вместе с manim.

Если вы в macOS и собираетесь рендерить подписи, самый лёгкий LaTeX — brew install --cask basictex (~100 MB). Для Linux — apt install texlive-latex-base texlive-fonts-recommended.

Установка

Вариант 1 — pip (release)

python3.13 -m pip install animageo

Это стянет manim и pycairo как зависимости. На macOS pycairo сначала хочет brew install cairo pkg-config, на Linux — apt install libcairo2-dev pkg-config.

Вариант 2 — из репозитория (dev)

git clone https://github.com/ivaleo/animageo.git
cd animageo
python3.13 -m pip install -e '.[dev]'

-e ставит в editable-режиме: правки в animageo/*.py видны сразу, без переустановки. Так же разрабатывается сам этот гайд.

Зависимости render-сервера для этого гайда

python3.13 -m pip install fastapi uvicorn pydantic

Нужны только если вы планируете интерактивные примеры — для обычного использования AnimaGeo в своих скриптах не требуются.

Интерактивный веб-экспорт (опционально, JS)

Для встраивания подвижных чертежей в web (см. §10) нужен только JSXGraph на стороне браузера — из npm (npm i jsxgraph) или с CDN. Python-сторона (exportJSXGraph) дополнительных зависимостей не требует.

Проверка установки

Самый дешёвый способ убедиться, что всё работает — импортировать AnimaGeoScene:

$ python3.13 -c "from animageo.animageo import AnimaGeoScene; print('OK')"
Manim Community v0.20.1
OK

Баннер Manim Community печатается самим manim при первом импорте. Если вместо OK вы получили ModuleNotFoundError — проверьте, что pip install прошёл в то же окружение, где запускается python3.13.

На одной машине может быть несколько Python. Проверяйте именно тот интерпретатор, которым запускаете рендер: which python3.13 и python3.13 -m pip show manim. Если python3 указывает на другой Python без manim, используйте явный python3.13.

CLI: .ggb → SVG одной командой

Для простого конверта GeoGebra-файла не обязательно писать Scene-класс:

$ animageo problem.ggb -o problem.svg -s my_style.json -px 800 600

CLI создаёт временный driver-script, запускает manim и вызывает loadGGB(...) + exportSVG(...). Размеры -px принимают числа или auto.

Первый скрипт

Минимальная программа на AnimaGeo — это Scene-подкласс с методом construct(). Ниже — треугольник с описанной окружностью и экспортом в SVG.

hello.py · попробуйте поменять вершины
A = Point(-3.5, -1.5)
B = Point(3.5, -1.5)
C = Point(0.4, 2.3)
p, a, b, c = Polygon(A, B, C)

# описанная окружность:
O = Center(Circle(A, B, C))
r = Segment(O, A)
k = Circle(O, A)

style(A, B, C, O, label_visible=True)
Треугольник и описанная окружность
Скачать: guide_style.json

Тело над чертой — это DSL. В скрипте его отдают методу putCode(...), а сам скрипт — обёртка вокруг AnimaGeoScene:

from animageo.animageo import AnimaGeoScene

class HelloScene(AnimaGeoScene):
    def construct(self):
        self.applyStyle(style_file='guide_style.json', px_size=[520, 340])
        self.putCode("""
A = Point(-3.5, -1.5)
B = Point(3.5, -1.5)
C = Point(0.4, 2.3)
p, a, b, c = Polygon(A, B, C)
O = Center(Circle(A, B, C))
k = Circle(O, A)
""")
        for n in ['A', 'B', 'C', 'O']:
            self.element(n).style['label_visible'] = True
        self.addAllGeometry(show=True)
        self.updateAllGeometry()
        self.autoPlaceLabels()
        self.exportSVG('hello.svg')

if __name__ == '__main__':
    HelloScene().construct()

Запуск:

$ python3.13 hello.py
$ open hello.svg      # macOS
$ xdg-open hello.svg  # Linux

Анатомия Scene

Любой скрипт AnimaGeo повторяет шесть шагов. Запомнить их стоит один раз — дальше в гайде мы их уже не будем повторять.

#ВызовЧто происходит
1HelloScene()создаётся manim.Scene; AnimaGeoScene.__init__ готовит пустой GeoStyle и пустой Construction
2self.applyStyle(...)грузится JSON-стиль, распаковывается в self.style; px_size задаёт холст в пикселях
3self.putCode(...)exec-движок (parsers/dsl/) превращает Python-DSL в команды и наполняет Construction
4self.element(n).style[...](опционально) per-element overrides поверх применённого стиля
5self.addAllGeometry(show=True)
self.updateAllGeometry()
строится mobject-граф; вычисляются актуальные координаты всех зависимых объектов
6self.exportSVG(path)Cairo-контекст → SVG-файл. Никакого видео-рендера, ~10–150 мс.
Для MP4 используется другой путь — запускаете скрипт через manim-CLI, вместо exportSVG работают self.play(...)-ы и self.wait(...). Подробно в §9.

Что делает putCode vs «прямой» API

putCode("""A = Point(0, 0)\nB = Point(3, 0)\n...""") — это сахар, эквивалентный набору прямых вызовов через self.geo. Оба пути работают, но предпочтительнее первый: тот же текст можно вставить в .ggb-файл, в интерактивный пример, прислать другому человеку — это один и тот же DSL.

Прямой API (для сравнения)
self.geo.Point('A', [-3, 0])
self.geo.Point('B', [3, 0])
self.geo.Point('C', [0, 2])
self.geo.Polygon('p', ['A', 'B', 'C'])
# полный список команд — animageo/geo/lib_commands.py

Render-сервер для этого гайда

Чтобы заработали кнопки Edit / Run в интерактивных примерах, нужен локальный сервер:

cd /path/to/animageo
PYTHONPATH=. python3.13 docs/guide/server/serve.py

Сервер слушает http://127.0.0.1:8765. Откройте гайд по этому URL, и кнопка Edit станет рабочей. Если сервер не запущен, гайд всё равно читается — иллюстрации показываются как статические SVG, просто не получится их перерисовать.

Эндпоинт POST /render исполняет произвольный Python через AnimaGeoScene.putCode(). Сервер жёстко биндится на 127.0.0.1 и никогда не должен смотреть наружу без дополнительного sandbox'а.

Пробуем интерактив прямо здесь

Если сервер запущен, пример ниже должен отработать: нажмите Edit, поменяйте, скажем, r = 2 на r = 3.5, нажмите Run.

install-sanity.py
O = Point(0, 0)
r = 2
P = Point(r, 0)
c = Circle(O, P)

style(O, P, label_visible=True)
Окружность с радиусом
Скачать: guide_style.json

Внизу справа в панели иллюстрации появится таймкод рендера (рендер 30ms · 80ms total) — первый раз медленнее из-за манименного init и, если подписи TeX — компиляции шрифтов; повторы попадают в LRU-кэш и отвечают за <2 мс.

Что дальше