Имена полей и атрибутов стиля — сквозной справочник
Один справочник на все имена, которые встречаются в animageo:
- Часть 1: поля геометрических классов (Point.x, Circle.center и т. д.).
- Часть 2: типы элементов в пяти слоях (GGB XML → класс animageo → JSON → mobject manim → SVG).
- Часть 3: атрибуты стиля в тех же пяти слоях.
- Часть 4: словарные перечисления (значения enum).
- Часть 5: единицы измерения и константы преобразования.
О том, откуда взялись эти имена (короткие имена до версии 1.0 и их удаление),
см. приложение История в конце.
Как прочитать значение стиля. В elem.style лежат только явные записи. Полный ответ на вопрос «что будет нарисовано» даёт resolver:
from animageo.style.resolver import resolve, resolved_style
resolve(scene, elem, 'size_px') # одно значение по цепочке приоритетов
resolved_style(scene, elem) # весь материализованный словарь
Цепочка: elem.style → overlay.per_name → overlay.per_type → elem.ggb_style → defaults.by_type → default=. Любой визуальный ключ из перечисленных ниже может жить в elem.style, elem.ggb_style, defaults.by_type и overlay.per_type / overlay.per_name; resolver выбирает действующее значение.
Часть 1. Поля геометрических классов
Point (lib_elements.py:Point)
| Поле |
Тип |
Смысл |
coords |
np.ndarray([x, y]) |
координаты (настоящее поле) |
x |
float |
координата x (@property над coords[0]) |
y |
float |
координата y (@property над coords[1]) |
Line
| Поле |
Тип |
Смысл |
normal |
np.ndarray |
нормаль (единичный вектор) |
direction |
np.ndarray |
направление (перпендикулярно нормали) |
offset |
float |
расстояние до начала координат со знаком (в уравнении normal·x = offset) |
Segment (наследует Line)
| Поле |
Тип |
Смысл |
endpoints |
np.ndarray формы (2, 2) |
пара концевых точек |
start |
np.ndarray |
первая точка (@property над endpoints[0]) |
end |
np.ndarray |
вторая точка (@property над endpoints[1]) |
length |
float |
длина |
Ray (наследует Line)
| Поле |
Тип |
Смысл |
start |
np.ndarray |
начало луча |
direction |
np.ndarray |
направление (через Line) |
Circle
| Поле |
Тип |
Смысл |
center |
np.ndarray |
центр |
radius |
float |
радиус |
radius_squared |
float |
радиус² (вычисляемое @property) |
Arc, CircleSector (наследуют Circle)
| Поле |
Тип |
Смысл |
angles |
list[float, float] |
пара углов [начало, конец] |
angle_start |
float |
@property над angles[0] |
angle_end |
float |
@property над angles[1] |
Angle
| Поле |
Тип |
Смысл |
vertex |
np.ndarray |
вершина (точка) |
size |
float |
величина в радианах |
side1 |
np.ndarray |
первая сторона (вектор) |
side2 |
np.ndarray |
вторая сторона |
arc_radius |
float |
радиус отрисованной дуги |
start_angle |
float |
угол от OX до side1 (радианы) |
end_angle |
float |
угол от OX до side2 |
value |
float |
синоним size (@property) |
Polygon
| Поле |
Тип |
Смысл |
vertices |
np.ndarray |
массив вершин |
Vector
| Поле |
Тип |
Смысл |
endpoints |
np.ndarray |
пара точек [начало, конец] |
direction |
np.ndarray |
направление (конец − начало) |
start |
np.ndarray |
@property над endpoints[0] |
end |
np.ndarray |
@property над endpoints[1] |
Measure (lib_vars.py:Measure)
| Поле |
Тип |
Смысл |
value |
float |
числовое значение |
dimension |
int |
0=скаляр, 1=длина, 2=площадь |
AngleSize
| Поле |
Тип |
Смысл |
value |
float |
величина в радианах |
Boolean
| Поле |
Тип |
Смысл |
value |
bool |
True/False |
Conic (lib_conic.py)
| Поле |
Тип |
Смысл |
matrix |
np.ndarray (3×3) |
симметричная матрица формы |
type |
ConicType |
классификация, вычисляемая лениво |
kind |
ConicType |
@property, синоним type |
Function (lib_function.py), ImplicitCurve (lib_implicit.py)
| Поле |
Тип |
Смысл |
expr |
sympy.Expr |
выражение: правая часть для Function, нулевой уровень F(x,y)=0 для ImplicitCurve |
var (Function) / var_x, var_y (ImplicitCurve) |
sympy.Symbol |
символы переменных |
source |
str |
исходная строка (для отладки и repr) |
_callable |
Callable |
скомпилировано через lambdify для numpy |
natural_singularities (Function) |
list[float] |
конечные вещественные точки разрыва или неопределённости; рендерер разбивает по ним кривую |
explicit_domain (Function) |
tuple[float, float] \| None |
явный диапазон x, если задан пользователем |
expression, variable, callable (Function) |
— |
@property-псевдонимы для expr, var, _callable |
expression, x_var, y_var (ImplicitCurve) |
— |
@property-псевдонимы для expr, var_x, var_y |
Var (lib_vars.py:Var)
| Поле |
Тип |
Смысл |
name |
str |
имя переменной в Construction |
data |
Any |
значение (Measure, AngleSize, Boolean, число и т. д.) |
style |
StyleProxy |
технически присутствует, но переменные не отрисовываются как геометрия |
Обёртка Element (lib_elements.py:Element, parsers/dsl/proxy.py:ElementProxy)
| Поле |
Тип |
Смысл |
name |
str |
имя в Construction |
data |
Any |
сам геометрический объект |
visible |
bool |
видимость |
fixed |
bool |
не пересобирается во время rebuild |
tparam |
Optional[float] |
параметр кривой или локуса у связанной точки (угол на окружности, линейный t на отрезке, прямой, луче) |
style |
StyleProxy |
стиль |
ggb_raw |
dict |
сырые значения GGB (до ImportPolicy) |
ggb_style |
StyleProxy |
нормализованный слой импорта GGB, отдельный от явного style |
_visible |
bool |
внутреннее хранилище видимости |
_visible_explicit |
bool |
True после изменения elem.visible во время выполнения или из DSL; защищает его от слоёв стиля |
_visible_has_value |
bool |
True, когда видимость задана из Construction, GGB или во время выполнения |
Construction (lib_elements.py:Construction) — методы
update_tparam(name, tparam) — обновить .tparam у связанной точки и пометить зависимые элементы на пересборку
Construction (geo/construction.py:Construction) — основные поля
| Поле |
Тип |
Смысл |
phantoms |
dict |
временные имена DSL вида _1, _2 |
vars |
list[Var] |
числовые, логические и угловые переменные |
elements |
list[Element] |
геометрические элементы; по умолчанию содержит скрытые xAxis, yAxis |
commands |
list[Command] |
отложенные команды построения и зависимости |
state |
dict |
граф зависимостей: level, inputs, outputs, input_commands, built |
name_mapping |
dict |
имя GGB → нормализованный идентификатор Python |
naming_counters |
dict |
счётчики регистратора DSL для уникальных имён в циклах и функциях |
command_diagnostics |
list[dict] |
диагностика неподдерживаемых команд |
_command_diagnostic_keys |
set |
внутренняя защита от дублей в диагностике |
_unsupported_roots_by_output |
dict |
связь «выход → корневая неподдерживаемая команда» |
strict_unsupported |
bool |
строгий режим: корневая неподдерживаемая команда бросает исключение |
log_unsupported |
bool |
логировать неподдерживаемые команды |
Часть 2. Типы элементов в пяти слоях
Что означают столбцы:
- GGB XML — тег или атрибут в файле .ggb (элемент внутри <construction>).
- Класс animageo — класс Python в animageo/geo/lib_*.py.
- JSON — как тип обозначается в JSON-стиле (через defaults, presets, import.per_type).
- mobject manim — что создаёт CreateMObject для этого типа.
- SVG — итоговый тег в выводе SVG (через Cairo).
| Сущность |
GGB XML |
Класс animageo |
JSON |
mobject manim |
SVG |
| Точка |
<element type="point"> |
Point |
point_size, import.point_size, per_type: point |
Circle (радиус) плюс подпись при необходимости |
<circle> |
| Прямая |
<element type="line"> плюс <coords a,b,c> |
Line |
line_width, per_type: line |
Line (отсечён по области видимости) |
<line> |
| Отрезок |
<element type="segment"> |
Segment |
line_width, tick, defaults.segment, per_type: segment |
Line плюс засечки |
<line> × N |
| Луч |
<element type="ray"> |
Ray |
per_type: ray |
Line (отсечён) |
<line> |
| Вектор |
<element type="vector"> |
Vector |
arrow, defaults.vector, per_type: vector |
Arrow плюс CustomArrowTip |
<path> |
| Окружность |
<element type="circle"> |
Circle |
per_type: circle |
Circle заливки плюс Circle обводки (VGroup) |
<circle> × 2 |
| Дуга |
<element type="arc"> |
Arc |
per_type: arc |
Arc плюс подпись при необходимости |
<path> |
| Сектор |
<element type="circlearc"> / <element type="circlesector"> |
CircleSector |
per_type: circlesector |
Sector плюс Arc плюс подпись при необходимости |
<path> |
| Угол |
<element type="angle"> плюс <arcSize>, <decoration>, <angleStyle> |
Angle |
angle_radius, defaults.angle, per_type: angle |
AnnularSector или Polygon (для прямых углов) плюс подпись |
<path> |
| Многоугольник |
<element type="polygon"> |
Polygon |
per_type: polygon |
Polygon заливки плюс Polygon обводки |
<polygon> × 2 |
| Кривая 2-го порядка |
<element type="conic"> плюс <matrix A0..A5> |
Conic (плюс enum ConicType) |
per_type: conic |
Circle/Ellipse/VMobject (в зависимости от .type) |
<circle>/<ellipse>/<path> |
| Функция |
<expression type="function" exp="y=…"> |
Function |
per_type: function |
VMobject × N (кусочная выборка) |
<path> |
| Неявная кривая |
<expression type="implicitpoly"> |
ImplicitCurve |
per_type: implicitcurve |
VMobject × N (marching squares) |
<path> |
| Число |
<element type="numeric"> |
Measure (внутри Var) |
— |
— (невидимо) |
— |
| Логическое значение |
— |
Boolean (внутри Var) |
— |
— |
— |
| Величина угла |
<element type="angle"> плюс значение |
AngleSize (внутри Var) |
— |
— |
— |
| Подпись |
<labelMode>, <caption>, <objColor> |
через elem.style['label_*'] |
rendering.label_anchor, font_size, per_name: {...} |
Tex (через create_label) |
<text> плюс <path> |
Диспетчеризация команд (lib_commands.py): имя команды = {имя_команды}_{сокращения_типов}, где сокращения — p=Point, l=Line, r=Ray, s=Segment, v=Vector, c=Circle, C=Arc, S=CircleSector, a=Angle, P=Polygon, K=Conic, F=Function, I=ImplicitCurve, i=int/float, m=Measure, A=AngleSize, b=Boolean, T=str. Пример: intersect_Kl(conic, line), midpoint_pp(p1, p2).
Часть 3. Атрибуты стиля в пяти слоях
Что означают столбцы:
- GGB XML — имя тега или атрибута в .ggb. —, когда в GGB нет соответствия.
- elem.ggb_raw[...] — ключ в словаре сырых значений GGB (до любых преобразований).
- elem.style[...] — ключ в словаре стиля времени выполнения после разбора и политик.
- JSON — где это задаётся в JSON-стиле (если задаётся вообще). Каноническая схема: переиспользуемые значения живут в presets, применение по типам — в defaults.<type>.*.
- Аргумент manim — параметр, который реально передаётся в конструктор manim.
- SVG — атрибут в итоговом SVG.
- Единица — единица измерения значения в elem.style.
3.0. Имена секций JSON-стиля и конфигурации рендерера
Верхний уровень JSON-стиля:
| Ключ |
Тип |
Смысл |
name |
str |
необязательное имя стиля |
version |
number |
версия пользовательского файла стиля |
presets |
dict |
семантические токены: цвета, размеры, толщины, шрифт, структуры засечек и стрелок |
defaults |
{type: {style_key: value}} |
базовые значения по типам, читаются resolver'ом после слоя импорта |
overlay |
dict |
переопределения поверх импорта и автоматика |
rendering |
dict |
настройки рендера и экспорта уровня сцены |
import |
dict |
правила чтения визуальных значений GGB |
presets из builtin.json:
| Группа |
Ключи |
color |
main, light, accent, accent_light, aux, black, white, shade, background, strong |
point_size |
main, bold, aux |
line_width |
main, bold, aux |
angle_radius |
main, bold, aux, shift, right |
tick.main |
tick_length_px, tick_width_px, tick_shift_px |
arrow.main |
arrow_length_px, arrow_width_px |
font_size |
main, bold, aux |
В defaults и overlay.per_type используются канонические имена типов:
point, segment, line, ray, vector, angle, polygon,
circle, arc, circlesector, conic, function, implicitcurve.
defaults.decoration есть в builtin.json как общий помощник для пресетов
засечек, но отрисовываемым типом элемента он не является.
overlay:
| Ключ |
Подключи |
Смысл |
per_type |
<тип> → ключи стиля |
правила для всех элементов типа, выше elem.ggb_style |
per_name |
<имя> → ключи стиля |
правила для конкретного элемента, выше per_type |
angle_radius |
enabled, exp, pivot_rad, min_px, max_arm_fraction, apply_to_right |
автоматическое масштабирование радиусов дуг углов |
label_placement |
enabled, distance_px, padding_px, angle_gap_arc_px, angle_gap_sides_px, w_anchor, w_label, w_geom, dynamic_angles, keyframe_snapshots, canonicalize_anchor, interpolation, ema_alpha, anchor_flip_frames, solver_every_n_frames |
автоматическая раскладка подписей, включая режимы ключевых кадров и покадровый |
rendering:
| Ключ |
Значения |
Смысл |
background |
hex или color.* |
фон камеры Manim, MP4 и экспорта SVG |
line_cap |
butt / round / square |
значение по умолчанию для stroke_linecap |
dash_period_px |
число > 0 (px), по умолчанию 10 |
значение по умолчанию для stroke_dash_period_px |
right_angle_joint |
auto / bevel / miter / round |
значение по умолчанию для right_angle_joint маркера прямого угла |
polygon_boundary_layer |
top / null |
поднимает стороны многоугольника на z_index=10 |
points_display |
auto / only_labels / only_points |
глобальный режим отображения точек и подписей |
label_anchor |
TL..BR |
якорь подписи по умолчанию для всей сцены |
label_value_precision |
int |
точность числовых подписей по умолчанию для всей сцены |
fast_value_labels |
bool, по умолчанию true |
анимированные подписи со значением используют кэшированные глифы цифр вместо LaTeX на каждом кадре |
label_contrast |
off / auto |
auto перекрашивает подписи на заливках близкой яркости |
label_contrast_threshold |
float, по умолчанию 0.35 |
разница яркости для label_contrast: auto |
color_interpolation |
oklab / srgb |
цветовое пространство анимации цветов в дорожках стиля ключевых кадров |
reference:
| Ключ |
Тип |
Смысл |
reference.width |
float |
ширина эталонного холста стиля для раскладки превью и экспорта |
reference.height |
float |
высота эталонного холста стиля |
reference.source |
manual / source_view / ggb_view |
откуда взят эталонный холст; область конструкции во время выполнения задаётся через content.source |
import:
| Ключ |
Тип |
Смысл |
enabled |
bool |
false отключает elem.ggb_style, colors, point_size, line_width, policy; геометрия и сырые значения остаются |
colors |
{"#hex [opacity]": "пресет-или-#hex [opacity]"} |
переназначение палитры цветов GGB |
point_size |
{сырой_или_стилевой_размер: значение} |
переназначение размера точки в size_px |
line_width |
{сырая_или_стилевая_толщина: значение} |
переназначение толщины линии в stroke_width_px |
policy |
dict |
поля ImportPolicy: size_px, stroke_width_px, arc_size_px, label_offset_px, label_color, label_visible, visible, label_text, label_mode, label_value_precision, label_value_strip_zeros, label_angle_unit, label_value_separator, angle_range, tick_count, font_size_px, stroke, fill, fill_opacity, point_shape, stroke_opacity, stroke_dash_ratio, stroke_dash_period_px, stroke_linecap |
3.1. Геометрические размеры
| Понятие |
GGB XML |
elem.ggb_raw |
elem.style |
JSON |
Аргумент manim |
SVG |
Единица |
| Диаметр точки |
<pointSize val> |
point_size |
size_px |
point_size.*, import.point_size |
radius = size_px/2/ptUnit |
r |
px |
| Толщина линии |
<lineStyle thickness> |
line_thickness |
stroke_width_px |
line_width.*, import.line_width |
stroke_width = 100*val/ptUnit |
stroke-width |
px |
| Радиус дуги угла |
<arcSize val> |
arc_size |
arc_size_px |
angle_radius.*, defaults.angle.arc_size_px, overlay.angle_radius |
radius = arc_size_px/ptUnit (для прямых углов делится на √2) |
— |
px |
| Сдвиг между концентрическими дугами |
— |
— |
arc_shift_px |
angle_radius.shift, defaults.angle.arc_shift_px |
— |
— |
px |
| Радиус волны засечки |
— |
— |
tick_radius_px |
per_name / overlay |
radius в round_corners_vmobject |
— |
px |
| Размер маркера прямого угла |
— |
— |
right_angle_size_px |
angle_radius.right, defaults.angle.right_angle_size_px |
radius для Polygon |
— |
px |
| Засечки равенства |
<decoration type> |
decoration_lines |
tick_length_px, tick_width_px, tick_shift_px |
tick.*, defaults.segment, defaults.vector |
length/shift = px/ptUnit; tick_width_px → stroke_width_to_manim() |
— |
px |
| Наконечник стрелки |
— |
— |
arrow_length_px, arrow_width_px |
arrow.*, defaults.vector |
CustomArrowTip |
— |
px |
3.2. Обводка и заливка (имена, совместимые с SVG)
| Понятие |
GGB XML |
elem.ggb_raw |
elem.style |
JSON |
Аргумент manim |
SVG |
| Цвет обводки |
<objColor r,g,b> (зависит от типа) |
obj_color |
stroke |
color.*, import.colors, import.policy.stroke |
color |
stroke |
| Непрозрачность обводки |
<lineStyle opacity> |
line_opacity |
stroke_opacity |
import.colors (с непрозрачностью), import.policy.stroke_opacity |
stroke_opacity |
opacity |
| Пунктир (соотношение) |
<lineStyle type> (>0) |
line_type |
stroke_dash_ratio |
import.policy (DSL) |
шаблон пунктира на штрихе (animageo/dash.py) |
stroke-dasharray |
| Период пунктира |
— |
— |
stroke_dash_period_px |
rendering.dash_period_px (10) |
/ ptUnit_style → MU |
stroke-dasharray |
| Окончания линий |
— |
— |
stroke_linecap |
rendering.line_cap |
cap_style |
stroke-linecap |
| Цвет заливки |
<objColor> (для angle/polygon/arc/conic/point) |
obj_color |
fill |
color.*, import.colors, import.policy.fill |
fill_color |
fill |
| Непрозрачность заливки |
<objColor alpha> |
obj_color['alpha'] / obj_color['opacity'] |
fill_opacity |
import.colors (с целевой непрозрачностью), import.policy.fill_opacity |
fill_opacity |
fill-opacity |
3.3. Точки (форма и разложение пресета GGB)
import.colors нормализует результат в отдельные поля: в stroke и fill
попадает только hex #rrggbb, а stroke_opacity и fill_opacity меняются
только тогда, когда непрозрачность явно указана в правой части соответствия.
Например, "#1565c0 0.1": "color.accent 1" меняет цвет на #f15b5b и
выставляет непрозрачность 1.0, а "#1565c0 0.1": "color.accent" сохраняет
прежнюю непрозрачность элемента.
| Понятие |
GGB XML |
elem.ggb_raw |
elem.style |
JSON |
Аргумент manim |
SVG |
| Форма точки |
<pointStyle val="0..10"> (жёстко связана с заливкой) |
point_style (int) |
point_shape (строковый enum) |
import.policy.point_shape, overlay.per_type.point.point_shape |
_make_point_mobject (9 форм: circle, square, diamond, triangle_*, cross, plus) |
зависит от формы |
Код point_style из GGB раскладывается на три независимые оси (point_shape, fill/fill_opacity, stroke/stroke_width_px/stroke_opacity) через style/enums.py:_GGB_POINT_STYLE_PATCHES.
pointStyle в GGB |
point_shape |
Заливка |
Обводка |
0 (залитая, чёрный контур — по умолчанию) |
"circle" |
цвет |
#000000, 1 px |
2 (полая окружность) |
"circle" |
нет (fill_opacity=0) |
цвет, 2 px |
10 (залитая, без контура) |
"circle" |
цвет |
нет (stroke_opacity=0) |
4 (залитый ромб) |
"diamond" |
цвет |
нет |
5 (полый ромб) |
"diamond" |
нет |
цвет, 2 px |
1 (×) |
"cross" |
нет |
цвет, 2 px |
3 (+) |
"plus" |
нет |
цвет, 2 px |
6/7/8/9 (▲/▼/▶/◀) |
"triangle_up" / "triangle_down" / "triangle_right" / "triangle_left" |
цвет |
нет |
3.4. Углы
| Понятие |
GGB XML |
elem.ggb_raw |
elem.style |
JSON |
manim |
| Какую дугу рисовать |
<angleStyle val="1\|2"> |
angle_style |
angle_range ("minor" / "reflex") |
import.policy.angle_range, overlay.per_name |
логика выбора в CreateMObject |
| Прямой угол (квадратный маркер) |
автоматически |
— |
right_angle_marker (bool) |
overlay.per_name |
маркер Polygon вместо AnnularSector |
| Число дуг и засечек |
<decoration type> |
decoration_lines |
tick_count (int) |
import.policy.tick_count, overlay.per_name |
цикл в CreateMObject |
| Стиль засечки (для Segment/Vector) |
— |
— |
tick_style ("line" / "wave") |
overlay.per_name |
Line против round_corners_vmobject |
| Толщина дуги |
<lineStyle thickness> (как у линий) |
line_thickness |
stroke_width_px |
line_width.*, defaults.angle.stroke_width_px |
stroke_width |
| Соединение в прямом угле |
— |
— |
right_angle_joint |
rendering.right_angle_joint, overlay.per_name / per_type |
joint_type у VMobject прямого угла |
3.5. Подписи
| Понятие |
GGB XML |
elem.ggb_raw |
elem.style |
JSON |
manim |
| Текст |
<labelMode>, <caption> |
label_caption |
label_text |
import.policy.label_text, overlay.per_name |
Tex(text) |
| Режим текста |
<labelMode val> |
label_mode (0/1/2/3/9) |
label_mode (label / value / label_value) |
import.policy.label_mode, overlay.per_type, overlay.per_name |
выбирает label, value или label = value |
| Формат значения |
— |
— |
label_value_precision, label_value_strip_zeros, label_angle_unit, label_value_separator |
overlay.per_type, overlay.per_name, import.policy.* |
форматирует числовую часть |
| Видимость |
<show label> |
show_label |
label_visible |
defaults.<type>.label_visible, overlay.per_type, overlay.per_name, import.policy.label_visible |
(условное создание) |
| Цвет |
<objColor> (тот же самый) |
obj_color.hex |
label_color |
import.policy.label_color |
color у Tex |
| Шрифт (размер) |
<gui><font size> (на всю сцену) |
— |
font_size_px |
font_size.*, defaults.<type>.font_size_px, import.policy.font_size_px |
font_size |
| Якорь |
<labelingStyle> (на всю сцену) |
— |
label_anchor ("TL"…"BR") |
rendering.label_anchor, overlay.per_name |
aligned_edge в move_to |
| Смещение |
<labelOffset x,y> |
label_offset_px (Y инвертируется) |
label_offset_px (после инверсии Y) |
import.policy.label_offset_px, overlay.per_name |
tex.shift(...) |
| Радиальное смещение (угол) |
— |
— |
label_radial_offset_px |
overlay.per_name |
прибавляется к r для Angle |
| Зафиксированное положение |
— |
— |
label_placement_locked (bool) |
overlay.per_name |
пропускается решателем |
| Подсказка места |
— |
— |
label_hint_px ([x, y], ось y вверх) |
overlay.per_name |
читается решателем как желаемая сторона подписи; рендерер её не читает |
| Внутренний флаг авторазмещения |
— |
— |
_auto_placed (bool, внутренний) |
— |
отключает поправку на выносной элемент GGB в create_label |
3.6. Видимость и слои
| Понятие |
GGB XML |
elem.ggb_raw |
elem.(style/атрибут) |
JSON |
| Видимость элемента |
<show object> |
show_object |
elem.visible (атрибут обёртки) / ключ resolver'а visible |
import.policy.visible, overlay.per_type, overlay.per_name, defaults.<type>.visible |
| Z-index |
— |
— |
elem.style['z_index'] (float) |
rendering.polygon_boundary_layer, overlay.per_name |
| Z-index заливки (CircleSector) |
— |
— |
elem.style['z_index_fill'] |
overlay.per_name |
3.7. Полотно GeoGebra: сетка, оси, фон
Эти поля читаются из <euclidianView> в geogebra.xml и сохраняются в
scene.style.export, а не в elem.ggb_style: это настройки области
просмотра, а не свойства отдельных геометрических объектов.
| Понятие |
GGB XML |
style.export |
Рендер |
| Размер области просмотра |
<size width height> |
ptWidth, ptHeight |
размер камеры и SVG |
| Начало координат и масштаб |
<coordSystem xZero yZero scale yscale> |
ptXZero, ptYZero, ptUnit, ptUnit_ggb, ptYUnit_ggb |
преобразование камеры, исходный вид |
| Показывать оси |
<evSettings axes> |
showAxes |
включает оси в _coordinate_background |
| Показывать сетку |
<evSettings grid> |
showGrid |
включает сетку в _coordinate_background |
| Жирная сетка |
<evSettings gridIsBold> |
gridIsBold |
немного увеличивает толщину сетки |
| Тип сетки |
<evSettings gridType> |
gridType |
сохраняется; пока отрисовывается декартова сетка |
| Цвет фона |
<bgColor r g b> |
background |
сохраняется как hex |
| Цвет осей |
<axesColor r g b> |
axesColor |
линии осей, засечки, числа |
| Цвет сетки |
<gridColor r g b> |
gridColor |
линии сетки |
| Стиль линий |
<lineStyle axes grid> |
axesLineStyle, gridLineStyle |
сохраняется для совместимости |
| Оси X и Y |
<axis id="0\|1" ...> |
axes.x, axes.y |
по каждой оси: показ, числа, засечки |
| Шаг сетки |
<grid distX distY distTheta> |
gridDistX, gridDistY, gridDistTheta |
distX/distY задают шаг сетки |
_coordinate_background рисуется до геометрии: сетка на z_index=-20, оси на
z_index=-10, засечки и числа на z_index=-9. Это не то же самое, что
встроенные xAxis и yAxis в Construction.
Часть 4. Словарные перечисления (enum)
Определены в animageo/style/enums.py как типы Literal плюс кортеж времени выполнения для валидации.
| Тип |
Значения |
Где используется |
PointShape |
"circle", "square", "diamond", "triangle_up", "triangle_down", "triangle_left", "triangle_right", "cross", "plus" |
elem.style['point_shape'] |
AngleRange |
"minor", "reflex" |
elem.style['angle_range'] |
TickStyle |
"line", "wave" |
elem.style['tick_style'] |
PointDisplay |
"auto", "only_labels", "only_points" |
rendering.points_display |
LineCap |
"butt", "round", "square" |
rendering.line_cap, elem.style['stroke_linecap'] |
RightAngleJoint |
"auto", "bevel", "miter", "round" |
rendering.right_angle_joint |
LabelAnchor |
"TL", "TC", "TR", "ML", "MC", "MR", "BL", "BC", "BR" |
rendering.label_anchor, elem.style['label_anchor'] |
Interpolation |
"linear", "smooth" |
overlay.label_placement.interpolation |
Часть 5. Единицы измерения и константы преобразования
5.1. Единицы
| Пространство |
Единица |
Где встречается |
| Экранные пиксели GGB |
px |
значения в GGB XML (pointSize, thickness, arcSize, labelOffset), elem.ggb_raw, суффикс _px в elem.style |
| Единицы JSON-стиля |
пиксели (задаёт пользователь) |
presets, defaults.* |
| Внутренние координатные единицы manim (MU) |
1 MU = ptUnit пикселей |
радиусы, координатные длины, смещения |
| Единицы обводки и шрифта manim |
шкала обводки и шрифта Manim |
stroke_width, set_stroke(width=...), font_size |
| Безразмерные |
непрозрачность [0..1], соотношение |
stroke_opacity, fill_opacity, stroke_dash_ratio |
| Перечисления |
строки |
см. часть 4 |
Контракт пиксельной инвариантности: все значения _px хранятся в пикселях, но преобразуются в зависимости от целевого параметра Manim. Координатные размеры (size_px, arc_size_px, tick_length_px, tick_shift_px, tick_radius_px, arrow_*_px, stroke_dash_period_px, смещения) переводятся в MU делением / ptUnit. Толщины и шрифты, которые уходят в Manim через stroke_width, set_stroke(width=...) или font_size, проходят через масштаб рендера * 100 / ptUnit: это stroke_width_px, tick_width_px, font_size_px. Так гарантируется одинаковый визуальный результат при любом размере холста.
5.2. Константы (animageo/constants.py)
| Константа |
Значение |
Назначение |
STYLE_TO_INTERNAL |
0.02 |
внутренняя константа масштабирования; JSON-стиль времени выполнения использует *_px в пикселях |
LINE_WIDTH_SCALE |
2 |
внутренняя константа масштабирования толщины; рендерер читает stroke_width_px через resolver |
FONT_SIZE_RATIO |
50/25.9 ≈ 1.93 |
внутренняя константа масштабирования шрифта; рендерер читает font_size_px через resolver |
STROKE_WIDTH_SCALE |
100 |
elem.style['stroke_width_px'] → stroke_width в manim (делится на ptUnit) |
GGB_FONT_SCALE |
100.0 |
пиксели шрифта GGB → font_size в manim (делится на ptUnit) |
Z_FILL, Z_FILL_INNER, Z_FILL_LABEL, Z_ANGLE, Z_LINE, Z_STROKE, Z_POINT, Z_LABEL |
уровни |
z-index по типам элементов (значения по умолчанию) |
builtin.json (animageo/style/builtin.json) — поставляемые с пакетом значения по умолчанию по типам, в пикселях; StyleConfig.load(user_path) всегда начинает с него и подмешивает пользовательский JSON через deep_merge.
5.3. Примеры полной цепочки
Точка A из GGB (pointSize=5, цвет #1565c0, pointStyle=0):
GGB XML:
<pointSize val="5"/>
<objColor r="21" g="101" b="192"/>
<pointStyle val="0"/>
<labelOffset x="-28" y="32"/>
↓ ggb_parser + style/enums.ggb_point_style_to_elem_style
elem.ggb_raw = {
'point_size': 5, 'point_style': 0,
'obj_color': {
'r': 21, 'g': 101, 'b': 192,
'alpha': 0, 'opacity': 0, 'hex': '#1565c0'
},
'label_offset_px': [-28, 32],
}
elem.style = {
'size_px': 10.0, # 5 × 2
'point_shape': 'circle',
'fill': '#1565c0', 'fill_opacity': 1.0,
'stroke': '#000000', 'stroke_width_px': 1.0, 'stroke_opacity': 1.0,
'label_color': '#1565c0',
'label_offset_px': [-28, -32], # Y инвертирован
...
}
↓ CreateMObject (во время рендера, ptUnit = 50)
Circle(radius=0.1, color='#000000', fill_color='#1565c0',
fill_opacity=1, stroke_opacity=1, stroke_width=2)
↓ Cairo → SVG
<circle cx="…" cy="…" r="0.1"
fill="#1565c0" fill-opacity="1"
stroke="#000000" stroke-width="2"/>
Пунктирная прямая из GGB (thickness=10, type=1):
GGB XML:
<lineStyle thickness="10" type="1" opacity="255"/>
elem.style = {
'stroke_width_px': 5.0, # 10 / 2
'stroke_opacity': 1.0, # 255 / 255
'stroke_dash_ratio': 0.65, # type > 0 → 0.65
...
}
↓ CreateMObject (ptUnit = 50)
DashedLine(..., stroke_width=10, dashed_ratio=0.65, dash_length=0.17)
↓ SVG
<path stroke="…" stroke-width="10" stroke-dasharray="..."/>
История
Пересмотр имён полей вышел в AnimaGeo 1.0.0 (2026-04-23) в рамках
переписывания геометрического ядра и системы стилей. Короткие и абстрактные
имена полей (a, c, n, v, r, p, M, b, x, dim, angle,
original, points, end_points, start_point) заменены понятными
человеку именами, описанными выше, без псевдонимов для обратной
совместимости: код, написанный под имена до версии 1.0 (point.a,
circle.c, line.n, measure.x, …), падает с AttributeError и должен
перейти на имена из части 1.
В JSON-формате обмена для анимации по ключевым кадрам используются те же
актуальные имена: get_independents() возвращает тип 'tparam_point' и ключ
'tparam'; парсер ключевых кадров принимает только 'tparam'.
Продолжение в 1.0.2: удалён последний оставшийся псевдоним
Construction.update_alpha (для update_tparam), а вместе с ним — осиротевший
снимок заглушек для IDE, который всё ещё ссылался на имена полей до версии 1.0
(Measure.x, Angle.angle).
См. также
docs/styles.md — понятное человеку руководство по JSON-схеме с примерами.
animageo/style/enums.py — исходный код со значениями enum и разложением GGB.
animageo/style/proxy.pyi — полный список ключей elem.style с типовыми аннотациями для IDE.
animageo/style/schema.py — docstring с каноническим примером JSON плюс валидатор.