AliasIO / Raphael.FreeTransform

Free transform tool for Raphaël elements.
http://elbertf.com
362 stars 107 forks source link

a bug with Raphael.Json #123

Open bcw104 opened 10 years ago

bcw104 commented 10 years ago

1.do some transform and export by Raphael.Json. 2.then import by Raphael.json, it can't init transform correctly.

you can test the bug in here: http://jsfiddle.net/bcw104/MvNvL/11/

dhardtke commented 10 years ago

I have the same issue...

bcw104 commented 10 years ago

@dhardtke I found a solution by change the raphael.json.js, do not use matrix.toTransformString(), use el.transform().toString():

(function () {
    Raphael.fn.toJSON = function (callback) {
        var data, elements = new Array, paper = this ;

        for (var el = paper.bottom; el != null; el = el.next) {
            data = callback ? callback(el, new Object) : new Object;

            if (data) elements.push({
                data: data,
                type: el.type,
                attrs: el.attrs,
//              transform: el.matrix.toTransformString(),
                transform: el.transform().toString(),
                id: el.id
            });
        }

        var cache = [];
        var o = JSON.stringify(elements, function (key, value) {
            //http://stackoverflow.com/a/11616993/400048
            if (typeof value === 'object' && value !== null) {
                if (cache.indexOf(value) !== -1) {
                    // Circular reference found, discard key
                    return;
                }
                // Store value in our collection
                cache.push(value);
            }
            return value;
        });
        cache = null;
        return o;
    }

    Raphael.fn.fromJSON = function (json, callback) {
        var el, paper = this ;

        if (typeof json === 'string') json = JSON.parse(json);

        for (var i in json) {
            if (json.hasOwnProperty(i)) {

                el = paper[json[i].type]().attr(json[i].attrs);
                if (json[i].transform != null) {
                    el.transform(json[i].transform);
                }

                el.id = json[i].id;

                if (callback) el = callback(el, json[i].data);

//              if ( el ) paper.set().push(el);
            }
        }
    }
})();
dhardtke commented 10 years ago

Maybe you should fork raphael.json and create a pull request for this? :)