Formos skaičiavimo priklausomybių grafikas

HotPDF sukuria priklausomybių grafiką per įkeltos AcroForm skaičiavimo laukus, todėl reikšmės pakeitimas perskaičiuoja tik tuos skaičiavimus, kurie tranzityviai ją skaito, tokia tvarka, kai kiekviena perskaičiuota reikšmė jau matoma jį vartojantiems skaičiavimams

Grafiko sudarymas

THotPDF.BuildLoadedFormCalculationGraph grąžina momentinį vaizdą, priklausantį skambintojui. Kiekvienas laukas tampa mazgu; kiekvienas per /CO registruotas Calculate scenarijus statiškai analizuojamas naudojant HPDFExtractSafeJavaScriptFieldReferences, kuris nuskaito laukų pavadinimus, kuriuos paliečia saugaus poaibio scenarijus: kabutėse esančius AFSimple_Calculate("OP", ["a","b"]) argumentus ir kabutėse esančius getField("x") prieigų pavadinimus, aplenkdamas eilutės literalių, kad tekstiniai paminėjimai nebūtų laikomi nuorodomis

THPDFFormCalcGraph.ResolveLinks išsprendžia tuos pavadinimus į source → dependent briaunas ir surikiuoja taikinius topologiniu rūšiavimu. Laukai, esantys priklausomybių cikle, vietoj to išlaiko /CO dokumento tvarką, atitinkančią vieno praėjimo pilno perskaičiavimo semantiką; pakeistas laukas niekada neperskaičiuoja savo paties scenarijaus, todėl ciklai negali svyruoti pirmyn atgal, ir vartotojo įvesta reikšmė visada laimi. Šaltinio pavadinimai, kurie neatitinka jokio lauko, pranešami per UnresolvedFieldNameCount ir nesukuria briaunų, atkartodami vykdymo laiko sprendimo mechanizmą

Inkrementinis perskaičiavimas

RecalculateLoadedFormFieldsIncremental įvertina tik paveiktą duotų pakeistų laukų uždarąjį rinkinį. Rašymai per SetFormFieldValue ir SetLoadedFormFieldValueByName kaupia nešvarių reikšmių rinkinį; perkrova be parametrų perskaičiuoja iš to rinkinio, todėl FDF arba XFDF importas ir vėlesnis vieno praėjimo inkrementinis žingsnis atnaujina kiekvieną priklausomą skaičiavimą neliesdamas nesusijusių. Abi perkrovos ir pilnas RecalculateLoadedFormFields praėjimas po to sunaudoja nešvarių reikšmių rinkinį

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']);

Grafiko tikrinimas

Grafikas atskleidžia kiekvieno lauko skaičiavimo būseną (GetNode), visą vertinimo seką (AllTargets), paveiktą uždarąjį rinkinį (AffectedTargets), cikluose esančių taikinių skaičių (CyclicTargetCount) ir neišspręstus šaltinio pavadinimus, todėl įrankiai gali iš anksto peržiūrėti būtent tuos skaičiavimus, kuriuos suaktyvins redagavimas