|
From: <bma...@us...> - 2011-09-29 09:20:54
|
Revision: 6459
http://fudaa.svn.sourceforge.net/fudaa/?rev=6459&view=rev
Author: bmarchan
Date: 2011-09-29 09:20:47 +0000 (Thu, 29 Sep 2011)
Log Message:
-----------
Add : Contrainte de construction lors de cr?\195?\169ation de lignes bris?\195?\169es (alignement des points par touche SHIFT)
Modified Paths:
--------------
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/dessin/DeLigneBrisee.java
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java
trunk/framework/ebli-common/src/main/java/org/fudaa/ebli/geometrie/GrSegment.java
Modified: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/dessin/DeLigneBrisee.java
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/dessin/DeLigneBrisee.java 2011-09-28 22:05:30 UTC (rev 6458)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/dessin/DeLigneBrisee.java 2011-09-29 09:20:47 UTC (rev 6459)
@@ -66,6 +66,11 @@
ligne_.sommets_.enleveDernier();
}
}
+
+ public GrPoint getSommet(int _i) {
+ return ligne_.sommet(_i);
+ }
+
public void affiche(final Graphics2D _g2d,final TraceGeometrie _t, final boolean _rapide) {
super.affiche(_g2d,_t, _rapide);
_t.dessinePolyligne(_g2d,ligne_, _rapide);
Modified: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java 2011-09-28 22:05:30 UTC (rev 6458)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java 2011-09-29 09:20:47 UTC (rev 6459)
@@ -40,8 +40,10 @@
import org.fudaa.ebli.trace.TraceLigne;
import com.memoire.bu.BuResource;
+import java.util.HashSet;
import java.util.List;
import org.fudaa.ctulu.gis.CtuluLibGeometrie;
+import org.fudaa.ebli.geometrie.GrSegment;
import org.fudaa.ebli.trace.TraceIcon;
import org.fudaa.ebli.trace.TraceIconModel;
import org.fudaa.ebli.trace.TraceLigneModel;
@@ -62,7 +64,7 @@
public abstract class FormDelegate extends MouseAdapter implements KeyListener, MouseMotionListener {
/** LE dernier point d'accrochage definit */
- GrPoint ptAccro_=null;
+ GrPoint ptAccro_=null;
/**
* Enleve le dernier point saisie.
*/
@@ -136,6 +138,7 @@
}
class FormDelegateLigneBrisee extends FormDelegate {
+ private HashSet<Integer> keyPressed_=new HashSet<Integer>(); // Les modifiers
ZEditionAttibutesContainer.LigneBriseeData data_;
@@ -168,6 +171,7 @@
isFerme_ = _isFerme;
}
+ @Override
public void removeLastSaisie() {
// s'il reste plus qu'un point on annule la saisie
if (ligne_.getNombre() <= 1) {
@@ -243,6 +247,7 @@
}
}
+ @Override
public void effaceDessin() {
if (isPaint_ && enCours()) {
final Graphics g = getGraphics();
@@ -275,43 +280,78 @@
return EbliLib.getS(isFerme_ ? "Polygone" : "Polyligne");
}
+ @Override
public void mouseDragged(final MouseEvent _e) {
mouseMoved(_e);
}
+ @Override
public void mouseEntered(final MouseEvent _e) {
if (enCours()) {
effaceDessin();
}
}
+ @Override
public void mouseExited(final MouseEvent _e) {
if (enCours()) {
effaceDessin();
}
}
+ @Override
public void mouseMoved(final MouseEvent _e) {
updateMouseMoved(_e.getX(), _e.getY());
}
+
+ @Override
+ public void keyPressed(KeyEvent _e) {
+ keyPressed_.add(_e.getKeyCode());
+ }
+ @Override
+ public void keyReleased(KeyEvent _e) {
+ keyPressed_.remove(_e.getKeyCode());
+ }
+
+ /**
+ * Corrige les coordonn\xE9es ecran de la souris si on force l'alignement.
+ * Sinon retourne le point en entr\xE9e.
+ * @param _pt Le point avant correction.
+ * @return Le point apr\xE8s correction.
+ */
+ private GrPoint alignPoint(GrPoint _pt) {
+ if (ligne_.getNombre()<2) return _pt;
+
+ if (keyModifiers_.contains(KeyEvent.VK_SHIFT) || keyPressed_.contains(KeyEvent.VK_SHIFT)) {
+ GrSegment sgprec=new GrSegment();
+ sgprec.o_=ligne_.getSommet(ligne_.getNombre() - 2).applique(getVersEcran());
+ sgprec.e_=ligne_.getSommet(ligne_.getNombre() - 1).applique(getVersEcran());
+ return sgprec.pointPlusProcheSurDroiteXY(_pt);
+ }
+
+ return _pt;
+ }
+
protected void updateMouseMoved(final int _x, final int _y) {
if (enCours()) {
effaceDessin();
ligne_.affiche((Graphics2D) getGraphics(), tl_, isRapide(), tmp_, getVersEcran());
tmp_.initialiseAvec(pointFin_);
tmp_.autoApplique(getVersEcran());
+ GrPoint pt=alignPoint(new GrPoint(_x,_y,0));
+
if (!isFerme_ || ligne_.getNombre() == 1) {
- dessineTrait(_x, _y, (int) tmp_.x_, (int) tmp_.y_, -1, -1);
+ dessineTrait((int)pt.x_, (int)pt.y_, (int) tmp_.x_, (int) tmp_.y_, -1, -1);
} else {
final int x1Tmp = (int) tmp_.x_;
final int y1Tmp = (int) tmp_.y_;
tmp_.initialiseAvec(pointDep_);
tmp_.autoApplique(getVersEcran());
- dessineTrait(_x, _y, x1Tmp, y1Tmp, (int) tmp_.x_, (int) tmp_.y_);
+ dessineTrait((int)pt.x_, (int)pt.y_, x1Tmp, y1Tmp, (int) tmp_.x_, (int) tmp_.y_);
}
- tmp_.x_ = _x;
- tmp_.y_ = _y;
+ tmp_.x_ = pt.x_;
+ tmp_.y_ = pt.y_;
tmp_.autoApplique(getVersReel());
if (support_!=null && ptAccro_==null) {
@@ -326,11 +366,13 @@
}
}
+ @Override
void addCurrentForme() {
if (polyAdded() && ligne_ != null) ligne_.affiche((Graphics2D) getGraphics(), tl_, isRapide(), tmp_,
getVersEcran());
}
+ @Override
public void mouseReleased(final MouseEvent _e) {
effaceDessin();
if (ligne_ == null) {
@@ -345,6 +387,9 @@
else
pointDep_=ptAccro_;
+ pointDep_.autoApplique(getVersEcran());
+ pointDep_=alignPoint(pointDep_).applique(getVersReel());
+
pointFin_ = pointDep_;
ligne_.ajoute(pointDep_);
if (data_ != null) {
@@ -363,6 +408,10 @@
pointFin_ = getPointReel(_e);
else
pointFin_=ptAccro_;
+
+ pointFin_.autoApplique(getVersEcran());
+ pointFin_=alignPoint(pointFin_).applique(getVersReel());
+
ligne_.ajoute(pointFin_);
if (data_ != null) {
data_.addPoint(ptAccro_);
@@ -384,6 +433,7 @@
mouseMoved(_e);
}
+ @Override
public void paintComponent(final Graphics _g) {
effaceDessin();
if (ligne_ != null) {
@@ -679,7 +729,7 @@
grandRayon_=Math.abs(pt.x_-origine_.x_);
petitRayon_=Math.abs(pt.y_-origine_.y_);
// Si la touche Ctrl est pressee, on est en mode 'cercle'
- if (keyPresse_.contains(KeyEvent.VK_CONTROL)) {
+ if (keyPresse_.contains(KeyEvent.VK_SHIFT) || keyModifiers_.contains(KeyEvent.VK_SHIFT)) {
grandRayon_ = (grandRayon_ + petitRayon_)/2;
petitRayon_ = grandRayon_;
}
@@ -708,6 +758,7 @@
*
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
*/
+ @Override
public void keyPressed(KeyEvent _e) {
if (!keyPresse_.contains(_e.getKeyCode())){
keyPresse_.add(_e.getKeyCode()); }
@@ -718,6 +769,7 @@
*
* @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
*/
+ @Override
public void keyReleased(KeyEvent _e) {
if (keyPresse_.contains(_e.getKeyCode()))
keyPresse_.remove((Integer)_e.getKeyCode());
@@ -728,6 +780,7 @@
*
* @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
*/
+ @Override
public void keyTyped(KeyEvent _e) {}
public void setDataAttributs(List<GISAttributeInterface> _attEditable, List<JComponent> _comps){
@@ -1092,7 +1145,7 @@
if (ptAccro_!=null)
pointFin_=ptAccro_;
// Si la touche Ctrl est pressee, on est en mode 'carre'
- if (keyPresse_.contains(KeyEvent.VK_CONTROL)) {
+ if (keyPresse_.contains(KeyEvent.VK_SHIFT) || keyModifiers_.contains(KeyEvent.VK_SHIFT)) {
double cote=(Math.abs(pointDep_.x_-pointFin_.x_)+Math.abs(pointDep_.y_-pointFin_.y_))/2;
if (pointFin_.x_<pointDep_.x_)
pointFin_.x_=pointDep_.x_-cote;
@@ -1247,6 +1300,8 @@
/** Le double clic termine-t-il la forme en cours ? */
boolean isFormEndedByDoubleClic=true;
+ /** Les keys modifiers fix\xE9s par programme */
+ HashSet<Integer> keyModifiers_=new HashSet<Integer>();
/**
* Constructeur, sans listener associ\xE9.
@@ -1304,6 +1359,22 @@
isFormEndedByDoubleClic=_b;
}
+ /**
+ * force les modifiers pour la saisie souris (CTRL, SHIFT, etc.).
+ * @param _keyModifier Le modifier \xE0 ajouter.
+ */
+ public void forceKeyModifier(int _keyModifier) {
+ keyModifiers_.add(_keyModifier);
+ }
+
+ /**
+ * release les modifiers pour la saisie souris (CTRL, SHIFT, etc.).
+ * @param _keyModifier Le modifier \xE0 supprimer.
+ */
+ public void releaseKeyModifier(int _keyModifier) {
+ keyModifiers_.remove(_keyModifier);
+ }
+
public boolean alwaysPaint() {
return true;
}
Modified: trunk/framework/ebli-common/src/main/java/org/fudaa/ebli/geometrie/GrSegment.java
===================================================================
--- trunk/framework/ebli-common/src/main/java/org/fudaa/ebli/geometrie/GrSegment.java 2011-09-28 22:05:30 UTC (rev 6458)
+++ trunk/framework/ebli-common/src/main/java/org/fudaa/ebli/geometrie/GrSegment.java 2011-09-29 09:20:47 UTC (rev 6459)
@@ -163,6 +163,20 @@
r.z_ = 0.;
return r;
}
+
+ /**
+ * Retourne le point appartenant a la droite passant par ce segment le plus proche
+ * du point donn\xE9 dans le plan x,y.
+ * @param _p Le point donn\xE9.
+ * @return Le point le plus proche sur la droite.
+ */
+ public GrPoint pointPlusProcheSurDroiteXY(final GrPoint _p) {
+ final double d = _p.soustraction(o_).projectionXY().division(vecteur().projectionXY());
+ GrPoint r;
+ r = o_.addition(vecteur().multiplication(d));
+ r.z_ = 0.;
+ return r;
+ }
public GrPoint intersectionXY(final GrSegment _s) {
if (boite().intersectionXY(_s.boite()) == null) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|