Extrusão Dinâmica — Etapa 09.10.5

Base: Etapa 06.2.

Mudança principal:
- contornos laterais/traseiros são pintados antes da face frontal;
- a face frontal funciona como oclusora natural desses strokes;
- o contorno da própria face frontal é pintado por último;
- mantém o motor geométrico 3D e a oclusão parcial de arestas da 06.2.

Objetivo: reproduzir o comportamento observado ao aplicar contorno ao resultado no próprio Inkscape, evitando a aparência de transparência da face frontal em círculos e formas tipo cruz.

Etapa 09.10.5: preview da face frontal composto com suporte a furos/subcaminhos, equivalente ao SVG final.

Etapa 09.10.5: preview da face traseira respeita furos; restaura contorno traseiro e arestas de profundidade visíveis através das aberturas.

Etapa 09.10.5: ajuste fino da interface; removido seletor visual da face traseira e painel lateral ligeiramente ampliado.

Etapa 09.10.5: arestas de furos identificadas estruturalmente pelo subcaminho de origem; corrige contornos traseiros e strokes de profundidade em letras/formas vazadas complexas.

Etapa 09.10.5: frontal e traseira passam a ser oclusores compostos com furos; arestas dentro de aberturas não são mais descartadas pelo contorno externo.

Etapa 09.10.5: corrige as arestas intermediárias em perspectiva. Cada aresta conhece sua face lateral de origem e não é mais ocultada pela própria face por diferenças numéricas da projeção.

Etapa 09.10.5: otimização para geometrias complexas. Adiciona pré-filtro por bounding box na oclusão, cache da malha do preview e agrupamento de eventos de arraste/rotação para reduzir recálculos repetidos.

Etapa 09.10.5 — otimização adaptativa: formas simples usam redraw imediato; objetos médios usam agrupamento de 8 ms; geometrias complexas mantêm o agrupamento de 24 ms da 07.0. Cache e pré-filtro espacial foram preservados.

Etapa 09.10.5: adiciona a opção 'Contornos laterais'. Desativada, mantém apenas os contornos frontal e traseiro; arestas de profundidade, transversais e longitudinais ficam ocultas. Baseada diretamente na 07.1.

Etapa 09.10.5: preserva strokes de profundidade nas extremidades da silhueta quando contornos laterais estão ocultos; campos manuais X/Y/Z sincronizados com sliders; alças X/Y/Z de rotação no preview.

Etapa 09.10.5: contornos laterais desligados passam a preservar somente arestas frente→fundo de silhueta 3D real, calculadas pela orientação das duas faces laterais adjacentes em relação à câmera. Isso evita arestas extras que migravam com a profundidade.

Etapa 09.10.5: adiciona tema Claro/Escuro à interface. O tema escuro permanece padrão; o tema claro atualiza painel, controles, preview, grade e widgets Tk clássicos sem alterar o motor geométrico.

Etapa 09.10.5: controle de perspectiva invertido para comportamento intuitivo (0%=fraca, 100%=forte), faixa ampliada com câmera virtual mais próxima e distorção mais dramática, mantendo clamp de segurança para evitar projeções instáveis.

Etapa 09.10.5: profundidade 3D pode ser definida numericamente em mm, cm ou px. O valor usa as conversões do próprio documento Inkscape, permanece sincronizado com a alça azul e preserva a direção atual da extrusão ao alterar apenas o comprimento.

Etapa 09.10.5: ajuste fino da interface. Barra lateral ampliada, área rolável interna mais larga e textos com maior largura de quebra.

Etapa 09.10.5: rotação X, Y e Z limitada ao intervalo de -90° a +90°.

Etapa 09.10.5 — edição de extrusões: ao selecionar o grupo de uma extrusão ou qualquer elemento interno dele, a extensão recupera a fonte oculta e os parâmetros data-* (modo, profundidade, perspectiva, rotações, cores, contorno, arestas e iluminação). O botão passa a 'Atualizar extrusão'. Novas extrusões salvam data-source-id, unidade de profundidade e tema. Há compatibilidade de recuperação com grupos 07.x cuja fonte permaneça imediatamente após o grupo.

