[FIXED] So fügen Sie programmatisch eine Füllebene in Photoshop hinzu

Ausgabe

Mein Ziel ist es, Maßstabsleisten programmgesteuert zu definieren, die eine feste Länge haben, aber nachträglich vom Grafikdesigner geändert werden können.

Ich bin so weit gekommen, einen geschlossenen Pfad innerhalb des Dokuments zu definieren:

def addLine(doc):
    
    def point(x, y):
        result      = Dispatch("Photoshop.PathPointInfo")
        result.Kind = 2 # for PsPointKind --> 2 (psCornerPoint)
        result.LeftDirection = result.rightDirection = result.Anchor = (x, y)
        return result

    points = [    
              point(100, 100),
              point(200, 100),
              point(200, 110),
              point(100, 110)
              ]

    lineSubPathArray               = Dispatch("Photoshop.SubPathInfo")
    lineSubPathArray.Operation     = 1 #for PsShapeOperation --> 1 (psShapeAdd
    lineSubPathArray.Closed        = True
    lineSubPathArray.EntireSubPath = points
    
    myPathItem = doc.PathItems.Add("bar-path", [lineSubPathArray])

Von hier aus kann ich das gespeicherte Dokument wieder in Photoshop (CS6) laden und dann manuell eine Formebene erstellen: Ebene | Neue Füllebene | einfarbig …

Dies führt zu einer Formebene, ähnlich der, die ich mit dem Linienwerkzeug erhalte, in der die Linie effektiv ein Rechteck ist, dessen Höhe später geändert werden kann.

Erste Frage: Wie erstellt man die Füllebene mit der API?

Zweitens: Ich habe ein Rechteck mit einer Breite von 100 Pixeln definiert, aber ich bekomme ein Rechteck mit einer Breite von 418 Pixeln. Das Dokument hat seinen doc.application.preferences.rulerUnitsSatz auf psPixels(1). Warum ist das?

Zuletzt: Ist es nicht möglich, eine Linie als echte Linie zu definieren, die durch zwei Endpunkte definiert ist, und ihre Strichbreite anstelle ihrer Höhe festzulegen?

Lösung

Es gibt zwei Lektionen, die ich aus der Übersetzung der Lösung von Ghoul Fool in Python gelernt habe:

  1. Bei der Verwendung von COM in Python kann man viele Fehler machen, die unbemerkt bleiben, außer kryptischen Fehlermeldungen, die weit über den Punkt hinausgehen. Dazu gehören syntaktische Fehler wie fehlende/überflüssige Klammern und falsche Groß-/Kleinschreibung.
  2. Lösungen, die mit COM in Python arbeiten, funktionieren nicht gleich mit der Python-Photoshop-API und umgekehrt, obwohl nach dem Quellcode der Bibliothek anscheinend genau dasselbe passiert. Ich war nicht immer in der Lage, Lösungen zu erahnen, die in beide Richtungen funktionieren.

Hier ist, für diejenigen, die später zu dieser Frage gekommen sind, was ich herausgefunden habe, um eine Formebene mit einem Balken zu erhalten, der nachträglich in der Höhe geändert werden kann. Die aufgerufene Aktion ist nichts anderes als eine Aufnahme von New Fill Layer aus dem Layer-Menü (CS6):

def makeBar(doc):
    app = doc.parent    
    app.preferences.rulerUnits = Units.Pixels
    
    def point(x, y):
        result               = Dispatch("Photoshop.PathPointInfo")
        result.Kind          = PointKind.CornerPoint
        result.LeftDirection = result.rightDirection = result.Anchor = (x, y)
        return result

    points = [    
              point(100, 100),
              point(200, 100),
              point(200, 110),
              point(100, 110)
              ]

    lineSubPathArray               = Dispatch("Photoshop.SubPathInfo")
    lineSubPathArray.Operation     = ShapeOperation.ShapeAdd
    lineSubPathArray.Closed        = True
    lineSubPathArray.EntireSubPath = points
    
    doc.PathItems.Add("bar-path", [lineSubPathArray])



app = Dispatch("Photoshop.Application")
doc = app.Open(self.fileName)

Was meine zweite Frage angeht: Die Einheit der Eckpunkte des Pfades ist immer in Points, egal wie die Lineale eingestellt sind.


Beantwortet von –
user508402


Antwort geprüft von –
Candace Johnson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like