@Override
  public Collection<Element> parse(DXFLayer layer)
      throws NullArgumentException, InvalidArgumentException {

    Collection<Element> archimedesSemilines = new ArrayList<Element>();
    List<DXFRay> dxfSemilines = layer.getDXFEntities(DXFConstants.ENTITY_TYPE_RAY);

    if (dxfSemilines != null) {
      for (DXFRay dxfSemiline : dxfSemilines) {
        org.kabeja.dxf.helpers.Point startPoint = dxfSemiline.getBasePoint();
        Vector direction = dxfSemiline.getDirection();

        double x = startPoint.getX();
        double y = startPoint.getY();

        Point p1 = new Point(x, y);
        Point p2 = new Point(direction.getX() + x, direction.getY() + y);

        Semiline semiline = new Semiline(p1, p2);

        archimedesSemilines.add(semiline);
      }
    }
    return archimedesSemilines;
  }
 /**
  * Add one DXFEntity to the appropriate bucket.
  *
  * @param e the entity
  * @param p the point. Could be the start or the end of the entity
  */
 public void addEntity(DXFBucketEntity e, Point p) {
   Iterator<DXFBucket> ib = buckets.iterator();
   while (ib.hasNext()) {
     DXFBucket b = ib.next();
     if (b.topLeft.getY() <= p.getY()
         && b.topLeft.getX() <= p.getX()
         && b.bottomRight.getY() >= p.getY()
         && b.bottomRight.getX() >= p.getX()) {
       // inside this bucket's region
       b.push(e, p);
       return;
     }
   }
   System.out.println("Not added " + p);
 }
  /**
   * @param cellsWide >0
   * @param cellsHigh >0
   * @param topLeft smallest X and smallest Y value
   * @param bottomRight largest X and largest Y value
   */
  public DXFBucketGrid(int cellsWide, int cellsHigh, Point topLeft, Point bottomRight) {
    int totalCells = cellsWide * cellsHigh;
    assert (totalCells > 0);

    // System.out.println("OUTER BOUNDS
    // ("+topLeft.getX()+","+topLeft.getY()+")-("+bottomRight.getX()+","+bottomRight.getY()+")");
    buckets = new ArrayList<DXFBucket>();
    double dx = bottomRight.getX() - topLeft.getX();
    double dy = bottomRight.getY() - topLeft.getY();

    int x, y;
    for (y = 0; y < cellsHigh; ++y) {
      for (x = 0; x < cellsWide; ++x) {
        DXFBucket b = new DXFBucket(x, y);
        buckets.add(b);
        b.topLeft.setX((x / (double) cellsWide) * dx + topLeft.getX());
        b.topLeft.setY((y / (double) cellsHigh) * dy + topLeft.getY());
        b.bottomRight.setX(((x + 1) / (double) cellsWide) * dx + topLeft.getX());
        b.bottomRight.setY(((y + 1) / (double) cellsHigh) * dy + topLeft.getY());
        // System.out.println(x+","+y+" =
        // ("+b.topLeft.getX()+","+b.topLeft.getY()+")-("+b.bottomRight.getX()+","+b.bottomRight.getY()+")");
      }
    }
  }