Etapa 09.10.5: ao atualizar uma extrusão existente, a transformação atual do grupo (especialmente deslocamentos feitos manualmente no Inkscape) é copiada para o novo grupo, preservando a nova posição no documento.

Etapa 09.10.5: os strokes gerados pela extensão passam a usar stroke-linecap: round, equivalente à opção de extremidades arredondadas do painel Preenchimento e Contorno do Inkscape. O motor 3D e a geometria permanecem inalterados.

Etapa 09.10.5 experimental: opção 'Suavizar laterais' em Iluminação. A iluminação de cada face lateral é suavizada com as faces vizinhas, reduzindo o aspecto facetado em círculos, letras e curvas. O recurso é opcional e é salvo nos metadados para reedição.

Etapa 09.10.5 experimental: adiciona 'Gradiente nas laterais'. Cada face recebe um gradiente entre as cores calculadas nas duas arestas de profundidade; faces vizinhas compartilham a mesma cor na junção. No preview o gradiente é aproximado por 16 faixas; no SVG inserido é um linearGradient real. A opção é salva para reedição.

Etapa 09.10.5: remove o antigo método 'Suavizar laterais'. O modo 'Gradiente nas laterais' permanece. No SVG final, deixa de usar linearGradient por face e passa a subdividir cada face em 32 tiras interpoladas, reproduzindo o mesmo princípio visual do preview.

Etapa 09.10.5: corrige o fluxo de atualização para sempre usar o pai e índice do grupo existente, eliminando a comparação por identidade Python que podia transformar uma atualização em nova inserção. Mantém a transformação local do grupo atual. Adiciona controle de 4 a 128 faixas para o gradiente do SVG final; o valor é salvo nos metadados e recuperado na reedição.

Etapa 09.10.5: reestrutura a reedição. Cada extrusão nova/atualizada passa a guardar dentro do grupo uma fonte-mestre 2D oculta, em coordenadas de documento, separada das faces 3D e da transformação externa do grupo. Ao reabrir, o preview usa exclusivamente essa fonte-mestre, lida sem composed_transform(). Extrusões antigas usam a fonte legada como fallback e recebem automaticamente a nova fonte-mestre na primeira atualização.

Etapa 09.10.5 experimental: mantém o preview da 08.0.8 e altera apenas o SVG final. Cada face lateral é subdividida em 8 tiras; cada tira recebe um linearGradient SVG verdadeiro, com vetor alinhado à própria inclinação da tira. As cores inicial/final seguem a interpolação da iluminação da face.

Etapa 09.10.5: corrige o modo híbrido para respeitar exatamente o valor escolhido em 'Faixas no resultado'. Cada faixa continua recebendo seu próprio linearGradient SVG verdadeiro e orientado pela geometria da tira.

Etapa 09.10.5: corrige colisão de IDs ao atualizar extrusões com gradientes. Cada linearGradient passa a receber um ID globalmente único gerado pelo próprio documento Inkscape; há fallback por UUID. Isso preserva a atualização atômica, na qual a nova extrusão é construída antes da antiga ser removida.

Etapa 09.10.5: corrige a orientação dos gradientes híbridos. O vetor de cada linearGradient passa a ser perpendicular à direção média frente→fundo da tira, mantendo a cor constante ao longo da profundidade e variando apenas através da largura da faixa.

Etapa 09.10.5: corrige a sincronização do campo 'Faixas por face'. Ao clicar em Inserir/Atualizar, o valor digitado no Spinbox é lido imediatamente, mesmo sem pressionar Enter nem tirar o foco do campo.

Etapa 09.10.5: valor padrão de 'Faixas por face' alterado de 32 para 4. O preview permanece com 16 faixas para manter a suavidade visual.
\nEtapa 09.10.5: preview do gradiente reduzido de 16 para 8 faixas. Barra lateral reorganizada em três abas: Principal (Modo, Rotação 3D e Geometria), Estilo (Cores, Contorno e Arestas) e Iluminação. Removido o texto informativo 'ETAPA 06 — MOTOR 3D' do final do painel.\n
Etapa 09.10.5 — início do modo Revolução. A aba Principal ganha Construção: Extrusão/Revolução. Revolução gira o perfil em torno de eixo vertical na borda esquerda, com ângulo 1–360° e 4–128 segmentos. Rotação X/Y/Z, projeção ortográfica/perspectiva e reedição permanecem disponíveis. Nesta primeira etapa, a superfície de revolução usa preenchimento lateral sólido; iluminação e gradientes específicos serão refinados nas próximas etapas.

