/** * Select the primitive if one of its virtual point is in the specified rectangular region (given * in logical coordinates). * * @param px the x coordinate of the top left point. * @param py the y coordinate of the top left point. * @param w the width of the region * @param h the height of the region * @return true if at least a primitive has been selected */ public boolean selectRect(int px, int py, int w, int h) { // Here is a trick: if there is at least one active layer, // distancePrimitive will return a value less than the maximum. SelectionActions sa = new SelectionActions(macro); EditorActions edt = new EditorActions(macro, sa, null); if (edt.distancePrimitive(0, 0) < Integer.MAX_VALUE) { return super.selectRect(px, py, w, h); } else { return false; } }
/** * Gets the distance (in primitive's coordinates space) between a given point and the primitive. * When it is reasonable, the behaviour can be binary (polygons, ovals...). In other cases (lines, * points), it can be proportional. * * @param px the x coordinate of the given point. * @param py the y coordinate of the given point. * @return the distance in logical units. */ public int getDistanceToPoint(int px, int py) { /* in the macro primitive, the the first virtual point represents the position of the reference point of the macro to be drawn. */ int x1 = virtualPoint[0].x; int y1 = virtualPoint[0].y; int dt = Integer.MAX_VALUE; // Here we check if the given point lies inside the text areas if (checkText(px, py)) return 0; // If not, we need to see more throughly about the inners of the macro int vx = px - x1 + 100; int vy = py - y1 + 100; // This is a sort of inelegant code: we need to translate the position // given in the macro's coordinate system. if (m) { switch (o) { case 1: vx = py - y1 + 100; vy = px - x1 + 100; break; case 2: vx = px - x1 + 100; vy = -(py - y1) + 100; break; case 3: vx = -(py - y1) + 100; vy = -(px - x1) + 100; break; case 0: vx = -(px - x1) + 100; vy = py - y1 + 100; break; default: vx = 0; vy = 0; break; } } else { switch (o) { case 1: vx = py - y1 + 100; vy = -(px - x1) + 100; break; case 2: vx = -(px - x1) + 100; vy = -(py - y1) + 100; break; case 3: vx = -(py - y1) + 100; vy = px - x1 + 100; break; case 0: vx = px - x1 + 100; vy = py - y1 + 100; break; default: vx = 0; vy = 0; break; } } if (macroDesc == null) System.out.println("1-Unrecognized macro " + "WARNING this can be a programming problem..."); else { SelectionActions sa = new SelectionActions(macro); EditorActions edt = new EditorActions(macro, sa, null); return Math.min(edt.distancePrimitive(vx, vy), dt); } return Integer.MAX_VALUE; }