Formatvorlagen für Grafikelemente

(Übersetzung von Rick Quatros FrameScript Tutorial »Styles for FrameMaker Graphics)

Wenn Sie viel mit FrameMaker-Grafiken arbeiten, zum Beispiel Linien mit Pfeilspitzen, kann allein der Gedanke, diese Grafiken nachträglich ändern zu müssen, zum reinsten Albtraum werden. Wäre es da nicht toll, wenn Sie »Formatvorlagen« für Grafikobjekte hätten? Mit FrameScript können Sie Ihren Grafiken »Stile« zuweisen, sodass Sie deren Eigenschaften global ändern können.

Der Schlüssel liegt in einer verborgenen Eigenschaft nahezu aller FrameMaker-Objekte: der Eigenschaft UserString. Dabei handelt es sich um eine String-Eigenschaft, in der Sie Informationen über ein Objekt speichern können. Über die Benutzeroberfläche von FrameMaker haben Sie allerdings keinen Zugriff auf diese Eigenschaft.

Sehen Sie sich als Beispiel die einfache Abbildung unten an. Jede der Beschriftungslinien hat eine Strichstärke von 0,5pt und die Pfeilspitzeneigenschaften werden im Dialogfeld angezeigt.

FrameScript Graphic Styles Example
FrameScript Graphic Styles Arrow Head Design

Ändern des Stils

Gehen wir davon aus, dass die Eigenschaft UserString jeder Beschriftungslinie bereits auf »Callout« (Beschriftung) gesetzt ist. Wie Sie diesen Wert setzen, erfahren Sie später. So einfach ist es, die Eigenschaften global zu ändern:

// Erstellen einer Liste mit neuen Eigenschaften.
New PropertyList NewVar(vCalloutProps);
Add Property To(vCalloutProps) LineCap(0);
Add Property To(vCalloutProps) ArrowTipAngle(24);
Add Property To(vCalloutProps) ArrowTipAngle(6);
Add Property To(vCalloutProps) ArrowLength(9pt);
Add Property To(vCalloutProps) BorderWidth(1.5pt);
// Schleife durch die Grafiken und Ändern aller Callout-Objekte.
Set vGraphic = ActiveDoc.FirstGraphicInDoc;
Loop While(vGraphic)
  If (vGraphic.UserString = 'Callout') // Prüfen des Stilnamens
    Set vGraphic.Properties = vCalloutProps;
  EndIf
  Set vGraphic = vGraphic.NextGraphicInDoc;
EndLoop

Der Vorteil an Eigenschaftslisten (PropertyList) liegt darin, dass Sie nur die Eigenschaften angeben müssen, die Sie tatsächlich ändern möchten. Wenn Sie nur die Strichstärke ändern möchten, müssen Sie nur die BorderWidth in die Eigenschaftsliste vCalloutProps übernehmen.

Zuweisen der UserString-Eigenschaft

Eine wichtige Frage bleibt allerdings offen: Wie weisen Sie der UserString-Eigenschaft Ihres Objekts einen Wert zu? Der folgende Code erfüllt genau diese Aufgabe für eine ausgewählte Grafik:

Set vGraphic = ActiveDoc.FirstSelectedGraphicInDoc;
If (vGraphic)
  Set vGraphic.UserString = 'Callout';
Else
  MsgBox 'Keine Grafik ausgewählt.';
EndIf

So erzeugen Sie eine Eingabeaufforderung für den UserString einer ausgewählten Grafik:

Set vGraphic = ActiveDoc.FirstSelectedGraphicInDoc;
If (vGraphic = 0)
  MsgBox 'Keine Grafik ausgewählt.';
  LeaveSub;
Else
  DialogBox Type(String) Title('Stilnamen eingeben:')
  NewVar(vStyle) Button(vButton);
  If (vButton = CancelButton)
    LeaveSub;
  Else
    Set vGraphic.UserString = vStyle;
  EndIf
EndIf

Wenn es sich bei allen Linien in einem verankerten Rahmen um Beschriftungslinien handelt, können Sie mit folgendem Code allen Linien eine Eigenschaft UserString zuweisen:

Set vFrame = ActiveDoc.FirstSelectedGraphicInDoc;
If (vFrame = 0)
  MsgBox 'Wählen Sie einen verankerten Rahmen aus.';
  LeaveSub;