Etapa 09.10.5: corrige o preview vazio/IndexError do modo Revolução. O redraw agora separa completamente o caminho de desenho da revolução do caminho da extrusão e não tenta acessar front_polylines/back_polylines quando a malha de revolução está ativa.

Etapa 09.10.5: adiciona strokes ao modo Revolução. Quando 'Usar contorno' e 'Contornos laterais / malha' estão ativos, cada face da malha recebe stroke com extremidades/junções arredondadas. Como as faces são pintadas de trás para frente, as faces dianteiras cobrem naturalmente grande parte dos strokes traseiros. Esta é a primeira etapa visual da malha de revolução.

Etapa 09.10.5: corrige perspectiva da revolução com proteção de câmera e reenquadramento automático da malha projetada.

Etapa 09.10.5: corrige o efeito de 'câmera respirando' na Revolução. O autoenquadramento passa a ocorrer apenas ao entrar em Revolução, abrir uma revolução existente ou trocar Ortográfica/Perspectiva. Durante rotação X/Y/Z, centro e fit_scale permanecem fixos.

Etapa 09.10.5: integra Iluminação ao modo Revolução. Cada face recebe sombreamento calculado pela orientação projetada da superfície e responde a Direção da luz e Intensidade, tanto no preview quanto no SVG. Gradiente nas laterais fica temporariamente desabilitado em Revolução até a implementação específica desse recurso.

Etapa 09.10.5: adiciona gradientes ao modo Revolução. O preview usa 8 faixas por face para simular suavidade; o SVG final usa linearGradient verdadeiro orientado no sentido angular da revolução. Direção e intensidade da luz continuam controlando as cores do gradiente.

Etapa 09.10.5: corrige gradiente invisível na Revolução. Cada face passa a guardar seu ângulo inicial/final real; os dois stops são calculados pela normal radial 3D rotacionada do sólido, produzindo diferença real de iluminação entre as bordas da face.

Etapa 09.10.5: corrige inversão claro/escuro ao ativar gradientes na Revolução. Para cada face, as duas orientações possíveis da normal radial são testadas e a extensão escolhe a que melhor corresponde ao fator médio da iluminação chapada já validada na Etapa 09.3. O gradiente passa a suavizar sem inverter o lado iluminado do objeto.

Etapa 09.10.5: corrige cortes de iluminação em certos ângulos da Revolução. A orientação da normal radial deixa de ser escolhida individualmente por face e passa a ser definida globalmente pelo ângulo theta da revolução, garantindo continuidade entre faces vizinhas no preview e no SVG.

Etapa 09.10.5: mantém a normal radial contínua da 09.4.3, mas inverte globalmente seu sentido para coincidir com a convenção de iluminação chapada da extensão. Assim o gradiente não deve mais trocar regiões claras por escuras, sem reintroduzir rupturas entre faces.

Etapa 09.10.5: adiciona controle de Opacidade do contorno (0–100%) na aba Estilo. O valor vale para Extrusão e Revolução, é salvo nos metadados para reedição e aplicado ao SVG via stroke-opacity. O preview simula transparência por mistura de cores, pois o Tk Canvas não possui alpha real em strokes.

Etapa 09.10.5: corrige a opacidade do stroke frontal na Extrusão. O contorno frontal recebe stroke-opacity diretamente no SVG, e o preview passa a desenhar explicitamente o perímetro frontal com a mesma opacidade simulada. Arestas laterais/traseiras e strokes da Revolução também passam a declarar a opacidade explicitamente.

