[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:00052] Java3Dでの印刷サンプルで縦横比が...



◆格安メーリングリスト◆====================
 『もう久しぶりなんて言わない』
       『だってMLでいつも話してるから!』
 <<初心者だってDNSなら安心サポート>>
===== http://www.dns-ml.co.jp/ml+.html =====

Sun の Java3D メーリングリスト(英語)で見つけたサンプルを使って、
Java3D から印刷してみました。

 http://java.sun.com/products/java-media/mail-archive/3D/0073.html

画面に ColorCube が表示され、ボタンを押すと印刷できるのですが、
キヤノン BJC-700 で印刷したところ、ポートレート(用紙縦)のときは
縦長に、ランドスケープ(用紙横)のときは横長に印刷されます。
どうも用紙の縦横比の計算がうまくできていないようなのですが...
(80〜90行目あたりがあやしいような気がします)

      1 import java.awt.*;
      2 import java.awt.event.*;
      3 import java.awt.geom.*;
      4 import java.awt.image.BufferedImage;
      5 import java.awt.print.*;
      6 import com.sun.j3d.utils.geometry.ColorCube;
      7 import com.sun.j3d.utils.universe.*;
      8 import javax.media.j3d.*;
      9 import javax.vecmath.*;
     10 
     11 public class Print3D extends Frame{
     12   MyCanvas3D  c3d;
     13   public Print3D()
     14   {
     15     super("Print3D");
     16     Panel panel = new Panel( new BorderLayout());
     17     add( panel);
     18     panel.add( "Center", c3d = new MyCanvas3D());
     19     panel.add( "North", createPrintButton());
     20     setVisible( true);
     21     setSize( 600, 600);
     22   }
     23 
     24   Button  createPrintButton()
     25   {
     26     Button button = new Button("Print");
     27     button.addActionListener( new ActionListener() {
     28       public void actionPerformed( ActionEvent ae)
     29       {
     30         Thread printThread = new Thread( new Runnable() {
     31           public void run()
     32           {
     33             PrinterJob printerJob = PrinterJob.getPrinterJob();
     34             PageFormat pageFormat = printerJob.pageDialog( printerJob.defaultPage());
     35             printerJob.setPrintable( c3d, pageFormat);
     36 
     37             try {
     38               if( printerJob.printDialog())
     39                 printerJob.print();
     40             } catch ( Exception e) { e.printStackTrace(); }
     41           }
     42         });
     43         printThread.start();
     44       }
     45     });
     46     return button;
     47   }
     48 
     49 public static void main(String[] args)
     50  { new Print3D(); }
     51 }
     52 
     53 class MyCanvas3D extends Canvas3D implements Printable{
     54   BufferedImage    printImage = null;
     55   AffineTransform    printTransform = null;
     56   Raster        printRaster;
     57   boolean        readRaster;
     58 
     59   public MyCanvas3D()
     60   {
     61     super( null);
     62     BranchGroup scene = createSceneGraph();
     63     SimpleUniverse u = new SimpleUniverse(this);
     64     u.getViewingPlatform().setNominalViewingTransform();
     65     u.addBranchGraph(scene);
     66   }
     67 
     68   public  int  print( Graphics graphics, PageFormat pageFormat, int pageIndex)
     69   {
     70    if (pageIndex > 0)
     71     {
     72       printImage = null;
     73       printTransform = null;
     74       return Printable.NO_SUCH_PAGE;
     75     }
     76     if( printImage == null)
     77     {
     78       printImage = getBufferedImage();
     79 
     80       Rectangle2D.Double pS = new Rectangle2D.Double(
     81         pageFormat.getImageableX(), pageFormat.getImageableY(),
     82         pageFormat.getImageableWidth(), pageFormat.getImageableHeight());
     83       Rectangle2D.Double iS = new Rectangle2D.Double(
     84         0, 0, printImage.getWidth(null), printImage.getHeight(null));
     85       double xScale = pS.getWidth()/iS.getWidth();
     86       double yScale = pS.getHeight()/iS.getHeight();
     87       printTransform = new AffineTransform();
     88       printTransform.translate(-iS.getX(), -iS.getY());
     89       printTransform.scale( xScale, yScale);
     90       printTransform.translate( pS.getX()/xScale, pS.getY()/yScale);
     91     }
     92 
     93     (( Graphics2D) graphics).drawImage( printImage, printTransform, null);
     94 
     95     return Printable.PAGE_EXISTS;
     96   }
     97 
     98   public BufferedImage getBufferedImage()
     99   {
    100     readRaster = true;
    101     setSize( getWidth()-1, getHeight());
    102     while( readRaster == true)
    103       Thread.currentThread().yield();
    104     return printRaster.getImage().getImage();
    105   }
    106 
    107   public void postSwap()
    108   {
    109     super.postSwap();
    110     if ( readRaster)
    111     {
    112       BufferedImage bImage = new BufferedImage(
    113         getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    114       ImageComponent2D imageComponent = new ImageComponent2D(
    115         ImageComponent.FORMAT_RGB, bImage);
    116       printRaster = new Raster(
    117         new Point3f(0.0f,0.0f,0.0f),  Raster.RASTER_COLOR, 0, 0,
    118         bImage.getWidth(), bImage.getHeight(), imageComponent, null);
    119       getGraphicsContext3D().readRaster( printRaster);
    120       readRaster = false;
    121     }
    122   }
    123 
    124   BranchGroup createSceneGraph()
    125   {
    126     BranchGroup objRoot = new BranchGroup();
    127     Transform3D spin = new Transform3D();
    128     Transform3D tempspin = new Transform3D();
    129     spin.rotX(Math.PI/4.0d);
    130     tempspin.rotY(Math.PI/5.0d);
    131     spin.mul(tempspin);
    132     TransformGroup objTrans = new TransformGroup(spin);
    133     objRoot.addChild(objTrans);
    134     objTrans.addChild(new ColorCube(0.4));
    135     Background  bgNode = new Background( new Color3f( 1.0f, 1.0f,1.0f));
    136     bgNode.setApplicationBounds(
    137       new BoundingSphere( new Point3d(0.0, 0.0, 0.0), 100.0));
    138     objRoot.addChild( bgNode);
    139 
    140     objRoot.compile();
    141     return objRoot;
    142   }
    143 }
------------------------------------------------------------------
遠藤靖之 (えんどう やすゆき) <yasuyuki@xxxxxxxxxx>
http://www.freepage.total.co.jp/jfriends/ (Java互助会ホームページ)
株式会社タイムインターメディア 情報通信サービス部 TEL 03-5362-9009
〒162-0065 新宿区住吉町3-11 新宿スパイアビル8F    FAX 03-5362-9008