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. |