Koordinatenverschiebung ohne Textspiegelung
  • jow Februar 2014
    Hallo,

    ich versuche, programmgesteuert Architekturpläne zu erstellen. Dazu benötige ich den Ursprung des Koordinatensystems in der linken unteren Ecke. Das ist soweit nicht wirklich schwierig, das kriegt man mit

      transform="translate(0, 90) scale(1, -1)"

    hin (siehe angehängte Datei). Allerdings ist dann der beinhaltete Text gespiegelt, so dass er auf dem Kopf steht.

    Wie bekomme ich den Ursprung nach links unten ohne dass der Text gespiegelt wird?

    Habe ich das transform-attribut überhaupt an der richtigen Stelle eingefügt? Oder sollte es besser an das toplevel SVG attribut angeklebt werden?

    Wie würde sich solch eine Transformation auswirken, wenn man die Datei in ein anderes Format exportiert?

  • jow Februar 2014
    Irgendwie klappt es mit dem Upload nicht. Hier also die generierte Datei direkt:

    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
      "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg width="50" height="90" version="1.1" id="toplevel"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
      <g transform="translate(0, 90) scale(1, -1)" id="first-layer"
        inkscape:groupmode="layer" inkscape:label="first-layer">
        <line x1="21" y1="22" x2="23" y2="24" stroke="red" fill="red"
              stroke-width="25"/>
        <line x1="31" y1="32" x2="33" y2="34" stroke="red" fill="red"
              stroke-width="35"/>
        <text x="50" y="50" font-size="10" stroke="red" fill="red"
             stroke-width="0.30">
          Some text
        </text>
      </g>
      <g transform="translate(0, 90) scale(1, -1)" id="second-layer"
        inkscape:groupmode="layer" inkscape:label="second-layer">
        <line x1="11" y1="12" x2="13" y2="14" stroke="blue" fill="blue"
              stroke-width="15"/>
      </g>
    </svg>

    BTW: ich verwende inkscape 0.48.4 r9939 unter opensuse-12.3

  • fZapfZap Februar 2014
    transform() würde ich hier nicht verwenden. Es reicht doch eine x,y-Verschiebung. Du musst für die Verschiebung  die Größe des Objekts (Innenbereich und Kontur) zunächst berechnen und dann als Offset bei x,y-Werten berücksichtigen.
  • jow Februar 2014
    Eine einfache Verschiebung reicht eben nicht, denn die y-Achse muss ja gespiegelt werden. Dadurch sind auch die Texte gespiegelt.

    Habe es jetzt geschafft: Die Lösung ist, die Reihenfolge der Operationen pingelig einzuhalten. So scheint es zu gehen:

    <svg width="1500" height="1900" version="1.1" id="toplevel"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
      <g transform="translate(0, 1900) scale(1, -1)" id="KG-waende"
        inkscape:groupmode="layer" inkscape:label="KG-waende">
        .....
        <text transform="translate(51.0, 1550.0) rotate(90, 0, 0) scale(1, -1)"
             x="0" y="0" font-size="10" text-anchor="middle" stroke="black"
             fill="black" stroke-width="0.20">
          102.0
        </text>

    Der text muss also erst auf Position 0/0 gesetzt werden, danach gespiegelt werden, danach rotiert (sofern gewünscht), und erst zum Schluss zur gewünschten Position verschoben. Macht man es in dieser Reihenfolge, muss man auch die Grösse des Objektes nicht kennen. Lediglich bei der Rotation muss man aufpassen, denn durch die Spiegelung ändert sich das Vorzeichen beim Rotationswinkel.

    Eigentlich ganz einfach, aber man muss erst mal darauf kommen :-)

Hey Fremder!

Sieht so aus als wenn du neu hier bist. Wenn du mitmachen willst, drücke einen dieser Buttons!

In dieser Diskussion

  • fZap Februar 2014
  • jow Februar 2014