Etapa 09.10.5: corrige a opacidade do contorno frontal no preview da Extrusão. Havia um segundo bloco antigo redesenhando o perímetro frontal com a cor do stroke em 100% de opacidade por cima do contorno já corrigido. Esse desenho redundante foi removido.

Etapa 09.10.5 (nova base, sem tampas): o controle 'Faixas no resultado' passa a controlar de verdade a resolução do gradiente na Revolução. Preview e SVG usam exatamente o valor escolhido. Cada faixa do SVG recebe um linearGradient real calculado pelos ângulos da revolução; o stroke é desenhado apenas uma vez sobre a face inteira para não criar uma grade.

Etapa 09.10.5: ajustes finos. No modo Revolução, o vetor/alça azul da Extrusão é ocultado, mantendo as alças X/Y/Z. O Spinbox 'Segmentos' agora atualiza o preview imediatamente ao clicar nas setas.

Etapa 09.10.5: eixo vertical móvel no modo Revolução. Linha tracejada arrastável no preview e campo de deslocamento em mm a partir da borda esquerda do perfil. Posição salva para reedição.

Etapa 09.10.5: corrige conflito entre o eixo móvel da Revolução e a alça X. Os manipuladores de rotação X/Y/Z passam a ter prioridade no clique; o eixo só é capturado quando o cursor não está sobre uma alça de rotação.

Etapa 09.10.5: adiciona seleção do eixo de Revolução Vertical/Horizontal. O eixo horizontal gira o perfil em torno de uma linha horizontal móvel; o deslocamento passa a ser medido a partir da borda superior. A linha pode ser arrastada no preview e orientação/posição são salvas para reedição.

Etapa 09.10.5: refinamento do controle de ângulo da Revolução. As setas do campo Ângulo atualizam o preview imediatamente e foram adicionados presets rápidos de 90°, 180°, 270° e 360°.

Etapa 09.10.5: presets de ângulo reorganizados em grade 2x2 para caber na barra lateral: 90°/180° na primeira linha e 270°/360° na segunda, alinhados pelas mesmas duas colunas.

Etapa 09.10.5: corrige o enquadramento da Revolução. O botão Ajustar e a abertura de uma Revolução existente passam a calcular os limites usando diretamente as faces projetadas da malha, em vez de front/back polylines (que são vazios nesse modo). O botão de ação agora muda dinamicamente entre Inserir/Atualizar Extrusão e Inserir/Atualizar Revolução.

Etapa 09.10.5: corrige desaparecimento de faces em regiões finas ao girar. Extrusão e Revolução deixam de depender exclusivamente da profundidade média de cada quad. Faces cujas projeções se sobrepõem são comparadas no interior da própria sobreposição, gerando restrições locais de fundo/frente. Um sweep por bounding boxes limita as comparações para preservar desempenho.

Etapa 09.10.5: otimiza a correção de ordenação da 09.9.3. Antes do teste caro de sobreposição 2D, o motor compara os intervalos Z das faces. Faces com profundidades inequivocamente separadas são ordenadas diretamente; apenas pares realmente ambíguos executam interseção e teste local de profundidade. Contatos de bbox sem área também são ignorados.

Etapa 09.10.5: separa preview e render final. Durante a manipulação, Extrusão e Revolução usam novamente a ordenação simples por profundidade média, recuperando a velocidade das versões anteriores. Ao clicar em Inserir/Atualizar, a malha é reconstruída uma única vez com a ordenação precisa por sobreposição local introduzida na 09.9.3. Assim o preview pode exibir ocasionalmente o artefato antigo, mas o SVG final recebe a correção completa.

Etapa 09.10.5: adiciona Ângulo inicial ao modo Revolução. Revoluções parciais podem ser rotacionadas ao redor do eixo sem alterar o ângulo total. O controle varia de -180° a 180°, atualiza o preview pelas setas/Enter e é salvo nos metadados para reedição.

Etapa 09.10.5: interface contextual por modo. Em Extrusão, o bloco exclusivo da Revolução é ocultado. Em Revolução, os controles exclusivos de profundidade da Extrusão são ocultados. grid_remove() preserva todos os valores ao alternar entre os modos. A dica abaixo do preview também muda conforme o modo ativo.

