Graf závislostí výpočtů formuláře
HotPDF sestavuje graf závislostí polí formuláře, aby výpočty spouštěl ve správném a stabilním pořadí
Závislosti a cykly
Graf zachycuje odkazy mezi poli, určuje nezávislé větve a rozpoznává cykly. Cyklické nebo nevyhodnotitelné vztahy vracejí diagnostiku místo neurčitého výsledku Graf z THotPDF.BuildLoadedFormCalculationGraph je snapshot ve vlastnictví volajícího; každé pole se stane uzlem a každý Calculate skript registrovaný přes /CO se staticky analyzuje funkcí HPDFExtractSafeJavaScriptFieldReferences, která přečte názvy polí, jichž se skript z bezpečné podmnožiny dotýká: uvozované argumenty AFSimple_Calculate("OP", ["a","b"]) a uvozované názvy z přístupů getField("x")
Po změně definice pole nebo akce se graf zneplatní a při dalším požadavku znovu sestaví THPDFFormCalcGraph.ResolveLinks převede tyto názvy na hrany source → dependent a cíle uspořádá topologickým tříděním. Pole na cyklu závislostí místo toho zachovají pořadí /CO v dokumentu, což odpovídá sémantice jednoho průchodu při úplném přepočtu; změněné pole nikdy nepřepočítá svůj vlastní skript, takže cykly nemohou kmitat a hodnota zapsaná uživatelem vždy vyhraje. Zdrojové názvy, které neodpovídají žádnému poli, se hlásí přes UnresolvedFieldNameCount
Inkrementální přepočet
RecalculateLoadedFormFieldsIncremental vyhodnotí jen dotčenou uzávěru zadaných změněných polí. Zápisy přes SetFormFieldValue a SetLoadedFormFieldValueByName hromadí sadu změn; přetížení bez parametrů přepočítá z této sady, takže import FDF nebo XFDF následovaný jedním inkrementálním průchodem obnoví všechny závislé výpočty, aniž by se dotkl nesouvisejících. Obě přetížení i úplný průchod RecalculateLoadedFormFields pak sadu změn vyčerpají
PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Recomputes subtotal and total only, chained in one pass
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);
Inspekce grafu
Graf zpřístupňuje výpočetní stav každého pole (GetNode), úplné pořadí vyhodnocení (AllTargets), dotčenou uzávěru (AffectedTargets), počet cílů na cyklech (CyclicTargetCount) i nevyřešené zdrojové názvy, takže nástroje můžou přesně předvidět, které výpočty editace spustí