Salve vários objetos do arquivo vetorial em arquivos separados usando o Inkscape / OS / Freeware

9

Eu tenho um arquivo vetorial baixado (formato AI). O arquivo contém imagens vetoriais simples de várias raças de cães. Carreguei o arquivo no inkscape, desagrupei-o e gostaria de salvar um vetor de cachorro como um arquivo separado. Existe uma maneira de automatizar isso com o Inkscape ou alguma outra ferramenta de OS / Freeware? Caso contrário, terei que selecionar cada um e Salvar como. Qualquer ajuda é muito apreciada!

ATUALIZAÇÃO Obrigado a JSBueno pelo conselho sobre a edição do arquivo SVG real. Não percebi que o SVG era apenas um arquivo XML. Deveria ser capaz de percorrer facilmente o arquivo e exportar cada cão como um arquivo separado. A propósito, isso será muito mais rápido do que fazê-lo através da interface que era o objetivo deste post. Obrigado a todos pelo conselho.

dinki
fonte
Por que você não pode selecionar cada um e salvar como? Existem tantas imagens que uma solução automatizada é obrigatória?
Scott
2
Para poder automatizar isso, você precisa definir elementos "dog" para extrair do arquivo svg. Na realidade, os elementos do seu cão consistirão em linhas compostas únicas até grupos cortados. Sugiro que você aprenda os atalhos de teclado necessários, selecione algumas músicas e continue com elas.
Sim, tenho mais de 80 objetos individuais para este. Estou apenas procurando uma maneira mais rápida, mas farei isso manualmente, se for o que for preciso.
dinki
Você certamente pode escrever isso. Seria necessário alguém habilitado em Python, por exemplo, pelo menos o tempo necessário para "salvar como" 30 dos seus 80 cães para criar esse script. Um codificador não qualificado, ou mesmo alguém habilitado, mas não familiarizado com as funções de ajuda do inkscape / XML, pode levar muito mais tempo do que salvar os 80 cães.
jsbueno
Por fim, você pode simplesmente escrever o arquivo SVG em um editor de texto (Notepad ++) e verificar se cada cão está contido em uma tag SVG separada - é melhor copiar / colar texto em vez de fazê-lo com imagens na interface do usuário do inkscape . Ainda pode ser mais rápido usando a interface do usuário do inkscape.
Jsbueno

Respostas:

5

Encontrei duas soluções para exportar vários objetos do Inkscape como SVGs. Esses métodos têm o benefício de serem scripts que podem ser executados automaticamente e não precisam de edição de SVGs em editores de texto.

  1. svg-objetos-exportação

O script svg-objects-export funciona exportando todos os objetos com base em expressões regulares. No seu caso, funcionaria exportando todos os objetos com um ID específico. Para usá-lo primeiro clone ou faça o download do script no Github .

No Inkscape, você precisa alterar o ID de todos os objetos que você deseja exportar para ter o mesmo padrão de nome de arquivo. Para fazer isso, abra a caixa de diálogo Propriedades do objeto, vá em Objeto> Propriedades do objeto ou pressione Ctrl+ Shift+ O. No campo ID, altere todos para ter o mesmo ID do nome da base Dog_1, por exemplo Dog_2, Dog_3etc (os objetos não podem ter o mesmo ID).

insira a descrição da imagem aqui

Com o arquivo salvo e o script baixado, em um terminal, execute o seguinte comando

python svg-objects-export.py --pattern 'Dog_*' /path/to/your/file.svg

Isso exportará todos os objetos com o ID do nome da base "Dog_".

  1. inx-exportobjects

A extensão inx-exportobjects inkscape simplesmente exportará todos os objetos selecionados. Para usá-lo primeiro clone ou baixe a extensão do Gitlab . Para instalá-lo, copie os arquivos export_objects.inxe export_objects.pypara .config/inkscape/extensions/. No Inkscape, você terá uma opção chamada "Objetos para arquivos ..." em Extensões> Exportações. Selecione os objetos que você deseja instalar e selecione esta opção.

insira a descrição da imagem aqui

