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.rulerUnits
Satz 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:
- 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.
- 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)