Etapa 09.10.5: oculta a opção Cor da Face frontal na aba Estilo quando o modo Revolução está ativo; ela reaparece normalmente em Extrusão.

Etapa 09.10.5: no modo Revolução, oculta toda a seção Arestas intermediárias da aba Estilo, inclusive o separador. A seção reaparece em Extrusão com os valores preservados.

Etapa 09.10.5: no modo Revolução, 'Contornos laterais / malha' passa a alternar entre malha completa e contornos estruturais. Desligado, remove as divisões angulares dos Segmentos e mantém os anéis gerados pelos vértices do perfil; em revoluções parciais também mantém as bordas inicial/final. A lógica vale para preview e SVG final, evitando duplicação de strokes.

Etapa 09.10.5: adiciona detecção de silhueta externa no modo Revolução. Com 'Contornos laterais / malha' desligado, além dos anéis estruturais, o motor preserva arestas angulares compartilhadas por faces de orientações projetadas opostas. Isso recupera contornos externos como as laterais de bases, pés e bordas salientes sem reativar toda a malha. Cálculo aplicado a preview e SVG final com custo baixo, pois usa apenas faces vizinhas.

Etapa 09.10.5: adiciona 'Ativar tampas' à aba Principal, na seção da Revolução. Quando o ângulo é menor que 360°, cada tampa fecha a extremidade aberta do arco com o próprio perfil selecionado, incluindo furos/subcaminhos (mesma geometria já usada nas faces frontal/traseira da Extrusão). As tampas entram na mesma ordenação por profundidade das faces laterais, para ocluir e serem ocluídas corretamente ao rotacionar em X/Y/Z. Recebem sombreamento próprio, calculado pela normal tangencial ao ângulo de abertura (perpendicular ao raio), e contorno quando 'Usar contorno' está ativo. Não recebem 'Gradiente nas laterais' nesta etapa — usam sombreamento chapado. A opção é salva nos metadados (data-caps-enabled) para reedição e some automaticamente quando o ângulo volta a 360°.

Etapa 09.10.5.1 — Tampas LocalDepth:
- mantém a arquitetura do Claude: tampa como face especial e um único path composto;
- remove a tampa degenerada do sorter preciso;
- usa o contorno projetado real da tampa na ordenação;
- usa os valores Z reais de cada vértice da tampa, em vez de um único Z médio;
- o Z médio fica apenas como fallback global estável;
- tampas são ignoradas pelos cálculos de silhueta lateral que dependem de quads.

Etapa 09.10.5.2 — Tampas LocalDepth Mask:
- mantém a tampa como um único path composto;
- preserva a ordenação LocalDepth da 09.10.5.1;
- cada face lateral guarda seus valores Z reais;
- faces que se sobrepõem à tampa são comparadas localmente em profundidade;
- somente faces realmente à frente entram numa máscara preta de oclusão;
- a máscara recorta preenchimento e stroke juntos, sem triangulação visual.

Etapa 09.10.5.4 — Tampas LocalDepth Intersect:
- parte diretamente da 09.10.5.2;
- descarta a classificação multiponto da 09.10.5.3;
- mantém a decisão LocalDepth original por interseção;
- quando uma face lateral está à frente, mascara apenas o polígono exato de interseção tampa ∩ face;
- não usa mais o quad lateral inteiro como oclusor;
- remove o stroke preto de expansão da máscara para evitar apagar áreas vizinhas.

Etapa 09.10.5.8 — Reedição Exata:
- parte diretamente da 09.10.5.4;
- mantém intacto o sistema de tampas LocalDepth Intersect;
- aumenta a precisão de _path_d de 6 casas para 12 dígitos significativos;
- salva as polilinhas-mestre exatas em data-roman-source-points com 17 dígitos;
- na reedição, recupera esses pontos diretamente, sem passar novamente por flatten_shape;
- mantém fallback para grupos antigos que ainda não possuem os dados exatos;
- adiciona contagem de pontos/subcaminhos como metadados de integridade.

