⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threedtab.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: ThreeDTab.java * * Copyright (c) 2004 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING.  If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */package com.sun.electric.tool.user.dialogs.options;import com.sun.electric.database.geometry.GenMath;import com.sun.electric.database.text.TextUtils;import com.sun.electric.technology.Layer;import com.sun.electric.tool.user.Resources;import com.sun.electric.tool.user.User;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GridBagConstraints;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.font.FontRenderContext;import java.awt.font.GlyphVector;import java.awt.font.LineMetrics;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import javax.swing.DefaultListModel;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.ListSelectionModel;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;/** * Class to handle the "3D" tab of the Preferences dialog. */public class ThreeDTab extends PreferencePanel{    /** Creates new form ThreeDTab depending on if 3Dplugin is on or not */    public static ThreeDTab create3DTab(java.awt.Frame parent, boolean modal)    {        ThreeDTab tab = null;        Class<?> plugin = Resources.get3DClass("ui.JThreeDTab");        if (plugin != null)        {            try            {                Constructor instance = plugin.getDeclaredConstructor(new Class[]{java.awt.Frame.class, Boolean.class});                Object panel = instance.newInstance(new Object[] {parent, new Boolean(modal)});                tab = (ThreeDTab)panel;            }            catch (Exception e)            {                System.out.println("Cannot create instance of 3D plugin JThreeDTab: " + e.getMessage());            }        }        else            tab = new ThreeDTab(parent, modal);        return tab;    }	/** Creates new form ThreeDTab */	public ThreeDTab(java.awt.Frame parent, boolean modal)	{		super(parent, modal);		initComponents();	}	/** return the panel to use for this preferences tab. */	public JPanel getPanel() { return threeD; }	/** return the name of this preferences tab. */	public String getName() { return "3D"; }	private boolean initial3DTextChanging = false;	private JList threeDLayerList;	private DefaultListModel threeDLayerModel;	protected Map<Layer,GenMath.MutableDouble> threeDThicknessMap, threeDDistanceMap;	private JPanel threeDSideView;	/**	 * Method called at the start of the dialog.	 * Caches current values and displays them in the 3D tab.	 */	public void init()	{		threeDTechnology.setText("Layer cross section for technology '" + curTech.getTechName() + "'");		threeDLayerModel = new DefaultListModel();		threeDLayerList = new JList(threeDLayerModel);		threeDLayerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		threeDLayerPane.setViewportView(threeDLayerList);		threeDLayerList.clearSelection();		threeDLayerList.addMouseListener(new MouseAdapter()		{			public void mouseClicked(MouseEvent evt) { threeDValuesChanged(false); }		});		threeDThicknessMap = new HashMap<Layer,GenMath.MutableDouble>();		threeDDistanceMap = new HashMap<Layer,GenMath.MutableDouble>();        // Sorted by Height to be consistent with LayersTab		for(Layer layer : curTech.getLayersSortedByName())		{			if (layer.isPseudoLayer()) continue;			threeDLayerModel.addElement(layer.getName());			threeDThicknessMap.put(layer, new GenMath.MutableDouble(layer.getThickness()));			threeDDistanceMap.put(layer, new GenMath.MutableDouble(layer.getDistance()));		}		threeDLayerList.setSelectedIndex(0);		threeDHeight.getDocument().addDocumentListener(new ThreeDInfoDocumentListener(this));		threeDThickness.getDocument().addDocumentListener(new ThreeDInfoDocumentListener(this));		threeDSideView = new ThreeDSideView(this);		threeDSideView.setMinimumSize(new java.awt.Dimension(200, 450));		threeDSideView.setPreferredSize(new java.awt.Dimension(200, 450));		GridBagConstraints gbc = new GridBagConstraints();		gbc.gridx = 2;       gbc.gridy = 1;		gbc.gridwidth = 2;   gbc.gridheight = 4;		gbc.weightx = 0.5;   gbc.weighty = 1.0;		gbc.fill = GridBagConstraints.BOTH;		gbc.insets = new java.awt.Insets(4, 4, 4, 4);		threeD.add(threeDSideView, gbc);		threeDValuesChanged(false);	}	private class ThreeDSideView extends JPanel		implements MouseMotionListener, MouseListener	{		ThreeDTab dialog;		double lowHeight = Double.MAX_VALUE, highHeight = Double.MIN_VALUE;		ThreeDSideView(ThreeDTab dialog)		{			this.dialog = dialog;			addMouseListener(this);			addMouseMotionListener(this);			for(Iterator<Layer> it = dialog.curTech.getLayers(); it.hasNext(); )			{				Layer layer = it.next();				if (layer.isPseudoLayer()) continue;				if (!layer.isVisible()) continue;				GenMath.MutableDouble thickness = dialog.threeDThicknessMap.get(layer);				GenMath.MutableDouble distance = dialog.threeDDistanceMap.get(layer);				double dis = distance.doubleValue();				double thick = thickness.doubleValue() / 2;				double valLow = dis - thick;				double valHig = dis + thick;				if (valLow < lowHeight)					lowHeight = valLow;				if (valHig > highHeight)					highHeight = valHig;			}			lowHeight -= 4;			highHeight += 4;		}		/**		 * Method to repaint this ThreeDSideView.		 */		public void paint(Graphics g)		{			Dimension dim = getSize();			g.setColor(Color.WHITE);			g.fillRect(0, 0, dim.width, dim.height);			g.setColor(Color.BLACK);			g.drawLine(0, 0, 0, dim.height-1);			g.drawLine(0, dim.height-1, dim.width-1, dim.height-1);			g.drawLine(dim.width-1, dim.height-1, dim.width-1, 0);			g.drawLine(dim.width-1, 0, 0, 0);			String layerName = (String)dialog.threeDLayerList.getSelectedValue();			Layer selectedLayer = dialog.curTech.findLayer(layerName);			for(Iterator<Layer> it = dialog.curTech.getLayers(); it.hasNext(); )			{				Layer layer = it.next();				if (layer.isPseudoLayer()) continue;				//if (!layer.isVisible()) continue;				if (layer == selectedLayer) g.setColor(Color.RED); else					g.setColor(Color.BLACK);				GenMath.MutableDouble thickness = dialog.threeDThicknessMap.get(layer);				GenMath.MutableDouble distance = dialog.threeDDistanceMap.get(layer);				double dis = distance.doubleValue() + thickness.doubleValue()/2;				int yValue = dim.height - (int)((dis - lowHeight) / (highHeight - lowHeight) * dim.height + 0.5);				int yHeight = (int)(thickness.doubleValue() / (highHeight - lowHeight) * dim.height + 0.5);				if (yHeight == 0)				{					g.drawLine(0, yValue, dim.width/3, yValue);				} else				{					//yHeight -= 4;					int firstPart = dim.width / 6;					int pointPos = dim.width / 4;					g.drawLine(0, yValue-yHeight/2, firstPart, yValue-yHeight/2);					g.drawLine(0, yValue+yHeight/2, firstPart, yValue+yHeight/2);					g.drawLine(firstPart, yValue-yHeight/2, pointPos, yValue);					g.drawLine(firstPart, yValue+yHeight/2, pointPos, yValue);					g.drawLine(pointPos, yValue, dim.width/3, yValue);				}				String string = layer.getName();				Font font = new Font(User.getDefaultFont(), Font.PLAIN, 9);				g.setFont(font);				FontRenderContext frc = new FontRenderContext(null, true, true);				GlyphVector gv = font.createGlyphVector(frc, string);				LineMetrics lm = font.getLineMetrics(string, frc);				double txtHeight = lm.getHeight();				Graphics2D g2 = (Graphics2D)g;				g2.drawGlyphVector(gv, dim.width/3 + 1, (float)(yValue + txtHeight/2) - lm.getDescent());

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -