Am 04.12.15 um 18:47 schrieb si...@publcif.co.uk:
>
> Thanks for this Angel
>
> My task was to effectively "crop" the model so that a static image
> could be created that was as large as possible with respect to the
> model, but also exactly reflected what would be seen in the applet -
> i.e. the static image could be used in e.g. a PDF but scaled to a
> 'thumbnail' size, but still had minimal margins and still represented
> what the associated applet would show.
>
> Anyway, a script such as:
>
> zoom {visible} 0;
> rotate best;
> refresh;
> margin=15;
> c=0;
> while ({visible}.sx.all.max < _width-margin && {visible}.sx.all.min >
> margin && {visible}.sy.all.max < _height-margin &&
> {visible}.sy.all.min > margin ) {
>    zm=100+c;
>    zoom {visible} @zm;
>    refresh;
>    c=c+1;
>    if (c>100) {break;}
> }
> echo @c;
>
> achieves this nicely and shows that in many cases there is room for a
> zoom of 130+ percent.
>
> Unfortunately, however, the script requires calling 'refresh' in order
> to update
> the screen coordinates of the model (.sx, .sy), which it seems is not
> possible when running the script from the command line to generate a
> static image (i.e. running the jmol application with -ionx and the
> script contained in an spt file) - which is essential to my task,
> which involves automated production of print content and html content
> without user intervention.
>
> So at the moment I'm left with having to 'crop' the static images for
> print use and reproducing the 'crop' effect in the html versions - not
> a major problem, but it would have been nice to have just had the one
> image with the load script embedded, etc., which could then be used
> for print and html...
>
> Anyway, if anyone has any suggestions regarding running the jmol
> application 'headless' with scripts that appear to require an 'event
> loop' I'd be very grateful...
>
The 'point({x,y,z},true)' function to calculate the screen coordinates 
does work headless in Jmol 14.4.0. So you can determine the minima and 
maxima in a loop (startZoom set to '80' for testing):

---- scriptfile 'autozoom.spt' --------
startZoom = 80
zoom {visible} @startZoom;
rotate best;
margin=15;
c=0;

function getScreenBoundary(atomSet) {
   if (atomSet.type == "bitset") {
     var screenMinX = "";
     var screenMaxX = "";
     var screenMinY = "";
     var screenMaxY = "";
     for (var i from [1 atomSet.size]) {
       var screenXYZ = point(atomSet[i].xyz, true);
       if (screenMinX == "") {
         screenMinX = screenXYZ.x;
         screenMaxX = screenXYZ.x;
         screenMinY = screenXYZ.y;
         screenMaxY = screenXYZ.y;
       } else {
         screenMinX = [screenMinX, screenXYZ.x].min;
         screenMaxX = [screenMaxX, screenXYZ.x].max;
         screenMinY = [screenMinY, screenXYZ.y].min;
         screenMinY = [screenMinY, screenXYZ.y].min;
       }
     }
     return [screenMinX, screenMaxX, screenMinY, screenMaxY];
   }
}

sxInfo = getScreenBoundary({visible});
while (sxInfo[2] < _width-margin && sxInfo[1] > margin && sxInfo[4] < 
_height-margin && sxInfo[3] > margin ) {
   zm=startZoom+c;
   zoom {visible} @zm;
   c=c+1;
   if (c>100) {break;}
   sxInfo = getScreenBoundary({visible});
}
print "c=" + c;

------ Headless Jmol call ----------------------------
java -jar JmolData.jar -g800x800 -J 'load =1deh; script "autozoom.spt"; 
write PNGJ 9 "autozoom-test.png";'
------------------------------------------------------

Regards,
Rolf


------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741911&iu=/4140
_______________________________________________
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users

Reply via email to