public boolean doBool(ArrayList<Drawable> drawables, int bT) {
    if (drawables.size() > 1) {
      Drawable d1 = drawables.get(0);
      Drawable d2 = drawables.get(1);
      boolType = bT;
      switch (boolType) {
        case UNION:
          createdDrawable = PolyBoolean.union(d1.copy(), d2.copy());
          break;
        case DIFF:
          createdDrawable = PolyBoolean.difference(d1.copy(), d2.copy());
          break;
        case XOR:
          createdDrawable = PolyBoolean.xor(d1.copy(), d2.copy());

          break;
        case CLIP:
          createdDrawable = PolyBoolean.intersection(d1.copy(), d2.copy());
          break;
      }
      this.fireToolEvent(CustomEvent.DRAWABLE_CREATED);
      this.fireToolEvent(CustomEvent.BOOL_PERFORMED);
      return true;

    } else {

      return false;
    }
  }
  @Override
  public VarType evaluate() {
    Drawable d = new Drawable();
    double start = startExpr.evaluate().asDouble().intValue();
    double stop = stopExpr.evaluate().asDouble().intValue();
    double increment = 1.0;
    if (incrementExpr != null) {
      increment = startExpr.evaluate().asDouble();
    }
    for (double i = start; i <= stop; i += increment) {
      scope.assign(identifier, new VarType(i));
      VarType returnValue = block.evaluate();

      if (returnValue.isDrawable() && lookup) {
        Drawable d2 = returnValue.asDrawable();
        d.addToGroup(d2);
        d2.removeFromCanvas();
        // System.out.println("added drawable in for loop at+"+i);

      }
      /*
      else if(returnValue != VarType.VOID ) {
          return returnValue;

      }*/
    }

    return VarType.VOID;
  }
  @Override
  public VarType evaluate() {
    Drawable d = null;
    VarType v = null;

    // try{
    Drawable aP = params.get(0).evaluate().asDrawable();
    Drawable bP = params.get(1).evaluate().asDrawable();
    // this.drawableEvent(CustomEvent.REMOVE_DRAWABLE, aP);
    // this.drawableEvent(CustomEvent.REMOVE_DRAWABLE, bP);

    d = PolyBoolean.union(aP.copy(), bP.copy());
    aP.hide();
    bP.hide();

    // d.setIdentifier(aP.getIdentifier());

    this.fireDrawableEvent(CustomEvent.DRAWABLE_CREATED, d);

    v = new VarType(d);

    d.setLine(line);

    // }
    /*catch (ClassCastException e){
    	throw new RuntimeException("Illegal union function call at line:"+ line+" : " + this);
    }*/
    return v;
  }
  @Override
  public void handleCustomDrawableEvent(Object source, int eventType, Drawable d1, Drawable d2) {
    // System.out.println("drawable event called");
    switch (eventType) {
      case CustomEvent.SWAP_DRAWABLE:
        int i = this.drawables.indexOf(d1);
        drawables.set(i, d2);
        d2.addEventListener(this);
        System.out.println("drawable swapped");

        break;
    }
  }
  @Override
  public void handleCustomDrawableEvent(Object source, int eventType, Drawable d) {
    System.out.println("drawable event called");
    switch (eventType) {
      case CustomEvent.DRAWABLE_CREATED:
        this.addDrawable(d);
        d.addEventListener(this);
        // System.out.println("drawable created");
        break;

      case CustomEvent.REMOVE_DRAWABLE:
        this.removeDrawable(d);
        d.removeEventListener(this);
        // System.out.println("drawable removed");
        // System.out.println("condensing holes");
        break;

      case CustomEvent.SHAPE_LOAD_REQUESTED:
        this.fireDrawableEvent(CustomEvent.SHAPE_LOAD_REQUESTED, d);
        break;
    }
    System.out.println("num drawables=" + this.drawables.size());
  }
  @Override
  public VarType evaluate() {
    Drawable d;

    d = param.evaluate().asDrawable().copy();

    d.flatten(true, new Drawable());
    Drawable flattened = d.getFlattenedDrawable();
    flattened.setLine(line);
    this.fireDrawableEvent(CustomEvent.DRAWABLE_CREATED, d.getFlattenedDrawable());
    return new VarType(flattened);
    // throw new RuntimeException("Illegal function call: " + this);
  }