Discussion should now rather take place on the ticket page. Please ask for a trac account (this may take some time).
I am not sure that this json is sent to jmol at all. We also have a jmol_repr method. But maybe it is used in some three.js interfaces or in sagemathcloud. Now looking at other doctests. Le mercredi 25 janvier 2017 11:38:20 UTC+1, mjs...@gmail.com a écrit : > > Thanks for taking care of this. I see that you fixed the doctests too. > > However, doctests will also fail in the description of `json_repr` in file > `base.pyx`, in a few instances. > > More importantly, you absolutely should verify that you can send the > corrected json to jmol and have it work. > > > > El miércoles, 25 de enero de 2017, 11:14:56 (UTC+1), Frédéric Chapoton > escribió: >> >> I have created a ticket on trac ( >> https://trac.sagemath.org/ticket/22253#ticket) >> >> we do not use github and pulls, but trac tickets. >> >> I am going to post a branch there soon. >> >> Frederic >> >> Le mercredi 25 janvier 2017 11:12:11 UTC+1, mjs...@gmail.com a écrit : >>> >>> Markdown below: >>> >>> Bug report: Incorrect json representation for graphics. >>> >>> >>> ## Extended description >>> >>> The json representation for graphics (which I believe is intended for >>> Jmol), >>> is **not** correct json. To wit: >>> >>> sage: G = cube((0,0,0),1) >>> sage: obj_list = >>> sage.plot.plot3d.base.flatten_list(G.flatten().json_repr(G.default_render_params())) >>> sage: j = obj_list[0] >>> sage: print j # json >>> >>> >>> {vertices:[{x:0.5,y:0.5,z:0.5},{x:-0.5,y:0.5,z:0.5},{x:-0.5,y:-0.5,z:0.5},{x:0.5,y:-0.5,z:0.5},{x:0.5,y:0.5,z:-0.5},{x:-0.5,y:0.5,z:-0.5},{x:0.5,y:-0.5,z:-0.5},{x:-0.5,y:-0.5,z:-0.5}],faces:[[0,1,2,3],[0,4,5,1],[0,3,6,4],[5,4,6,7],[6,3,2,7],[2,1,5,7]],color:'#6666ff'} >>> >>> sage: import json >>> sage: json.loads(j) # Throws value error >>> >>> >>> ## Sage Version: >>> >>> sage: version() >>> 'SageMath Version 7.1, Release Date: 2016-03-20' >>> >>> ## Operating System: >>> >>> macOS Sierra Version 10.12.2 >>> >>> The bug is reproducible in other OSs, though. >>> >>> >>> ## Solution >>> >>> I've traced down the problem, but I don't know if I should submit a pull >>> request on Github >>> or what. Advice on what to do is welcome. >>> >>> The problem lies in the file `src/sage/plot/plot3d/index_face_set.pyx`, >>> where the json is generated. There are two problems with the generated json: >>> >>> 1. The quote signs used in the file are `'` and not `"` as per [Json >>> spec]( >>> http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf >>> ). >>> 2. Every dictionary key is unquoted, which is incorrect. Thus, a point >>> >>> {x:0,y:0,z:0} >>> >>> should really be >>> >>> {"x":0,"y":0,"z":0} >>> >>> as per Json spec. >>> >>> >>> In particular, the function `cdef inline format_json_vertex(point_c P):` >>> should read: >>> >>> cdef inline format_json_vertex(point_c P): >>> cdef char ss[100] >>> cdef Py_ssize_t r = sprintf_3d(ss, '{"x":%g,"y":%g,"z":%g}', >>> P.x, P.y, P.z) >>> return PyString_FromStringAndSize(ss, r) >>> >>> and lines 871 through 882 should read: >>> >>> if self.global_texture: >>> color_str = '"#{}"'.format(self.texture.hex_rgb()) >>> return ['{"vertices":%s,"faces":%s,"color":%s}' % >>> (vertices_str, faces_str, color_str)] >>> else: >>> color_str = "[{}]".format(",".join(['"{}"'.format( >>> Color(self._faces[i].color.r, >>> self._faces[i].color.g, >>> self._faces[i].color.b).html_color()) >>> for i from 0 <= i < >>> self.fcount])) >>> return ['{"vertices":%s,"faces":%s,"face_colors":%s}' % >>> (vertices_str, faces_str, color_str)] >>> >>> This will affect doctest output, btw. >>> >>> ## Workaround for existing installations: >>> >>> The silver lining is that even though the Json is incorrect, since it is >>> very simple, it can be easly corrected inline: >>> >>> import re >>> def correct_json(s): >>> """ >>> Correct the json returned by `Graphics3d.json_repr()`, which >>> contains the following >>> errors: >>> 1. it uses ' instead of " for strings. >>> 2. dictionary keys are not quoted. >>> >>> """ >>> j = re.sub(r"{\s*(\w+)\s*:\s*", r'{"\1":', s) >>> j = re.sub(r",\s*(\w+)\s*:\s*", r',"\1":', j) >>> j = re.sub(r"'", r'"', j) >>> return j >>> >>> Note that this `correct_json` does **not** work for general json, just >>> for the particularly simple json produced by the graphics3d module. >>> >>> >>> >>> >>> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.