Else
  DialogBox Type(String) Title('Stilnamen eingeben:')
  NewVar(vStyle) Button(vButton);
  If (vButton = CancelButton)
    LeaveSub;
  Else
    Set vGraphic = vFrame.FirstGraphicInFrame;
    Loop While(vGraphic)
      If (vGraphic.ObjectName = 'Line')
        Set vGraphic.UserString = vStyle;
      EndIf
      Set vGraphic = vGraphic.NextGraphicInFrame;
    EndLoop
  EndIf
EndIf

Zuweisen eines UserString beim Erstellen der Beschriftungslinien

Wenn Sie einen Stil für Beschriftungslinien verwenden, erfolgt das Einfügen in zwei Schritten. Zunächst zeichnen Sie die Linie mit der Pfeilspitze und anschließend weisen Sie der Linie die Eigenschaft UserString zu. In folgendem Beispiel führen Sie beide Schritte mithilfe eines Skripts aus. Wählen Sie einen verankerten Rahmen aus, bevor Sie den Code ausführen.

New PointList NewVar(vPointList) X(6pt) Y(12pt) X(78pt) Y(12pt);
New PropertyList NewVar(vCalloutProps);
Add Property To(vCalloutProps) HeadArrow(1);
Add Property To(vCalloutProps) UserString('Callout');
Set vFrame = ActiveDoc.FirstSelectedGraphicInDoc;
If (vFrame = 0)
  MsgBox 'Wählen Sie einen verankerten Rahmen aus.'; 
  LeaveSub;
Else
  New Line NewVar(vLine) ParentObject(vFrame) Points(vPointList);
  Set vLine.Properties = vCalloutProps;
EndIf
Set vLine.GraphicIsSelected = 1;

Die letzte Zeile im Skript wählt die neue Linie aus, sodass Sie diese in die gewünschte Position verschieben können. Wenn Sie diese Zeile nicht einfügen, bleibt nach Ausführung des Skripts der verankerte Rahmen ausgewählt. Alle weiteren Eigenschaften, die Sie der Beschriftungslinie zuweisen möchten, müssen zur Eigenschaftsliste vCalloutProps am Anfang des Skripts hinzugefügt werden. Das Wichtigste ist das Setzen eines Werts für UserString, damit Ihre Beschriftung mit einem »Stil« verknüpft wird.

Außerdem legt die erste Zeile des Skripts die Position der Endpunkte der Beschriftungslinie fest. Sie können beliebig viele Punktepaare hinzufügen. Mit diesem Code

New PointList NewVar(vPointList)
    X(6pt) Y(12pt) 
    X(6pt) Y(84pt) 
    X(78pt) Y(84pt);

können Sie rechtwinklige Linien wie diese erstellen:

FrameScript Graphic Styles Example

Außerdem können Sie eine Schleife programmieren, um mehrere Beschriftungslinien gleichzeitig hinzuzufügen.

New PropertyList NewVar(vCalloutProps);
Add Property To(vCalloutProps) HeadArrow(1);
Add Property To(vCalloutProps) UserString('Callout');
Set vFrame = ActiveDoc.FirstSelectedGraphicInDoc;
If (vFrame = 0)
  MsgBox 'Wählen Sie einen verankerten Rahmen aus.'; 
  LeaveSub;
Else
  DialogBox Type(Int) Title('Anzahl der Linien')
          Init(5) NewVar(vQty) Button(vButton);
  If (vButton = CancelButton)
    LeaveSub;
  Else
    Set vTopOffset = 12pt
    Loop While(vCounter <= vQty) LoopVar(vCounter)
            Init(1) Incr(1)
      New PointList NewVar(vPointList)
         X(6pt) Y(vTopOffset) 
         X(78pt) Y(vTopOffset);
      New Line NewVar(vLine) ParentObject(vFrame)
         Points(vPointList);
      Set vLine.Properties = vCalloutProps;
      Set vTopOffset = vTopOffset + 12;
    EndLoop
  EndIf
EndIf

FrameScript Graphic Styles Example

Ein verborgener Schatz wird zur Goldmine

Sie werden für Ihre Skripts viele nützliche Verwendungszwecke der Eigenschaft UserString entdecken. Ich benutze sie in Dutzenden von Skripts. Lassen Sie mich mit einer Anregung schließen, die Sie für sich selbst erkunden können. Wenn Sie Grafiken nicht über einen Verweis, sondern durch Kopieren importieren, können Sie den Pfad der Grafik ebenfalls als UserString speichern, damit Sie später bei Bedarf die Quelle wieder finden können. Und Sie können mit FrameScript beim Import einer Grafik den Pfad auch automatisch der Eigenschaft UserString zuweisen.

Mai 2009, Michael Müller-Hillebrand