Nesta caixa de diálogo, simplesmente altere o Diretório de exportação para o local em que deseja salvar seus arquivos, altere o Nome da base para o novo nome dos arquivos e pressione Aplicar.

insira a descrição da imagem aqui

Os arquivos serão exportados para o diretório especificado.

Cada uma das soluções tem muitas outras opções, como exportação de gif animado, com as quais você definitivamente deve experimentar.

hellocatfood
fonte
Excelente solução @hellocatfood Apenas uma dica: Antes de exportar, você pode redimensionar a tela. No meu caso, eu tinha muitos ícones. Eu descobri a largura e a altura máx. Dos ícones. E, em seguida, redimensione a tela para a respectiva altura x largura. Em seguida, selecione todos os objetos, alinhe-os horizontal e verticalmente e inicie o processo de exportação. Dessa forma, você terá os svg's com altura e largura adequadas.
Anish Nair
1

Dependendo da pré-condição, de que todos os seus objetos são agrupados e não combinados em grupos maiores, aqui está como fazê-lo. (Eu usei gatos no exemplo, porque os cães não estavam disponíveis).

insira a descrição da imagem aqui No canto inferior direito, você vê um gato realçado, objeto id 5358, que é um caminho único; por isso, adicionei um piso verde mais tarde, que foi alterado para o objeto 5364, que ocorrerá mais tarde. Portanto, não deixe confundi-lo. :)

Você obtém o editor xml pressionando o botão 4 da direita (seta 1).

Alterei g5358 para g-cat-5358 (campo 4) para facilitar a ferramenta de texto escolher esses objetos que funcionam para a maioria dos elementos que não colidem com xml-svg-names (color, meta, id, ... )

Na janela esquerda, você vê que já existe uma entidade renomeada, g-cat-5312, próxima à parte superior no mesmo nível de indentação.

O Inkscape organiza IDs exclusivos para grupos, mas eles não precisam ter o formato gNUMBER, você pode misturar outros caracteres. Apenas não escolha um identificador já existente.

Depois de alterar o identificador, pressione 'setzen (set)' (5) para confirmar sua alteração. Você vê uma interface alemã aqui, YMMV.

Salve o svg (como demo-cats.svg). Agora, mudamos para scripts.

for cat in $( grep g-cat- demo-cats.svg )
do
  id=${cat//[^0-9]/}
  echo $id
  (head -n 53 demo-cats.svg; sed -n "/$cat/,/^    <\/g>/p" demo-cats.svg; echo "</svg>" ) > cat-${id}.svg
done

O que isso faz? Ele greps (procure com grep) pelo padrão "g-cat-", que é o começo de nossa seção interessante. id=${cat//[^0-9]/}extrai o ID no bash da expressão. O Echo imprime na tela, o que deve ajudar a encontrar o erro, se algo der errado. head -n 53 demo-cats.svg pega as primeiras 53 linhas do svg, que contém todo o svg-boilerplate. Dependendo das suas configurações com diferentes formatos svg (inkscape, compactado, svg normal, inkscape-compactado), isso pode variar. Com nl demo-cats.svg | lessvocê pode n umerate as l ines, para encontrar o ponto de corte para a direita no seu caso.

  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1">
     <g

^ Até esta parte, as linhas devem ser incluídas.

O próximo comando é feito com o s tream ed itor sed: sed -n "/$cat/,/^ <\/g>/p" demo-cats.svg;diz (-n) sem impressão (mas) searche para o grupo gato, até a marca de fechamento g no nível de recuo 2, que é de 4 espaços antes do </g>se você não fez altere as preferências do Inkscape, das quais você poderá se lembrar se o fez. Em seguida, adicione a marca de fechamento para SVG: echo "</svg>". Escreva a saída no arquivo 'cat- $ id.svg' (isso substitui os arquivos existentes silenciosamente).

Então, acabo com dois arquivos: cat-5312.svg e cat-5364.svg.

Uma solução mais elegante deve ser possível com xmlstarlet ou ferramentas semelhantes, criadas para pesquisar e editar arquivos xml. Infelizmente, não estou acostumado a isso e não o funcionou depois de ler 10 minutos de documentação. Você não precisaria renomear os grupos no começo.

Usuário desconhecido
fonte