Suche // Search:

14.03.2010

FormCalc Diagramme Teil 1 - Säulendiagramm
//
FormCalc Charts Pt.1 - Bar Charts

Ein riesen Manko am LiveCycle Designer ist, dass er keine Diagramme aus den Formulardaten erstellen kann, so wie das Excel kann.
Mit etwas Einsatz vom FormCalc, kann man dies aber (schnell) beseitigen.
Dieses Beispiel ist eine Weiterentwicklung des Scripts, dass ich vor knapp einem Jahr im Acrobatusers.com-Forum geposted habe.

Es besteht aus einer Tabelle zum Eingeben der Daten (Beschreibung und Wert sowie Farbe) und einem Teilformular mit einem verstecktem Feld, dass die Diagramme per FormCalc quasi in Echtzeit berechnet.

One of LiveCycle Designers flaws is, that it can't generate chart from the form data such as Excel does.
But with some FormCalc experiences this can be solved.
This example is a new version of a script I posted about a year ago in the Acrobatusers.com community.

It contains a table for the inputs (label, value and color) and a subform with a hidden field that calculates the chart quasi in realtime.

FormCalc-Script:

var nCharts = Input.Table.ChartValues.instanceManager.count

_Chart.setInstances(nCharts)

var CurrentInstance = $.parent.index
var ChartValue = Input.Table.ChartValues[CurrentInstance].Amount
var ChartLabel = Input.Table.ChartValues[CurrentInstance].Label.value.text.value
var ChartColor = Input.Table.ChartValues[CurrentInstance].Color.value.text.value
var ChartMod = UnitValue(ChartValue / 25.4)
var Maximum = UnitValue(105 / 25.4)

if(ChartMod > Maximum) then
ChartMod = Maximum
zLine.presence = "visible"
elseif(ChartMod <= Maximum) then
zLine.presence = "invisible"
endif


var ChartMove = Round(UnitValue(ChartMod * 25.4))
var ContainerHeight = Round(UnitValue(Output.Chart.h))
var ChartStart = ContainerHeight
var ChartEnd = ChartStart - ChartMove

if (ChartValue >= 0) then
Bar.presence = "visible"
Bar.h = ChartMod
Bar.y = UnitValue(ChartEnd / 25.4 )
BarValue.value.text.value = ChartValue
BarValue.y = UnitValue(ChartEnd / 25.4 )
BarLabel.presence = "visible"
BarLabel.value.text.value = ChartLabel
BarLabel.y = UnitValue(ChartEnd / 25.4 )

if(ChartColor == "O")then
Bar.value.rectangle.fill.color.value = "255,153,0"
elseif(ChartColor == "R") then
Bar.value.rectangle.fill.color.value = "255,0,0"
elseif(ChartColor == "B") then
Bar.value.rectangle.fill.color.value = "0,0,255"
elseif(ChartColor == "G") then
Bar.value.rectangle.fill.color.value = "0,255,0"
endif

else
Bar.presence = "invisible"
Bar.presence = "invisible"
BarLabel.presence = "invisible"
endif

Säulendiagramm // Bar Chart:


Beispiel // Example:
https://workspaces.acrobat.com/app.html#d=KROi8eYubRAHc4ArxFUK7A

XML-Daten // XML-Data:
https://workspaces.acrobat.com/app.html#d=VfgJO9dH1bSss-7zu8nk7g

Kommentare:

  1. Ich bin Anfänger auf diesem Gebiet und finde Ihre Diagramme super. Ich habe gesehen, dass Sie mit FomCalc ein Säulendiagramm erschaffen haben. Ich weiß aber nicht genau, welches Objekt ich benutzen muss, um den Formcalc-Code anzugeben und welches Teil Ihres Codes der Tabelle entspricht.
    Wenn ich eine statische Tabelle habe, wo in Ihrem Code muss ich diese dann auswählen und welches Objekt muss ich benutzen, um Ihren Code anzugeben? Ein Teilformular?

    AntwortenLöschen
  2. Schön, dass Ihnen das Beispiel gefällt.
    Ich verwende hier ein ausgeblendetes numerisches Feld namens 'Trigger', um die Berechnungen auszuführen. Die Objektart spielt letztlich keine wirkliche Rolle. Sie können das Skript auch in jedem anderen Objekt verwendet, dass das calculate Event unterstützt.
    Alternativ können Sie es auch in das click Event einer Schaltfläche platzieren, dann erfolgt die Berechnung z.B. nur auf Knopfdruck.

    Das Beispiel ist bewusst darauf ausgelegt, dass die Ausgangsdaten in einer dynamischen Tabelle vorliegen, da es so viel einfacher ist, mehrere Werte abzufragen. Der Code ist viel kompakter und übersichtlicher, da man nur eine Schleife deklarieren muss. Des Weiteren verbraucht eine dynamische Tabelle weniger Platz im Formularentwurf, was weniger Speicherplatz benötigt. Ich empfehle immer dynamische Tabellen zu nehmen!

    AntwortenLöschen
  3. Hi Radzmar:

    The link to the eample points to a place cant access despite me having a adobe.com account. Is there another way of loading the examples?

    ron

    AntwortenLöschen
  4. Hi,

    I've fixed the broken links.

    AntwortenLöschen
  5. Hi radzmar, kannst Du mir sagen, wie der Trigger angesteuert wird? Ich möchte gern ein Diagramm ohne XML-Datei - und irgendwie funktioniert es nicht!

    AntwortenLöschen
  6. Das Diagramm wird über ein Skript im calculate Event des Objekts "Trigger" berechnet, also immer dann, wenn eine Berechnung im Formular ansteht.
    Die XML-Daten sind dafür nicht zwingend notwendig.
    Im der Beispieldatei kannst Du die Werte der Tabelle auch von Hand ändern.
    Das Diagramm wird dann unmittelbar neu berechnet.

    AntwortenLöschen
  7. Hallo das Diagramm ist Klasse, wie bekommt man sowas aber vertikal zu Stande?

    AntwortenLöschen