in packages/playground/src/playground.ts [719:808]
    export function setProcessedModel(model: MakerJs.IModel, error?: string) {
        clearTimeout(setProcessedModelTimer);
        var oldUnits = getUnits();
        var oldMeasurement = processed.measurement;
        processed.model = model;
        processed.measurement = null;
        processed.error = error;
        var newUnits = getUnits();
        if (!error) {
            if (errorMarker) {
                errorMarker.clear();
                errorMarker = null;
            }
        }
        if (!processed.model) return;
        //now safe to render, so register a resize listener
        if (init && model) {
            init = false;
            initialize();
        }
        //todo: find minimum viewScale
        if (!makerjs.isPoint(processed.model.origin)) processed.model.origin = [0, 0];
        var newMeasurement = makerjs.measure.modelExtents(processed.model);
        makerjs.model.getAllCaptionsOffset(processed.model).forEach(caption => {
            makerjs.measure.increase(newMeasurement, makerjs.measure.pathExtents(caption.anchor), true);
        });
        processed.measurement = newMeasurement;
        if (!processed.measurement) {
            setProcessedModelTimer = setTimeout(function () {
                setProcessedModel(
                    new StraightFace(),
                    'Your model code was processed, but it resulted in a model with no measurement. It probably does not have any paths. Here is the JSON representation: \n\n' + mdCode(processed.model));
            }, 2500);
            return;
        }
        if ((!viewScale || oldUnits != newUnits) || (!isMeasurementEqual(oldMeasurement, newMeasurement) && checkFitToScreen.checked)) {
            fitOnScreen();
        }
        document.body.classList.remove('wait');
        if (newUnits)
            document.body.classList.add('has-units');
        else {
            document.body.classList.remove('has-units');
        }
        render();
        var measureText: string;
        if (processed.error) {
            setNotes(processed.error);
            //sync notes and checkbox
            if (checkNotes) checkNotes.checked = true;
            document.body.classList.remove('collapse-notes');
            measureText = '';
        } else {
            var size = getModelNaturalSize();
            measureText = size[0].toFixed(2) + ' x ' + size[1].toFixed(2) + ' ' + (newUnits || 'units');
            if (!updateLockedPathNotes()) {
                setNotesFromModelOrKit();
            }
        }
        if (measurementDiv) {
            measurementDiv.innerText = measureText;
        }
        if (onViewportChange) {
            onViewportChange();
        }
    }