CaRMtl/eric/jobs/JobValidation.java
2018-09-04 22:51:42 -04:00

210 lines
6.4 KiB
Java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package eric.jobs;
import eric.GUI.pipe_tools;
import eric.Progress_Bar;
import java.util.ArrayList;
import java.util.Enumeration;
import rene.gui.Global;
import rene.zirkel.ZirkelCanvas;
import rene.zirkel.construction.Construction;
import rene.zirkel.objects.ConstructionObject;
import rene.zirkel.objects.PointObject;
/**
*
* @author erichake
*/
public class JobValidation {
private final int MAX=1000;
private ZirkelCanvas ZC;
private Construction C;
private ArrayList<PointObject> mobiles=new ArrayList<PointObject>();
private ArrayList<double[]> mobilesCoords=new ArrayList<double[]>();
private ArrayList<ConstructionObject> targets, clones;
public JobValidation(ZirkelCanvas zc) {
ZC=zc;
C=ZC.getConstruction();
initMobiles();
targets=ZC.job_getTargets();
}
public void initMobiles() {
mobiles.clear();
mobilesCoords.clear();
Enumeration e=C.elements();
while (e.hasMoreElements()) {
final ConstructionObject c=(ConstructionObject) e.nextElement();
if (c instanceof PointObject) {
PointObject pt=(PointObject) c;
if (pt.moveable()&&pt.insidewindow()) {
mobiles.add(pt);
double[] tab={pt.getX(), pt.getY()};
mobilesCoords.add(tab);
}
}
}
}
/**
* Find every clones of targets object in the whole construction
* @return true if everything is fine. return false in case of
* error.
*/
public boolean initClones() {
clones=new ArrayList<ConstructionObject>();
for (int i=0; i<targets.size(); i++) {
ConstructionObject o=targets.get(i);
Enumeration e=C.elements();
while (e.hasMoreElements()) {
ConstructionObject c=(ConstructionObject) e.nextElement();
if ((o!=c)&&(!c.isHidden())) {
/* Careful ! "equals" is a method of ConstructionObjects classes :
* It says if both objects have same type and are at the same places.
*/
if (o.equals(c)) {
clones.add(c);
break;
}
}
}
}
return (targets.size()==clones.size());
}
public void reset() {
// Reset position for non magnetic mobile objects :
for (int i=0; i<mobiles.size(); i++) {
double[] tab=mobilesCoords.get(i);
mobiles.get(i).move(tab[0], tab[1]);
}
ZC.validate();
}
public boolean checkHorizontalAligment() {
double inc=2*C.getW()/(mobiles.size()+2);
double left=C.getX()-C.getW()+inc;
for (int i=0; i<mobiles.size(); i++) {
PointObject pt=mobiles.get(i);
pt.move(left, 0);
pt.validate();
left+=inc;
}
ZC.validate();
return isTargetsEqualClones();
}
public boolean check1step() {
for (int i=0; i<mobiles.size(); i++) {
PointObject pt=mobiles.get(i);
pt.alea();
}
ZC.validate();
return isTargetsEqualClones();
}
public boolean isTargetsEqualClones() {
for (int i=0; i<targets.size(); i++) {
if ((targets.get(i).valid())||(clones.get(i).valid())) {
if (!targets.get(i).equals(clones.get(i))) {
return false;
}
}
}
return true;
}
public void dynamicConstructionFailed() {
reset();
String message="<b>"+ZC.job_getMessageFailed();
message+="</b><br>("+Global.Loc("restrict.failed.initial")+")";
if (!pipe_tools.Exercise_To_HTML(false, ZC.job_getMessageFailed())) {
JobMessage.showMessage(message);
}
}
public void dynamicConstructionFailed(int failed) {
reset();
double d=100.0*failed/(MAX+1);
String message="<b>"+ZC.job_getMessageFailed();
message+="</b><br>("+Global.Loc("restrict.failed.percent")+String.valueOf(Math.round(d))+"%)";
if (!pipe_tools.Exercise_To_HTML(false, ZC.job_getMessageFailed())) {
JobMessage.showMessage(message);
}
}
public void staticConstructionFailed() {
reset();
String message="<b>"+ZC.job_getMessageFailed()+"</b>";
if (!pipe_tools.Exercise_To_HTML(false, ZC.job_getMessageFailed())) {
JobMessage.showMessage(message);
}
}
public void constructionOk() {
reset();
if (!pipe_tools.Exercise_To_HTML(true, ZC.job_getMessageOk())) {
JobMessage.showMessage(ZC.job_getMessageOk());
}
}
public void constructionOkExceptAlignment() {
reset();
String message="<b>"+ZC.job_getMessageOk();
message+="</b><br>("+Global.Loc("job.gui.alignment")+")";
if (!pipe_tools.Exercise_To_HTML(true, ZC.job_getMessageOk()+" ("+Global.Loc("job.gui.alignment")+")")) {
JobMessage.showMessage(message);
}
}
public void justSee() {
ZC.paint(ZC.getGraphics());
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
}
}
public void checkAllsteps() {
if ((mobiles.size()>0)&&(!ZC.job_isStaticJob())) {
// if it's a dynamic exercise :
int failed=0;
if (!initClones()) {
dynamicConstructionFailed();
return;
}
int progress=0;
Progress_Bar.create(Global.Loc("job.gui.progressmessage"), 0, MAX-1);
for (int i=0; i<MAX; i++) {
if (!check1step()) {
failed++;
}
Progress_Bar.nextValue();
}
Progress_Bar.close();
if (failed>0) {
dynamicConstructionFailed(failed);
return;
}
if (!checkHorizontalAligment()) {
constructionOkExceptAlignment();
return;
}
constructionOk();
} else {
// if it's a static exercise :
if (!initClones()) {
staticConstructionFailed();
return;
}
constructionOk();
}
}
}