Inkscapeスクリプト:レイヤーを表示/非表示にしてエクスポートする方法


8

複数のレイヤーを持つ漫画があります。それらのレイヤーの中に、ドイツ語と英語のレイヤーがあります。彼らはそれぞれの言語でテキストを持っています。アイデアは、ドイツ語レイヤーを非表示にして英語レイヤーを表示し、英語の漫画としてエクスポートするか、英語レイヤーを非表示にしてドイツ語版の漫画のドイツ語レイヤーを表示することです。そのエクスポートをスクリプト化したいと思います。

これが私のSVGファイルの一部です:

  <g
     inkscape:groupmode="layer"
     id="layer3"
     inkscape:label="English"
     style="display:inline">
     <text
         xml:space="preserve"  
         <!-- .... --> 
         id="text3255">
         <tspan id="tspan3257">I don't think</tspan>
         <!-- ... -->

そして

 <g
     inkscape:groupmode="layer"
     id="layer4"
     inkscape:label="German"
     style="display:none"> 
     <text
           xml:space="preserve"
           <!-- ... -->
           id="text3284">   
           <tspan id="tspan3286">Ich glaube nicht,</tspan> 
           <!-- ... -->

私は/programming/9652573/inkscape-command-line-programmingを見て、このコマンドを試しました(そしてそれにたくさんのバリエーションがあります):

inkscape -z --file=cartoon.svg --select=English --verb=LayerHideAll --select=German --verb=LayerShowAll --export-png=cartoon-de.png --export-area-drawing

しかし、ファイルを保存したときに英語のレイヤーが表示され、ドイツ語のレイヤーが表示されなかったためか、英語のテキストが表示され続けています。

また、IDでレイヤーを選択し(それぞれ上のレイヤー3とレイヤー4のコード内)、実際の<text>要素を選択しました。Inkscape動詞のさまざまな組み合わせを試しました。しかし、運もありません。

このエクスポートをスクリプト化して、必要に応じて言語レイヤーを非表示または表示するにはどうすればよいですか?これをInkscape動詞で実行できますか、それともXMLを操作して、style属性をdisplay:inlineまたはdisplay:noneに設定してみますか?

回答:


3

わかりました、私はさまざまなXML解析モジュールをいじり、次のコードで終わりました。

use XML::LibXML;
use XML::LibXML::XPathContext;

my $xml = XML::LibXML->load_xml(location => $file);
my $xpath = XML::LibXML::XPathContext->new($xml);  
$xpath->registerNs("defNs", 'http://www.w3.org/2000/svg');
foreach my $layer ($xpath->findnodes('/defNs:svg/defNs:g[@inkscape:groupmode="layer"])) {
    my $label = $layer->{'inkscape:label'};
    foreach my $otherLang (@languages) {
        if ($label =~ m/$other_lang$/) {
            $layer->{'style'} =~ s{\bdisplay:inline\b}{display:none};
        }
    }
    if ($layerLang eq $lang) {
        $layer->{'style'} =~ s{\bdisplay:none\b}{display:inline};
    }
}
$xml->toFile($tempFileName);

これは私の問題を解決します。うまくいけば、それは他の誰かにも役立つでしょう。


1
@StephenEglen実際、これはバグがあります... display:...不透明度のような他のスタイル属性がすでにある場合、スタイルを設定してこれを壊すことはできません。答えを更新しました。
Robert

ありがとう。レイヤーの「スタイル」アイテムに複数の属性を含めることができるということですか?どの場合、display:inline <-> display:inlineを検索/置換する必要がありますか?
Stephen Eglen

1
@StephenEglenはい、そうです。不透明に気づきましたが、おそらく他にもあるでしょう。したがって、表示だけを置き換える正規表現:...を残し、その他はすべてそのままにします。
ロバート

2

少し遅れていることはわかっていますが、このhide-latyer-svg Githubプロジェクトを見つけました。Pythonスクリプトを使用して、レイヤーレバーで作成したxmlノードに基づいて特定のレイヤーを表示および非表示にした新しいファイルを作成します。

最高、クリストフ


2

コマンドラインテストが機能しなかった理由については、まず、レイヤー内に(レイヤー自体ではなく)アイテムを選択して、そのレイヤーに含める必要があるというのが答えだと思います。その後、正しい動詞はになりますLayerToggleHide。(この質問が尋ねられたときにこの動詞が利用可能であったかどうかはわかりません。)そして、はい、オブジェクトはIDではなく名前でのみ選択できます。

さらに、LayerHideとLayerShowの動詞がないため(なぜですか?)、これを確実にスクリプト化するには、最初にすべてのレイヤーを使用LayerHideAllまたはLayerShowAll設定してLayerToggleHideから、最終的な結果を得るために使用する必要があります。

私はこのコマンドラインルートをテストしていないため、確実な実用的なソリューションを示すことはできません。代わりに、コマンドラインルートを十分に検討し、自分のニーズに合うようにスクリプトを実行するのにどれだけの時間がかかるかを理解した後、オールインして、このようなニーズを処理するInskape拡張機能を作成することにしました。私はそれをSLiCk Layer Combinatorと呼んでいます、そしてそれはここで見つけることができます:https : //github.com/juanitogan/slick

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.