Etapa 10.0.1 — Extrusão Composta — Detecção:
- aceita 1 ou 2 objetos selecionados;
- maior bbox = base; menor = operação secundária;
- vermelho = cavidade; azul = ressalto;
- mostra o perfil secundário tracejado no preview;
- ainda não altera a malha 3D nesta etapa.

Etapa 10.0.2 — Extrusão Composta — Cavidade:
- parte da 10.0.1;
- objeto vermelho passa a gerar cavidade real de 10 mm;
- abertura existe apenas na face frontal;
- cria paredes internas entre a abertura e o fundo;
- cria fundo sólido da cavidade na profundidade definida;
- paredes e fundo participam da rotação/projeção e da ordenação de faces;
- objeto azul continua apenas como detecção/overlay nesta etapa.

Etapa 10.0.2.2 — correção:
- paredes internas usam poly_index reservado negativo;
- preview e SVG deixam de tentar acessar mesh.front_polylines com esse índice;
- paredes internas recebem desenho/sombreamento próprio;
- mantém fundo e abertura da cavidade da 10.0.2.1.

Etapa 10.0.2.3 — correção de formas de cavidade:
- normaliza automaticamente o winding do contorno da cavidade;
- o contorno interno é sempre orientado no sentido oposto ao contorno externo da base, garantindo o furo com fill-rule nonzero;
- aplica-se igualmente a círculo, retângulo, estrela, polígono e paths;
- mantém a correspondência entre abertura, paredes e fundo da cavidade.

Etapa 10.0.2.4 — correções:
- preview passa a desenhar os strokes das paredes internas da cavidade;
- respeita ativação de contorno, contornos laterais, espessura e opacidade;
- identificação da operação secundária passa a ser feita primeiro pela cor;
- vermelho/azul funciona independentemente de o SVG ser circle, rect, polygon, star, path ou outra forma compatível;
- bbox fica apenas como fallback quando a cor não resolve o papel dos objetos.

Etapa 10.0.2.8 — Path secundário normalizado:
- base: 10.0.2.4;
- get_path() do secundário é copiado;
- composed_transform() é aplicado diretamente ao Path;
- path é convertido para comandos absolutos/não shorthand;
- SuperPath e flattening são feitos sem voltar ao elemento sodipodi;
- visa igualar Polígono/Estrela do Inkscape a um path desenhado com Bézier.

Etapa 10.0.2.10 — Clip da Cavidade:
- base: 10.0.2.8.1;
- paredes e fundo só podem aparecer através da abertura frontal;
- preview: interseção geométrica contra o contorno da abertura;
- SVG: clipPath dedicado aplicado às paredes e ao fundo;
- evita vazamento visual da cavidade sobre faces externas.

Etapa 10.0.2.13 — Paredes à Frente:
- base: 10.0.2.10;
- descarta as experiências 10.0.2.11/12;
- paredes internas ficam num grupo SVG separado;
- esse grupo é movido para depois da face frontal;
- o clip da abertura continua limitando as paredes;
- fundo permanece atrás;
- preview usa a mesma hierarquia: face frontal primeiro, paredes depois;
- título da janela atualizado para 10.0.2.13.

Etapa 10.0.2.14 — Fundo e Paredes à Frente:
- base: 10.0.2.13;
- mantém o grupo superior da cavidade e o clip da abertura;
- fundo passa a ser inserido nesse grupo antes das paredes;
- ordem SVG: face frontal -> fundo da cavidade -> paredes internas -> contorno frontal;
- preview reproduz a mesma hierarquia;
- título da janela atualizado para 10.0.2.14.

Etapa 10.0.2.15 — Base Normalizada:
- base: 10.0.2.14;
- cria helper único flatten_shape_normalized_path();
- aplica a mesma normalização a forma-base e operação secundária;
- get_path() é transformado para coordenadas absolutas do documento antes do flattening;
- corrige Polígono/Estrela do Inkscape também quando usado como corpo principal;
- mantém intactos clip, fundo e paredes da cavidade da 10.0.2.14;
- título da janela atualizado para 10.0.2.15.

