// by Yong Yook Kim import java.awt.*; import java.applet.*; //import java.net.URL; //import java.net.MalformedURLException; import WarningDialog; class BeamView extends Frame { BeamControls controls; boolean mlflag=false; CheckboxMenuItem mlc; BeamCanvas c; SignDlg signDlg; TableInputDlg tin; TableOutputDlg tout; InputDrg inDrg; BeamView(){ setLayout(new BorderLayout()); setBackground(Color.white); setTitle("Beam View"); BeamCanvas c = new BeamCanvas(); tin = new TableInputDlg(c); tout = new TableOutputDlg(c); signDlg = new SignDlg(); inDrg = new InputDrg(); add("Center", c ); add("East", controls = new BeamControls(c)); MenuBar mb = new MenuBar(); Menu file = new Menu("File"); // file.add(new MenuItem("Send Results via E-mail")); file.add(new MenuItem("Exit")); mb.add(file); Menu option = new Menu("Option"); option.add(new MenuItem("Table Input")); option.add(new MenuItem("Table Output")); // option.add(new MenuItem("-")); // option.add(new MenuItem("Manual Input")); mlc= new CheckboxMenuItem("Mouse Input"); // option.add(mlc); // option.add(new MenuItem("Move Load")); mb.add(option); Menu help = new Menu("Help"); help.add(new MenuItem("Sign Convention")); help.add(new MenuItem("Load Input Convention")); // help.add(new MenuItem("Output")); mb.add(help); setMenuBar(mb); /* Dialog dle = new Dialog(this,"Error",true); dle.add(new Label("Input error : Out of range")); dle.add(new Button("OK")); dle.resize(100,75); */ } public boolean handleEvent(Event evt) { switch (evt.id) { // Application shutdown (e.g. user chooses Close from the system menu). //------------------------------------------------------------------ case Event.WINDOW_DESTROY: hide(); signDlg.hide(); tin.hide(); tout.hide(); inDrg.hide(); dispose(); System.exit(0); return true; default: return super.handleEvent(evt); } } public boolean action(Event evt, Object arg) { if (evt.target instanceof MenuItem) { String label=(String)arg; if (label.equals("Exit")) { hide(); signDlg.hide(); tin.hide(); tout.hide(); inDrg.hide(); dispose(); System.exit(0); return true; } else if (label.equals("Table Input")) { // TableInputDlg tin = new TableInputDlg(c); tin.show(); } else if (label.equals("Table Output")) { tout.show(); } // else if (mlc.getState()) else if (label.equals("Mouse Input")) { // c.mlflag=true; } else if (label.equals("Load Input Convention")) { inDrg.resize(350,240); inDrg.move(100,250); inDrg.show(); // WarningDialog wd = new WarningDialog(this,"Help is on its way!!"); // wd.show(); // getAppletContext.showDocument("http","www.aoe.vt.edu", // "~yongkm/java/BeamView/beamview.html"); } else if (label.equals("Sign Convention")) { signDlg.resize(280,320); signDlg.move(400,100); signDlg.show(); } else if (label.equals("Output")) { // getAppletContext.showDocument("http","www.aoe.vt.edu", // "~yongkm/java/BeamView/beamview.html"); } return true; } else return false; } public synchronized void show() { move(50, 50); super.show(); } // public void init() { // } /* public void start() { controls.enable(); } public void stop() { controls.disable(); } public boolean handleEvent(Event e) { if (e.id == Event.WINDOW_DESTROY) { System.exit(0); } return false; } */ /* public static void main(String args[]) { Frame f = new Frame("BeamView"); BeamView beamView = new BeamView(); beamView.init(); beamView.start(); f.add("Center", beamView); f.resize(600, 512); f.show(); } */ } class BeamCanvas extends Canvas { int noPoints=601; boolean startOver = true; double w = 0.; double w2 = 0.; double a = 0.; double c = 0.; double L=20.; double E=28000000.; double I=2.; int whichLoad=6; int whichBeam=0; int xs; double xi[]=new double[noPoints]; double vi[]=new double[noPoints]; double mi[]=new double[noPoints]; double yi[]=new double[noPoints]; double vSum[]=new double[noPoints]; double mSum[]=new double[noPoints]; double ySum[]=new double[noPoints]; double rr1sum; double rr2sum; double mm1sum; double mm2sum; double dheight; // height of diagram int y1; int y2; int i; int j; int jj; int k; int vY; // vertical location of shear x-axis int mY; // vertical location of moment x-axis int x1; int y1v,y1m,y1y; int x2; int y2v,y2m,y2y; int trix[] = new int[4]; int triy[] = new int[4]; double wt[] = new double[100]; double ab[] = new double[100]; double scaleV; double scaleM; double scaleY; double vMax; double vMin; double mMax; double mMin; int flx; int fly; int fleng; int xStep; int yStep; boolean add; int sx2; int kc; int ik; int numLine=50; // total number of arrows in distributed loads int asc=6; //scale of arrow head double maxX; int sx; // text location int sy; double sumMoment[][] = new double[100][2]; double sumForce[][] = new double[100][2]; // variable for summing concentrated load double sumDist[] = new double[noPoints]; // variable for summing distribulte load int momentCount=0; int forceCount=0; double totalDist =0.; // total Distribution load added. double dy=0.; // distributio load diagram x-axis.. CantileverBeam cantl; EndSupports sups; FixedEnds fixeds; OneFixOneSupport fixsup; Font font; boolean flag=false; double scaleYG=0.; double distScale=0.; // distributed load scale int x1f,y1f; boolean mlflag=false; // draw arrowHead void arrowHead(Graphics g) { trix[0]=flx; triy[0]=fly; trix[1]=flx+asc/3; triy[1]=fly-asc; trix[2]=flx-asc/3; triy[2]=fly-asc; //g.fillPolygon(trix,triy,3); g.drawLine(trix[0],triy[0],trix[1],triy[1]); g.drawLine(trix[0],triy[0],trix[2],triy[2]); } double chopDigit(double num,int n) { num*=Math.pow(10.,(double)n); return (double)( (long)(num + (num>0.?0.5:-0.5)) ) / Math.pow(10.,(double)n) ; } public void paint(Graphics g) { // test // beamView= new BeamView(); // if (beamView.mlc.getState()==true) g.drawString("Mouse Input",0,14); // else if (beamView.mlc.getState()==false) g.drawString("Mouse Input Not selected",0,14); // if (mlflag) g.drawString("Mouse Input",0,28); // else g.drawString("Mouse Input Not selected",0,28); g.setFont(new Font("Helvetica",Font.ITALIC,12)); Rectangle r = bounds(); int ls=r.width*8/10; numLine = r.width/10; // background g.setColor(Color.lightGray); g.fillRect(r.width/10, r.height * 2 / 8 + 16, ls+1, r.height/4-31); g.fillRect(r.width/10, r.height * 4 / 8 + 16, ls+1, r.height/4-31); g.setColor(Color.black); // If start over button is pressed, zero summation variables. if (startOver) { // initialize the diagram g.setFont(new Font("Helvetica",Font.BOLD,12)); g.drawString("Initialized",r.width/3,15); g.setFont(new Font("Helvetica",Font.ITALIC,12)); w=0.; a=0.; c=0.; whichLoad=6; for (i=0;ivMax) vMax=vSum[i]; if (vSum[i]mMax) mMax=mSum[i]; if (mSum[i]scaleY) { scaleY=Math.abs(ySum[i]); maxX=xi[i]; } } scaleV=vMax-vMin; scaleM=mMax-mMin; if (flag || scaleY>2.5*scaleYG) { scaleYG=scaleY; flag=false; } if (startOver) flag=true; // ** draw diagrams ** dheight=(double)(r.height/8-16); if (!startOver) { x1=r.width/10; y1v=r.height * 3 / 8; y1m=r.height * 5 / 8; y1y=r.height / 8; g.setColor(Color.blue); if (scaleV!=0) vY=(int)(chopDigit( (double)r.height * 3. / 8.+ dheight*(1.+2.*vMin/scaleV),0)); if (scaleM!=0) mY=(int)(chopDigit( (double)r.height * 5. / 8.+ dheight*(1.+2.*mMin/scaleM),0)); for (i=0;i=0) & (i<=(noPoints-1)) & startOver==false) { g.setColor(Color.blue); g.drawString("x="+Double.toString(chopDigit(xi[i],1)) +"in. : y="+Double.toString(chopDigit(ySum[i],6)) +"in. V="+Double.toString(chopDigit(vSum[i],2)) +"lb. M="+Double.toString(chopDigit(mSum[i],2)) +"lbin w="+Double.toString(chopDigit(sumDist[i],2))+"lb/in" ,10,r.height*6/8+14); x1=r.width/10+(int)((double)ls*xi[i]/L); g.setColor(Color.gray); g.drawLine(x1,vY,x1,vY - (int)(dheight*vSum[i] / scaleV * 2.)); g.drawLine(x1,mY,x1,mY - (int)(dheight*mSum[i] / scaleM * 2.)); g.drawOval(x1-2,r.height / 8 - (int)( chopDigit( (double)r.height / 25. * ySum[i] / scaleYG ,0) )-2,4,4); } // ** draw shear and moment diagram axis // x axis of shear diagram g.setColor(Color.black); g.drawLine(r.width/10, vY, r.width/10+ls, vY); // V axis of shear diagram g.drawLine(r.width/10, r.height * 2 / 8 + 15, r.width/10, r.height * 4 / 8 - 15); // g.drawString("+",r.width/10-9, r.height * 2 / 8 + 15); if (scaleV!=0.) g.drawString("+"+Double.toString(chopDigit(vMax,2)),r.width/10+2,r.height*2/8+15); // g.drawString("-",r.width/10-9, r.height * 4 / 8 - 4); if (scaleV!=0.) g.drawString("-"+Double.toString(Math.abs(chopDigit(vMin,2))),r.width/10+2,r.height*4/8-4); g.drawString("0",r.width/10-9,vY+7); // x axis of moment diagram g.drawLine(r.width/10, mY, r.width/10+ls, mY); // M axis of moment diagram g.drawLine(r.width/10, r.height * 4 / 8 + 15, r.width/10, r.height * 6 / 8 - 15); // g.drawString("+",r.width/10-9, r.height * 4 / 8 + 15); if (scaleM!=0.) g.drawString("+"+Double.toString(chopDigit(mMax,2)),r.width/10+2, r.height*4/8+15); // g.drawString("-",r.width/10-9, r.height * 6 / 8 - 4); if (scaleM!=0.) g.drawString("-"+Double.toString(Math.abs(chopDigit(mMin,2))),r.width/10+2,r.height*6/8-4); g.drawString("0",r.width/10-9,mY+5); // x axis drawing g.setColor(Color.black); g.drawLine(r.width/10,r.height/8-30,r.width/10+25,r.height/8-30); g.drawLine(r.width/10+25,r.height/8-30,r.width/10+25-6,r.height/8-30-2); g.drawLine(r.width/10+25,r.height/8-30,r.width/10+25-6,r.height/8-30+2); g.drawLine(r.width/10,r.height/8-35,r.width/10,r.height/8-25); g.drawString("x",r.width/10+18,r.height/8-35); if (scaleY!=0.) { g.drawString("Maximum Deflection of "+Double.toString(chopDigit(scaleY,6)) +"in."+" occur at "+Double.toString(chopDigit(maxX,2))+"in. from the left end." ,15,r.height-31); // g.setColor(Color.blue); g.setFont(new Font("Helvetica",Font.ITALIC,11)); g.drawString(" ( The deflection shown on the diagram is "+ Integer.toString((int)(chopDigit( (double)r.height / 250./(scaleYG/L*(double)ls),0))) +"times exagerated relative to",15,r.height-18); g.drawString(" the length of the beam.)",15,r.height-4); } // to prevent wrong repaint w=0.; w2=0.; // whichLoad=9; for (i=0;i<(jj+2);i++) wt[i]=0.; for (i=0;istart|| wh==0 || wh==2) && start>=0 && ll>0) { /* if (start<0|end>ll|(endll) warn = "Error: [a] is out of range"; else if (start>end) warn="Error: [a] have to be smaller than [b]"; else warn = "Error : Invalid Input"; WarningDialog wd = new WarningDialog(f,warn); wd.show(); } } public void redraw2( double load[], double po[],int jk) { int i; boolean er=false; for (i=0;ipo[i] && po[i]>=0) { } else { Frame f = new Frame(); String warn; if (po[i]<0 || po[i]>this.L) warn = "Error: out of range"; else if (po[i]>po[i+1]) warn="Error: The input points have to keep increasing"; else warn = "Error : Invalid Input"; WarningDialog wd = new WarningDialog(f,warn); wd.show(); er=true; break; } } if (er==false) { this.startOver=false; this.whichLoad=3; this.wt = load; this.ab = po; this.jj = jk-1; repaint(); } } /* public void redraw2( double load, double load2,double start, double end ) { if (end<=this.L && start<=this.L && end>start && start>=0) { this.startOver=false; this.whichLoad=1; this.w = load; this.w2 = load2; this.a = start; this.c = end-start; repaint(); } else { Frame f = new Frame(); String warn; if (start<0 || start>this.L) warn = "Error: [a] is out of range"; else if (start>end) warn="Error: [a] have to be smaller than [b]"; else warn = "Error : Invalid Input"; WarningDialog wd = new WarningDialog(f,warn); wd.show(); } } */ public boolean mouseDown(Event evt, int x, int y) { Rectangle r = bounds(); if(x < r.width) { if ( y < r.height) { xs = x; repaint(); return true; } } return true; } /* public boolean action(Event evt) { if (evt.target instanceof Button) { if (label.equals("OK")) { dle.hide(); } } }*/ } class BeamControls extends Panel { BeamCanvas canvas; TextField ein; TextField iin; TextField lin; TextField win; TextField w2in; TextField ain; TextField bin; Choice whi; Choice bwhi; public BeamControls(BeamCanvas canvas) { this.canvas = canvas; setBackground(Color.lightGray); setLayout(new GridLayout(4,1)); setFont(new Font("Helvetica",Font.PLAIN,12)); // load and beam type choice panel Panel choicePanel = new Panel(); choicePanel.setLayout(new GridLayout(4,1,5,0)); whi = new Choice(); whi.addItem("Concentrated Force"); whi.addItem("Linearly Distributed Load"); whi.addItem("Concentrated Moment"); bwhi = new Choice(); bwhi.addItem("Cantilever Beam"); bwhi.addItem("Both Ends Pinned"); bwhi.addItem("Both Ends Clamped"); bwhi.addItem("One Clamped & one Pinned"); choicePanel.add(new Label("Beam Type",Label.CENTER)); choicePanel.add(bwhi); choicePanel.add(new Label("Load Type",Label.CENTER)); choicePanel.add(whi); // Load Panel Panel loadPanel = new Panel(); loadPanel.setLayout(new GridLayout(5,2,5,0)); loadPanel.add(new Label("Load",Label.RIGHT)); loadPanel.add(new Label("Input",Label.LEFT)); Panel pwm = new Panel(); pwm.setLayout(new GridLayout(2,1,2,2)); pwm.add(new Label( "P, w1, M",Label.CENTER)); pwm.add(new Label("(lb,lb/in,lbin)",Label.CENTER)); loadPanel.add(pwm); loadPanel.add(new Label(" w2 (lb/in)",Label.CENTER)); loadPanel.add(win = new TextField("10", 5)); loadPanel.add(w2in = new TextField("10", 5)); loadPanel.add(new Label("a (in)",Label.CENTER)); loadPanel.add(new Label("b (in)",Label.CENTER)); loadPanel.add(ain = new TextField("5", 5)); loadPanel.add(bin = new TextField("10", 5)); // Property Panel Panel propertyPanel = new Panel(); propertyPanel.setLayout(new GridLayout(5,2)); propertyPanel.add(new Label("Beam",Label.RIGHT)); propertyPanel.add(new Label("Properties")); propertyPanel.add(new Label("L (in) ",Label.RIGHT)); propertyPanel.add(lin = new TextField("20",5)); propertyPanel.add(new Label("E (ksi) ",Label.RIGHT)); propertyPanel.add(ein = new TextField("28000",5)); propertyPanel.add(new Label("I (in^4) ",Label.RIGHT)); propertyPanel.add(iin = new TextField("2",5)); // Button Panel Panel buttonPanel = new Panel(); buttonPanel.setLayout(new GridLayout(4,1,0,3)); buttonPanel.add(new Button("Add Load")); buttonPanel.add(new Button("Initialize")); buttonPanel.add(new Label("")); buttonPanel.add(new Label("")); add(choicePanel); add(loadPanel); add(propertyPanel); add(buttonPanel); } public boolean action(Event ev, Object arg) { if (ev.target instanceof Button) { String label = (String)arg; canvas.redraw ( label.equals("Initialize"), label.equals("Add Load"), (Double.valueOf(win.getText().trim())).doubleValue(), (Double.valueOf(w2in.getText().trim())).doubleValue(), (Double.valueOf(ain.getText().trim())).doubleValue(), (Double.valueOf(bin.getText().trim())).doubleValue(), whi.getSelectedIndex(), bwhi.getSelectedIndex(), (Double.valueOf(ein.getText().trim())).doubleValue(), (Double.valueOf(iin.getText().trim())).doubleValue(), (Double.valueOf(lin.getText().trim())).doubleValue() ); return true; } return false; } }