📄 view3dwindow.java
字号:
* @param ep the ElectricPrinter object. * @param pageFormat information about the print job. * @return false for now. */ public boolean initializePrinting(ElectricPrinter ep, PageFormat pageFormat) { return false;} /** * Method to print window using offscreen canvas. * @param ep printable object. * @return the image to print (null on error). */ public BufferedImage getPrintImage(ElectricPrinter ep) { BufferedImage bImage = ep.getBufferedImage(); //int OFF_SCREEN_SCALE = 3; // might have problems if visibility of some layers is switched off if (bImage == null) { //Forcint the repaint canvas.writePNG_ = true; canvas.repaint(); bImage = canvas.img;// // Create the off-screen Canvas3D object// if (offScreenCanvas3D == null)// {// offScreenCanvas3D = new J3DUtils.OffScreenCanvas3D(SimpleUniverse.getPreferredConfiguration(), true);// // attach the offscreen canvas to the view// u.getViewer().getView().addCanvas3D(offScreenCanvas3D);// // Set the off-screen size based on a scale3D factor times the// // on-screen size// Screen3D sOn = canvas.getScreen3D();// Screen3D sOff = offScreenCanvas3D.getScreen3D();// Dimension dim = sOn.getSize();// dim.width *= OFF_SCREEN_SCALE;// dim.height *= OFF_SCREEN_SCALE;// sOff.setSize(dim);// sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth() * OFF_SCREEN_SCALE);// sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight() * OFF_SCREEN_SCALE);// bImage = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB);// ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);//// offScreenCanvas3D.setOffScreenBuffer(buffer);// }// offScreenCanvas3D.renderOffScreenBuffer();// offScreenCanvas3D.waitForOffScreenRendering();// bImage = offScreenCanvas3D.getOffScreenBuffer().getImage(); ep.setBufferedImage(bImage); //Need to remove offscreen after that //u.getViewer().getView().removeCanvas3D(offScreenCanvas3D); } Graphics2D g2d = (Graphics2D)ep.getGraphics(); // In case of printing if (g2d != null) { AffineTransform t2d = new AffineTransform(); t2d.translate(ep.getPageFormat().getImageableX(), ep.getPageFormat().getImageableY()); double xscale = ep.getPageFormat().getImageableWidth() / (double)bImage.getWidth(); double yscale = ep.getPageFormat().getImageableHeight() / (double)bImage.getHeight(); double scale = Math.min(xscale, yscale); t2d.scale(scale, scale); try { ImageObserver obj = ep; g2d.drawImage(bImage, t2d, obj); } catch (Exception ex) { ex.printStackTrace(); return null; } } return bImage; } // ************************************* EVENT LISTENERS ************************************* //private int lastXPosition, lastYPosition; /** * Respond to an action performed, in this case change the current cell * when the user clicks on an entry in the upHierarchy popup menu. */ public void actionPerformed(ActionEvent e) { JMenuItem source = (JMenuItem)e.getSource(); // extract library and cell from string Cell cell = (Cell)Cell.findNodeProto(source.getText()); if (cell == null) return; setCell(cell, VarContext.globalContext, null); } // the MouseListener events public void mousePressed(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); /* View3DWindow wnd = (View3DWindow)evt.getSource(); WindowFrame.setCurrentWindowFrame(wnd.wf); WindowFrame.curMouseListener.mousePressed(evt); */ } public void mouseReleased(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //WindowFrame.curMouseListener.mouseReleased(evt); } /** * Method to rotate individual groups * @param values array of values */ public J3DUtils.ThreeDDemoKnot moveAndRotate(double[] values) { Vector3f newPos = new Vector3f((float)values[0], (float)values[1], (float)values[2]); double factor = 10; Quat4f quaf = J3DUtils.createQuaternionFromEuler(factor*values[3], factor*values[4], factor*values[5]); Transform3D currXform = new Transform3D(); for (Iterator<NodeInst> it = cell.getNodes(); it.hasNext();) { NodeInst ni = it.next(); Variable var = ni.getVar("3D_NODE_DEMO"); if (var == null) continue; List<Node> list = electricObjectMap.get(ni); for (int i = 0; i < list.size(); i++) { Node obj = list.get(i); TransformGroup grp = transformGroupMap.get(obj); grp.getTransform(currXform); currXform.setTranslation(newPos);// tmpVec.set(newPos);// boolean invert = true;// if (invert) {// currXform.mul(currXform, tmpVec);// } else {// currXform.mul(tmpVec, currXform);// } grp.setTransform(currXform); grp.getTransform(currXform); Matrix4d mat = new Matrix4d(); // Remember old matrix currXform.get(mat); //tmpVec.setEuler(rotation); // Translate to rotation point currXform.setTranslation(new Vector3d(values[6], values[7], values[8])); currXform.setRotation(quaf);// if (invert) {// currXform.mul(currXform, tmpVec);// } else {// currXform.mul(tmpVec, currXform);// } // Set old translation back Vector3d translation = new Vector3d(mat.m03, mat.m13, mat.m23); currXform.setTranslation(translation); // Update xform grp.setTransform(currXform); } } return(new J3DUtils.ThreeDDemoKnot(1, newPos, quaf, null)); } public void mouseClicked(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //WindowFrame.curMouseListener.mouseClicked(evt); pickCanvas.setShapeLocation(evt);// Transform3D t = new Transform3D();// Transform3D t1 = new Transform3D();// canvas.getImagePlateToVworld(t);// canvas.getVworldToImagePlate(t1); PickResult result = pickCanvas.pickClosest(); // Clean previous selection selectObject(false, true); if (result != null) { Shape3D s = (Shape3D)result.getNode(PickResult.SHAPE3D); if (s != null) { highlighter.addObject(new HighlightShape3D(s), cell); selectObject(true, true); } } WindowFrame.curMouseListener.mouseClicked(evt); } public void mouseEntered(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //showCoordinates(evt); //WindowFrame.curMouseListener.mouseEntered(evt); } public void mouseExited(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //WindowFrame.curMouseListener.mouseExited(evt); } // the MouseMotionListener events public void mouseMoved(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //showCoordinates(evt); //WindowFrame.curMouseMotionListener.mouseMoved(evt); } public void mouseDragged(MouseEvent evt) { //lastXPosition = evt.getX(); lastYPosition = evt.getY(); //showCoordinates(evt); //WindowFrame.curMouseMotionListener.mouseDragged(evt); } public void showCoordinates(MouseEvent evt) { View3DWindow wnd = (View3DWindow)evt.getSource(); if (wnd.getCell() == null) StatusBar.setCoordinates(null, wnd.wf); else { Point2D pt = wnd.screenToDatabase(evt.getX(), evt.getY()); UserInterface ui = Job.getUserInterface(); ui.alignToGrid(pt); StatusBar.setCoordinates("(" + TextUtils.formatDouble(pt.getX(), 2) + ", " + TextUtils.formatDouble(pt.getY(), 2) + ")", wnd.wf); } } // the MouseWheelListener events public void mouseWheelMoved(MouseWheelEvent evt) { WindowFrame.curMouseWheelListener.mouseWheelMoved(evt); } // the KeyListener events public void keyPressed(KeyEvent evt) { System.out.println("Here keyPressed");WindowFrame.curKeyListener.keyPressed(evt); } public void keyReleased(KeyEvent evt) { System.out.println("Here keyReleased");WindowFrame.curKeyListener.keyReleased(evt); } public void keyTyped(KeyEvent evt) { System.out.println("Here keyTyped");WindowFrame.curKeyListener.keyTyped(evt); } public Point getLastMousePosition() { //return new Point(lastXPosition, lastYPosition); return new Point(0,0); } // ************************************* COORDINATES ************************************* /** * Method to convert a screen coordinate to database coordinates. * @param screenX the X coordinate (on the screen in this EditWindow). * @param screenY the Y coordinate (on the screen in this EditWindow). * @return the coordinate of that point in database units. */ public Point2D screenToDatabase(int screenX, int screenY) { double dbX = 0, dbY = 0; /* = (screenX - sz.width/2) / scale3D + offx; double dbY = (sz.height/2 - screenY) / scale3D + offy; */ return new Point2D.Double(dbX, dbY); } /***************************************************************************** * To navigate in tree and create 3D objects * *****************************************************************************/ private class View3DEnumerator extends HierarchyEnumerator.Visitor { public View3DEnumerator(Cell cell) { // Checking if field poly and gate poly are not aligned. // If not, the extra polyhedra are generated to build like a LoCos shape Technology tech = cell.getTechnology(); Layer poly = tech.findLayerFromFunction(Layer.Function.POLY1, -1); Layer gate = tech.findLayerFromFunction(Layer.Function.GATE, -1); if (poly != null && gate != null && !DBMath.areEquals(poly.getDistance(), gate.getDistance())) { locosShape = true; } } /** */ public boolean enterCell(HierarchyEnumerator.CellInfo info) { if (job != null && job.checkAbort()) return false; if (!isSizeLimitOK(info.getCell().getNumArcs() + objTrans.numChildren())) return false; // limit reached AffineTransform rTrans = info.getTransformToRoot(); for(Iterator<ArcInst> it = info.getCell().getArcs(); it.hasNext(); ) { addArc(it.next(), rTrans, objTrans); } return true; } /** */ public void exitCell(HierarchyEnumerator.CellInfo info) {} /** */ public boolean visitNodeInst(Nodable no, HierarchyEnumerator.CellInfo info) { if (reachLimit) return false; if (job != null && job.checkAbort()) return false; NodeInst ni = no.getNodeInst(); AffineTransform trans = ni.rotateOutAboutTrueCenter(); AffineTransform root = info.getTransformToRoot(); if (root.getType() != AffineTransform.TYPE_IDENTITY) trans.preConcatenate(root); TransformGroup grp = objTrans; if (oneTransformPerNode) { grp = new TransformGroup(); grp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); grp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); grp.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND); grp.setCapability(TransformGroup.ALLOW_CHILDREN_READ); grp.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE); objTrans.addChild(grp); } addNode(ni, trans, grp); if (!isSizeLimitOK(grp.numChildren())) return false; // limit reached // For cells, it should go into the hierarchy return ni.isExpanded();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -