[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