Etapa 10.0.2.18 — Iluminação da Cavidade:
- base: 10.0.2.17;
- remove fatores fixos 0.72/0.68 das paredes e fundo;
- cada parede interna recebe iluminação direcional própria;
- intensidade responde à orientação projetada da parede e ao ângulo da luz;
- fundo usa normal 3D do plano frontal após rotação X/Y/Z;
- preview e SVG final usam os mesmos fatores;
- título da janela atualizado para 10.0.2.18.

Etapa 10.0.2.19 — Furos da Base à Frente:
- base: 10.0.2.18;
- identifica faces laterais dos subcaminhos internos do path-base via hole_flags;
- essas faces deixam de ser desenhadas na pilha lateral antiga;
- passam para o mesmo grupo superior das cavidades vermelhas;
- preview e SVG preservam a ordem de side_fragments entre todos os interiores;
- mantém iluminação automática das paredes do furo original;
- título da janela atualizado para 10.0.2.19.

Etapa 10.0.2.20 — Gradiente nas Cavidades:
- base: 10.0.2.19;
- gradientes laterais passam a atuar também nas paredes das cavidades vermelhas;
- bordas vizinhas compartilham fatores suavizados de iluminação;
- preview usa 8 faixas leves;
- SVG final respeita o número configurado em Faixas no resultado;
- cada faixa usa linearGradient SVG verdadeiro;
- contorno é desenhado apenas uma vez sobre cada parede;
- título da janela atualizado para 10.0.2.20.

Etapa 10.0.2.22 — Formas Vazadas / Ilha Frontal:
- base: 10.0.2.21;
- todos os subcaminhos da forma vermelha entram na abertura composta;
- subcaminhos internos preservam ilhas na face frontal;
- apenas regiões de nível par recebem fundo rebaixado;
- clip da cavidade usa fill-rule/clip-rule evenodd;
- face frontal SVG usa fill-rule evenodd;
- objetivo: anel vermelho produz cavidade anular com centro no plano frontal.

Etapa 10.0.2.23 — Clip da Cavidade sem Furos da Base:
- base: 10.0.2.22;
- ExtrusionMesh passa a registrar cavity_opening_indices;
- _cavity_opening_polys usa apenas os subcaminhos da operação vermelha;
- furos já existentes na forma-base deixam de participar do clip da cavidade;
- corrige casos como a letra R, em que o vazado original era coberto pela cavidade;
- mantém a topologia externo+interno das formas vermelhas vazadas.

Etapa 10.0.3.0.6 — Iluminação do Ressalto no SVG:
- base: 10.0.3.0.5;
- tampa positiva usa o mesmo _cavity_bottom_light_factor do preview;
- paredes positivas usam o mesmo _cavity_wall_light_factor do preview;
- cores são convertidas com _shade_svg no documento final;
- iluminação desligada preserva front_color/side_color sem alteração.

Etapa 10.0.3.0.7 — Retângulo Nativo no Windows:
- base: 10.0.3.0.6;
- fluxo normal get_path().to_superpath() permanece inalterado;
- se inkex gerar ZeroDivisionError/erro aritmético em <rect>, usa fallback direto;
- fallback reconstrói x/y/width/height e aplica composed_transform;
- solução também aplicada ao flatten_shape legado;
- demais formas e Linux continuam usando o caminho normal.


============================================================
EXTRUSÃO DINÂMICA — VERSÃO 1.0
============================================================
Base consolidada: Etapa 10.0.3.0.7.1.
Esta versão preserva exatamente a lógica validada antes do lançamento.

Recursos consolidados:
- Extrusão 3D com rotação X/Y/Z e perspectiva;
- Extrusão negativa por forma auxiliar vermelha;
- Profundidade configurável da cavidade;
- Formas vermelhas vazadas e topologia composta;
- Furos existentes na forma-base preservados corretamente;
- Extrusão positiva por forma auxiliar azul;
- Altura configurável do ressalto;
- Iluminação automática no preview e no SVG final;
- Gradientes laterais;
- Controle de contornos e opacidade;
- Reedição de extrusões preservando parâmetros;
- Tema claro e escuro;
- Compatibilidade testada em Linux e Windows;
- Workaround para retângulo nativo do Inkscape no Windows.
